Docker 系列之 MySQL 主从复制

本贴最后更新于 1593 天前,其中的信息可能已经沧海桑田

目录

  • 前言
  • 主节点配置
  • 从节点配置
  • 扩展

前言

为什么基于 Docker 搭建?

  • 资源有限,虚拟机搭建对宿主机配置有一定要求
  • MySQL 安装步骤繁琐
  • 一台宿主机可以运行多个 Docker 容器
  • 容器之间相互隔离,有独立 ip,互不冲突
  • Docker 使用简便,容器启动为秒级别

MySQL 主从复制(也称 A/B 复制) 的原理

MySQL 的主从复制方式有多种,本文主要演示基于日志 binlog 的主从复制方式。

  1. Master 将数据变更记录到二进制日志 binary log 中,也就是配置文件中 log-bin 指定的文件,这些记录叫做二进制日志事件 binary log events
  2. Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到自己的中继日志 relay log 中;
  3. Slave 重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)。

启动容器

首先启动两个 MySQL 容器,端口映射分别为 3307(Master)和 3308(Slave),具体的容器部署请参考《Docker 系列之 MySQL 容器化部署》

PS: MySQL 容器的数据文件夹映射的路径不能相同

mysql.png

主节点(Master)配置

步骤简要说明

  1. 配置数据库文件,指明 server_id,开启二进制日志 log-bin
  2. 登录数据库,授予用户权限;
  3. 查看当前日志文件名和 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 文件。

conf.png

2. 授权

第一步,进入 MySQL 命令终端

首先进入 MySQL 容器

docker exec -it mysql_3307 /bin/bash

然后进入容器后使用 root 用户登录 MySQL 进入命令终端

mysql -u root -p	# 输入命令按回车键,然后输入root账号密码登录

mysql.png

第二步,创建用于复制操作的用户并授权

CREATE USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';	# 由于创建容器时已经创建过相同用户,此处不再创建
GRANT REPLICATION SLAVE ON *.* TO 'user'@'%';	# 授权给user用户
flush privileges;	# 刷新权限

3. 查看主节点信息

此时不要再对主节点做任何数据库操作,避免引起 fileposition 变化

SHOW MASTER STATUS;

master.png

从节点(Slave)配置

步骤简要说明

  1. 配置数据库文件,指明 server_id,开启二进制日志 log-bin
  2. 登录数据库,设置主节点(Master);
  3. 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

正常情况下,SlaveIORunningSlaveSQLRunning 都是 No,因为我们还没有开启主从复制过程。

stop.png

开启主从同步

start slave;

再次查询主从同步状态 show slave status \GSlaveIORunningSlaveSQLRunning 都是 Yes,说明主从复制已经开启,此时可以测试数据同步是否成功。

start.png

PS:

  • 从节点(Slave)只会同步生效这一时刻后的内容,之前的主节点(Master)数据需要在配置同步之前备份到从库中。
  • 主从数据库若没有保持一致的话,后续的同步过程中从库会发生异常。
  • 从库发生异常处理后,需要更新从库中主库的 master_log_pos 的值

3. 其它命令

stop slave;	# 停止主从同步
reset master;	# 重置主节点

扩展

双向主从复制

本篇教程主要展示单向主从复制,如果有需要实现双向主从复制,按照本教程将主从节点反过来再配置一遍即可实现,需要注意的是从节点要关闭数据库只读 read_only=0

非 Docker 部署

本篇教程也适用于非 Docker 部署的 MySQL,只需将本教程中的 docker 部分去除,以及自定义配置文件 my_conf.cnf 中的配置添加到 MySQL 的 my.cnf 配置文件中即可。

参考

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    690 引用 • 535 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...