Docker实现mysql单向主从同步
1.在Docker中下载mysql镜像
docker pull mysql:5.7
2.创建mysql容器
#创建主节点mysql与外部服务器3307端口映射,同时做数据挂载实现与本地服务器数据持久同步化
? ~ docker run -d -p 3307:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql_master mysql:5.7
#创建子节点mysql与外部服务器3308端口映射
? ~ docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql_slave mysql:5.7
3.查看容器
4.配置主节点mysql
# 进入 msyql_master 容器内部
docker exec -it mysql_master /bin/bash
# 同步时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo ‘Asia/Shanghai‘ >/etc/timezone
# 更换源
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >> /etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free" >>/etc/apt/sources.list
# 安装vim
apt-get update
apt-get install vim -y
# 修改 my.cnf
vim /etc/mysql/my.cnf
my.cnf 添加内容:
[mysqld]
# 同一局域网内唯一ID
server-id=1
# 开启二进制日志功能
log-bin=mysql-bin
# 开启日志
# general_log = 1
# general_log_file = /var/log/mysql/general_sql.log
# 需要忽略的库,忽略后不同步此库
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
# 需要同步的库
# binlog-do-db=test
#退出容器并重启容器
docker restart mysql_master
#进入数据库
mysql -uroot -p123456
#查看server id(这个id是在my.cnf文件中进行更改)
show variables like ‘server_id‘;
#查看 master 的 binlog,此时需要保证Master库不能做任何操作,否则将会引起状态变化
show master status;
#创建数据同步用户
CREATE USER ‘slave‘@‘%‘ IDENTIFIED BY ‘123456‘;
GRANT REPLICATION SLAVE, REPLICATION CLIENT on *.* TO ‘slave‘@‘%‘;
#验证是否授权成功
show grants for slave;
使用创建用户进行登录测试
mysql -uslave -p123456
5.配置子节点mysql
# 进入 slave 容器内部
docker exec -it mysql_slave /bin/bash
# 同步时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo ‘Asia/Shanghai‘ >/etc/timezone
# 更换源
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >> /etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free" >>/etc/apt/sources.list
# 安装vim
apt-get update
apt-get install vim -y
# 修改 my.cnf
vim /etc/mysql/my.cnf
my.cnf 添加内容:
[mysqld]
# 同一局域网内唯一ID
server-id=2
# 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
# relay_log配置中继日志
relay_log=mysql-relay-bin
# 开启日志
# general_log = 1
# general_log_file = /var/log/mysql/general_sql.log
# 需要忽略的库,忽略后不同步此库
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
replicate-ignore-db=mysql
# 需要复制的库
# replicate-do-db=ufind_db
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
重启容器
docker restart slave_mysql
#进入数据库
mysql -uroot -p123456
#查看server id(这个id是在my.cnf文件中进行更改)
show variables like ‘server_id‘;
#在容器外部使用docker命令查询主节点容器的独立IP
docker inspect --format=‘{{.NetworkSettings.IPAddress}}‘ master_mysql
#在子节点数据库中进行与主节点的链接配置
CHANGE MASTER TO MASTER_HOST=‘172.17.0.3‘, MASTER_PORT=3306, MASTER_LOG_FILE=‘mysql-bin.000001‘, MASTER_LOG_POS=154, MASTER_CONNECT_RETRY=30, MASTER_BIND=‘‘;
#字段解释
master_host: Master的地址
master_port: Master的端口号
master_user: 用于数据同步的用户
master_password: 用于同步的用户的密码
master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry: 如果连接失败,重试的时间间隔,单位是秒,默认是60秒
#启动子节点
start slave user=‘slave‘ password=‘123456‘;
*如果 slave 报错: [ERROR] [MY-010584] [Repl] Slave I/O for channel , 尝试使用 root
start slave user=‘root‘ password=‘123456‘;
查看 slave 状态
show slave status\G
查看连接错误时的日志: docker logs -f slave_mysql
6.测试
在主节点数据库建库建表插入数据,在子节点数据库进行查看,但由于是单向的主从同步在子节点数据库进行增删改操作时无法同步到主节点数据库中。(在项目中写入操作在主库中完成,而查询操作可以在子库中进行以减轻主库的压力)