首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Docker 部署 MySQL 5.7 主從複制架構完整實戰

     編輯:MySQL 綜合教學

Docker 部署 MySQL 5.7 主從複制架構完整實戰

基於 Docker 1.11.2 + CentOS 7.1 + MySQL 5.7.13,記錄雙物理機主從複制部署全流程:鏡像拉取、容器啟動、複制賬戶、配置修改、資料同步、複制啟動、狀態驗證。

架構拓撲

Master (192.168.2.108) ──────────────► Slave (192.168.2.103)
  Binlog (Row + GTID)                    Relay Log
  Server ID = 1                          Server ID = 2
  Rep User: rep1@192.168.2.103

步驟 1:兩節點拉取鏡像並啟動


# 兩台機器均執行
docker pull mysql:5.7.13
docker run --name anuo-mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=qaz.00JK \
  -d mysql:5.7.13

步驟 2:主庫建立複制賬戶


# 進入主庫容器
docker exec -it anuo-mysql mysql -u root -p
# 執行
GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'192.168.2.103' IDENTIFIED BY 'qaz.00JK';
FLUSH PRIVILEGES;

⚠️ 限定從庫 IP:'rep1'@'192.168.2.103',提高安全性。

步驟 3:修改主庫配置 (啟用 Binlog、設定 Server ID)


# 1. 複製配置檔到宿主機
docker cp anuo-mysql:/etc/mysql/my.cnf /root/

# 2. 編輯 /root/my.cnf,在 [mysqld] 區塊新增
[mysqld]
log-bin = mysql-bin
server-id = 1
gtid_mode = on
enforce_gtid_consistency = on
binlog_format = row

# 3. 複製回容器覆蓋
docker cp /root/my.cnf anuo-mysql:/etc/mysql/my.cnf

# 4. 重啟容器生效
docker restart anuo-mysql

步驟 4:修改從庫配置


# 同步驟 3,唯一差異:
server-id = 2
# 從庫不需 log-bin (除非做級聯從庫)

步驟 5:主庫鎖表備份 (確保一致性基準點)


# 主庫執行
FLUSH TABLES WITH READ LOCK;
# 保持該會話開啟,不要關閉!

步驟 6:資料備份與還原

使用 Navicat for MySQL 或 mysqldump:


# 主庫導出 (另開終端)
mysqldump -h 192.168.2.108 -u root -p --all-databases --master-data=2 --single-transaction --routines --triggers > master_backup.sql

# 從庫導入
mysql -h 192.168.2.103 -u root -p < master_backup.sql

--master-data=2 會在導出檔中包含 CHANGE MASTER TO 所需的 Binlog 位置資訊 (註釋形式)。

步驟 7:釋放主庫鎖


# 步驟 5 的會話執行
UNLOCK TABLES;

步驟 8:從庫配置複制連線


# 從庫執行 (從 SHOW MASTER STATUS 獲取)
CHANGE MASTER TO
  MASTER_HOST = '192.168.2.108',
  MASTER_PORT = 3306,
  MASTER_USER = 'rep1',
  MASTER_PASSWORD = 'qaz.00JK',
  MASTER_LOG_FILE = 'mysql-bin.000002',
  MASTER_LOG_POS = 898,
  MASTER_AUTO_POSITION = 1;  -- GTID 模式啟用

⚠️ GTID 模式:MASTER_AUTO_POSITION = 1 替代傳統檔案+位置定位,自動計算同步點。

步驟 9:啟動複制


START SLAVE;

步驟 10:驗證複制狀態


SHOW SLAVE STATUS\G

關鍵指標:

欄位正常值異常含義
Slave_IO_RunningYesNo = IO 執行緒故障 (網路、認證、Binlog 缺失)
Slave_SQL_RunningYesNo = SQL 執行緒故障 (衝突、錯誤、資料不一致)
Slave_IO_StateWaiting for master to send event其他 = 等待/連線/錯誤狀態
Seconds_Behind_Master0 或極小大 = 延遲嚴重
Last_IO_Error / Last_SQL_Error空非空 = 具體錯誤資訊

Docker 部署優化建議

  • 資料持久化:-v /data/mysql:/var/lib/mysql 避免容器刪除丟失資料
  • 配置檔掛載:-v /etc/mysql/my.cnf:/etc/mysql/my.cnf 避免 cp 來回
  • 網路模式:生產建議 --network host 或自定義 bridge,避免 NAT 效能損耗
  • 資源限制:--memory=4g --cpus=2 防止容器佔盡宿主資源
  • 日誌驅動:--log-driver=json-file --log-opt max-size=100m --log-opt max-file=5

常見故障排查

現象排查方向
IO_Running=No網路通訊、防火牆、MASTER_HOST/PORT/USER/PASS、Binlog 是否開啟
SQL_Running=NoSHOW SLAVE STATUS \G 看 Last_SQL_Error;常見:主鍵衝突、外鍵失敗、字符集不匹配
Seconds_Behind_Master 偏大從庫硬體較弱、長事務阻塞、並行複制未開啟 (5.7+ slave_parallel_workers)
GTID 不一致RESET MASTER + 重新備份、或 SET GLOBAL gtid_purged=...

Docker 化部署極大簡化了 MySQL 主從環境搭建,配合 GTID 自動定位,運維效率顯著提升。生產環境建議引入 Orchestrator、MHA、ProxySQL 實現高可用自動化。

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