MySQL主從集群的實(shí)現(xiàn)示例
一、MySQL主從復(fù)制的工作原理
1. 基本概念
- 主節(jié)點(diǎn)(Master):處理所有寫操作(如INSERT、UPDATE、DELETE),并將這些操作記錄到二進(jìn)制日志(Binary Log)中。
- 從節(jié)點(diǎn)(Slave):連接到主節(jié)點(diǎn),讀取并應(yīng)用主節(jié)點(diǎn)的二進(jìn)制日志,從而同步數(shù)據(jù)。
2. 工作流程
- 事務(wù)記錄:當(dāng)主節(jié)點(diǎn)上發(fā)生寫操作時,MySQL會將這些操作記錄在二進(jìn)制日志中。
- 日志傳輸:從節(jié)點(diǎn)通過IO線程連接到主節(jié)點(diǎn),請求獲取新的二進(jìn)制日志條目,并將其存儲在從節(jié)點(diǎn)的中繼日志(Relay Log)中。
- 日志應(yīng)用:從節(jié)點(diǎn)上的SQL線程讀取中繼日志中的條目,并執(zhí)行相應(yīng)的SQL語句,更新本地?cái)?shù)據(jù)庫。
二、環(huán)境準(zhǔn)備
假設(shè)我們有以下三臺服務(wù)器:
- 主節(jié)點(diǎn)(Master): 192.168.1.101
- 從節(jié)點(diǎn)1(Slave 1): 192.168.1.102
- 從節(jié)點(diǎn)2(Slave 2): 192.168.1.103
確保各節(jié)點(diǎn)之間可以互相通信,并開放必要的端口(如3306)。
三、安裝與配置
1. 安裝MySQL
在所有節(jié)點(diǎn)上安裝MySQL:
sudo apt update sudo apt install mysql-server
2. 配置主節(jié)點(diǎn)(Master)
編輯配置文件
編輯主節(jié)點(diǎn)的/etc/mysql/mysql.conf.d/mysqld.cnf文件,在末尾添加以下內(nèi)容:
[mysqld] server-id=1 log-bin=mysql-bin binlog-do-db=testdb # 只同步指定數(shù)據(jù)庫,如需同步所有數(shù)據(jù)庫可刪除此行 expire_logs_days=7 # 自動清理過期的日志文件 max_binlog_size=100M # 單個日志文件的最大大小 relay-log=mysql-relay-bin log-slave-updates=1 # 如果需要級聯(lián)復(fù)制,則啟用此選項(xiàng) sync_binlog=1 # 確保每次提交都同步到磁盤 innodb_flush_log_at_trx_commit=1 # 確保每次提交都刷新日志到磁盤
server-id: 每個節(jié)點(diǎn)必須有一個唯一的ID。log-bin: 啟用二進(jìn)制日志,這是主從復(fù)制的基礎(chǔ)。binlog-do-db: 只記錄特定數(shù)據(jù)庫的操作日志,如果需要同步所有數(shù)據(jù)庫,可以省略此行。expire_logs_days: 設(shè)置日志文件的自動清理天數(shù)。max_binlog_size: 設(shè)置單個日志文件的最大大小。relay-log: 指定中繼日志文件名。log-slave-updates: 如果從節(jié)點(diǎn)也需要作為其他從節(jié)點(diǎn)的主節(jié)點(diǎn),啟用此選項(xiàng)。sync_binlog: 確保每次提交都同步到磁盤,提高數(shù)據(jù)一致性。innodb_flush_log_at_trx_commit: 確保每次提交都刷新日志到磁盤,提高數(shù)據(jù)一致性。
重啟MySQL服務(wù)
sudo systemctl restart mysql
創(chuàng)建用于復(fù)制的用戶
登錄到MySQL并創(chuàng)建用于復(fù)制的用戶:
mysql -u root -p CREATE USER 'replicator'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; FLUSH PRIVILEGES;
鎖定數(shù)據(jù)庫并獲取二進(jìn)制日志位置
鎖定數(shù)據(jù)庫以防止數(shù)據(jù)修改,并獲取當(dāng)前二進(jìn)制日志位置:
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
記下File和Position的值,稍后需要在從節(jié)點(diǎn)上使用。
3. 配置從節(jié)點(diǎn)(Slave)
編輯配置文件
在每個從節(jié)點(diǎn)上編輯/etc/mysql/mysql.conf.d/mysqld.cnf文件,在末尾添加以下內(nèi)容:
[mysqld] server-id=2 # 對于第二個從節(jié)點(diǎn),使用不同的ID,如3 relay-log=mysql-relay-bin log-slave-updates=1 read-only=1 skip-slave-start=1 # 禁止啟動時自動啟動復(fù)制 slave_parallel_workers=4 # 并行復(fù)制線程數(shù) slave_parallel_type=LOGICAL_CLOCK # 并行復(fù)制類型 gtid_mode=ON # 啟用GTID enforce_gtid_consistency=ON # 強(qiáng)制GTID一致性
server-id: 每個節(jié)點(diǎn)必須有一個唯一的ID。relay-log: 指定中繼日志文件名。log-slave-updates: 如果從節(jié)點(diǎn)也需要作為其他從節(jié)點(diǎn)的主節(jié)點(diǎn),啟用此選項(xiàng)。read-only: 設(shè)置從節(jié)點(diǎn)為只讀模式,防止意外寫入。skip-slave-start: 禁止啟動時自動啟動復(fù)制,便于手動控制。slave_parallel_workers: 設(shè)置并行復(fù)制線程數(shù)。slave_parallel_type: 設(shè)置并行復(fù)制類型。gtid_mode: 啟用GTID。enforce_gtid_consistency: 強(qiáng)制GTID一致性。
重啟MySQL服務(wù)
sudo systemctl restart mysql
設(shè)置主節(jié)點(diǎn)信息
登錄到MySQL并設(shè)置主節(jié)點(diǎn)信息:
mysql -u root -p CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='replicator', MASTER_PASSWORD='your_password', MASTER_LOG_FILE='mysql-bin.000001', -- 使用之前記錄的File值 MASTER_LOG_POS=154, -- 使用之前記錄的Position值 MASTER_AUTO_POSITION=1; -- 如果使用GTID,則啟用此選項(xiàng) START SLAVE; SHOW SLAVE STATUS\G;
檢查輸出中的Slave_IO_Running和Slave_SQL_Running字段是否為Yes,以確認(rèn)從節(jié)點(diǎn)已成功連接到主節(jié)點(diǎn)。
對于第二個從節(jié)點(diǎn),重復(fù)上述步驟,并確保使用不同的server-id。
解鎖主節(jié)點(diǎn)
在主節(jié)點(diǎn)上解鎖數(shù)據(jù)庫,允許數(shù)據(jù)修改:
UNLOCK TABLES;
四、測試與驗(yàn)證
1. 測試主從復(fù)制功能
在主節(jié)點(diǎn)上進(jìn)行一些操作,例如創(chuàng)建數(shù)據(jù)庫和表,并插入數(shù)據(jù):
mysql -u root -p CREATE DATABASE testdb; USE testdb; CREATE TABLE example (id INT NOT NULL PRIMARY KEY, data VARCHAR(100)); INSERT INTO example VALUES (1, 'test');
然后在從節(jié)點(diǎn)上查詢該表的數(shù)據(jù),確認(rèn)數(shù)據(jù)已正確同步:
mysql -u root -p USE testdb; SELECT * FROM example;
如果能看到插入的數(shù)據(jù),則說明主從復(fù)制已經(jīng)正常工作。
五、進(jìn)一步優(yōu)化與管理
1. 監(jiān)控與維護(hù)
為了確保集群的穩(wěn)定性和性能,建議定期監(jiān)控MySQL的狀態(tài)和日志文件。可以使用以下命令查看從節(jié)點(diǎn)的狀態(tài):
SHOW SLAVE STATUS\G;
重點(diǎn)關(guān)注以下字段:
Slave_IO_Running: IO線程是否運(yùn)行。Slave_SQL_Running: SQL線程是否運(yùn)行。Last_Error: 上次錯誤信息。Seconds_Behind_Master: 從節(jié)點(diǎn)落后主節(jié)點(diǎn)的時間。
也可以通過配置監(jiān)控工具如Prometheus + Grafana來實(shí)時監(jiān)控MySQL集群的狀態(tài)。
2. 故障轉(zhuǎn)移與高可用性
為了提高系統(tǒng)的高可用性,可以考慮以下措施:
- 自動故障轉(zhuǎn)移:使用中間件如MHA(MySQL High Availability)或Orchestrator來實(shí)現(xiàn)自動故障轉(zhuǎn)移。
- 負(fù)載均衡:使用負(fù)載均衡器(如HAProxy)來分發(fā)讀請求到多個從節(jié)點(diǎn),減輕主節(jié)點(diǎn)的壓力。
3. 數(shù)據(jù)一致性檢查
定期檢查主從節(jié)點(diǎn)之間的數(shù)據(jù)一致性,可以使用工具如Percona Toolkit中的pt-table-checksum和pt-table-sync來檢測和修復(fù)不一致的數(shù)據(jù)。
六、高級配置與優(yōu)化
1. 半同步復(fù)制(Semi-Synchronous Replication)
半同步復(fù)制可以在一定程度上保證數(shù)據(jù)一致性。配置步驟如下:
在主節(jié)點(diǎn)上啟用半同步插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; SET GLOBAL rpl_semi_sync_master_enabled = 1;
在從節(jié)點(diǎn)上啟用半同步插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled = 1; START SLAVE;
2. 并行復(fù)制(Parallel Replication)
MySQL 5.7及以上版本支持并行復(fù)制,可以顯著提高從節(jié)點(diǎn)的復(fù)制速度。配置步驟如下:
在從節(jié)點(diǎn)的配置文件中添加以下配置:
slave_parallel_workers=4 # 設(shè)置并行線程數(shù) slave_parallel_type=LOGICAL_CLOCK # 設(shè)置并行類型
3. GTID(Global Transaction Identifier)
GTID可以簡化主從切換和故障恢復(fù)。配置步驟如下:
在主節(jié)點(diǎn)和從節(jié)點(diǎn)的配置文件中添加以下配置:
gtid_mode=ON enforce_gtid_consistency=ON
然后在從節(jié)點(diǎn)上使用GTID進(jìn)行復(fù)制配置:
CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='replicator', MASTER_PASSWORD='your_password', MASTER_AUTO_POSITION=1;
七、常見問題及解決方案
1. 從節(jié)點(diǎn)無法連接主節(jié)點(diǎn)
- 檢查防火墻:確保防火墻允許3306端口。
sudo ufw allow 3306/tcp
- 檢查權(quán)限:確認(rèn)主節(jié)點(diǎn)的
replicator用戶權(quán)限正確。 - 網(wǎng)絡(luò)連通性:使用
ping和telnet等工具檢查網(wǎng)絡(luò)連通性。ping 192.168.1.101 telnet 192.168.1.101 3306
2. 數(shù)據(jù)不一致
- 使用Percona Toolkit:使用
pt-table-checksum和pt-table-sync工具進(jìn)行數(shù)據(jù)一致性檢查和修復(fù)。pt-table-checksum --host=192.168.1.101 --user=root --password=your_password pt-table-sync --execute h=192.168.1.101,u=root,p=your_password h=192.168.1.102
- 配置一致性:確認(rèn)主節(jié)點(diǎn)和從節(jié)點(diǎn)的配置一致,特別是字符集和排序規(guī)則。
3. 復(fù)制延遲
- 硬件資源:檢查從節(jié)點(diǎn)的硬件資源(CPU、內(nèi)存、磁盤I/O)是否充足。
- 參數(shù)調(diào)整:調(diào)整從節(jié)點(diǎn)的
innodb_buffer_pool_size和其他相關(guān)參數(shù)。innodb_buffer_pool_size=2G # 根據(jù)實(shí)際情況調(diào)整大小
八、詳細(xì)配置示例
主節(jié)點(diǎn)配置示例 (/etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld] server-id=1 log-bin=mysql-bin binlog-do-db=testdb # 只同步指定數(shù)據(jù)庫,如需同步所有數(shù)據(jù)庫可刪除此行 expire_logs_days=7 # 自動清理過期的日志文件 max_binlog_size=100M # 單個日志文件的最大大小 relay-log=mysql-relay-bin log-slave-updates=1 # 如果需要級聯(lián)復(fù)制,則啟用此選項(xiàng) sync_binlog=1 # 確保每次提交都同步到磁盤 innodb_flush_log_at_trx_commit=1 # 確保每次提交都刷新日志到磁盤
從節(jié)點(diǎn)配置示例 (/etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld] server-id=2 # 對于第二個從節(jié)點(diǎn),使用不同的ID,如3 relay-log=mysql-relay-bin log-slave-updates=1 read-only=1 skip-slave-start=1 # 禁止啟動時自動啟動復(fù)制 slave_parallel_workers=4 # 并行復(fù)制線程數(shù) slave_parallel_type=LOGICAL_CLOCK # 并行復(fù)制類型 gtid_mode=ON # 啟用GTID enforce_gtid_consistency=ON # 強(qiáng)制GTID一致性
到此這篇關(guān)于MySQL主從集群的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySQL主從集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL下200GB大表備份的操作(利用傳輸表空間解決停服發(fā)版表備份問題)
這篇文章主要介紹了MySQL下200GB大表備份的操作(利用傳輸表空間解決停服發(fā)版表備份問題),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2025-04-04
一步步教你利用Mysql存儲過程造百萬級數(shù)據(jù)
因工作需要維護(hù)一張中建表數(shù)據(jù)內(nèi)置,所以得造數(shù)據(jù)所以使用存儲過程來造數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于如何一步步利用Mysql存儲過程造百萬級數(shù)據(jù)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
Mysql中關(guān)于on,in,as,where的區(qū)別
這篇文章主要介紹了Mysql中關(guān)于on,in,as,where的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
利用MySQL空間函數(shù)實(shí)現(xiàn)位置打卡的完整步驟
這篇文章主要給大家介紹了關(guān)于如何利用MySQL空間函數(shù)實(shí)現(xiàn)位置打卡的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
MySQL數(shù)據(jù)庫自動化備份腳本的實(shí)踐指南
數(shù)據(jù)是企業(yè)的核心資產(chǎn),定期備份數(shù)據(jù)庫是每個運(yùn)維和開發(fā)人員的必修課,本文分享一個生產(chǎn)環(huán)境驗(yàn)證過的 MySQL 自動備份腳本,支持多數(shù)據(jù)庫備份、自動壓縮、過期清理,并詳細(xì)解讀每一處細(xì)節(jié),幫助你快速搭建可靠的備份體系,需要的朋友可以參考下2026-04-04

