首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Docker 部署 MySQL 主從復制完整實戰指南

     編輯:MySQL 資料庫相關知識

架構設計

  • Master: mysql-master (端口 3307 映射容器 3306)
  • Slave: mysql-slave (端口 3308 映射容器 3306)
  • 網絡: bridge 模式,容器間通過容器名解析
  • 同步模式: 基於 GTID 或傳統文件/位置 (本例用傳統)

一、準備配置文件

1.1 Master 配置 (my-m.cnf)


[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
gtid-mode = OFF
enforce-gtid-consistency = OFF

1.2 Slave 配置 (my-s.cnf)


[mysqld]
server-id = 2
log-bin = mysql-bin
relay-log = relay-bin
read-only = 1
gtid-mode = OFF
enforce-gtid-consistency = OFF

關鍵點:server-id 唯一、log-bin 啟用、Slave 設置 read-only=1 防誤寫。

二、啟動容器


# 創建配置目錄
mkdir -p /docker/mysql/{master,slave}/conf
# 將上述 cnf 文件放入對應 conf 目錄

# 啟動 Master
docker run -d \
  --name mysql-master \
  -e MYSQL_ROOT_PASSWORD=RootPass123! \
  -v /docker/mysql/master/conf/my-m.cnf:/etc/mysql/my.cnf \
  -v /docker/mysql/master/data:/var/lib/mysql \
  -p 3307:3306 \
  mysql:5.7

# 啟動 Slave
docker run -d \
  --name mysql-slave \
  -e MYSQL_ROOT_PASSWORD=RootPass123! \
  -v /docker/mysql/slave/conf/my-s.cnf:/etc/mysql/my.cnf \
  -v /docker/mysql/slave/data:/var/lib/mysql \
  -p 3308:3306 \
  mysql:5.7

三、配置主從復制

3.1 Master 創建同步賬號


docker exec -it mysql-master mysql -uroot -pRootPass123!
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'ReplPass123!';
mysql> FLUSH PRIVILEGES;

3.2 查看 Master 狀態


mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      312 |              |                  |
+------------------+----------+--------------+------------------+

記錄 File 和 Position 值,配置 Slave 時使用。

3.3 Slave 配置同步源


docker exec -it mysql-slave mysql -uroot -pRootPass123!
mysql> CHANGE MASTER TO
    MASTER_HOST='mysql-master',
    MASTER_USER='repl_user',
    MASTER_PASSWORD='ReplPass123!',
    MASTER_LOG_FILE='mysql-bin.000004',
    MASTER_LOG_POS=312,
    MASTER_PORT=3306;

注意:MASTER_HOST 使用容器名 mysql-master,Docker 內部 DNS 自動解析。

3.4 啟動同步並驗證


mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql-master
Master_User: repl_user
Master_Port: 3306
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

關鍵指標:Slave_IO_Running: Yes、Slave_SQL_Running: Yes、Seconds_Behind_Master: 0 表示同步正常無延遲。

四、驗證同步效果


# Master 創建測試數據
docker exec -it mysql-master mysql -uroot -pRootPass123! -e "
CREATE DATABASE test_sync;
USE test_sync;
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t VALUES (1, 'master_data');
"

# Slave 查詢驗證
docker exec -it mysql-slave mysql -uroot -pRootPass123! -e "
USE test_sync;
SELECT * FROM t;
"

五、常見問題排查

問題排查方向
IO_Running: No網絡不通、賬號密碼錯、MASTER_HOST 錯誤、防火牆
SQL_Running: No數據衝突、表結構不一致、主鍵衝突、Last_SQL_Error 詳情
Seconds_Behind_Master 大Slave 性能弱、大事務、網絡延遲、並行復制未開啟
容器重啟同步中斷配置 master-auto-position=1 (GTID) 或腳本自動重連

六、生產環境建議

  • 啟用 GTID 模式 (gtid-mode=ON) 簡化故障切換
  • 配置半同步復制 (rpl_semi_sync_master=ON) 保證數據不丟失
  • 監控 Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Running
  • 定期校驗主從數據一致性 (pt-table-checksum)
  • 備份策略:Master 全量+增量,Slave 邏輯備份分擔壓力

總結

Docker 部署 MySQL 主從核心步驟:差異化配置 server-id/log-bin → 容器互聯 → Master 創建 repl 賬號 → 獲取 binlog 位置 → Slave CHANGE MASTER → START SLAVE → 驗證雙 Yes。容器化帶來環境一致性與快速部署優勢,生產環境建議引入編排工具 管理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved