mysql多主雙向和級聯(lián)復(fù)制
前言:
公司項(xiàng)目需求,要做一個內(nèi)網(wǎng)用的物品管理的web
系統(tǒng),其中一個要求是要每個單位的本地PC在內(nèi)網(wǎng)離線狀態(tài)下(即無法訪問總服務(wù)器)也能使用系統(tǒng)的服務(wù)。項(xiàng)目架構(gòu)設(shè)計(jì)的是在線狀態(tài)時訪問總服務(wù)器,離線時,用戶訪問本地服務(wù)(是的,我們在每個本地PC上也部署了服務(wù))。
注:
下級單位的本地PC能訪問到總服務(wù)器時,稱為在線,反之稱為離線
一.解讀
在離線狀態(tài)的切換,對于web
服務(wù)來說沒什么影響,畢竟代碼是一樣的,所以不管部署在哪都一樣。區(qū)別就是數(shù)據(jù)庫中的數(shù)據(jù)。這就要求我們的主庫,以及每個本機(jī)PC上部署的從庫,他們之間能實(shí)現(xiàn)數(shù)據(jù)的自主同步。
關(guān)于可能的沖突,我們已經(jīng)在業(yè)務(wù)層規(guī)避掉了。不同的單位,不會update相同的字段。不同的單位,不會在相同的表中insert。所以現(xiàn)在就只用關(guān)心mysql的自動同步,以及離線重連的自動續(xù)傳了。
二.web設(shè)計(jì)
1.web后端,我設(shè)置了讀寫分離(只是為了裝一下,其實(shí)大可不必,畢竟內(nèi)網(wǎng)并發(fā)量不高)
2.在線時,單位的訪問,均select本地mysql,update/insert/delete總服務(wù)器mysql
3.離線時,單位的訪問,均在本地mysql
(這很好實(shí)現(xiàn),不同的域名地址,對應(yīng)不同的項(xiàng)目,項(xiàng)目內(nèi)提前設(shè)定好數(shù)據(jù)庫router,由用戶自主決定訪問哪個域名地址即可。實(shí)際上,如果斷網(wǎng)了,總服務(wù)器訪問不通,他會自然而然的去訪問本機(jī)服務(wù)的域名地址)
三.mysql設(shè)計(jì)
1.同步方式毋庸置疑用的是mysql自帶的binlog
,mysql版本要選擇5.7及以上的版本
2.多主雙向:每個本機(jī)PC上的mysql
,要與總服務(wù)器上的mysql保持雙主同步。
3.總服務(wù)器要開啟級聯(lián)復(fù)制,將下級單位PC產(chǎn)生的binlog,同步給其他單位的PC。以便其他單位的PC在離線時可以使用這部分?jǐn)?shù)據(jù)
四、實(shí)操
1.mysql架構(gòu)圖(草稿)
2.配置
一階段,先把所有庫的master
功能啟動,同時在庫中創(chuàng)建訪問賬號供其他庫使用:
主主庫(總服務(wù)器)
①在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
各參數(shù)的釋義:
log_bin=mysql-bin:配置為mysql-bin時,mysql開啟binlog功能
binlog_format=MIXED:binlog的記錄方式,MIXED為混合記錄方式
sync_binlog=1:
觸發(fā)binlog由緩存刷新到磁盤所需要提交的事務(wù)數(shù)量,默認(rèn)為0表示由磁盤文件系統(tǒng)控制,為1表示每提交一個事務(wù)即刷新一次(此時最安全,服務(wù)異常時丟失的事務(wù)最多只有1個,但I(xiàn)O消耗最大,高并發(fā)下忌用),常見的DBA一般設(shè)置為100。本項(xiàng)目并發(fā)量低,可設(shè)置為1expire_logs_days=7:
binlog有效時長,設(shè)置為7表示binlog存在7天后刪除binlog-do-db=equip_system:
要同步的數(shù)據(jù)庫名slave-skip-errors=all:
表示同步出現(xiàn)異常時要跳過哪些異常,設(shè)置為all表示所有異常的同步都直接跳過不管。是否可以設(shè)置為all,要結(jié)合項(xiàng)目的具體業(yè)務(wù)。本項(xiàng)目可以。master_info_repository=table:
可選< table | file >,設(shè)置為table更穩(wěn)定,重啟服務(wù)時可以自動續(xù)傳relay_log_info_repository=table:
可選< table | file >,設(shè)置為table更穩(wěn)定,重啟服務(wù)時可以自動續(xù)傳
log-slave-updates=1:配置為1表示開啟級聯(lián)復(fù)制
記得修改server-id,架構(gòu)內(nèi)互聯(lián)的mysql均不能相同
server-id=100
②重啟sql服務(wù)
③進(jìn)入mysql命令行,執(zhí)行以下命令
values為ON表示開啟binlog成功
show variables like '%log_bin%';
有幾個從主庫,就創(chuàng)建幾個賬號,注意這個賬號密碼提前確定好記好,搞亂了就很頭大:
CREATE USER '被同步庫的賬號名'@'被同步庫的ip' IDENTIFIED BY '被同步庫賬號的密碼';? GRANT REPLICATION SLAVE ON *.* TO '被同步庫的賬號名'@'被同步庫的ip';
刷新權(quán)限:
flush privileges;
查看master狀態(tài):
show master status;
返回結(jié)果:
這個形如"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
以上參數(shù)和主主庫是一樣的,區(qū)別在于從主庫不需要開啟級聯(lián)復(fù)制。記得修改server-id
后邊過程和主主庫的配置是一樣的,畢竟都是開啟master功能的,這里就不贅述了。把產(chǎn)出的形如"mysql-bin.000003"
的值記錄下來就好了
一階段各個庫的master功能配置完成
二階段,配置各個庫的slave功能,即將其與要同步的庫建立連接
從主庫只需跟主主庫建立連接即可
在mysql命令行中執(zhí)行以下命令:
設(shè)置連接master的參數(shù):
CHANGE MASTER TO MASTER_HOST='要同步的對方庫的ip', MASTER_PORT=對方庫的端口號, MASTER_USER='對方庫為你創(chuàng)建的賬號名', MASTER_PASSWORD='對方庫為你創(chuàng)建的密碼',MASTER_LOG_FILE='對方庫master狀態(tài)產(chǎn)出的File的值';
啟動slave建立連接:
start slave;
查看連接狀態(tài):
show slave status\G
返回結(jié)果:
兩個Running
都為Yes時,表示連接成功了。不成功請自行查閱資料debug。我這里是對方庫沒開。
其余從主庫操作一樣,都是設(shè)置連接參數(shù)、啟動slave
建立連接、查看連接狀態(tài)
主主庫:
主主庫流程同樣是設(shè)置連接參數(shù)、啟動slave建立連接、查看連接狀態(tài)。不同點(diǎn)在于要設(shè)置多個master連接參數(shù),所以設(shè)置連接參數(shù)的命令有一個小的變化,要多一個通道channel的設(shè)置,命令如下:
配置與從主庫2的連接參數(shù)
CHANGE MASTER TO MASTER_HOST='從主庫1的ip', MASTER_PORT='從主庫1的端口號', MASTER_USER='從主庫1為你創(chuàng)建的賬號名', MASTER_PASSWORD='從主庫1為你創(chuàng)建的密碼',MASTER_LOG_FILE='從主庫1的master狀態(tài)的File值'for channel '1';
配置與從主庫2的連接參數(shù):
CHANGE MASTER TO MASTER_HOST='從主庫2的ip', MASTER_PORT='從主庫2的端口號', MASTER_USER='從主庫2為你創(chuàng)建的賬號名', MASTER_PASSWORD='從主庫2為你創(chuàng)建的密碼',MASTER_LOG_FILE='從主庫2的master狀態(tài)的File值'for channel '2';
有幾個配幾個:
...
啟動slave:
start slave;
查看slave狀態(tài):
show slave status\G
返回結(jié)果有多個status
,依次查看,依次核對即可。
結(jié)語:
該架構(gòu)具有高可用強(qiáng)穩(wěn)定的特性:具有多主一從,一主多從,雙主架構(gòu)的所有優(yōu)勢:1.上方多增加一個主主庫2,形成雙機(jī)熱備提高容災(zāi)能力;2.增加大量從主庫,進(jìn)行讀寫分離,提高高并發(fā)下的性能;3.內(nèi)網(wǎng)離線產(chǎn)生的數(shù)據(jù)在切換至在線狀態(tài)時自動同步至所有其他庫;
到此這篇關(guān)于mysql多主雙向和級聯(lián)復(fù)制的文章就介紹到這了,更多相關(guān)mysql多主雙向+級聯(lián)復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mac os 解決無法使用localhost連接mysql問題
今天在mac上搭建好了php的環(huán)境,把先前在window、linux下運(yùn)行良好的程序放在mac上,居然出現(xiàn)訪問不了數(shù)據(jù)庫,數(shù)據(jù)庫連接的host用的是localhost,可以確認(rèn)數(shù)據(jù)庫配置是正確的,下面特為大家分享下2014-05-05mysql生成指定位數(shù)的隨機(jī)數(shù)及批量生成隨機(jī)數(shù)的方法
這篇文章主要介紹了mysql生成指定位數(shù)的隨機(jī)數(shù)及批量生成隨機(jī)數(shù)的方法,文中給大家介紹了常用mysql函數(shù),需要的朋友可以參考下2018-09-09