有的時(shí)候博客內(nèi)容會(huì)有變動(dòng)嬉挡,首發(fā)博客是最新的钝鸽,其他博客地址可能會(huì)未同步,認(rèn)準(zhǔn)
https://blog.zysicyj.top
注意:這篇轉(zhuǎn)載文章,非原創(chuàng)
前言
MySQL的高可用有很多種庞钢,有我們經(jīng)常說的MMM架構(gòu)拔恰、MHA架構(gòu)、MGR架構(gòu)基括。在這一篇文章中我們先討論MMM架構(gòu)的高可用仁连,后續(xù)在分析MHA和MGR,其中的MGR有點(diǎn)類似于percona推出的PXC集群
集群 VS 高可用
在MySQL數(shù)據(jù)庫中阱穗,什么是集群饭冬?什么是高可用?最早我理解的是只要有了讀寫分離的組從集群架構(gòu)揪阶,就是擁有高可用的架構(gòu)了〔伲現(xiàn)在想想,當(dāng)初的想法是多么的天真鲁僚。MySQL集群和MySQL的高可用是兩個(gè)概念炊苫,我們不能把他們混為一談。
集群是指你多臺(tái)MySQL數(shù)據(jù)庫實(shí)例冰沙,有一個(gè)可以提供寫侨艾,多個(gè)提供讀、或者有多個(gè)可以寫拓挥,多個(gè)可以讀唠梨。比如我們配置了讀寫分離的一主多從的集群架構(gòu),或者雙主多從的集群架構(gòu)侥啤。此時(shí)当叭,我們只是有了MySQL的集群,在讀寫性能上有鎖提升盖灸,但是此時(shí)并不是一個(gè)高可用的MySQL架構(gòu)蚁鳖。
高可用是指在任意一個(gè)時(shí)刻,我們的MySQL都可以提供讀寫的服務(wù)赁炎,不會(huì)因?yàn)槟骋粋€(gè)MySQL數(shù)據(jù)庫實(shí)例宕機(jī)而導(dǎo)致MySQL數(shù)據(jù)不能正常讀寫醉箕,此時(shí)才是高可用。從某種意義上來說徙垫,高可用要在集群的基礎(chǔ)上才可以實(shí)現(xiàn)讥裤,也就是說,要想高可用松邪,必須先把集群搭建起來坞琴。有了MySQL的集群,才可以談?wù)揗ySQL的高可用逗抑,沒有MySQL的集群剧辐,談MySQL的高可用猶如空中樓閣寒亥。
拿我們前面說的雙主多從的MySQL集群架構(gòu)來說,兩個(gè)主在同一個(gè)時(shí)間點(diǎn)荧关,若只有一個(gè)主對(duì)外提供寫的服務(wù)溉奕,此時(shí)如果其中一個(gè)主宕機(jī),另外一個(gè)主可以頂替原先的主對(duì)外提供寫的服務(wù)忍啤,同時(shí)其他的從可以把同步的數(shù)據(jù)源切換到新的主上面來加勤,這樣的一個(gè)集群就是一個(gè)高可用的架構(gòu)。
有了MySQL的集群同波,并不一定就有MySQL的高可用鳄梅。但是如果有了MySQL的高可用,那么此時(shí)它一定是一個(gè)MySQL集群未檩。高可用需要在集群的基礎(chǔ)上來配合其他組件才能實(shí)現(xiàn)戴尸。
MMM高可用架構(gòu)
什么是MMM
所謂的MMM只是:Multi-Master Replication Manager for
MySQL,取其中的三個(gè)M開頭的單詞簡寫冤狡。它是mysql多主復(fù)制管理器孙蒙,基于perl實(shí)現(xiàn),關(guān)于mysql主主復(fù)制配置的監(jiān)控悲雳、故障轉(zhuǎn)移和管理的一套可伸縮的腳本套件(在任何時(shí)候只有一個(gè)節(jié)點(diǎn)可以被寫入)挎峦,MMM也能對(duì)從服務(wù)器進(jìn)行讀負(fù)載均衡,所以可以用它來在一組用于復(fù)制的服務(wù)器啟動(dòng)虛擬ip合瓢,除此之外坦胶,它還有實(shí)現(xiàn)數(shù)
據(jù)備份、節(jié)點(diǎn)之間重新同步功能的腳本歪玲。
MySQL本身沒有提供replication failover的解決方案迁央,通過MMM方案
能實(shí)現(xiàn)服務(wù)器的故障轉(zhuǎn)移掷匠,從而實(shí)現(xiàn)mysql的高可用滥崩。MMM不僅能提供浮動(dòng)IP的功能,如果當(dāng)前的主服務(wù)器掛掉后讹语,會(huì)將你后端的從服務(wù)器自動(dòng)轉(zhuǎn)向新的主服務(wù)器進(jìn)行同步復(fù)制钙皮,不用手工更改同步配置。
從字面來理解就是它有兩個(gè)master節(jié)點(diǎn)顽决,并且實(shí)現(xiàn)了這兩個(gè)master節(jié)點(diǎn)的高可用短条。它的架構(gòu)如下所示:
MMM主要功能,由下面三個(gè)腳本提供:
mmm_mond 負(fù)責(zé)所有的監(jiān)控工作的監(jiān)控守護(hù)進(jìn)程才菠,決定節(jié)點(diǎn)的移除(mmm_mond進(jìn)程定 時(shí)心跳檢測(cè)茸时,失敗則將write
ip浮動(dòng)到另外一臺(tái)master)mmm_agentd 運(yùn)行在mysql服務(wù)器上的代理守護(hù)進(jìn) 程,通過簡單遠(yuǎn)程服務(wù)集提供給監(jiān)控節(jié)點(diǎn)
mmm_control 通過命令行管理mmm_mond進(jìn)程 在整個(gè)監(jiān)管過程中赋访,
需要在mysql中添加相關(guān)授權(quán)用戶可都,授權(quán)的用戶包括一個(gè)mmm_monitor用戶和一個(gè)mmm_agent用戶缓待,如果想使用mmm的備份工具則還要添加一個(gè)mmm_tools用戶。
MMM架構(gòu)的優(yōu)點(diǎn)
可以兼容不同系列的MySQL來做高可用渠牲。比如有MySQL官方社區(qū)版本旋炒,有percona版本的,有MariaDB版本的MySQL签杈。這樣的集群可以可以使用MMM架構(gòu)來做高可用瘫镇。
高可用性,擴(kuò)展性好答姥,出現(xiàn)故障自動(dòng)切換铣除,對(duì)于主主同步,在同一時(shí)間只提供一臺(tái)數(shù)據(jù)庫寫操作鹦付,保證 的數(shù)據(jù)的一致性通孽。
當(dāng)主服務(wù)器掛掉以后,另一個(gè)主立即接管睁壁,其他的從服務(wù)器能自動(dòng)切換背苦,不用人工干預(yù)。
MMM架構(gòu)的缺點(diǎn)
是一種比較老的MySQL高可用實(shí)現(xiàn)方式潘明,因?yàn)樯鐓^(qū)不活躍行剂,所以目前已經(jīng)沒有人在維護(hù)這個(gè)組件了。
只能基于日之點(diǎn)的主從復(fù)制集群架構(gòu)來做高可用钳降,不支持基于GTID的主從復(fù)制集群架構(gòu)厚宰。這也是因?yàn)樯鐓^(qū)活躍,沒有維護(hù)這個(gè)組件導(dǎo)致不支持GTID遂填。
數(shù)據(jù)不能保證100%的一致性铲觉,這個(gè)是以為它在做故障轉(zhuǎn)移的時(shí)候?qū)崿F(xiàn)的方式所導(dǎo)致的。如果對(duì)于數(shù)據(jù)需要強(qiáng)一致性吓坚,則不能選擇MMM高可用架構(gòu)频丘,可以考慮MHA高可用架構(gòu)光坝。
monitor節(jié)點(diǎn)是單點(diǎn),不過這個(gè)可以結(jié)合keepalived或者h(yuǎn)aertbeat做成高可用。
至少三個(gè)節(jié)點(diǎn)员萍,2個(gè)master瓷马,1個(gè)slave糠涛,對(duì)主機(jī)的數(shù)量有要求社搅,
在讀寫非常繁忙的業(yè)務(wù)系統(tǒng)下表現(xiàn)不是很穩(wěn)定,可能會(huì)出現(xiàn)復(fù)制延時(shí)挚躯、切換失效等問題强衡。
MMM方案并不太適應(yīng)于對(duì)數(shù)據(jù)安全性要求很高,并且讀码荔、寫 繁忙的環(huán)境中漩勤。
需要實(shí)現(xiàn)讀寫分離号涯,還需要在前端編寫讀寫分離程序,或者結(jié)合數(shù)據(jù)庫中間件如mycat來解決锯七。
如何搭建MMM高可用架構(gòu)
要想實(shí)現(xiàn)MMM高可用架構(gòu)链快,我們先來搭建一個(gè)雙主雙從的MySQL集群,然后在這個(gè)集群的基礎(chǔ)上來完成MMM高可用的架構(gòu)眉尸。
我們準(zhǔn)備搭建的MySQL-MMM高可用架構(gòu)的網(wǎng)絡(luò)拓?fù)淙缦滤荆盒枰⒁獾氖瞧渲械腣IP域蜗,這幾個(gè)IP不需要我們自己創(chuàng)建,MMM服務(wù)會(huì)自動(dòng)的在各個(gè)節(jié)點(diǎn)分配這些VIP噪猾。其中的綠色字體read
vip霉祸,它并不會(huì)嚴(yán)格的按照我們下圖中分配是主機(jī)來分配,而是隨機(jī)的將這4個(gè)read vip分布到4個(gè)數(shù)據(jù)庫節(jié)點(diǎn)上袱蜡,但是紅色字體的write
vip只會(huì)在master1或master2上面隨著master1和master2節(jié)點(diǎn)宕機(jī)和恢復(fù)來回切換丝蹭。
搭建雙主雙從的MySQL集群
準(zhǔn)備MySQL數(shù)據(jù)庫環(huán)境
我們使用docker來啟動(dòng)4個(gè)MySQL容器,作為雙主雙從的四個(gè)MySQL數(shù)據(jù)庫實(shí)例坪蚁。容器鏡像的名稱為mysql:5.7.31
奔穿,這個(gè)鏡像是docker hub上面MySQL官方提供的鏡像,它是基于Debian buster
版本制作的MySQL容器鏡像敏晤。所以贱田,我們的MySQL數(shù)據(jù)庫服務(wù)器,可以任務(wù)是一個(gè)minimal版本的Debian系統(tǒng)嘴脾。
為了方便管理男摧,我們先創(chuàng)建一個(gè)docker虛擬網(wǎng)段,然后在啟動(dòng)四個(gè)MySQL數(shù)據(jù)庫的時(shí)候译打,指定數(shù)據(jù)庫服務(wù)器的IP地址并且使用這個(gè)網(wǎng)段耗拓。創(chuàng)建網(wǎng)段的命令如下:
docker network create --subnet=172.20.0.0/24 mysql-ha-mmm-network
我們使用下面的四條命令,啟動(dòng)4個(gè)MySQL數(shù)據(jù)庫實(shí)例奏司。這里我們把每一個(gè)數(shù)據(jù)庫的`my.cnf`
配置文件已經(jīng)在本地配置好乔询,然后通過數(shù)據(jù)卷的方式掛載到MySQL容器中,這樣我們啟動(dòng)的MySQL數(shù)據(jù)庫實(shí)例就會(huì)按照我們配置的`my.cnf`
配置文件來啟動(dòng)并配置我們的MySQL數(shù)據(jù)庫實(shí)例结澄。
# 啟動(dòng)master1節(jié)點(diǎn)
docker run --net=mysql-ha-mmm-network --hostname master1.mysql --ip 172.20.0.11 --cap-add NET\_ADMIN --name
mysql-ha-mmm-master1 -d -v Users/coder-home/docker\_mysql\_ha/mmm/master1:/etc/mysql/conf.d -e MYSQL\_ROOT_PASSWORD=root
-e TZ="Asia/Shanghai" -p 33011:3306 mysql:5.7.31
# 啟動(dòng)slave1節(jié)點(diǎn)
docker run --net=mysql-ha-mmm-network --hostname slave1.mysql --ip 172.20.0.12 --cap-add NET\_ADMIN --name
mysql-ha-mmm-slave1 -d -v Users/coder-home/docker\_mysql\_ha/mmm/slave1:/etc/mysql/conf.d -e MYSQL\_ROOT_PASSWORD=root
-e TZ="Asia/Shanghai" -p 33012:3306 mysql:5.7.31
# 啟動(dòng)master2節(jié)點(diǎn)
docker run --net=mysql-ha-mmm-network --hostname master2.mysql --ip 172.20.0.21 --cap-add NET\_ADMIN --name
mysql-ha-mmm-master2 -d -v Users/coder-home/docker\_mysql\_ha/mmm/master2:/etc/mysql/conf.d -e MYSQL\_ROOT_PASSWORD=root
-e TZ="Asia/Shanghai" -p 33021:3306 mysql:5.7.31
# 啟動(dòng)slave2節(jié)點(diǎn)
docker run --net=mysql-ha-mmm-network --hostname slave2.mysql --ip 172.20.0.22 --cap-add NET\_ADMIN --name
mysql-ha-mmm-slave2 -d -v Users/coder-home/docker\_mysql\_ha/mmm/slave2:/etc/mysql/conf.d -e MYSQL\_ROOT_PASSWORD=root
-e TZ="Asia/Shanghai" -p 33022:3306 mysql:5.7.31
這里解釋一下docker run
后面幾個(gè)重要的參數(shù)和含義哥谷。
--net=mysql-ha-mmm-network:指定容器運(yùn)行的時(shí)候使用的網(wǎng)段。
--hostname slave2.mysql:指定容器的主機(jī)名稱麻献。
--ip 172.20.0.22:指定容器使用的IP地址。
--cap-add NET_ADMIN:默認(rèn)容器運(yùn)行的時(shí)候猜扮,沒有增加額外的Linux的功能勉吻,這里我們要增加上NET_ADMIN的功能,否則我們不能再啟動(dòng)后的容器內(nèi)使用ifconfig命令增加虛擬IP旅赢。否則會(huì)有如下錯(cuò)誤提示:
root@test:/etc/network# ifconfig eth0:0 192.168.1.100 up
SIOCSIFADDR: Operation not permitted
SIOCSIFFLAGS: Operation not permitted
SIOCSIFFLAGS: Operation not permitted
root@test:/etc/network#
--name mysql-ha-mmm-slave2:指定容器的名稱為
mysql-ha-mmm-slave2
齿桃,后面我們?cè)谕V够蛑貑⑷萜鞯臅r(shí)候惑惶,可以通過這個(gè)名稱來操作容器。-d:以demon進(jìn)程的方式運(yùn)行容器短纵。
-v Users/coder-home/docker_mysql_ha/mmm/slave2:
/etc/mysql/conf.d:把本地的/Users/coder-home/docker_mysql_ha/mmm/slave2
目錄掛載到容器中的/etc/mysql/conf.d
目錄下带污。-e MYSQL_ROOT_PASSWORD=root:向容器內(nèi)傳入?yún)?shù),我們指定MySQL數(shù)據(jù)庫root用戶的密碼也為root香到。
-e TZ="Asia/Shanghai":向容器內(nèi)傳入?yún)?shù)鱼冀,這里我們指定的容器中使用的系統(tǒng)的時(shí)區(qū)為上海時(shí)間。
-p 33022:3306:我們指定容器中的3306端口悠就,映射到我們本地為33022千绪。這樣我們?cè)诒镜卦L問MySQL服務(wù)的時(shí)候,就可以通過33022端口來訪問梗脾。
mysql:5.7.31:這個(gè)是我們要運(yùn)行的容器的名稱和版本荸型。如果本地沒有這個(gè)容器名稱和版本,則會(huì)從docker
hub中自動(dòng)拉取這個(gè)鏡像名稱和版本到本地炸茧,然后再啟動(dòng)這個(gè)鏡像瑞妇。
容器啟動(dòng)后,我們可以查看啟動(dòng)后的結(jié)果如下:
? ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5207089da9a5 mysql:5.7.31 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:
33022->3306/tcp mysql-ha-mmm-slave2
1c8ff5960272 mysql:5.7.31 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:
33021->3306/tcp mysql-ha-mmm-master2
d8d646ba25f1 mysql:5.7.31 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:
33012->3306/tcp mysql-ha-mmm-slave1
d3d75d9cd930 mysql:5.7.31 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:
33011->3306/tcp mysql-ha-mmm-master1
? ~
下面我們查看每一個(gè)MySQL數(shù)據(jù)庫容器的host文件中的IP地址:
- master1的host文件如下:
? ~ docker exec -it mysql-ha-mmm-master1 bin/bash
root@master1:/# cat etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.0.11 master1.mysql master1
root@master1:/#
- master2的host文件如下:
? ~ docker exec -it mysql-ha-mmm-master2 bin/bash
root@master2:/# cat etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.0.21 master2.mysql master2
root@master2:/#
- slave1的host文件如下:
? ~ docker exec -it mysql-ha-mmm-slave1 bin/bash
root@slave1:/# cat etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.0.12 slave1.mysql slave1
root@slave1:/#
- slave2的host文件如下:
? ~ docker exec -it mysql-ha-mmm-slave2 bin/bash
root@slave2:/# cat etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.0.22 slave2.mysql slave2
root@slave2:/#
上面我們啟動(dòng)的四個(gè)MySQL數(shù)據(jù)庫實(shí)例梭冠,我們還需要一個(gè)監(jiān)控節(jié)點(diǎn)踪宠,下面啟動(dòng)一個(gè)監(jiān)控節(jié)點(diǎn),用于安裝MMM的監(jiān)控服務(wù)妈嘹。
為了和其他環(huán)境一致柳琢,這里我們也使用上面MySQL的鏡像。如下是啟動(dòng)一個(gè)新的MySQL容器润脸,這個(gè)容器柬脸,我們不在掛載MySQL的my.cnf配置文件了,因?yàn)檫@個(gè)MySQL數(shù)據(jù)庫我們不會(huì)使用毙驯,我們只是在這個(gè)容器中安裝MMM的監(jiān)控服務(wù)倒堕,我們此時(shí)把這個(gè)MySQL數(shù)據(jù)庫容器當(dāng)成一個(gè)Debian版本的虛擬機(jī)來使用。
啟動(dòng)監(jiān)控節(jié)點(diǎn)
docker run --net=mysql-ha-mmm-network --hostname monitor.mysql --ip 172.20.0.10 --cap-add NET\_ADMIN --name
mysql-ha-mmm-monitor -d -e MYSQL\_ROOT_PASSWORD=root -e TZ="Asia/Shanghai" -p 33010:3306 mysql:5.7.31
查看這個(gè)監(jiān)控節(jié)點(diǎn)的host文件如下:
? ~ docker exec -it mysql-ha-mmm-monitor bin/bash
root@monitor:~# cat etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.0.10 monitor.mysql monitor
root@monitor:~#
創(chuàng)建主從同步的數(shù)據(jù)庫用戶
在組從同步的時(shí)候爆价,從需要使用一個(gè)指定的用戶去連接到主上面同步主上面的binlog日志垦巴。所以,我們需要在我們的主上面創(chuàng)建好這樣的一個(gè)用戶铭段。因?yàn)樵趍aster1宕機(jī)之后骤宣,MMM組件會(huì)將master2提升為新的主庫,所以需要在master1和master2上面都創(chuàng)建一個(gè)這樣的用戶序愚,也就是下的命令需要在兩個(gè)master節(jié)點(diǎn)上都執(zhí)行一下憔披。
create user 'repl_user'@'172.20.0.%' identified by 'repl_user';
grant replication slave on *.* to 'repl_user'@'172.20.0.%';
歷史數(shù)據(jù)的同步
如果我們并不是基于一個(gè)新的集群環(huán)境來搭建,而是基于一個(gè)已經(jīng)運(yùn)行了一段時(shí)間的MySQL數(shù)據(jù)庫來做集群,此時(shí)我們需要把選定的master節(jié)點(diǎn)上面的數(shù)據(jù)芬膝,先使用mysqldump
命令導(dǎo)出為.sql
文件望门,然后再把這個(gè).sql
文件導(dǎo)入到所有的slave節(jié)點(diǎn)上去。然后在可以開始下面的任務(wù)锰霜。
在master上面執(zhí)行的導(dǎo)出的命令示例如下:
mysqldump -uroot -proot \
--master-data=2 \
--single-transaction \
--flush-logs \
--triggers \
--routines \
--events \
-B mydb1 > mydb1.sql
在所有的slave節(jié)點(diǎn)上執(zhí)行的導(dǎo)入數(shù)據(jù)的命令示例如下:
mysql -uroot -proot < mydb1.sql
但是筹误,我們是基于一個(gè)嶄新的環(huán)境來做的,不涉及到歷史數(shù)據(jù)的問題癣缅。所以厨剪,這一步我們可以省略。
開啟組從同步
在所有的slave上面執(zhí)行如下命令所灸,此時(shí)的binlog文件和日志點(diǎn)的位置丽惶,可以在master1上面使用show master status
命令查看,或者查看導(dǎo)出數(shù)據(jù)的時(shí)候爬立,生成的.sql
文件钾唬。在master1節(jié)點(diǎn)上執(zhí)行mysqldump
導(dǎo)出命令的時(shí)候,我們指定的--master-data=2
侠驯,這個(gè)參數(shù)會(huì)在導(dǎo)出的.sql
文件中標(biāo)記當(dāng)前master1節(jié)點(diǎn)上binlog日志的文件名稱和日志偏移量抡秆。
change master to master_host='172.20.0.11', master_user='repl_user', master_password='repl_user',
MASTER\_LOG\_FILE='mysql-bin.000003', MASTER\_LOG\_POS=1034;
開啟組從同步:
start slave;
查看同步狀態(tài):
mysql> show slave status\\G
*************************** 1. row ***************************
Slave\_IO\_State: Waiting for master to send event
Master_Host: 172.20.0.11
Master\_User: repl\_user
Master_Port: 3306
Connect_Retry: 60
Master\_Log\_File: mysql-bin.000003
Read\_Master\_Log_Pos: 1034
Relay\_Log\_File: mysql-relay.000002
Relay\_Log\_Pos: 320
Relay\_Master\_Log_File: mysql-bin.000003
Slave\_IO\_Running: Yes
Slave\_SQL\_Running: Yes
Replicate\_Do\_DB:
Replicate\_Ignore\_DB:
Replicate\_Do\_Table:
Replicate\_Ignore\_Table:
Replicate\_Wild\_Do_Table:
Replicate\_Wild\_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec\_Master\_Log_Pos: 1034
Relay\_Log\_Space: 523
Until_Condition: None
Until\_Log\_File:
Until\_Log\_Pos: 0
Master\_SSL\_Allowed: No
Master\_SSL\_CA_File:
Master\_SSL\_CA_Path:
Master\_SSL\_Cert:
Master\_SSL\_Cipher:
Master\_SSL\_Key:
Seconds\_Behind\_Master: 0
Master\_SSL\_Verify\_Server\_Cert: No
Last\_IO\_Errno: 0
Last\_IO\_Error:
Last\_SQL\_Errno: 0
Last\_SQL\_Error:
Replicate\_Ignore\_Server_Ids:
Master\_Server\_Id: 11
Master_UUID: 047bcc07-7424-11eb-96b4-0242ac14000b
Master\_Info\_File: mysql.slave\_master\_info
SQL_Delay: 0
SQL\_Remaining\_Delay: NULL
Slave\_SQL\_Running_State: Slave has read all relay log; waiting for more updates
Master\_Retry\_Count: 86400
Master_Bind:
Last\_IO\_Error_Timestamp:
Last\_SQL\_Error_Timestamp:
Master\_SSL\_Crl:
Master\_SSL\_Crlpath:
Retrieved\_Gtid\_Set:
Executed\_Gtid\_Set:
Auto_Position: 0
Replicate\_Rewrite\_DB:
Channel_Name:
Master\_TLS\_Version:
1 row in set (0.00 sec)
mysql>
配置主與主的同步
上面我們配置好了master1->slave1,master1->slave2
的同步吟策。我們還需要在master1和master2直接配置互相同步對(duì)方儒士。
現(xiàn)在master2上面配置master1作為它的主庫。參考上面slave1和slave2上面的配置檩坚。執(zhí)行如下命令:
change master to master_host='172.20.0.11', MASTER\_LOG\_FILE='mysql-bin.000003', MASTER\_LOG\_POS=1034;
start slave user='repl_user' password='repl_user';
show slave status\\G
然后再配置master2到master1的同步着撩。此時(shí)我們需要查看一下master2上面的binlog日志名稱和日志偏移量是多少。使用如下命令查看:
mysql> show master status\\G
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 623
Binlog\_Do\_DB:
Binlog\_Ignore\_DB:
Executed\_Gtid\_Set:
1 row in set (0.00 sec)
mysql>
然后我們登錄到master1上面匾委,執(zhí)行如下命令拖叙,配置master2作為master1的主庫。
change master to master_host='172.20.0.21', MASTER\_LOG\_FILE='mysql-bin.000003', MASTER\_LOG\_POS=623;
start slave user='repl_user' password='repl_user';
show slave status\\G
驗(yàn)證雙主雙從同步的效果如下:
安裝MMM
修改apt-get源
在下載MMM之前赂乐,我們先修改一下apt-get
源薯鳍,然后更新一下apt-get
源。如下所示挨措,因?yàn)榇藭r(shí)的容器中挖滤,沒有vim
命令,所以我們使用echo "xxx" >/etc/apt/sources.list
的方式去更新apt-get
的源浅役。
echo "
deb http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb http://mirrors.aliyun.com/debian-security buster/updates main
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian-security buster/updates main
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
" > etc/apt/sources.list
注意斩松,在更新鏡像源的時(shí)候,要根據(jù)自己的Debian系統(tǒng)的版本担租,我的Debian系統(tǒng)的版本是buster
版本砸民,所以你要根據(jù)自己的系統(tǒng)版本網(wǎng)上找到對(duì)應(yīng)的鏡像地址。接著奋救,我們更新一下系統(tǒng)岭参。
root@master1:/etc/apt# apt-get update
Get:1 http://security.debian.org/debian-security buster/updates InRelease \[65.4 kB\]
Get:2 http://repo.mysql.com/apt/debian buster InRelease \[21.5 kB\]
Get:3 http://mirrors.ustc.edu.cn/debian buster InRelease \[122 kB\]
Get:4 http://security.debian.org/debian-security buster/updates/main amd64 Packages \[267 kB\]
Get:5 http://mirrors.ustc.edu.cn/debian buster-updates InRelease \[51.9 kB\]
Get:6 http://mirrors.ustc.edu.cn/debian buster/main amd64 Packages \[7907 kB\]
Get:7 http://repo.mysql.com/apt/debian buster/mysql-5.7 amd64 Packages \[5693 B\]
Get:8 http://mirrors.ustc.edu.cn/debian buster-updates/main amd64 Packages \[9504 B\]
Fetched 8450 kB in 10s (871 kB/s)
Reading package lists... Done
root@master1:/etc/apt#
更新完成之后,我們先安裝一下我們經(jīng)常用到的幾個(gè)命令:
apt-get install net-tools wget vim make cmake inetutils-ping iproute2 iproute2-doc -y
下載MMM
推薦使用源碼來安裝尝艘,這樣可以在任何Linux系統(tǒng)版本上面進(jìn)行安裝演侯,例如:Ubuntu、Debian背亥、CentOS秒际、Redhat等等。不用因?yàn)橄到y(tǒng)版本的問題找對(duì)應(yīng)的rpm
包狡汉,找對(duì)應(yīng)的deb
包娄徊。
通過如下步驟來獲取MMM的源碼。
登錄Debian的官方網(wǎng)站:https://www.debin.org盾戴,然后點(diǎn)擊跟多關(guān)于下載與軟件介紹的連接寄锐。
此時(shí)我們會(huì)進(jìn)入如下頁面:https://www.debian.org/intro/index#software,然后點(diǎn)擊軟件包連接尖啡。
接著橄仆,我們會(huì)進(jìn)入如下頁面:https://www.debian.org/distrib/packages#search_packages,根據(jù)選項(xiàng)輸入mysql-mmm
衅斩,點(diǎn)擊搜索按鈕盆顾。
點(diǎn)擊上面的搜索按鈕后,進(jìn)入如下頁面:https://packages.debian.org/search?keywords=mysql-mmm&searchon=names&suite=oldstable§ion=all畏梆,然后我們點(diǎn)擊頁面中的Debian系統(tǒng)的版本您宪,選擇jessie
版本,因?yàn)?code>mysql-mmm
是比較老的一種MySQL考可用架構(gòu)奠涌,在最新的Debian系統(tǒng)中宪巨,已經(jīng)沒有這樣的軟件包了,所以我們選擇老版本的jessie
版本铣猩,這個(gè)版本中包含mysql-mmm
的源碼揖铜。
點(diǎn)擊完成jessie
之后,進(jìn)入如下頁面:https://packages.debian.org/search?suite=jessie&searchon=names&keywords=mysql-mmm达皿,此時(shí)我們已經(jīng)搜索到了mysql-mmm
的軟件天吓。點(diǎn)擊其中任何一個(gè)鏈接,進(jìn)入詳細(xì)頁面峦椰。
進(jìn)入如下的頁面:https://packages.debian.org/jessie/mysql-mmm-tools龄寞,我們選擇下載源碼文件。
或者我們可以右鍵復(fù)制下載地址:http://deb.debian.org/debian/pool/main/m/mysql-mmm/mysql-mmm_2.2.1.orig.tar.gz汤功,使用wget命令下載源碼到MySQL服務(wù)器上物邑。
wget http://deb.debian.org/debian/pool/main/m/mysql-mmm/mysql-mmm_2.2.1.orig.tar.gz
如果要下載.deb文件,可以點(diǎn)擊上面圖片中的硬件架構(gòu)下面的all
連接,進(jìn)入下面頁面后色解,選擇對(duì)應(yīng)的距離我們最近鏡像地址茂嗓,我選擇的為ftp.cn.debian.org
這個(gè)鏡像地址,然后復(fù)制下載鏈接地址科阎,使用wget下載即可述吸。這里貼出如下的下載示例:
wget http://ftp.cn.debian.org/debian/pool/main/m/mysql-mmm/mysql-mmm-tools\_2.2.1-1.1\_all.deb
wget http://ftp.cn.debian.org/debian/pool/main/m/mysql-mmm/mysql-mmm-monitor\_2.2.1-1.1\_all.deb
wget http://ftp.cn.debian.org/debian/pool/main/m/mysql-mmm/mysql-mmm-common\_2.2.1-1.1\_all.deb
wget http://ftp.cn.debian.org/debian/pool/main/m/mysql-mmm/mysql-mmm-agent\_2.2.1-1.1\_all.deb
編譯安裝MMM
我們是使用的MySQL的容器鏡像來啟動(dòng)的MySQL集群,而這個(gè)從docker
hub上面拉取的MySQL5.7官方版本的鏡像是基于Debian系統(tǒng)來制作的锣笨,所以我們此次安裝MMM軟件需要基于Debian系統(tǒng)來安裝蝌矛。
下載好的mysql-mmm
如下所示:
root@test:~# ls -lstr
total 60
56 -rw-r--r-- 1 root root 55278 Feb 21 16:22 mysql-mmm_2.2.1.orig.tar.gz
4 drwxr-xr-x 2 root root 4096 Feb 21 16:24 deb
root@test:~#
解壓并且安裝,但是在安裝MMM之前错英,先安裝一下它的依賴包入撒,使用如下命令來安裝:
apt-get install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl libclass-singleton-perl libproc-daemon-perl
libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl -y
安裝MMM的命令和過程如下:
root@test:~# tar -zxf mysql-mmm_2.2.1.orig.tar.gz
root@test:~# ls -lstr
total 64
4 drwxr-xr-x 6 root root 4096 May 7 2010 mysql-mmm-2.2.1
56 -rw-r--r-- 1 root root 55278 Feb 21 16:22 mysql-mmm_2.2.1.orig.tar.gz
4 drwxr-xr-x 2 root root 4096 Feb 21 16:24 deb
root@test:~# cd mysql-mmm-2.2.1/
root@test:~/mysql-mmm-2.2.1# make install
mkdir -p usr/share/perl5/MMM usr/lib/mysql-mmm usr/sbin var/log/mysql-mmm etc etc/mysql-mmm etc/init.d/
cp -r lib/Common/ usr/share/perl5/MMM
\[ -f etc/mysql-mmm/mmm_common.conf \] || cp etc/mysql-mmm/mmm_common.conf etc/mysql-mmm/
mkdir -p usr/lib/mysql-mmm/agent/
cp -r lib/Agent/ usr/share/perl5/MMM
cp -r bin/agent/* usr/lib/mysql-mmm/agent/
cp -r etc/init.d/mysql-mmm-agent etc/init.d/
cp sbin/mmm_agentd usr/sbin
\[ -f etc/mysql-mmm/mmm_agent.conf \] || cp etc/mysql-mmm/mmm_agent.conf etc/mysql-mmm/
mkdir -p usr/lib/mysql-mmm/monitor/
cp -r lib/Monitor/ usr/share/perl5/MMM
cp -r bin/monitor/* usr/lib/mysql-mmm/monitor/
cp -r etc/init.d/mysql-mmm-monitor etc/init.d/
cp sbin/mmm\_control sbin/mmm\_mond usr/sbin
\[ -f etc/mysql-mmm/mmm_mon.conf \] || cp etc/mysql-mmm/mmm_mon.conf etc/mysql-mmm/
mkdir -p usr/lib/mysql-mmm/tools/
cp -r lib/Tools/ usr/share/perl5/MMM
cp -r bin/tools/* usr/lib/mysql-mmm/tools/
cp sbin/mmm\_backup sbin/mmm\_clone sbin/mmm_restore usr/sbin
\[ -f etc/mysql-mmm/mmm_tools.conf \] || cp etc/mysql-mmm/mmm_tools.conf etc/mysql-mmm/
root@test:~/mysql-mmm-2.2.1#
如果在安裝mmm
的時(shí)候,提示沒有make
命令椭岩,則需要先安裝make
命令茅逮,安裝的時(shí)候如果是Debian或Ubuntu系統(tǒng),使用如下apt-get命令安裝:
apt-get install make cmake -y
如果是CentOS或Redhat系統(tǒng)簿煌,則使用如下的yum命令來安裝:
yum install make cmake -y
以上編譯安裝MMM需要在每一個(gè)節(jié)點(diǎn)都執(zhí)行氮唯,包括兩個(gè)master節(jié)點(diǎn)和兩個(gè)slave節(jié)點(diǎn),還有monitor監(jiān)控節(jié)點(diǎn)也要安裝姨伟。
安裝完MMM之后惩琉,我們需要注意一下幾個(gè)目錄,這是我們使用MMM服務(wù)的基礎(chǔ)夺荒。
# MMM各種配置文件所在目錄
/etc/mysql-mmm
# MMM服務(wù)日志文件所在目錄
/var/log/mysql-mmm/mmm_mond.log # MMM的monitor服務(wù)的日志文件
/var/log/mysql-mmm/mmm_agentd.log # MMM的agent服務(wù)的日志文件
# 各種perl腳本所在目錄
/usr/lib/mysql-mmm/agent # agent客戶端各種腳本所在目錄
/usr/lib/mysql-mmm/monitor # monitor監(jiān)控端各種腳本所在目錄
/usr/lib/mysql-mmm/tools # 工具包腳本所在目錄
# 啟動(dòng)和關(guān)閉MMM服務(wù)的腳本文件
/etc/init.d/mysql-mmm-agent
/etc/init.d/mysql-mmm-monitor
創(chuàng)建MMM使用的MySQL用戶
監(jiān)控用和客戶端用戶瞒渠,在所有的節(jié)點(diǎn)上都要?jiǎng)?chuàng)建這兩個(gè)用戶。如果已經(jīng)配置組從同步技扼,在master1上創(chuàng)建就OK伍玖,其他節(jié)點(diǎn)會(huì)自動(dòng)同步這兩個(gè)創(chuàng)建好的用戶到其他節(jié)點(diǎn)。
create user 'mmm_monitor'@'172.20.0.%' identified by 'mmm_monitor';
grant replication client on *.* to 'mmm_monitor'@'172.20.0.%';
create user 'mmm_agent'@'172.20.0.%' identified by 'mmm_agent';
grant super, replication client, process on *.* to 'mmm_agent'@'172.20.0.%';
需要注意的是這兩個(gè)用戶的權(quán)限不同剿吻,結(jié)合前面我們配置組從同步的哪一個(gè)用戶窍箍,我們來對(duì)比一下:
monitor:MMM監(jiān)控使用的用戶,擁有replication client權(quán)限就可以丽旅。
agent:MMM客戶單使用的用椰棘,擁有super、replication client榄笙、process權(quán)限邪狞。
replication:組從同步使用的用戶,擁有replication slave權(quán)限即可茅撞。
最后的用戶在四個(gè)節(jié)點(diǎn)上面的結(jié)果如下圖所示:
修改MMM的配置文件
MMM所有的配置文件都在如下目錄中:
root@master1:/etc/mysql-mmm# ls -lstr etc/mysql-mmm/*
4 -rw-r----- 1 root root 321 Feb 22 21:46 etc/mysql-mmm/mmm_mon.conf
4 -rw-r----- 1 root root 1293 Feb 22 21:46 etc/mysql-mmm/mmm_tools.conf
4 -rw-r----- 1 root root 37 Feb 22 22:21 etc/mysql-mmm/mmm_agent.conf
4 -rw-r----- 1 root root 789 Feb 22 23:20 etc/mysql-mmm/mmm_common.conf
root@master1:/etc/mysql-mmm#
mmm_comm.conf配置文件
所有5個(gè)節(jié)點(diǎn)中的/etc/mysql-mmm/mmm_common.conf
配置文件都修改為如下所示的內(nèi)容帆卓。
root@master1:/etc/mysql-mmm# cat mmm_common.conf
active\_master\_role writer
<host default>
# 網(wǎng)卡的名稱巨朦,各個(gè)主機(jī)上面網(wǎng)絡(luò)設(shè)備的名稱
cluster_interface eth0
pid\_path /var/run/mmm\_agentd.pid
bin_path /usr/lib/mysql-mmm/
# 主從復(fù)制用戶名和密碼
replication\_user repl\_user
replication\_password repl\_user
# MMM服務(wù)使用的anget用戶名和密碼
agent\_user mmm\_agent
agent\_password mmm\_agent
</host>
# master1的配置信息
<host master1>
ip 172.20.0.11
mode master
peer master2
</host>
# master2的配置信息
<host master2>
ip 172.20.0.21
mode master
peer master1
</host>
# slave1的配置信息
<host slave1>
ip 172.20.0.12
mode slave
</host>
# slave2的配置信息
<host slave2>
ip 172.20.0.22
mode slave
</host>
# 寫虛擬IP的配置信息,指定可寫的主機(jī)名稱
<role writer>
hosts master1, master2
ips 172.20.0.100
mode exclusive
</role>
# 讀虛擬IP的配置信息剑令,指定可以提供讀服務(wù)的主機(jī)名稱糊啡。下面的VIP和主鍵名稱不一定是一一對(duì)應(yīng)的,VIP是隨機(jī)分布到各個(gè)可讀節(jié)點(diǎn)的尚洽。
# 如果提供多個(gè)VIP悔橄,有可能一個(gè)節(jié)點(diǎn)被分配多個(gè)VIP靶累,這樣也是支持的腺毫。
<role reader>
hosts master1, master2, slave1, slave2
ips 172.20.0.111, 172.20.0.211, 172.20.0.122, 172.20.0.222
mode balanced
</role>
root@master1:/etc/mysql-mmm#
上面的role reader
中配置的可讀節(jié)點(diǎn),可以根據(jù)自己的需求來配置挣柬,這里我把master1, master2, slave1, slave2
都作為可讀的節(jié)點(diǎn)潮酒,當(dāng)然可以把主節(jié)點(diǎn)master1
去掉,只配置master2, slave1, slave2
三個(gè)節(jié)點(diǎn)邪蛔。這里的ips
也是我們指定的VIP的值急黎,我們可以配置多個(gè)VIP,最好是VIP的個(gè)數(shù)和上面的host的數(shù)目一致侧到,表示每一個(gè)提供讀的節(jié)點(diǎn)分配一個(gè)VIP勃教。
mmm_agent.conf配置文件
每一個(gè)節(jié)點(diǎn)上面的/etc/mysql-mmm/mmm_agent.conf
配置文件中,都在第2行中匠抗,修改一下主機(jī)名稱故源。下面給出master1節(jié)點(diǎn)的配置如下:
root@master1:/etc/mysql-mmm# cat mmm_agent.conf
include mmm_common.conf
this master1
root@master1:/etc/mysql-mmm#
其他master2、slave1汞贸、slave2各個(gè)節(jié)點(diǎn)也需要作出對(duì)應(yīng)的修改绳军。只要把master1改為對(duì)應(yīng)的主機(jī)名稱即可。
mmm_mon.conf配置文件
在monitor節(jié)點(diǎn)上矢腻,修改/etc/mysql-mmm/mmm_mon.conf
配置文件门驾,修改內(nèi)容如下所示,其他四個(gè)節(jié)點(diǎn)不需要對(duì)這個(gè)文件做修改多柑。
root@monitor:/etc/mysql-mmm# cat mmm_mon.conf
include mmm_common.conf
<monitor>
ip 127.0.0.1
pid\_path /var/run/mmm\_mond.pid
bin_path /usr/lib/mysql-mmm/
status\_path /var/lib/misc/mmm\_mond.status
ping_ips 172.20.0.1, 172.20.0.11, 172.20.0.21, 172.20.0.12, 172.20.0.22 # 網(wǎng)關(guān)IP地址奶是,和各個(gè)節(jié)點(diǎn)的物理IP地址,用于監(jiān)控各個(gè)節(jié)點(diǎn)的狀態(tài)是否可用
</monitor>
# MMM服務(wù)使用MySQL中的monitor用戶名稱和密碼
<host default>
monitor\_user mmm\_monitor
monitor\_password mmm\_monitor
</host>
#
debug值為0非debug模式竣灌,為1的時(shí)候表示debug模式聂沙,debug模式下,會(huì)在/var/log/mysql-mmm/mmm_mond.log日志文件中生成更多日志信息帐偎。
debug 0
root@monitor:/etc/mysql-mmm#
啟動(dòng)MMM服務(wù)
客戶端agent服務(wù)相關(guān)命令如下逐纬,客戶端agent啟動(dòng)后日志存放在/var/log/mysql-mmm/mmm_agentd.log
文件中。
/etc/init.d/mysql-mmm-agent start
/etc/init.d/mysql-mmm-agent status
/etc/init.d/mysql-mmm-agent stop
/etc/init.d/mysql-mmm-agent restart
監(jiān)控端monitor服務(wù)相關(guān)命令如下削樊,監(jiān)控端monitor啟動(dòng)后日志存放在/var/log/mysql-mmm/mmm_mond.log
文件中豁生。
/etc/init.d/mysql-mmm-monitor start
/etc/init.d/mysql-mmm-monitor status
/etc/init.d/mysql-mmm-monitor stop
/etc/init.d/mysql-mmm-monitor restart
MMM監(jiān)控狀態(tài)有一個(gè)管理命令mmm_control
兔毒,它的使用幫助如下所示:
root@monitor:/# mmm_control --help
Invalid command '--help'
Valid commands are:
help \- show this message
ping \- ping monitor
show - show status
checks \[<host>|all \[<check>|all\]\] - show checks status
set_online <host> \- set host <host> online
set_offline <host> \- set host <host> offline
mode - print current mode.
set_active - switch into active mode.
set_manual - switch into manual mode.
set_passive - switch into passive mode.
move_role \[--force\] <role> <host> \- move exclusive role <role> to host <host>
(Only use --force if you know what you are doing!)
set_ip <ip> <host> \- set role with ip <ip> to host <host>
root@monitor:/#
常用的維護(hù)節(jié)點(diǎn)狀態(tài)的命令如下:
mmm_control show
mmm_control checks all
mmm\_control set\_online master1
mmm\_control set\_online master2
mmm\_control set\_online slave1
mmm\_control set\_online slave2
下面分別在四個(gè)MySQL節(jié)點(diǎn)上執(zhí)行如下命令啟動(dòng)并查看MMM的客戶端服務(wù)
- master1主節(jié)點(diǎn)上,啟動(dòng)和查看MMM的客戶端服務(wù)如下:
root@master1:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
root@master1:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent status
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Checking MMM Agent process: running.
root@master1:/etc/mysql-mmm#
- master2主節(jié)點(diǎn)上甸箱,啟動(dòng)和查看MMM的客戶端服務(wù)如下:
root@master2:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
root@master2:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent status
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Checking MMM Agent process: running.
root@master2:/etc/mysql-mmm#
- slave1主節(jié)點(diǎn)上育叁,啟動(dòng)和查看MMM的客戶端服務(wù)如下:
root@slave1:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
root@slave1:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent status
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Checking MMM Agent process: running.
root@slave1:/etc/mysql-mmm#
- slave2主節(jié)點(diǎn)上,啟動(dòng)MMM的客戶端服務(wù)如下:
root@slave2:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
root@slave2:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent status
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Checking MMM Agent process: running.
root@slave2:/etc/mysql-mmm#
下面在監(jiān)控節(jié)點(diǎn)上執(zhí)行如下命令啟動(dòng)并查看MMM的監(jiān)控服務(wù)
- monitor節(jié)點(diǎn)上芍殖,啟動(dòng)和查看MMM的監(jiān)控端服務(wù)如下:
root@monitor:/etc/mysql-mmm# etc/init.d/mysql-mmm-monitor start
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: Ok
root@monitor:/etc/mysql-mmm# etc/init.d/mysql-mmm-monitor status
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Checking MMM Monitor process: running.
root@monitor:/etc/mysql-mmm#
- 在monitor節(jié)點(diǎn)豪嗽,查看監(jiān)控的狀態(tài):
root@monitor:/etc/mysql-mmm# mmm_control show
master1(172.20.0.11) master/AWAITING_RECOVERY. Roles:
master2(172.20.0.21) master/AWAITING_RECOVERY. Roles:
slave1(172.20.0.12) slave/AWAITING_RECOVERY. Roles:
slave2(172.20.0.22) slave/AWAITING_RECOVERY. Roles:
root@monitor:/etc/mysql-mmm# mmm\_control set\_online master1;
OK: State of 'master1' changed to ONLINE. Now you can wait some time and check its new roles!
root@monitor:/etc/mysql-mmm# mmm\_control set\_online master2
OK: State of 'master2' changed to ONLINE. Now you can wait some time and check its new roles!
root@monitor:/etc/mysql-mmm# mmm\_control set\_online slave1
OK: State of 'slave1' changed to ONLINE. Now you can wait some time and check its new roles!
root@monitor:/etc/mysql-mmm# mmm\_control set\_online slave2
OK: State of 'slave2' changed to ONLINE. Now you can wait some time and check its new roles!
root@monitor:/etc/mysql-mmm# mmm_control show
master1(172.20.0.11) master/ONLINE. Roles: reader(172.20.0.111), writer(172.20.0.100)
master2(172.20.0.21) master/ONLINE. Roles: reader(172.20.0.211)
slave1(172.20.0.12) slave/ONLINE. Roles: reader(172.20.0.122)
slave2(172.20.0.22) slave/ONLINE. Roles: reader(172.20.0.222)
root@monitor:/etc/mysql-mmm#
問題排查1:monitor服務(wù)不能正常啟動(dòng)?
當(dāng)在monitor節(jié)點(diǎn)啟動(dòng)監(jiān)控服務(wù)后豌骏,監(jiān)控服務(wù)一會(huì)就異常退出了龟梦。原因是在使用docker啟動(dòng)集群節(jié)點(diǎn)的時(shí)候沒有使用--cap-add NET_ADMIN
參數(shù),沒有這個(gè)參數(shù)就沒有辦法在容器只用使用虛擬VIP的功能窃躲。在刪除容器后计贰,增加參數(shù)重新運(yùn)行后,才運(yùn)行起來蒂窒。
后來躁倒,又發(fā)現(xiàn)monitor節(jié)點(diǎn)啟監(jiān)控服務(wù)器仍然失敗,查看日志/var/log/mysql-mmm/mmm_mond.log
洒琢,如下所示:
root@monitor:/etc/mysql-mmm# tail -f var/log/mysql-mmm/mmm_mond.log
2021/02/22 23:26:27 INFO Waiting for network connection...
2021/02/22 23:26:27 INFO Spawning checker 'ping_ip'...
2021/02/22 23:26:27 INFO Shutting down checker 'ping_ip'...
2021/02/22 23:26:27 INFO Network connection is available.
2021/02/22 23:26:27 FATAL Child exited with exitcode 255, restarting after 10 second sleep
修改/etc/mysql-mmm/mmm_mon.conf
配置文件中的debug
的值為1
秧秉,表示以debug
的模式運(yùn)行monitor服務(wù),此時(shí)我們?cè)僦匦聠?dòng)monitor服務(wù)衰抑,查看輸出的詳細(xì)錯(cuò)誤日志如下:
root@monitor:/etc/mysql-mmm# etc/init.d/mysql-mmm-monitor start
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: 2021/02/22 23:30:17 INFO STARTING...
2021/02/22 23:30:17 DEBUG Created pid file '/var/run/mmm_mond.pid' with pid 5330
2021/02/22 23:30:17 INFO Waiting for network connection...
2021/02/22 23:30:17 INFO Spawning checker 'ping_ip'...
2021/02/22 23:30:17 DEBUG IP '172.20.0.1' is reachable: OK
2021/02/22 23:30:17 INFO Shutting down checker 'ping_ip'...
2021/02/22 23:30:17 INFO Network connection is available.
Use of uninitialized value $old_state in string ne at usr/share/perl5/MMM/Monitor/Agent.pm line 42.
2021/02/22 23:30:17 FATAL Child exited with exitcode 255, restarting after 10 second sleep
于是去修改了/usr/share/perl5/MMM/Monitor/Agent.pm
文件象迎,在第41行增加如下內(nèi)容,保存退出停士,重新啟動(dòng)monitor服務(wù)挖帘。
if (! defined($old\_state)) { $old\_state = 'certinally not new_state'; }
然后再次重啟monitor服務(wù),啟動(dòng)成功恋技。然后把/etc/mysql-mmm/mmm_mon.conf
配置文件中的debug
的值再次修改為0
拇舀,關(guān)閉debug
模式再次重啟monitor服務(wù)。此時(shí)查看monitor服務(wù)的日志內(nèi)容如下:
root@monitor:/# tail -f var/log/mysql-mmm/mmm_mond.log
2021/02/22 23:42:43 INFO Check 'rep_backlog' on 'slave1' is ok!
2021/02/22 23:42:43 INFO Check 'rep_backlog' on 'master2' is ok!
2021/02/22 23:42:43 INFO Check 'rep_threads' on 'master1' is ok!
2021/02/22 23:42:43 INFO Check 'rep_threads' on 'slave2' is ok!
2021/02/22 23:42:43 INFO Check 'rep_threads' on 'slave1' is ok!
2021/02/22 23:42:43 INFO Check 'rep_threads' on 'master2' is ok!
2021/02/22 23:42:43 INFO Check 'ping' on 'master1' is ok!
2021/02/22 23:42:43 INFO Check 'ping' on 'slave2' is ok!
2021/02/22 23:42:43 INFO Check 'ping' on 'slave1' is ok!
2021/02/22 23:42:43 INFO Check 'ping' on 'master2' is ok!
問題排查2:虛擬IP不能再各個(gè)節(jié)點(diǎn)生成蜻底?
啟動(dòng)MMM后骄崩,發(fā)現(xiàn)不能通過VIP訪問MySQL數(shù)據(jù)庫,去各個(gè)節(jié)點(diǎn)使用ifconfig -a
或者ip addr
命令查看發(fā)現(xiàn)沒有對(duì)應(yīng)的VIP生成薄辅。查看了各個(gè)節(jié)點(diǎn)MMM agent服務(wù)的日志文件/var/log/mysql-mmm/mmm_agent.log
要拂,發(fā)現(xiàn)如下錯(cuò)誤信息:
root@master1:/# tail -f var/log/mysql-mmm/mmm_agentd.log
2021/02/23 17:16:19 FATAL Couldn't configure IP '172.20.0.111' on interface 'eth0': undef
2021/02/23 17:16:19 FATAL Couldn't allow writes: undef
2021/02/23 17:16:22 FATAL Couldn't configure IP '172.20.0.111' on interface 'eth0': undef
2021/02/23 17:16:22 FATAL Couldn't allow writes: undef
經(jīng)過排查發(fā)現(xiàn)是在設(shè)置VIP的時(shí)候失敗,設(shè)置客戶端VIP的腳本如下:
/usr/lib/mysql-mmm/agent/configure_ip
執(zhí)行上面的腳本發(fā)現(xiàn)如下錯(cuò)誤:
提示我們站楚,需要在perl中安裝arp.pm包脱惰。安裝的時(shí)候,為了提高速度窿春,我們修改一下perl安裝模塊的時(shí)候使用的鏡像源拉一。
修改perl安裝包的時(shí)候使用的鏡像源采盒,參考如下方式修改:
root@master1:/# perl -MCPAN -e shell
cpan\[5\]> o conf urllist
urllist
0 \[http://www.cpan.org/\]
Type 'o conf' to view all configuration items
cpan\[6\]> o conf urllist push http://mirrors.aliyun.com/CPAN/
Please use 'o conf commit' to make the config permanent!
cpan\[7\]> o conf commit
commit: wrote '/root/.cpan/CPAN/MyConfig.pm'
cpan\[8\]> o conf urllist
urllist
0 \[http://www.cpan.org/\]
1 \[http://mirrors.aliyun.com/CPAN/\]
Type 'o conf' to view all configuration items
cpan\[9\]> install Net::ARP
cpan\[10\]>
其中各個(gè)命令的含義如下:
o conf urllist
:查看的當(dāng)前的鏡像源o conf urllist push http://mirrors.aliyun.com/CPAN/
:添加阿里的perl鏡像源o conf commit
:提交對(duì)鏡像源的修改install Net::ARP
:安裝arp.pm包。
經(jīng)過上面的安裝方式蔚润,發(fā)現(xiàn)安裝失敗磅氨。于是下載源碼自己編譯安裝這個(gè)包。參考如下命令順序來編譯安裝嫡纠。
# 下載源碼文件
wget https://cpan.metacpan.org/authors/id/C/CR/CRAZYDJ/Net-ARP-1.0.11.tgz
# 解壓下載后的文件
tar -zxvf Net-ARP-1.0.11.tgz
# 進(jìn)入下載目錄
cd Net-ARP-1.0.11
# 執(zhí)行編譯
perl Makefile.PL
# 執(zhí)行安裝
make install
上面安裝Net-ARP包的操作烦租,需要在除了monitor節(jié)點(diǎn)的四個(gè)節(jié)點(diǎn)上都執(zhí)行安裝一下。
最后所有節(jié)點(diǎn)的IP地址和VIP地址如下所示:
驗(yàn)證VIP訪問數(shù)據(jù)庫
當(dāng)我們的MMM客戶段服務(wù)在四個(gè)MySQL數(shù)據(jù)庫實(shí)例中啟動(dòng)除盏,并且MMM監(jiān)控服務(wù)在monitor節(jié)點(diǎn)啟動(dòng)之后叉橱。我們?cè)趍onitor節(jié)點(diǎn)上面嘗試使用各個(gè)VIP看能否正常連接到MySQL數(shù)據(jù)庫。驗(yàn)證的結(jié)果如下:
root@monitor:/etc/mysql-mmm#
root@monitor:/etc/mysql-mmm# mmm_control show
master1(172.20.0.11) master/ONLINE. Roles: reader(172.20.0.111), writer(172.20.0.100)
master2(172.20.0.21) master/ONLINE. Roles: reader(172.20.0.122)
slave1(172.20.0.12) slave/ONLINE. Roles: reader(172.20.0.211)
slave2(172.20.0.22) slave/ONLINE. Roles: reader(172.20.0.222)
root@monitor:/etc/mysql-mmm# mysql -uroot -proot -h172.20.0.100 -e 'select @@hostname'
mysql: \[Warning\] Using a password on the command line interface can be insecure.
+---------------+
| @@hostname |
+---------------+
| master1.mysql |
+---------------+
root@monitor:/etc/mysql-mmm# mysql -uroot -proot -h172.20.0.111 -e 'select @@hostname'
mysql: \[Warning\] Using a password on the command line interface can be insecure.
+---------------+
| @@hostname |
+---------------+
| master1.mysql |
+---------------+
root@monitor:/etc/mysql-mmm# mysql -uroot -proot -h172.20.0.122 -e 'select @@hostname'
mysql: \[Warning\] Using a password on the command line interface can be insecure.
+---------------+
| @@hostname |
+---------------+
| master2.mysql |
+---------------+
root@monitor:/etc/mysql-mmm# mysql -uroot -proot -h172.20.0.211 -e 'select @@hostname'
mysql: \[Warning\] Using a password on the command line interface can be insecure.
+--------------+
| @@hostname |
+--------------+
| slave1.mysql |
+--------------+
root@monitor:/etc/mysql-mmm# mysql -uroot -proot -h172.20.0.222 -e 'select @@hostname'
mysql: \[Warning\] Using a password on the command line interface can be insecure.
+--------------+
| @@hostname |
+--------------+
| slave2.mysql |
+--------------+
root@monitor:/etc/mysql-mmm#
驗(yàn)證MMM的高可用
我們把master1節(jié)點(diǎn)上面的MySQL服務(wù)停止掉痴颊,來驗(yàn)證一下是否會(huì)把主從同步的源頭從master1切換為master2上面赏迟,并且我們?cè)趍onitor節(jié)點(diǎn)上,仍然可以通過writer
vip 去連接到MySQL上蠢棱。
停止master1節(jié)點(diǎn)上面的MySQL服務(wù),在master1節(jié)點(diǎn)上甩栈,執(zhí)行如下命令:
root@master1:~/Net-ARP-1.0.11# etc/init.d/mysql stop
............
\[info\] MySQL Community Server 5.7.31 is stopped.
root@master1:~/Net-ARP-1.0.11# %
? ~
接著泻仙,我們?cè)趍onitor節(jié)點(diǎn)上,查看MMM監(jiān)控各個(gè)節(jié)點(diǎn)服務(wù)的狀態(tài)量没,發(fā)現(xiàn)master1節(jié)點(diǎn)以及下線了玉转,并且我們的writer
ip,已經(jīng)從原先的master1節(jié)點(diǎn)遷移到master2節(jié)點(diǎn)上了殴蹄。如下所示:
root@monitor:/etc/mysql-mmm# mmm_control show
# Warning: agent on host master1 is not reachable
master1(172.20.0.11) master/HARD_OFFLINE. Roles:
master2(172.20.0.21) master/ONLINE. Roles: reader(172.20.0.122), writer(172.20.0.100)
slave1(172.20.0.12) slave/ONLINE. Roles: reader(172.20.0.111), reader(172.20.0.211)
slave2(172.20.0.22) slave/ONLINE. Roles: reader(172.20.0.222)
root@monitor:/etc/mysql-mmm# mmm_control checks all
slave2 ping \[last change: 2021/02/23 16:19:44\] OK
slave2 mysql \[last change: 2021/02/23 16:19:44\] OK
slave2 rep_threads \[last change: 2021/02/23 16:19:44\] OK
slave2 rep_backlog \[last change: 2021/02/23 16:19:44\] OK: Backlog is null
master1 ping \[last change: 2021/02/23 18:44:57\] ERROR: Could not ping 172.20.0.11
master1 mysql \[last change: 2021/02/23 18:44:40\] ERROR: Connect error (host = 172.20.0.11:3306, user = mmm_monitor)!
Can't connect to MySQL server on '172.20.0.11' (115)
master1 rep_threads \[last change: 2021/02/23 16:19:44\] OK
master1 rep_backlog \[last change: 2021/02/23 16:19:44\] OK: Backlog is null
slave1 ping \[last change: 2021/02/23 16:19:44\] OK
slave1 mysql \[last change: 2021/02/23 16:19:44\] OK
slave1 rep_threads \[last change: 2021/02/23 16:19:44\] OK
slave1 rep_backlog \[last change: 2021/02/23 16:19:44\] OK: Backlog is null
master2 ping \[last change: 2021/02/23 16:19:44\] OK
master2 mysql \[last change: 2021/02/23 16:19:44\] OK
master2 rep_threads \[last change: 2021/02/23 16:19:44\] OK
master2 rep_backlog \[last change: 2021/02/23 16:19:44\] OK: Backlog is null
root@monitor:/etc/mysql-mmm#
此時(shí)我們看到master2上面的IP地址信息如下究抓,writer vip 172.20.0.100
已經(jīng)遷移到了master2主機(jī)上了。
root@master2:~/Net-ARP-1.0.11# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid\_lft forever preferred\_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
link/tunnel6 :: brd ::
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:14:00:15 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.20.0.21/24 brd 172.20.0.255 scope global eth0
valid\_lft forever preferred\_lft forever
inet 172.20.0.122/32 scope global eth0
valid\_lft forever preferred\_lft forever
inet 172.20.0.100/32 scope global eth0
valid\_lft forever preferred\_lft forever
root@master2:~/Net-ARP-1.0.11#
在monitor節(jié)點(diǎn)上袭灯,查看MMM的監(jiān)控服務(wù)器的日志信息如下:
root@monitor:/etc/mysql-mmm# tail -20 /var/log/mysql-mmm/mmm_mond.log
2021/02/23 16:19:49 INFO Check 'mysql' on 'slave2' is ok!
2021/02/23 16:19:49 INFO Check 'mysql' on 'master1' is ok!
2021/02/23 16:19:49 INFO Check 'mysql' on 'slave1' is ok!
2021/02/23 16:19:49 INFO Check 'mysql' on 'master2' is ok!
2021/02/23 18:44:30 WARN Check 'rep_threads' on 'master1' is in unknown state! Message: UNKNOWN: Connect error (host =
172.20.0.11:3306, user = mmm_monitor)! Can't connect to MySQL server on '172.20.0.11' (115)
2021/02/23 18:44:30 WARN Check 'rep_backlog' on 'master1' is in unknown state! Message: UNKNOWN: Connect error (host =
172.20.0.11:3306, user = mmm_monitor)! Can't connect to MySQL server on '172.20.0.11' (115)
2021/02/23 18:44:40 ERROR Check 'mysql' on 'master1' has failed for 10 seconds! Message: ERROR: Connect error (host =
172.20.0.11:3306, user = mmm_monitor)! Can't connect to MySQL server on '172.20.0.11' (115)
2021/02/23 18:44:41 FATAL State of host 'master1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
2021/02/23 18:44:41 INFO Removing all roles from host 'master1':
2021/02/23 18:44:41 INFO Removed role 'reader(172.20.0.111)' from host 'master1'
2021/02/23 18:44:41 INFO Removed role 'writer(172.20.0.100)' from host 'master1'
2021/02/23 18:44:41 FATAL Can't reach agent on host 'master1'
2021/02/23 18:44:41 ERROR Can't send offline status notification to 'master1' \- killing it!
2021/02/23 18:44:41 FATAL Could not kill host 'master1' \- there may be some duplicate ips now! (There's no binary
configured for killing hosts.)
2021/02/23 18:44:41 INFO Orphaned role 'writer(172.20.0.100)' has been assigned to 'master2'
2021/02/23 18:44:41 INFO Orphaned role 'reader(172.20.0.111)' has been assigned to 'slave1'
2021/02/23 18:44:57 ERROR Check 'ping' on 'master1' has failed for 11 seconds! Message: ERROR: Could not ping
172.20.0.11
root@monitor:/etc/mysql-mmm#
我們?cè)趍onitor節(jié)點(diǎn)上刺下,再次嘗試連接到writer vip 172.20.0.100
上面,發(fā)現(xiàn)已經(jīng)連接到master2上面了稽荧,如下所示:
root@monitor:/etc/mysql-mmm# mysql -uroot -proot -h172.20.0.100 -e 'select @@hostname'
mysql: \[Warning\] Using a password on the command line interface can be insecure.
+---------------+
| @@hostname |
+---------------+
| master2.mysql |
+---------------+
root@monitor:/etc/mysql-mmm#
下面我們看一下slave1和slave2節(jié)點(diǎn)主從同步的配置是否橘茉,自動(dòng)切換到master2節(jié)點(diǎn)上。分別登錄到slave1和slave2節(jié)點(diǎn)上執(zhí)行如下SQL命令:
select * from mysql.slave\_master\_info\\G
查看結(jié)果如下:
通過下面的截圖姨丈,可以看出在新的主節(jié)點(diǎn)上面執(zhí)行的插入數(shù)據(jù)畅卓,是可以正常的同步到兩個(gè)slave從節(jié)點(diǎn)上。
下面我們把master1節(jié)點(diǎn)重新啟動(dòng)蟋恬,讓MySQL數(shù)據(jù)庫服務(wù)恢復(fù)翁潘。
# 啟動(dòng)master1容器
docker start mysql-ha-mmm-master1
# 進(jìn)入master1容器
docker exec -it mysql-ha-mmm-master1 /bin/bash
# 啟動(dòng)master1上面的MMM的agent服務(wù)
/etc/init.d/mysql-mmm-agent start
進(jìn)入monitor節(jié)點(diǎn)上,查看各個(gè)節(jié)點(diǎn)的狀態(tài):
# 在master1啟動(dòng)后歼争,在monitor節(jié)點(diǎn)查看各個(gè)節(jié)點(diǎn)狀態(tài)的時(shí)候拜马,發(fā)現(xiàn)已經(jīng)不再有"Warning: agent on host master1 is not reachable"
的警告了箱歧。
root@monitor:/etc/mysql-mmm# mmm_control show
master1(172.20.0.11) master/AWAITING_RECOVERY. Roles:
master2(172.20.0.21) master/ONLINE. Roles: reader(172.20.0.122), writer(172.20.0.100)
slave1(172.20.0.12) slave/ONLINE. Roles: reader(172.20.0.111), reader(172.20.0.211)
slave2(172.20.0.22) slave/ONLINE. Roles: reader(172.20.0.222)
# 設(shè)置master1節(jié)點(diǎn)上線
root@monitor:/etc/mysql-mmm# mmm\_control set\_online master1
OK: State of 'master1' changed to ONLINE. Now you can wait some time and check its new roles!
# 再次查看各個(gè)節(jié)點(diǎn)的狀態(tài),發(fā)現(xiàn)master1已經(jīng)上線了一膨。但是它此時(shí)成立備用的主節(jié)點(diǎn)了呀邢,并且給他分配了一個(gè)reader VIP地址。
root@monitor:/etc/mysql-mmm# mmm_control show
master1(172.20.0.11) master/ONLINE. Roles: reader(172.20.0.211)
master2(172.20.0.21) master/ONLINE. Roles: reader(172.20.0.122), writer(172.20.0.100)
slave1(172.20.0.12) slave/ONLINE. Roles: reader(172.20.0.111)
slave2(172.20.0.22) slave/ONLINE. Roles: reader(172.20.0.222)
root@monitor:/etc/mysql-mmm#
MMM高可用驗(yàn)證結(jié)果小結(jié):
master1節(jié)點(diǎn)宕機(jī)之后豹绪,master2節(jié)點(diǎn)會(huì)接管master1的所有任務(wù)价淌。
writer VIP會(huì)自動(dòng)從master1上面轉(zhuǎn)移到master2上面。
兩個(gè)從節(jié)點(diǎn)slave1和slave2會(huì)自動(dòng)的把主從同步的鏈路從master1切換到master2上面瞒津。
如果在master1上除了提供寫的服務(wù)蝉衣,還提供可讀的服務(wù),也就是為其分配了reader VIP巷蚪,那么當(dāng)master1宕機(jī)后病毡,這個(gè)reader
VIP不會(huì)丟失,會(huì)被遷移到其他任意一個(gè)節(jié)點(diǎn)上屁柏。在master1重啟后啦膜,在monitor節(jié)點(diǎn)通過命令
mmm_control set_online master1
設(shè)置master1節(jié)點(diǎn)上線后,master1節(jié)點(diǎn)不會(huì)接管現(xiàn)有master2的角色淌喻,而是作為一個(gè)備用主節(jié)點(diǎn)集群中提供服務(wù)僧家。此時(shí),只有master2節(jié)點(diǎn)宕機(jī)后裸删,master1節(jié)點(diǎn)才會(huì)重新成為主節(jié)點(diǎn)的角色八拱。隨著master1和master2節(jié)點(diǎn)的宕機(jī)和恢復(fù),提供寫的VIP會(huì)在兩個(gè)節(jié)點(diǎn)上來回切換涯塔。
對(duì)于這個(gè)5個(gè)服務(wù)器組成的高可用集群肌稻,如果我們擔(dān)心MMM的monitor節(jié)點(diǎn)是單節(jié)點(diǎn),不是高可用的monitor服務(wù)匕荸,我們可以在選擇一臺(tái)服務(wù)器爹谭,在上面部署另外一個(gè)monitor服務(wù),使用keepalive組件每聪,保證兩個(gè)monitor服務(wù)至少有一個(gè)可用旦棉。這樣就更加完美了。
總結(jié)
上面就是關(guān)于MySQL高可用架構(gòu)-MMM架構(gòu)的搭建過程药薯。期間涉及到了MySQL主從同步集群的搭建绑洛,我們搭建了一個(gè)雙主雙從的集群,然后基于這個(gè)集群童本,又在每一個(gè)節(jié)點(diǎn)上面編譯安裝了MMM插件真屯,在每一個(gè)節(jié)點(diǎn)上啟動(dòng)了MMM的agent服務(wù)。還選擇了一臺(tái)服務(wù)器穷娱,安裝MMM監(jiān)控服務(wù)绑蔫。
希望對(duì)你有所幫助运沦,后續(xù)會(huì)分享其他高可用架構(gòu)搭建的方式。
本文由mdnice多平臺(tái)發(fā)布