04_MySQL 通過 Docker 在同一個服務器上搭建主從集群(一主一從)
🧰 準備工作
1. 拉取 MySQL 鏡像
docker pull mysql:8.0.26
2. 創建主從配置目錄
mkdir -p /root/mysql/master/conf
mkdir -p /root/mysql/master/data
mkdir -p /root/mysql/master/mysql-filesmkdir -p /root/mysql/slave/conf
mkdir -p /root/mysql/slave/data
mkdir -p /root/mysql/slave/mysql-files
3. 編寫 docker-compose.yml 文件
version: '3.8'services:mysql-master:image: mysql:8.0.26container_name: mysql-masterrestart: alwaysports:- "3307:3306"environment:MYSQL_ROOT_PASSWORD: 123456volumes:- /root/mysql/master/conf/:/etc/mysql/- /root/mysql/master/mysql-files:/var/lib/mysql-files- /root/mysql/master/data:/var/lib/mysqlnetworks:- mysql-netmysql-slave:image: mysql:8.0.26container_name: mysql-slaverestart: alwaysports:- "3308:3306"environment:MYSQL_ROOT_PASSWORD: 123456depends_on:- mysql-mastervolumes:- /root/mysql/slave/conf/:/etc/mysql/- /root/mysql/slave/mysql-files:/var/lib/mysql-files- /root/mysql/slave/data:/var/lib/mysqlnetworks:- mysql-netnetworks:mysql-net:driver: bridge
4. 編寫主從數據庫配置文件
4.1 主庫配置(放到 /root/mysql/master/conf/my.cnf
)
[mysqld]
# 唯一的server_id
server-id=1# 開啟二進制日志功能
log-bin=mysql-bin# 二進制日志緩存大小
binlog_cache_size=1M# 二進制日志過期天數
expire_logs_days=7# 二進制日志格式(mixed/statement/row)
binlog_format=STATEMENT# 忽略復制以下數據庫
binlog-ignore-db=mysql
binlog-ignore-db=information_schema# 只復制指定數據庫
binlog-do-db=testdb# 允許 LOAD DATA / SELECT INTO OUTFILE 操作的目錄(必須存在)
secure_file_priv=/var/lib/mysql-files
4.2 從庫配置(放到 /root/mysql/slave/conf/my.cnf
)
[mysqld]
# 唯一的server_id,不能和主庫相同
server-id=2# 中繼日志文件名
relay-log=relay-log# 設置只讀,防止手動寫入破壞復制
read_only=1# 允許 LOAD DATA / SELECT INTO OUTFILE 操作的目錄(必須存在)
secure_file_priv=/var/lib/mysql-files
5. 啟動容器
docker compose up -d
6. 容器內操作及權限配置
6.1 進入主庫容器及 MySQL
docker exec -it mysql-master bash
mysql -uroot -p123456
- 查看
server_id
:
SHOW VARIABLES LIKE 'server_id';
- 授權 root 用戶遠程登錄權限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
6.2 進入從庫容器及 MySQL
docker exec -it mysql-slave bash
mysql -uroot -p123456
- 同樣授權 root 用戶遠程登錄權限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
7. 主從復制配置
7.1 主庫授權復制賬戶
docker exec -it mysql-master bash
mysql -uroot -p123456-- 創建復制用戶
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';-- 授權復制權限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';FLUSH PRIVILEGES;
7.2 查詢主庫狀態,記錄 File
和 Position
SHOW MASTER STATUS;
示例輸出:
File | Position | … |
---|---|---|
mysql-bin.000004 | 156 | … |
7.3 在從庫配置主庫信息
docker exec -it mysql-slave bash
mysql -uroot -p123456
sql復制編輯CHANGE MASTER TO MASTER_HOST='172.17.180.75',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=156;
注意:
如果遇到錯誤,先執行:
STOP SLAVE;
RESET SLAVE;
然后重新執行 CHANGE MASTER TO
命令。
7.4 啟動從庫復制線程
復制編輯
START SLAVE;
7.5 查看從庫復制狀態
SHOW SLAVE STATUS\G;
確認 Slave_IO_Running
和 Slave_SQL_Running
都為 Yes
。
8. 連接測試
- 使用 Navicat 或其他數據庫客戶端分別連接主庫(端口 3307)和從庫(端口 3308)測試。
9. 測試主從復制效果
- 在主庫創建數據庫和表:
CREATE DATABASE testdb;
USE testdb;CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50)
);INSERT INTO test_table (name) VALUES ('test1'), ('test2');
- 查看從庫是否同步了
testdb
數據庫和數據。