搭建步骤
1、拉取镜像
docker pull mysql:latest
2、查看镜像
docker images
3、创建启动容器
Master
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
Slave
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
MySQL 主数据库端口为 3306,容器名称为 mysql-master,默认密码为 123456,-d 为后台运行。
MySQL 从数据库端口为 3307,容器名称为 mysql-slave,默认密码为 123456,-d 为后台运行。
4、配置Master
进入容器:
docker exec -it mysql-master /bin/bash
修改配置文件:
cd /etc/mysqlvim my.cnf
找不到vim命令解决:
# 更新包
apt-get update
# 安装vim
apt-get install vim -y
修改配置文件,添加如下配置:
# 同一局域网内注意要唯一
server-id=1
# 开启二进制日志功能,二进制文件名称
log-bin=master-bin
# 二进制日志格式,有row、statement、mixed三种格式,row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
binlog-format=ROW
# 同步的数据库名称,如果不配置,表示同步所有的库
binlog-do-db=数据库名
重启容器:
docker restart mysql-master
5、配置Slave
进入容器:
docker exec -it mysql-slave /bin/bash
修改配置文件如下:
# 同一局域网内注意要唯一
server-id=2
# 开启二进制日志功能,二进制文件名称
log-bin=slave-bin
# 二进制文件的格式
binlog-format=ROW
重启容器:
docker restart mysql-slave
6、开启 Master-Slave 主从复制
进入 master 容器或者通过 MySQL 客户端工具,执行 show master status 查看 master 状态,记录相关信息。
#进入容器
docker exec -it 容器名 /bin/bash
#输入密码,进入mysql
mysql -u root -p
mysql->show master status;
-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
| master-bin.000007 | 156 | | | |
查看 master 容器的独立IP:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-maste
172.17.0.4
进入slave容器或者通过MySQL客户端工具,执行如下命令:
change master to master_host='172.17.0.4', master_user='root', master_password='123456', master_port=3306, master_log_file='master-bin.000007', master_log_pos=156, master_connect_retry=60,get_master_public_key=1;
- master_host:master的容器独立IP
- master_port:master的容器端口号
- master_user:用于同步数据的用户
- master_password:用于同步数据的用户密码
- master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
- master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
- master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
- get_master_public_key=1:是mysql8.0有密码校验才要进行设置的
启动 slave:
start slave
查看 slave 状态:
show slave status \G;
————————————————————————————
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 172.17.0.4Master_User: rootMaster_Port: 3306Connect_Retry: 30Master_Log_File: master-bin.000007Read_Master_Log_Pos: 4187Relay_Log_File: a40ee670e244-relay-bin.000002Relay_Log_Pos: 4356Relay_Master_Log_File: master-bin.000007Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 4187Relay_Log_Space: 4572Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: 77e35acb-bfb0-11eb-9513-0242ac110002Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
看到 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 说明启动成功了。
7、关闭主从
进入 slave 容器 mysql 客户端,这样表示就不同步了
stop slave;