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

