本文記錄在 CentOS 6.5 環境下,基於 MySQL 實現主從復制(Master-Slave)及讀寫分離的完整步驟,適用於生產環境高可用架構部署。
| 角色 | IP | OS | MySQL 版本 |
|---|---|---|---|
| Master | 192.168.1.200 | CentOS 6.5 | 5.6+ |
| Slave | 192.168.1.201 | CentOS 6.5 | 5.6+ |
yum install mysql-server[mysqld] server-id=200 log-bin=mysql-bin-200 binlog-do-db=your_db_name # 指定同步庫,不寫則同步所有 innodb_flush_log_at_trx_commit=2 sync_binlog=1
service mysqld restart mysql -uroot -p GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.201' IDENTIFIED BY 'repl_pass'; FLUSH PRIVILEGES; SHOW MASTER STATUS; -- 記錄 File 與 Position
[mysqld] server-id=201 log-bin=mysql-bin-201 innodb_flush_log_at_trx_commit=2 sync_binlog=1
service mysqld restart mysql -uroot -p CHANGE MASTER TO MASTER_HOST='192.168.1.200', MASTER_USER='repl_user', MASTER_PASSWORD='repl_pass', MASTER_LOG_FILE='mysql-bin-200.000002', -- 從 Master SHOW MASTER STATUS 獲取 MASTER_LOG_POS=1167; START SLAVE; SHOW SLAVE STATUS\G
檢查 Slave_IO_Running 與 Slave_SQL_Running 均為 Yes 即成功。在 Master 建立資料庫/表/插入資料,觀察 Slave 是否同步出現。
主從搭建完成後,需引入中間件實現讀寫分離。常見方案:
ProxySQL 快速範例:
-- 安裝 ProxySQL 後配置
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (0, '192.168.1.200', 3306); -- Master 寫入組
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, '192.168.1.201', 3306); -- Slave 讀取組
-- 設定讀寫分離規則
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (1, 1, '^SELECT.*', 1, 1),
(2, 1, '^(INSERT|UPDATE|DELETE|REPLACE).*', 0, 1);
LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;
sync_binlog/innodb_flush_log_at_trx_commit 設定。auto_increment_offset/auto_increment_increment 錯開,或使用 UUID/雪花算法。read_only=1 防止誤寫入。gtid_mode=ON),簡化故障切換。主從復制是高可用基石,讀寫分離則能線性擴展讀取吞吐。生產環境建議搭配 MHA/Orchestrator 實現自動故障轉移。