写点什么

Docker 实践经验(四)docker 上部署 mysql8 主从复制

作者:看,未来
  • 2022 年 5 月 30 日
  • 本文字数:2551 字

    阅读完需:约 8 分钟


@[toc]

环境准备

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


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



简易版本安装

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


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 就能动了。



设置密码

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


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


mysql> use mysql
mysql> update user set authentication_string='123456' where user='root' and host='localhost';
mysql> flush privileges;
复制代码


不用注释吧。




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


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


cd /mysql/confvim my.cnf插入以下内容:[client]default_character_set=utf8[mysqld]collation_server = utf8_general_cicharacter_set_server = utf8
复制代码


重启 MySQL:


docker restart mysqldocker exec -it mysql bash
复制代码



配置 MySQL 主从复制

创建 bridge 网络并指定 IP 区间

docker network create --driver bridge mysql-master-slave
复制代码


mysql 连接数默认不够


set global max_connections=500;set global mysqlx_max_connections=500;
复制代码



创建数据和配置存放目录

# 创建主库数据存放目录mkdir -p /home/docker/mysql/master/data# 创建主库配置存放目录mkdir -p /home/docker/mysql/master/conf # 创建从库1数据存放目录mkdir -p /home/docker/mysql/slave1/data# 创建从库1配置存放目录mkdir -p /home/docker/mysql/slave1/conf
复制代码



准备配置文件

主数据库

[mysqld]pid-file        = /var/run/mysqld/mysqld.pidsocket          = /var/run/mysqld/mysqld.sockdatadir         = /var/lib/mysql secure-file-priv= NULL # Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0 # 服务器唯一ID,默认是1server-id=10 # 启用二进制日志log-bin=mysql-bin # 最大连接数 max_connections=10000 # 设置默认时区default-time_zone='+8:00' # 0:区分大小写# 1:不区分大小写lower_case_table_names=1 !includedir /etc/mysql/conf.d/
复制代码

从数据库

[mysqld]pid-file        = /var/run/mysqld/mysqld.pidsocket          = /var/run/mysqld/mysqld.sockdatadir         = /var/lib/mysql secure-file-priv= NULL # Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0 # 服务器唯一ID,默认是1server-id=11 # 启用二进制日志log-bin=mysql-bin # 最大连接数 max_connections=10000 # 设置默认时区default-time_zone='+8:00' # 0:区分大小写# 1:不区分大小写lower_case_table_names=1 !includedir /etc/mysql/conf.d/
复制代码



启动数据库

启动主数据库

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


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
复制代码

启动从数据库

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
复制代码



远程访问配置(主从)

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



主库创建复制用户

CREATE USER 'woniu'@'%' IDENTIFIED WITH mysql_native_password BY 'woniu123456'; GRANT REPLICATION SLAVE ON *.* TO 'woniu'@'%';
flush privileges;
复制代码



查看 master 机器的状态

SHOW MASTER STATUS;
复制代码




从库设置 master 的信息

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


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:连接失败重试的时间间隔,单位为秒。
复制代码



开启主从复制

# 开始同步start slave; # 同步状态show slave status \;
复制代码



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



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

发布于: 刚刚阅读数: 3
用户头像

看,未来

关注

还未添加个人签名 2021.04.25 加入

还未添加个人简介

评论

发布
暂无评论
Docker实践经验(四)docker 上部署 mysql8 主从复制_看,未来_InfoQ写作社区