MySQL 8.0.30 一主两从架构实战 (Docker) 1. 环境准备 在宿主机(IP: 192.168.31.128)上创建独立的挂载目录,确保数据隔离。
1 2 3 4 5 6 7 8 docker network create mysql-netmkdir -p /mydata/mysql/master/{conf,log ,data}mkdir -p /mydata/mysql/slave1/{conf,log ,data}mkdir -p /mydata/mysql/slave2/{conf,log ,data}
2. 编写配置文件 MySQL 8.0 需要注意 server-id 的唯一性。
1. 主库配置 主库的核心是开启 log-bin 并配置好需要推送给从库的数据库。
vim /mydata/mysql/master/conf/my.cnf
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 [client] default-character-set =utf8mb4[mysql] default-character-set =utf8mb4[mysqld] init_connect ='SET collation_connection = utf8mb4_unicode_ci' init_connect ='SET NAMES utf8mb4' character-set-server =utf8mb4collation-server =utf8mb4_unicode_ci skip-character-set-client-handshake skip-name-resolveserver_id =1 log-bin =mysql-binread-only =0 binlog-do-db =gulimall_umsbinlog-do-db =gulimall_pmsbinlog-do-db =gulimall_omsbinlog-do-db =gulimall_smsbinlog-do-db =gulimall_wmsbinlog-do-db =gulimall_adminreplicate-ignore-db =mysqlreplicate-ignore-db =sysreplicate-ignore-db =information_schemareplicate-ignore-db =performance_schemadefault-authentication-plugin =mysql_native_passworddefault-time-zone ='+8:00' binlog_expire_logs_seconds =604800 log_slave_updates =1
2. 从库配置 从库的关键在于 server_id 必须唯一,且开启 read-only 保证数据一致性。
从库 1 (Slave-1):
vim /mydata/mysql/slave1/conf/my.cnf
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 [client] default-character-set =utf8mb4[mysql] default-character-set =utf8mb4[mysqld] character-set-server =utf8mb4collation-server =utf8mb4_unicode_ci skip-name-resolveserver_id =2 read-only =1 relay-log =mysql-relay-bin log-bin =mysql-bin replicate-do-db =gulimall_umsreplicate-do-db =gulimall_pmsreplicate-do-db =gulimall_omsreplicate-do-db =gulimall_smsreplicate-do-db =gulimall_wmsreplicate-do-db =gulimall_admindefault-authentication-plugin =mysql_native_passworddefault-time-zone ='+8:00'
从库 2 (Slave-2):
vim /mydata/mysql/slave2/conf/my.cnf
配置内容与 Slave-1 完全一致,只需将 server_id=2 修改为 server_id=3。
3. 启动容器 使用 8.0.30 版本,并映射不同端口。
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 docker run -p 3307:3306 --name mysql-master \ --network mysql-net \ -v /mydata/mysql/master/log:/var/log/mysql \ -v /mydata/mysql/master/data:/var/lib/mysql \ -v /mydata/mysql/master/conf/my.cnf:/etc/mysql/my.cnf \ -e MYSQL_ROOT_PASSWORD=root \ --restart always \ -d mysql:8.0.30 docker run -p 3308:3306 --name mysql-slave-1 \ --network mysql-net \ -v /mydata/mysql/slave1/log:/var/log/mysql \ -v /mydata/mysql/slave1/data:/var/lib/mysql \ -v /mydata/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf \ -e MYSQL_ROOT_PASSWORD=root \ --restart always \ -d mysql:8.0.30 docker run -p 3309:3306 --name mysql-slave-2 \ --network mysql-net \ -v /mydata/mysql/slave2/log:/var/log/mysql \ -v /mydata/mysql/slave2/data:/var/lib/mysql \ -v /mydata/mysql/slave2/conf/my.cnf:/etc/mysql/my.cnf \ -e MYSQL_ROOT_PASSWORD=root \ --restart always \ -d mysql:8.0.30
4. 主库配置 (Master)
进入主库并创建同步账号:
1 2 docker exec -it mysql-master mysql -uroot -proot
执行 SQL:
1 2 3 4 5 6 7 8 CREATE USER 'backup' @'%' IDENTIFIED WITH mysql_native_password BY '123456' ;GRANT REPLICATION SLAVE ON * .* TO 'backup' @'%' ; FLUSH PRIVILEGES;SHOW MASTER STATUS;
假设此时查到: File: mysql-bin.000003, Position: 831
5. 从库配置 (Slaves) 分别进入 mysql-slave-1 和 mysql-slave-2 执行同步命令。
1 2 docker exec -it mysql-slave-1 mysql -uroot -proot
关键同步命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 CHANGE MASTER TO MASTER_HOST= 'mysql-master' , MASTER_USER= 'backup' , MASTER_PASSWORD= '123456' , MASTER_PORT= 3306 , MASTER_LOG_FILE= 'mysql-bin.000003' , MASTER_LOG_POS= 831 ; START SLAVE;SHOW SLAVE STATUS\G
进入 slave2 执行
1 2 docker exec -it mysql-slave-2 mysql -uroot -proot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CHANGE MASTER TO MASTER_HOST= 'mysql-master' , MASTER_USER= 'backup' , MASTER_PASSWORD= '123456' , MASTER_PORT= 3306 , MASTER_LOG_FILE= 'mysql-bin.000003' , MASTER_LOG_POS= 831 ; CHANGE MASTER TO MASTER_HOST= 'mysql-master' , MASTER_USER= 'backup' , MASTER_PASSWORD= '123456' , MASTER_PORT= 3306 , MASTER_LOG_FILE= 'mysql-bin.000003' , MASTER_LOG_POS= 831 ;START SLAVE;SHOW SLAVE STATUS\G
6. 验证
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果在主库创建一个数据库 CREATE DATABASE gulimall_pms;,你在从库 SHOW DATABASES; 就能立刻看到了。