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架構圖(草稿)

mysql多主雙向+級聯復制

2.配置

一階段,先把所有庫的master功能啟動,同時在庫中創建訪問賬號供其他庫使用:
主主庫(總服務器)
①在mysql安裝路徑下找到啟動文件my.inimy.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。本項目並發量低,可設置為1
expire_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!

推薦閱讀: