Docker 实现 MySQL 读写分离(主从同步)
1年前
pull镜像(MySQL 5.7)
docker pull mysql:5.7.26
创建目录
mkdir -p /usr/local/mysqlData/master/cnf
mkdir -p /usr/local/mysqlData/master/data
mkdir -p /usr/local/mysqlData/slave/cnf
mkdir -p /usr/local/mysqlData/slave/data
编写配置master节点配置
vim /usr/local/mysqlData/master/cnf/mysql.cnf
内容如下
[mysqld]
## 设置server_id,注意要唯一
server-id=1
## 开启binlog
log-bin=mysql-bin
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
编写配置slave节点配置
vim /usr/local/mysqlData/slave/cnf/mysql.cnf
内容如下
[mysqld]
## 设置server_id,注意要唯一
server-id=2
## 开启binlog,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
启动主服务器 3306端口
docker run -itd -p 3306:3306 --name master -v /usr/local/mysqlData/master/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.26
添加复制master数据的用户reader,供从服务器使用
docker exec -it master /bin/bash
mysql -u root -p123456
GRANT REPLICATION SLAVE ON *.* to 'reader'@'%' identified by 'reader';
FLUSH PRIVILEGES;
创建并运行从服务器 3307端口
docker run -itd -p 3307:3306 --name slaver -v /usr/local/mysqlData/slave/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.26
在从服务器上配置连接主服务器的信息
- 首先主服务器上查看master_log_file、master_log_pos两个参数,然后切换到从服务器上进行主服务器的连接信息的设置。
docker exec -it master /bin/bash
mysql -u root -p123456
show master status;
- 查看主服务器容器的ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' master
从服务器上执行
docker exec -it slaver /bin/bash
mysql -u root -p123456
change master to master_host='172.17.0.2',master_user='reader',master_password='reader',master_log_file='mysql-bin.000003',master_log_pos=591;
#ip地址,master_log_file,master_log_pos 替换为上一步主服务器上查询到的
从服务器启动I/O 线程和SQL线程
start slave;
# Slave_IO_Running: Yes,Slave_SQL_Running: Yes 即表示启动成功。
设置Docker容器自动启动
docker update --restart=always slaver
docker update --restart=always master