经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
Docker上部署mysql8主从复制的实现
来源:jb51  时间:2022/8/2 12:45:20  对本文有异议

环境准备

需要一个 MySQL8 版本的 MySQL,因为我个人没有用过 mysql5,不知道二者是否会有一些特性上的偏差。

默认你与我的环境是一样的。

简易版本安装

先仅仅安装一个 MySQL,一上来就主从的话很多细节都会杂糅在一起。

  1. docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql

这里的参数介绍一下:

-p:指定内外端口映射,虚拟机为外,docker 容器为内,写在前面的为外部端口,写在后面的为内部端口。因为 MySQL 本身端口为 3306,为了不使你们混淆,我外部端口不设置为 3306。
-v:指定内外存储卷映射,Docker 实践经验(三)讲的就是这个。
-e:往容器内部传参,最后会由 MySQL 来接收。关于这个 -e 其实我也还没研究它的一个走势。

这样一个简易的 MySQL 就能动了。

设置密码

没有设置密码的话,不确定第二次要登录的时候是否还能进得去了。
不确定的意思就是可能进得去,可能进不去。

所以我们自行设置一个密码比较保险。

  1. mysql> use mysql
  2.  
  3. mysql> update user set authentication_string='123456' where user='root' and host='localhost';
  4.  
  5. mysql> flush privileges;

不用注释吧。

现在这个 MySQL 能动了吧,可以考虑删掉了,咱开始做主从复制。

如果想留着用的:
修改 my.cnf,通过数据卷同步给MySQL:

  1. cd /mysql/conf
  2. vim my.cnf
  3. 插入以下内容:
  4. [client]
  5. default_character_set=utf8
  6. [mysqld]
  7. collation_server = utf8_general_ci
  8. character_set_server = utf8

重启MySQL:

  1. docker restart mysql
  2. docker exec -it mysql bash

配置 MySQL 主从复制

创建 bridge 网络并指定 IP 区间

  1. docker network create --driver bridge mysql-master-slave

mysql连接数默认不够

  1. set global max_connections=500;
  2. set global mysqlx_max_connections=500;

创建数据和配置存放目录

  1. # 创建主库数据存放目录
  2. mkdir -p /home/docker/mysql/master/data
  3. # 创建主库配置存放目录
  4. mkdir -p /home/docker/mysql/master/conf
  5. # 创建从库1数据存放目录
  6. mkdir -p /home/docker/mysql/slave1/data
  7. # 创建从库1配置存放目录
  8. mkdir -p /home/docker/mysql/slave1/conf

准备配置文件

主数据库

  1. [mysqld]
  2. pid-file = /var/run/mysqld/mysqld.pid
  3. socket = /var/run/mysqld/mysqld.sock
  4. datadir = /var/lib/mysql
  5. secure-file-priv= NULL
  6. # Disabling symbolic-links is recommended to prevent assorted security risks
  7. symbolic-links=0
  8. # 服务器唯一ID,默认是1
  9. server-id=10
  10. # 启用二进制日志
  11. log-bin=mysql-bin
  12. # 最大连接数
  13. max_connections=10000
  14. # 设置默认时区
  15. default-time_zone='+8:00'
  16. # 0:区分大小写
  17. # 1:不区分大小写
  18. lower_case_table_names=1
  19. !includedir /etc/mysql/conf.d/

从数据库

  1. [mysqld]
  2. pid-file = /var/run/mysqld/mysqld.pid
  3. socket = /var/run/mysqld/mysqld.sock
  4. datadir = /var/lib/mysql
  5. secure-file-priv= NULL
  6. # Disabling symbolic-links is recommended to prevent assorted security risks
  7. symbolic-links=0
  8. # 服务器唯一ID,默认是1
  9. server-id=11
  10. # 启用二进制日志
  11. log-bin=mysql-bin
  12. # 最大连接数
  13. max_connections=10000
  14. # 设置默认时区
  15. default-time_zone='+8:00'
  16. # 0:区分大小写
  17. # 1:不区分大小写
  18. lower_case_table_names=1
  19. !includedir /etc/mysql/conf.d/

启动数据库

启动主数据库

如果上面完全按照我的步骤来,这里的命令也不用改参数。

  1. docker run -d -p 3316:3306 --name mysql_master --restart=always --network mysql-master-slave -v /home/docker/mysql/master/data:/var/lib/mysql -v /home/docker/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql

启动从数据库

  1. docker run -d -p 3326:3306 --name mysql_slave1 --restart=always --network mysql-master-slave -v /home/docker/mysql/slave1/data:/var/lib/mysql -v /home/docker/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql

远程访问配置(主从)

  1. # 在容器 mysql_master 中开启一个交互模式的终端
  2. docker exec -it mysql_master /bin/bash
  3. # 在容器 mysql_slave1 中开启一个交互模式的终端
  4. docker exec -it mysql_slave1 /bin/bash
  5. # mysql 登录
  6. mysql -u root -p
  7. # 给予远程用户所有表所有权限
  8. GRANT ALL ON *.* TO 'root'@'%';
  9. # 更改加密规则
  10. ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
  11. # 远程访问
  12. ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  13. # 刷新权限
  14. flush privileges;

主库创建复制用户

  1. CREATE USER 'woniu'@'%' IDENTIFIED WITH mysql_native_password BY 'woniu123456';
  2. GRANT REPLICATION SLAVE ON *.* TO 'woniu'@'%';
  3.  
  4. flush privileges;

查看 master 机器的状态

  1. SHOW MASTER STATUS;

从库设置 master 的信息

如果前面完全按我的步骤来,这里需要填写你们自己宿主机上的 ip、还有上图中显示的那两个数据。

  1. change master to master_host='192.168.190.133', master_user='woniu', master_password='woniu123456', master_port=3316, master_log_file='mysql-bin.000003', master_log_pos=2838, master_connect_retry=30;

参数释义:

  • master_host:主数据库的IP地址;
  • master_port:主数据库的运行端口;
  • master_user:在主数据库创建的用于同步数据的用户账号;
  • master_password:在主数据库创建的用于同步数据的用户密码;
  • master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
  • master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
  • master_connect_retry:连接失败重试的时间间隔,单位为秒。

开启主从复制

  1. # 开始同步
  2. start slave;
  3. # 同步状态
  4. show slave status ;

如果成功,圈出来的地方要都是 yes、
如果失败,会显示日志:

可自行百度,不过百度出来的不一定就适用于咱,毕竟咱是在 docker 上部署的,现有资料较少。
要靠经验。

到此这篇关于Docker上部署mysql8主从复制的实现的文章就介绍到这了,更多相关Docker部署mysql8主从复制内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号