MySQL高可用搭建方案之(MMM)

有的時(shí)候博客內(nèi)容會(huì)有變動(dòng)嬉挡,首發(fā)博客是最新的钝鸽,其他博客地址可能會(huì)未同步,認(rèn)準(zhǔn)https://blog.zysicyj.top

注意:這篇轉(zhuǎn)載文章,非原創(chuàng)

首發(fā)博客地址

原文地址


前言

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&section=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ā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末配深,一起剝皮案震驚了整個(gè)濱河市携添,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篓叶,老刑警劉巖烈掠,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缸托,居然都是意外死亡左敌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凭戴,你說我怎么就攤上這事〉鸱纾” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵匹摇,是天一觀的道長咬扇。 經(jīng)常有香客問我,道長廊勃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任经窖,我火速辦了婚禮坡垫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘画侣。我一直安慰自己冰悠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布配乱。 她就那樣靜靜地躺著溉卓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搬泥。 梳的紋絲不亂的頭發(fā)上桑寨,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音忿檩,去河邊找鬼尉尾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛燥透,可吹牛的內(nèi)容都是我干的沙咏。 我是一名探鬼主播辨图,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼肢藐!你這毒婦竟也來了故河?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤吆豹,失蹤者是張志新(化名)和其女友劉穎鱼的,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞻讽,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸳吸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了速勇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌砾。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烦磁,靈堂內(nèi)的尸體忽然破棺而出养匈,到底是詐尸還是另有隱情,我是刑警寧澤都伪,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布呕乎,位于F島的核電站,受9級(jí)特大地震影響陨晶,放射性物質(zhì)發(fā)生泄漏猬仁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一先誉、第九天 我趴在偏房一處隱蔽的房頂上張望湿刽。 院中可真熱鬧,春花似錦褐耳、人聲如沸诈闺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雅镊。三九已至,卻和暖如春刃滓,著一層夾襖步出監(jiān)牢的瞬間仁烹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工注盈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晃危,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像僚饭,于是被迫代替她去往敵國和親震叮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容