目录
- 前言
- 主节点配置
- 从节点配置
- 扩展
前言
为什么基于 Docker 搭建?
- 资源有限,虚拟机搭建对宿主机配置有一定要求
- MySQL 安装步骤繁琐
- 一台宿主机可以运行多个 Docker 容器
- 容器之间相互隔离,有独立 ip,互不冲突
- Docker 使用简便,容器启动为秒级别
MySQL 主从复制(也称 A/B 复制) 的原理
MySQL 的主从复制方式有多种,本文主要演示基于日志 binlog
的主从复制方式。
- Master 将数据变更记录到二进制日志
binary log
中,也就是配置文件中log-bin
指定的文件,这些记录叫做二进制日志事件binary log events
; - Slave 通过 I/O 线程读取 Master 中的
binary log events
并写入到自己的中继日志relay log
中; - Slave 重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)。
启动容器
首先启动两个 MySQL 容器,端口映射分别为 3307(Master)和 3308(Slave),具体的容器部署请参考《Docker 系列之 MySQL 容器化部署》。
PS: MySQL 容器的数据文件夹映射的路径不能相同
主节点(Master)配置
步骤简要说明
- 配置数据库文件,指明
server_id
,开启二进制日志log-bin
; - 登录数据库,授予用户权限;
- 查看当前日志文件名和
position
;
1. 配置数据库文件
进入容器映射到宿主机中的 MySQL 配置文件目录
cd /usr/docker/mysql_3307/conf # MySQL配置文件目录,创建容器时,通过'-v /usr/docker/mysql_3307/conf:/etc/mysql.conf.d'映射的文件目录
创建 my_conf.cnf
文件
touch my_conf.cnf # 创建自定义配置文件
在 my_conf.cnf
文件中添加配置
[mysqld]
# 同一局域网内注意要唯一
server-id=1
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
# 可选,日志的过期时间
expire_logs_days = 10
# 可选,日志的最大大小
max_binlog_size = 200M
# 可选,同步的数据库名称,可填多项
binlog_do_db = test_1_db
#binlog_do_db = test_2_db
# 可选,忽略同步的数据库,可填多项
binlog_ignore_db = ignore_1_db
#binlog_ignore_db = ignore_2_db
配置添加完成后,重启 MySQL 容器
docker restart mysql_3307
PS: 容器中的 MySQL 启动的时候会加载自带的 my.cnf
配置文件,而 my.cnf
配置文件中引入了 conf.d 文件目录,我们在创建容器的时候已经通过 -v
将该目录映射到了宿主机,所以我们只需要在宿主机的文件目录下添加新的配置文件即可,无需进入容器中修改 my.cnf
文件。
2. 授权
第一步,进入 MySQL 命令终端
首先进入 MySQL 容器
docker exec -it mysql_3307 /bin/bash
然后进入容器后使用 root 用户登录 MySQL 进入命令终端
mysql -u root -p # 输入命令按回车键,然后输入root账号密码登录
第二步,创建用于复制操作的用户并授权
CREATE USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; # 由于创建容器时已经创建过相同用户,此处不再创建
GRANT REPLICATION SLAVE ON *.* TO 'user'@'%'; # 授权给user用户
flush privileges; # 刷新权限
3. 查看主节点信息
此时不要再对主节点做任何数据库操作,避免引起 file
和 position
变化
SHOW MASTER STATUS;
从节点(Slave)配置
步骤简要说明
- 配置数据库文件,指明
server_id
,开启二进制日志log-bin
; - 登录数据库,设置主节点(Master);
- Slave 相关命令
1. 配置数据库文件
进入容器映射到宿主机中的 MySQL 配置文件目录
cd /usr/docker/mysql_3308/conf # MySQL配置文件目录,创建容器时,通过'-v /usr/docker/mysql_3308/conf:/etc/mysql.conf.d'映射的文件目录
创建 my_conf.cnf
文件
touch my_conf.cnf # 创建自定义配置文件
在 my_conf.cnf
文件中添加配置
[mysqld]
# 同一局域网内注意要唯一
server-id=2
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
# 可选,日志的过期时间
expire_logs_days = 10
# 可选,日志的最大大小
max_binlog_size = 200M
# 可选,设置从节点(Slave)只读,不可写
read_only=1
# 可选,同步的数据库名称,可填多项
replicate_do_db = test_1_db
#replicate_do_db = test_2_db
# 可选,忽略同步的数据库,可填多项
replicate_ignore_db = ignore_1_db
#replicate_ignore_db = ignore_2_db
配置添加完成后,重启 MySQL 容器
docker restart mysql_3308
2. 配置主节点(Master)
进入从节点(Slave)MySQL 命令终端,然后设置主节点(Master)参数
change master to master_host='172.17.0.3',
master_port=3306,
master_user='user',
master_password='password',
master_log_file='mysql-bin.000004',
master_log_pos=2774;
命令说明
master_host # Master的地址,指的是容器的独立ip,可以通过 'docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id' 查询容器的ip
master_port # Master的端口号,指的是容器的端口号
master_user # 用于数据同步的用户
master_password # 用于同步的用户的密码
master_log_file # 指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段的值
master_log_pos # 从日志文件中的哪个开始读,即上文中提到的Position字段的值
master_connect_retry # 如果连接失败,重试的时间间隔,单位是秒,默认是60秒
查看从节点(Slave)状态
show slave status \G
正常情况下,SlaveIORunning
和 SlaveSQLRunning
都是 No,因为我们还没有开启主从复制过程。
开启主从同步
start slave;
再次查询主从同步状态 show slave status \G
,SlaveIORunning
和 SlaveSQLRunning
都是 Yes,说明主从复制已经开启,此时可以测试数据同步是否成功。
PS:
- 从节点(Slave)只会同步生效这一时刻后的内容,之前的主节点(Master)数据需要在配置同步之前备份到从库中。
- 主从数据库若没有保持一致的话,后续的同步过程中从库会发生异常。
- 从库发生异常处理后,需要更新从库中主库的
master_log_pos
的值
3. 其它命令
stop slave; # 停止主从同步
reset master; # 重置主节点
扩展
双向主从复制
本篇教程主要展示单向主从复制,如果有需要实现双向主从复制,按照本教程将主从节点反过来再配置一遍即可实现,需要注意的是从节点要关闭数据库只读 read_only=0
。
非 Docker 部署
本篇教程也适用于非 Docker 部署的 MySQL,只需将本教程中的 docker 部分去除,以及自定义配置文件 my_conf.cnf
中的配置添加到 MySQL 的 my.cnf
配置文件中即可。
参考
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于