mysql多主雙向和級聯復制
前言:
公司項目需求,要做一個內網用的物品管理的web
系統,其中一個要求是要每個單位的本地PC在內網離線狀態下(即無法訪問總服務器)也能使用系統的服務。項目架構設計的是在線狀態時訪問總服務器,離線時,用戶訪問本地服務(是的,我們在每個本地PC上也部署瞭服務)。
註:
下級單位的本地PC能訪問到總服務器時,稱為在線,反之稱為離線
一.解讀
在離線狀態的切換,對於web
服務來說沒什麼影響,畢竟代碼是一樣的,所以不管部署在哪都一樣。區別就是數據庫中的數據。這就要求我們的主庫,以及每個本機PC上部署的從庫,他們之間能實現數據的自主同步。
關於可能的沖突,我們已經在業務層規避掉瞭。不同的單位,不會update相同的字段。不同的單位,不會在相同的表中insert。所以現在就隻用關心mysql的自動同步,以及離線重連的自動續傳瞭。
二.web設計
1.web後端,我設置瞭讀寫分離(隻是為瞭裝一下,其實大可不必,畢竟內網並發量不高)
2.在線時,單位的訪問,均select本地mysql,update/insert/delete總服務器mysql
3.離線時,單位的訪問,均在本地mysql
(這很好實現,不同的域名地址,對應不同的項目,項目內提前設定好數據庫router,由用戶自主決定訪問哪個域名地址即可。實際上,如果斷網瞭,總服務器訪問不通,他會自然而然的去訪問本機服務的域名地址)
三.mysql設計
1.同步方式毋庸置疑用的是mysql自帶的binlog
,mysql版本要選擇5.7及以上的版本
2.多主雙向:每個本機PC上的mysql
,要與總服務器上的mysql保持雙主同步。
3.總服務器要開啟級聯復制,將下級單位PC產生的binlog,同步給其他單位的PC。以便其他單位的PC在離線時可以使用這部分數據
四、實操
1.mysql架構圖(草稿)
2.配置
一階段,先把所有庫的master
功能啟動,同時在庫中創建訪問賬號供其他庫使用:
主主庫(總服務器)
①在mysql安裝路徑下找到啟動文件my.ini
或my.cnf
,將如下信息放在啟動文件的[mysqld]下:
log_bin=mysql-bin binlog_format=MIXED sync_binlog=1 expire_logs_days=7 binlog-do-db=equip_system slave-skip-errors=all master_info_repository=table relay_log_info_repository=table log-slave-updates=1
各參數的釋義:
log_bin=mysql-bin:配置為mysql-bin時,mysql開啟binlog功能
binlog_format=MIXED:binlog的記錄方式,MIXED為混合記錄方式
sync_binlog=1:
觸發binlog由緩存刷新到磁盤所需要提交的事務數量,默認為0表示由磁盤文件系統控制,為1表示每提交一個事務即刷新一次(此時最安全,服務異常時丟失的事務最多隻有1個,但IO消耗最大,高並發下忌用),常見的DBA一般設置為100。本項目並發量低,可設置為1expire_logs_days=7:
binlog有效時長,設置為7表示binlog存在7天後刪除binlog-do-db=equip_system:
要同步的數據庫名slave-skip-errors=all:
表示同步出現異常時要跳過哪些異常,設置為all表示所有異常的同步都直接跳過不管。是否可以設置為all,要結合項目的具體業務。本項目可以。master_info_repository=table:
可選< table | file >,設置為table更穩定,重啟服務時可以自動續傳relay_log_info_repository=table:
可選< table | file >,設置為table更穩定,重啟服務時可以自動續傳
log-slave-updates=1:配置為1表示開啟級聯復制
記得修改server-id,架構內互聯的mysql均不能相同
server-id=100
②重啟sql服務
③進入mysql命令行,執行以下命令
values為ON表示開啟binlog成功
show variables like '%log_bin%';
有幾個從主庫,就創建幾個賬號,註意這個賬號密碼提前確定好記好,搞亂瞭就很頭大:
CREATE USER '被同步庫的賬號名'@'被同步庫的ip' IDENTIFIED BY '被同步庫賬號的密碼'; GRANT REPLICATION SLAVE ON *.* TO '被同步庫的賬號名'@'被同步庫的ip';
刷新權限:
flush privileges;
查看master狀態:
show master status;
返回結果:
這個形如"mysql-bin.000003"
的值要記錄上,從主庫連接時要用
主主庫的一階段配置完成瞭
從主庫:
①在mysql安裝路徑下找到啟動文件my.ini或my.cnf,將如下信息放在啟動文件的[mysqld]下:
log_bin=mysql-bin binlog_format=MIXED sync_binlog=1 expire_logs_days=7 binlog-do-db=equip_system slave-skip-errors=all master_info_repository=table relay_log_info_repository=table
以上參數和主主庫是一樣的,區別在於從主庫不需要開啟級聯復制。記得修改server-id
後邊過程和主主庫的配置是一樣的,畢竟都是開啟master功能的,這裡就不贅述瞭。把產出的形如"mysql-bin.000003"
的值記錄下來就好瞭
一階段各個庫的master功能配置完成
二階段,配置各個庫的slave功能,即將其與要同步的庫建立連接
從主庫隻需跟主主庫建立連接即可
在mysql命令行中執行以下命令:
設置連接master的參數:
CHANGE MASTER TO MASTER_HOST='要同步的對方庫的ip', MASTER_PORT=對方庫的端口號, MASTER_USER='對方庫為你創建的賬號名', MASTER_PASSWORD='對方庫為你創建的密碼',MASTER_LOG_FILE='對方庫master狀態產出的File的值';
啟動slave建立連接:
start slave;
查看連接狀態:
show slave status\G
返回結果:
兩個Running
都為Yes時,表示連接成功瞭。不成功請自行查閱資料debug。我這裡是對方庫沒開。
其餘從主庫操作一樣,都是設置連接參數、啟動slave
建立連接、查看連接狀態
主主庫:
主主庫流程同樣是設置連接參數、啟動slave建立連接、查看連接狀態。不同點在於要設置多個master連接參數,所以設置連接參數的命令有一個小的變化,要多一個通道channel的設置,命令如下:
配置與從主庫2的連接參數
CHANGE MASTER TO MASTER_HOST='從主庫1的ip', MASTER_PORT='從主庫1的端口號', MASTER_USER='從主庫1為你創建的賬號名', MASTER_PASSWORD='從主庫1為你創建的密碼',MASTER_LOG_FILE='從主庫1的master狀態的File值'for channel '1';
配置與從主庫2的連接參數:
CHANGE MASTER TO MASTER_HOST='從主庫2的ip', MASTER_PORT='從主庫2的端口號', MASTER_USER='從主庫2為你創建的賬號名', MASTER_PASSWORD='從主庫2為你創建的密碼',MASTER_LOG_FILE='從主庫2的master狀態的File值'for channel '2';
有幾個配幾個:
...
啟動slave:
start slave;
查看slave狀態:
show slave status\G
返回結果有多個status
,依次查看,依次核對即可。
結語:
該架構具有高可用強穩定的特性:具有多主一從,一主多從,雙主架構的所有優勢:1.上方多增加一個主主庫2,形成雙機熱備提高容災能力;2.增加大量從主庫,進行讀寫分離,提高高並發下的性能;3.內網離線產生的數據在切換至在線狀態時自動同步至所有其他庫;
到此這篇關於mysql多主雙向和級聯復制的文章就介紹到這瞭,更多相關mysql多主雙向+級聯復制內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!