MySQL實(shí)現(xiàn)多源復(fù)制的示例代碼
MySQL的多源復(fù)制(Multi-Source Replication)允許一個(gè)從服務(wù)器從多個(gè)主服務(wù)器復(fù)制數(shù)據(jù)。這在需要將多個(gè)數(shù)據(jù)源匯聚到一個(gè)數(shù)據(jù)庫實(shí)例時(shí)非常有用,例如數(shù)據(jù)匯總和數(shù)據(jù)倉庫場景。
一、多源復(fù)制原理
多源復(fù)制的原理與單源復(fù)制類似,但一個(gè)從服務(wù)器會有多個(gè)復(fù)制通道(Replication Channel),每個(gè)通道對應(yīng)一個(gè)主服務(wù)器。每個(gè)通道獨(dú)立工作,處理各自的二進(jìn)制日志和中繼日志。
二、多源復(fù)制配置步驟
2.1 主服務(wù)器配置
假設(shè)我們有兩個(gè)主服務(wù)器(Master1和Master2)和一個(gè)從服務(wù)器(Slave)。我們需要配置兩個(gè)主服務(wù)器,使它們能夠與從服務(wù)器進(jìn)行復(fù)制。
Master1配置
- 編輯Master1的MySQL配置文件(通常為
/etc/my.cnf或/etc/mysql/my.cnf):
[mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = mydatabase1 # 指定需要復(fù)制的數(shù)據(jù)庫
- 重啟MySQL服務(wù):
sudo systemctl restart mysql
- 創(chuàng)建復(fù)制用戶并授予權(quán)限:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'replica_password'; GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%'; FLUSH PRIVILEGES;
- 確定二進(jìn)制日志文件名和位置:
SHOW MASTER STATUS;
輸出示例:
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 154 | mydatabase1 | | +------------------+----------+--------------+------------------+
Master2配置
配置過程與Master1類似,確保server-id唯一。
- 編輯Master2的MySQL配置文件:
[mysqld] server-id = 2 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = mydatabase2 # 指定需要復(fù)制的數(shù)據(jù)庫
- 重啟MySQL服務(wù):
sudo systemctl restart mysql
- 創(chuàng)建復(fù)制用戶并授予權(quán)限:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'replica_password'; GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%'; FLUSH PRIVILEGES;
- 確定二進(jìn)制日志文件名和位置:
SHOW MASTER STATUS;
輸出示例:
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 200 | mydatabase2 | | +------------------+----------+--------------+------------------+
2.2 從服務(wù)器配置
- 編輯從服務(wù)器的MySQL配置文件:
[mysqld] server-id = 3 relay-log = /var/log/mysql/mysql-relay-bin log_slave_updates = 1
- 重啟MySQL服務(wù):
sudo systemctl restart mysql
- 在從服務(wù)器上配置多個(gè)復(fù)制通道:
-- 配置從Master1復(fù)制的通道 CHANGE MASTER TO MASTER_HOST='Master1_IP', MASTER_USER='replica_user', MASTER_PASSWORD='replica_password', MASTER_LOG_FILE='mysql-bin.000001', -- Master1的File值 MASTER_LOG_POS=154 -- Master1的Position值 FOR CHANNEL 'channel1'; -- 配置從Master2復(fù)制的通道 CHANGE MASTER TO MASTER_HOST='Master2_IP', MASTER_USER='replica_user', MASTER_PASSWORD='replica_password', MASTER_LOG_FILE='mysql-bin.000001', -- Master2的File值 MASTER_LOG_POS=200 -- Master2的Position值 FOR CHANNEL 'channel2';
- 啟動多個(gè)復(fù)制通道:
START SLAVE FOR CHANNEL 'channel1'; START SLAVE FOR CHANNEL 'channel2';
- 檢查復(fù)制狀態(tài):
SHOW SLAVE STATUS FOR CHANNEL 'channel1'\G; SHOW SLAVE STATUS FOR CHANNEL 'channel2'\G;
確保每個(gè)通道的Slave_IO_Running和Slave_SQL_Running都顯示為Yes。
三、處理沖突和監(jiān)控
多源復(fù)制時(shí)可能會遇到?jīng)_突問題,例如兩個(gè)主服務(wù)器同時(shí)修改相同的數(shù)據(jù)。處理沖突的方法包括:
應(yīng)用層解決沖突:
- 在應(yīng)用層確保不會出現(xiàn)沖突,例如通過數(shù)據(jù)分區(qū)。
使用復(fù)制過濾器:
- 在從服務(wù)器上使用復(fù)制過濾器,確保只接收特定表或數(shù)據(jù)庫的修改。
[mysqld] replicate-do-db = mydatabase1 replicate-do-db = mydatabase2
- 日常監(jiān)控:
- 定期監(jiān)控復(fù)制狀態(tài),確保沒有出現(xiàn)延遲和錯(cuò)誤。
SHOW SLAVE STATUS FOR CHANNEL 'channel1'\G; SHOW SLAVE STATUS FOR CHANNEL 'channel2'\G;
四、總結(jié)
MySQL多源復(fù)制通過在從服務(wù)器上配置多個(gè)復(fù)制通道,實(shí)現(xiàn)從多個(gè)主服務(wù)器復(fù)制數(shù)據(jù)。配置多源復(fù)制需要確保每個(gè)主服務(wù)器和從服務(wù)器的server-id唯一,并分別配置和啟動每個(gè)復(fù)制通道。處理多源復(fù)制中的沖突和定期監(jiān)控復(fù)制狀態(tài),對于確保數(shù)據(jù)一致性和系統(tǒng)穩(wěn)定性至關(guān)重要。
到此這篇關(guān)于MySQL實(shí)現(xiàn)多源復(fù)制的示例代碼的文章就介紹到這了,更多相關(guān)MySQL 多源復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL出現(xiàn)"Lock?wait?timeout?exceeded"錯(cuò)誤的原因是什么詳解
這篇文章主要給大家介紹了關(guān)于MySQL出現(xiàn)"Lock?wait?timeout?exceeded"錯(cuò)誤的原因是什么的相關(guān)資料,工作中同事遇到此異常,查找解決問題時(shí),收集整理形成此篇文章,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
MySQL 虛擬列和虛擬索引的實(shí)現(xiàn)示例
在MySQL 5.7及更高版本中,虛擬列是一個(gè)非常有用的特性,本文主要介紹了MySQL 虛擬列和虛擬索引的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
MySQL遷移到Oracle數(shù)據(jù)庫的超詳細(xì)步驟和方法總結(jié)
今天接到一個(gè)任務(wù),讓我把MySQL中的表與數(shù)據(jù)移植到Oracle中,所以這里總結(jié)下,這篇文章主要給大家介紹了關(guān)于MySQL遷移到Oracle數(shù)據(jù)庫的超詳細(xì)步驟和方法,需要的朋友可以參考下2023-11-11
MYSQL數(shù)據(jù)插入之返回自增主鍵ID的方法詳解
這篇文章主要介紹了MYSQL數(shù)據(jù)插入之返回自增主鍵ID的方法詳解,mysql中的insert插入之后會有返回值,返回的是影響的行數(shù),也就是說,成功插入一條數(shù)據(jù)之后返回的是1,失敗則返回0,那么,很多時(shí)候我們都想要得到最后插入的id值,需要的朋友可以參考下2023-10-10
詳細(xì)聊聊關(guān)于Mysql聯(lián)合查詢的那些事兒
聯(lián)合查詢union將多次查詢(多條select語句)的結(jié)果,在字段數(shù)相同的情況下,在記錄的層次上進(jìn)行拼接,這篇文章主要給大家介紹了關(guān)于Mysql聯(lián)合查詢的那些事兒,需要的朋友可以參考下2021-10-10
mysql變量用法實(shí)例分析【系統(tǒng)變量、用戶變量】
這篇文章主要介紹了mysql變量用法,結(jié)合實(shí)例形式分析了mysql系統(tǒng)變量、用戶變量相關(guān)概念、功能、原理與使用技巧,需要的朋友可以參考下2020-04-04
Mysql使用concat函數(shù)實(shí)現(xiàn)關(guān)鍵字模糊查詢功能(列表數(shù)據(jù)過濾含前后端代碼)
在我們的平時(shí)開發(fā)中經(jīng)常會遇到根據(jù)條件過濾列表數(shù)據(jù)項(xiàng),今天在做自己項(xiàng)目的時(shí)候就遇到了這個(gè)問題,正好借著這個(gè)機(jī)會分享我的思路以及相關(guān)的代碼,對Mysql使用concat函數(shù)實(shí)現(xiàn)關(guān)鍵字模糊查詢功能感興趣的朋友一起看看吧2023-02-02

