1. 背景
本文通过 Docker 容器实现 MySQL 主从复制功能,本案例只实现一主一从
2. Master节点配置部署
2.1 my.cnf 关键配置
[client]
default-character-set=utf8mb4
[mysqld]
default-time_zone='+8:00'
datadir=/var/lib/mysql
character_set_server=utf8mb4
collation-server=utf8mb4_general_ci
# [必选]服务 ID,需要保证全局唯一
server_id=1
# [必选]开启 binlog,主从复制基于 binlog 实现
log_bin=mysql_bin
# [必选]设置 binlog 格式为 row 格式
binlog_format=row
expire_logs_days=10
#[可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=0
#[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=test_master_salve,这样就只会同步该库
binlog-do-db=test_master_salve
2.2 运行容器
docker run --restart=always --name mysql5.7-3306 --privileged=true \
-d -p 3306:3306 \
-v /Contents/DockerContainer/MySQL5.7-3306/conf/my.cnf:/etc/mysql/my.cnf \
-v /Contents/DockerContainer/MySQL5.7-3306/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=123456 mysql/mysql-server:5.7
2.3 建立账户并授权
CREATE USER 'slave_user'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
如果使用的是MySQL8,需要如下的方式建立账户,并授权slave:
ALTER USER 'slave_user'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
注意:在从机执行show slave status\G时报错: Last_IO_Error: error connecting to master 'slave1@172.17.0.2:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
2.4 查看 Master 状态
show master status;
查询Master的状态,并记录下File和Position的值。
注意:执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化,导致 Slave 同步失败。
3. Slave 节点配置部署
3.1 my.cnf 关键配置
[client]
default-character-set=utf8mb4
[mysqld]
default-time_zone='+8:00'
datadir=/var/lib/mysql
character_set_server=utf8mb4
collation-server=utf8mb4_general_ci
max_connections=500
max_connect_errors=100
innodb_buffer_pool_size=512M
innodb_lock_wait_timeout=50
# 主要不同点
server_id=2
relay-log=mysql-relay
3.2 运行容器
docker run --restart=always --name mysql5.7-3307 --privileged=true \
-d -p 3307:3306 \
-v /Contents/DockerContainer/MySQL5.7-3307/conf/my.cnf:/etc/mysql/my.cnf \
-v /Contents/DockerContainer/MySQL5.7-3307/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=123456 mysql/mysql-server:5.7
3.3 Slave 复制 Master 命令
CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_PORT='具体端口',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS='具体值';
CHANGE MASTER TO
MASTER_HOST='172.17.0.2',
MASTER_USER='slave_user',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql_bin.000009',
MASTER_LOG_POS=2772;
关于 IP 地址可通过 docker inspect ID/NAMES 进行查看
3.4 开启同步
start slave;
如果发生报错,执行下面命令
- stop slave; # 停止主从同步
- reset slave; # 删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件
显式如下的情况,就是不正确的。可能错误的原因有:
- 网络不通
- 账户密码错误
- 防火墙
- mysql配置文件问题
- 连接服务器时语法
- 主服务器mysql权限
此时根据报错信息,进行排查即可
3.5 查看从节点状态
show slave status\G
4. 测试
由于主节点中配置*binglog-do-db=test_master_salve(只对该库的数据进行同步), *所以我们可以创建该库进行测试。