1.使用docker搭建主从
1.1.拉取镜像
- 使用docker拉取mysql镜像,以5.7版本为例
- 查看镜像
1.2.运行容器
- 运行master
1 2 3 4 5 6 7 8
| docker run \ --name mysql-master \ -v /tmp/mysql-master/conf:/etc/mysql/conf.d \ -v /tmp/mysql-master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -p 3300:3306 \ -d \ mysql:5.7
|
参数说明:
–name mysql-master
指定容器名称
-v /tmp/mysql-master/conf:/etc/mysql/conf.d
配置文件挂载
-v /tmp/mysql-master/data:/var/lib/mysql
数据挂载
-e MYSQL_ROOT_PASSWORD=123456
配置root密码
-p 3300:3306
映射端口
- 运行从机slave
1 2 3 4 5 6 7 8
| docker run \ --name mysql-slave \ -v /tmp/mysql-slave/conf:/etc/mysql/conf.d \ -v /tmp/mysql-slave/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -p 3301:3306 \ -d \ mysql:5.7
|
1.3.修改主从配置文件
- 创建并配置主机my.cnf文件
1 2 3 4 5 6 7 8 9 10
| vim /tmp/mysql-master/conf/my.cnf
[mysqld] server-id=1 log-bin=/var/lib/mysql/mysql-bin binlog-do-db=test
docker restart mysql-master
|
server-id=1
[必须]主服务器唯一ID
log-bin=/var/lib/mysql/mysql-bin
[必须]启用二进制日志,指名路径
binlog-do-db=test
指定需要同步数据库,如果不配置代表同步所有库
- 在master中创建用户并授予权限
1 2 3
| CREATE USER 'salve'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'salve'@'%'; FLUSH PRIVILEGES;
|
测试 show master status;

- 创建并配置从机my.cnf
1 2 3 4 5 6 7 8 9 10
| vim /tmp/mysql-slave/conf
[mysqld] server-id=2 relay_log=mysql-relay-bin read_only=1
|
relay_log
配置中继日志
read_only=1
设置为只读,该项如果不设置,表示slave可读可写
1.4.开启主从复制
1 2 3 4 5 6 7 8 9 10 11
| docker exec -it mysql-slave mysql -uroot
CHANGE MASTER TO MASTER_HOST='192.168.149.111', MASTER_PORT=3300, MASTER_USER='salve', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=306;
|
- MASTER_HOST 主机ip
- MASTER_PORT 主机端口
- MASTER_USER 连接主机的用户名
- MASTER_PASSWORD 连接主机的密码
- MASTER_LOG_FILE 主服务器上正在写入的二进制日志文件名
- MASTER_LOG_POS 从主服务器的哪个二进制日志位置开始复制。
启动复制
检查复制状态

Slave_IO_Running 和 Slave_SQL_Running 都显示为 “Yes”,这表示主从复制已成功启动。
创建需要同步的测试数据库(必须和配置文件中配置的数据库名称相同)


1.5.测试
主机新建库、新建表、insert记录,从机复制:
1 2 3 4 5 6 7
| CREATE DATABASE test;
CREATE TABLE mytbl(id INT,NAME VARCHAR(16));
INSERT INTO mytbl VALUES(1, 'zhang3');
INSERT INTO mytbl VALUES(2,@@hostname);
|
1.6.补充
停止主从
重新配置主从-需要在从机上执行:
1 2 3
| stop slave;
reset master;
|
2.使用Docker Compose简化
- 创建docker-compose.yml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| version: '3' services: mysql-master: container_name: mysql-master image: mysql:5.7 ports: - 3000:3306 hostname: mysql-master privileged: true volumes: - ./mysql-master/logs:/var/log/mysql - ./mysql-master/conf/my.cnf:/etc/mysql/my.cnf - ./mysql-master/data:/var/lib/mysql - ./mysql-master/script:/docker-entrypoint-initdb.d environment: MYSQL_ROOT_PASSWORD: "123456" MASTER_SYNC_USER: "slave" MASTER_SYNC_PASSWORD: "123456" ADMIN_USER: "root" ADMIN_PASSWORD: "123456" networks: - mysql mysql-slave: container_name: mysql-slave image: mysql:5.7 ports: - 3301:3306 hostname: mysql-slave privileged: true volumes: - ./mysql-slave/logs:/var/log/mysql - ./mysql-slave/conf/my.cnf:/etc/mysql/my.cnf - ./mysql-slave/data:/var/lib/mysql - ./mysql-slave/script:/docker-entrypoint-initdb.d environment: MYSQL_ROOT_PASSWORD: "123456" MASTER_SYNC_USER: "slave" MASTER_SYNC_PASSWORD: "123456" ADMIN_USER: "root" ADMIN_PASSWORD: "root123" MASTER_HOST: "mysql-master" TZ: "Asia/Shanghai" networks: - mysql
networks:
mysql: driver: bridge
|
- 配置主机配置文件
1 2 3 4 5 6 7 8
| vim mysql-master/conf/my.cnf
[mysqld] server-id=1 log-bin=/var/lib/mysql/mysql-bin binlog-do-db=test
|
3.从机配置文件
4.初始化脚本
………