1.下载镜像
dockerpull mysql:5.72.目录结构
opt文件夹下 mysqltest/ ├── master/ │ ├── conf/my.cnf │ └── data/ ├── slave/ │ ├── conf/my.cnf │ └── data/ └── docker-compose.yml3.创建目录
mkdir-p/opt/mysqltest/master/{conf,logs,data}mkdir-p/opt/mysqltest/slave/{conf,logs,data}4.创建主库配置文件my.conf
cat>/opt/mysqltest/master/conf/my.cnf<<EOF [mysqld] #每个mysql的server-id必须为不重复的值 server-id=1 #开启二进制日志 log-bin=mysql-bin binlog_format=ROW #超过30天的log删除 expire_logs_days=7 binlog-ignore-db=mysql # 可选:只同步指定库 # binlog-do-db=test_db character-set-server=utf8mb4 collation-server=utf8mb4_general_ci # 性能相关 innodb_flush_log_at_trx_commit=1 sync_binlog=1 #禁止 MySQL 对客户端连接进行 DNS 反向解析 skip-name-resolve EOF5.创建备库配置文件my.cnf
cat>/opt/mysqltest/slave/conf/my.cnf<<EOF [mysqld] server-id=2 relay-log=relay-bin read-only=1 # 可选 # replicate-do-db=test_db character-set-server=utf8mb4 collation-server=utf8mb4_general_ci skip-name-resolve EOF6.创建docker-compose文件
cat>~/mysql_test.yml<<EOF services: mysql-master: image: mysql:5.7 container_name: mysql-master environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_USER: repl MYSQL_PASSWORD: repl123 volumes: - /opt/mysqltest/master/conf:/etc/mysql/conf.d - /opt/mysqltest/master/logs:/logs - /opt/mysqltest/master/data:/var/lib/mysql ports: - "3307:3306" networks: - mysql-net restart: always mysql-slave: image: mysql:5.7 container_name: mysql-slave environment: MYSQL_ROOT_PASSWORD: root123 volumes: - /opt/mysqltest/slave/conf:/etc/mysql/conf.d - /opt/mysqltest/slave/logs:/logs - /opt/mysqltest/slave/data:/var/lib/mysql ports: - "3308:3306" networks: - mysql-net restart: always depends_on: - mysql-master networks: mysql-net: driver: bridge EOF#赋予执行权限chmod+x mysql_test.yml7.启动
docker-compose-fmysql_test.yml up-d8.在master创建复制账号
dockerexec-itmysql-master mysql-uroot-proot123CREATEUSER'repl'@'%'IDENTIFIED BY'repl123';GRANT REPLICATION SLAVE ON *.* TO'repl'@'%';FLUSH PRIVILEGES;SHOW MASTER STATUS;记录以下两个值(非常重要):
File:如 mysql-bin.000001
Position:如 502
9.slave配置主从同步
dockerexec-itmysql-slave mysql-uroot-proot123CHANGE MASTER TOMASTER_HOST='mysql-master',MASTER_USER='repl',MASTER_PASSWORD='repl123',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=502;START SLAVE;SHOW SLAVE STATUS\G✅ 关键字段必须正常:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
备注:
如果不使用docker compose方式,第六第七步替换为如下docker run指令
#搭建网桥dockernetwork create mysql-net#运行主库dockerrun-d\--namemysql-master\--networkmysql-net\-p3307:3306\-eMYSQL_ROOT_PASSWORD=root123\-eMYSQL_USER=repl\-eMYSQL_PASSWORD=repl123\-v/opt/mysqltest/master/conf:/etc/mysql/conf.d\-v/opt/mysqltest/master/logs:/logs\-v/opt/mysqltest/master/data:/var/lib/mysql\--restartalways\mysql:5.7#运行从库dockerrun-d\--namemysql-slave\--networkmysql-net\-p3308:3306\-eMYSQL_ROOT_PASSWORD=root123\-v/opt/mysqltest/slave/conf:/etc/mysql/conf.d\-v/opt/mysqltest/slave/logs:/logs\-v/opt/mysqltest/slave/data:/var/lib/mysql\--restartalways\mysql:5.7