# MacOS如何使用Docker創建MySQL主從數據庫
## 前言
在當今數據驅動的時代,數據庫的高可用性和數據冗余變得尤為重要。MySQL作為最流行的開源關系型數據庫之一,其主從復制(Master-Slave Replication)功能是實現數據備份、負載均衡和讀寫分離的關鍵技術。本文將詳細介紹如何在MacOS系統上使用Docker容器技術快速搭建MySQL主從數據庫環境。
## 環境準備
### 系統要求
- MacOS 10.15或更高版本
- 已安裝Docker Desktop for Mac
- 建議內存4GB以上(Docker默認分配2GB)
- 終端工具(iTerm2或系統自帶終端)
### Docker環境檢查
在開始前,請確認Docker已正確安裝:
```bash
docker --version
# 輸出示例: Docker version 20.10.17, build 100c701
docker-compose --version
# 輸出示例: docker-compose version 2.6.0
主從復制的工作流程: 1. 主庫(Master)將數據變更記錄到二進制日志(binlog) 2. 從庫(Slave)的I/O線程請求主庫的binlog 3. 主庫的binlog dump線程發送日志內容 4. 從庫將日志寫入中繼日志(relay log) 5. 從庫的SQL線程重放中繼日志中的事件
我們將使用Docker的bridge網絡模式,確保容器間可以互相通信:
docker network create mysql-replication-net
docker run -d \
--name mysql-master \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=masterpass \
-v $(pwd)/master-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0 \
--server-id=1 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--gtid-mode=ON \
--enforce-gtid-consistency=ON
參數說明:
- --server-id
: 必須唯一,主庫設為1
- --log-bin
: 啟用二進制日志
- gtid-mode
: 使用全局事務ID簡化復制
進入主庫容器:
docker exec -it mysql-master mysql -uroot -pmasterpass
執行SQL命令:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
-- 查看主庫狀態,記錄File和Position值
SHOW MASTER STATUS;
示例輸出:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 835 | | | |
+------------------+----------+--------------+------------------+-------------------+
docker run -d \
--name mysql-slave \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=slavepass \
-v $(pwd)/slave-data:/var/lib/mysql \
-p 3307:3306 \
mysql:8.0 \
--server-id=2 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--gtid-mode=ON \
--enforce-gtid-consistency=ON \
--skip-slave-start
注意:
- --server-id
必須與主庫不同
- --skip-slave-start
防止自動啟動復制
進入從庫容器:
docker exec -it mysql-slave mysql -uroot -pslavepass
執行配置命令(使用之前記錄的master信息):
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='replpass',
MASTER_AUTO_POSITION=1;
START SLAVE;
-- 查看從庫狀態
SHOW SLAVE STATUS\G
關鍵檢查項:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Seconds_Behind_Master: 0
創建docker-compose.yml
文件:
version: '3.8'
services:
mysql-master:
image: mysql:8.0
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: masterpass
volumes:
- ./master-data:/var/lib/mysql
ports:
- "3306:3306"
command:
- --server-id=1
- --log-bin=mysql-bin
- --binlog-format=ROW
- --gtid-mode=ON
- --enforce-gtid-consistency=ON
networks:
- mysql-net
mysql-slave:
image: mysql:8.0
container_name: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: slavepass
volumes:
- ./slave-data:/var/lib/mysql
ports:
- "3307:3306"
command:
- --server-id=2
- --log-bin=mysql-bin
- --binlog-format=ROW
- --gtid-mode=ON
- --enforce-gtid-consistency=ON
- --skip-slave-start
depends_on:
- mysql-master
networks:
- mysql-net
networks:
mysql-net:
driver: bridge
啟動服務:
docker-compose up -d
docker exec -it mysql-master mysql -uroot -pmasterpass
CREATE DATABASE replication_test;
USE replication_test;
CREATE TABLE users (id INT AUTO_INCREMENT, name VARCHAR(255), PRIMARY KEY(id));
INSERT INTO users(name) VALUES ('Alice'), ('Bob');
docker exec -it mysql-slave mysql -uroot -pslavepass
SELECT * FROM replication_test.users;
應能看到與主庫相同的數據。
提高數據一致性,確保至少一個從庫接收到數據:
在主庫配置:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 3000;
在從庫配置:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
提高從庫應用速度:
STOP SLAVE;
SET GLOBAL slave_parallel_workers = 4;
START SLAVE;
主庫:
SHOW MASTER STATUS;
SHOW PROCESSLIST;
從庫:
SHOW SLAVE STATUS\G
SHOW SLAVE HOSTS;
常見問題及解決方案:
復制中斷:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
數據不一致:
使用pt-table-checksum
和pt-table-sync
工具
網絡中斷:
自動重試機制,檢查master_retry_count
參數
主庫配置:
sync_binlog=1
innodb_flush_log_at_trx_commit=1
從庫配置:
read_only=ON
skip-slave-start=ON
log_slave_updates=ON # 如需級聯復制
硬件建議:
Q1: 如何添加新的從庫? A: 流程類似,確保: - 唯一server-id - 使用主庫備份初始化數據 - 正確配置復制參數
Q2: 主從數據不一致怎么辦?
A: 可以:
1. 使用pt-table-sync
修復
2. 重建從庫(通過主庫快照)
Q3: 如何升級MySQL版本? A: 建議流程: 1. 升級從庫并驗證 2. 切換從庫為主庫 3. 升級原主庫
通過Docker在MacOS上搭建MySQL主從復制環境,我們實現了: - 快速部署和隔離的數據庫環境 - 數據冗余和高可用性基礎 - 方便的測試和開發環境
這種方案特別適合開發測試場景,如需生產環境使用,建議考慮: - 使用持久化存儲卷 - 配置監控告警系統 - 實施定期備份策略
功能 | 命令 |
---|---|
查看容器狀態 | docker ps -a |
查看主庫binlog | SHOW BINARY LOGS; |
停止復制 | STOP SLAVE; |
重置從庫 | RESET SLAVE ALL; |
導出主庫數據 | mysqldump --all-databases --master-data > backup.sql |
”`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。