溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql中的MMM的介紹以及部署方法

發(fā)布時(shí)間:2021-09-28 13:44:09 來源:億速云 閱讀:335 作者:柒染 欄目:MySQL數(shù)據(jù)庫

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)mysql中的MMM的介紹以及部署方法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、 MMM 簡介:
MMM 即 Multi-Master Replication Manager for MySQL: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è)方案是目前比較成熟的解決方案。
mysql中的MMM的介紹以及部署方法
優(yōu)點(diǎn): 高可用性,擴(kuò)展性好,出現(xiàn)故障自動(dòng)切換,對(duì)于主主同步,在同一時(shí)間只提供一臺(tái)數(shù)
據(jù)庫寫操作,保證的數(shù)據(jù)的一致性。 當(dāng)主服務(wù)器掛掉以后,另一個(gè)主立即接管,其他的從服
務(wù)器能自動(dòng)切換,不用人工干預(yù)。
缺點(diǎn): monitor 節(jié)點(diǎn)是單點(diǎn),不過這個(gè)你也可以結(jié)合 keepalived 或者 haertbeat 做成高可用;
至少三個(gè)節(jié)點(diǎn),對(duì)主機(jī)的數(shù)量有要求,需要實(shí)現(xiàn)讀寫分離,還需要在前端編寫讀寫分離程序。
在讀寫非常繁忙的業(yè)務(wù)系統(tǒng)下表現(xiàn)不是很穩(wěn)定,可能會(huì)出現(xiàn)復(fù)制延時(shí)、切換失效等問題。
MMM 方案并不太適應(yīng)于對(duì)數(shù)據(jù)安全性要求很高,并且讀、寫繁忙的環(huán)境中。
適用場(chǎng)景:
MMM 的適用場(chǎng)景為數(shù)據(jù)庫訪問量大,并且能實(shí)現(xiàn)讀寫分離的場(chǎng)景。
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用戶。
二、 部署實(shí)施
建議安裝包完在克隆虛擬機(jī)
1、 環(huán)境介紹
OS:centos7.2(64 位) 數(shù)據(jù)庫系統(tǒng): mysql5.7.13
關(guān)閉 selinux
配置 ntp,同步時(shí)間
關(guān)閉防火墻

角色IPhostnameserver-idwrite vipread vip
master1192.168.41.10master11192.168.41.100
master2(backup)192.168.41.11master22
192.168.41.101
slave1192.168.41.12slave13
192.168.41.102
slave2192.168.41.13slave24
192.168.41.103
monitor192.168.41.14monitor1

192.168.41.14

2、在所有主機(jī)上配置/etc/hosts 文件,添加如下內(nèi)容:
192.168.41.10 master1
192.168.41.11 master2
192.168.41.12 slave1
192.168.41.13 slave2
192.168.41.14 monitor1
在 所 有 主 機(jī) 上 安 裝 perl perl-devel perl-CPAN libart_lgpl.x86_64 rrdtool.x86_64
rrdtool-perl.x86_64 包
#yum -y install perl- libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64
注:使用 centos7 在線 yum 源安裝(如果沒有安裝成功就yum remove libvirt-client在重新yum  -y install perl-
libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64就好)
安裝 perl 的相關(guān)庫
#cpan -i Algorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perl
Mail::Send Net::Ping Proc::Daemon Time::HiRes Params::Validate Net::ARP
3、在 master1、 master2、 slave1、 slave2 主機(jī)上安裝 mysql5.7 和配置復(fù)制
master1 和 master2 互為主從, slave1、 slave2 為 master1 的從
在每個(gè) mysql 的配置文件/etc/my.cnf 中加入以下內(nèi)容, 注意 server-id 不能重復(fù)。
master1 主機(jī):
log-bin = mysql-bin
binlog_format = mixed
server-id = 1
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
master2 主機(jī):
log-bin = mysql-bin
binlog_format = mixed
server-id = 2
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1auto-increment-increment = 2
auto-increment-offset = 2
slave1 主機(jī):
server-id = 3
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
slave2 主機(jī):
server-id = 4
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
在完成了對(duì) my.cnf 的修改后,通過 systemctl restart mysqld 重新啟動(dòng) mysql 服務(wù)
主從配置(master1 和 master2 配置成主主, slave1 和 slave2 配置成 master1 的從):
在 master1 上授權(quán):
mysql> grant replication slave on . to rep@'192.168.31.%' identified by '123456';
在 master2 上授權(quán):
mysql> grant replication slave on . to rep@'192.168.31.%' identified by '123456';
把 master2、 slave1 和 slave2 配置成 master1 的從庫:
在 master1 上執(zhí)行 show master status; 獲取 binlog 文件和 Position 點(diǎn)
mysql中的MMM的介紹以及部署方法
在 master2、 slave1 和 slave2 執(zhí)行
mysql> change master to master_host='192.168.41.10',master_port=3306,master_user='rep',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=452;
mysql>slave start;
驗(yàn)證主從復(fù)制:
master2 主機(jī):
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果 Slave_IO_Running 和 Slave_SQL_Running 都為 yes,那么主從就已經(jīng)配置 OK 了
把 master1 配置成 master2 的從庫:
在 master2 上執(zhí)行 show master status ;獲取 binlog 文件和 Position 點(diǎn)
mysql> show master status;
mysql中的MMM的介紹以及部署方法

在 master1 上執(zhí)行:
mysql> change master to
master_host='192.168.41.11',master_port=3306,master_user='rep',master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos=452;
mysql> start slave;
驗(yàn)證主從復(fù)制:
master1 主機(jī):
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果 Slave_IO_Running 和 Slave_SQL_Running 都為 yes,那么主從就已經(jīng)配置 OK 了
4、 mysql-mmm 配置:
在 4 臺(tái) mysql 節(jié)點(diǎn)上創(chuàng)建用戶
創(chuàng)建代理賬號(hào):
mysql> grant super,replication client,process on . to 'mmm_agent'@'192.168.41.%' identified
by '123456';
創(chuàng)建監(jiān)控賬號(hào):
mysql> grant replication client on . to 'mmm_monitor'@'192.168.41.%' identified by '123456';
注 1: 因?yàn)橹暗闹鲝膹?fù)制,以及主從已經(jīng)是 ok 的,所以我在 master1 服務(wù)器執(zhí)行就 ok 了。
檢查 master2 和 slave1、 slave2 三臺(tái) db 上是否都存在監(jiān)控和代理賬號(hào)
mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');
mysql中的MMM的介紹以及部署方法
注 2:
mmm_monitor 用戶: mmm 監(jiān)控用于對(duì) mysql 服務(wù)器進(jìn)程健康檢查
mmm_agent 用戶: mmm 代理用來更改只讀模式,復(fù)制的主服務(wù)器等
5、 mysql-mmm 安裝
在 monitor 主機(jī)(192.168.41.14) 上安裝監(jiān)控程序
cd /usr/local/src
wget
http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251
d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar -zxf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install
在數(shù)據(jù)庫服務(wù)器(master1、 master2、 slave1、 slave2)上安裝代理
cd /tmp
wget
http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251
d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar -zxf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install
6、配置 mmm
編寫配置文件,五臺(tái)主機(jī)必須一致:
完成安裝后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服務(wù)器和數(shù)據(jù)庫服務(wù)器
上都要包含一個(gè)共同的文件 mmm_common.conf,內(nèi)容如下:
active_master_rolewriter#積極的 master 角色的標(biāo)示,所有的 db 服務(wù)器要開啟 read_only 參
數(shù),對(duì)于 writer 服務(wù)器監(jiān)控代理會(huì)自動(dòng)將 read_only 屬性關(guān)閉。

<host default>
cluster_interface eno16777736#群集的網(wǎng)絡(luò)接口
pid_path /var/run/mmm_agentd.pid#pid 路徑
bin_path /usr/lib/mysql-mmm/#可執(zhí)行文件路徑
replication_user rep#復(fù)制用戶
replication_password 123456#復(fù)制用戶密碼
agent_usermmm_agent#代理用戶
agent_password 123456#代理用戶密碼
</host>
<host master1>#master1 的 host 名
ip 192.168.41.10#master1 的 ipmode master#角色屬性, master 代表是主
peer master2#與 master1對(duì)等的服務(wù)器的 host名,也就是 master2的服務(wù)器 host
名
</host>
<host master2>#和 master 的概念一樣
ip 192.168.41.11
mode master
peer master1
</host>
<host slave1>#從庫的 host 名,如果存在多個(gè)從庫可以重復(fù)一樣的配置
ip 192.168.41.12#從的 ip
mode slave#slave 的角色屬性代表當(dāng)前 host 是從
</host>
<host slave2>#和 slave 的概念一樣
ip 192.168.41.13
mode slave
</host>
<role writer>#writer 角色配置
hosts master1,master2#能進(jìn)行寫操作的服務(wù)器的 host 名,如果不想切換寫操
作這里可以只配置 master,這樣也可以避免因?yàn)榫W(wǎng)絡(luò)延時(shí)而進(jìn)行 write 的切換,但是一旦
master 出現(xiàn)故障那么當(dāng)前的 MMM 就沒有 writer 了只有對(duì)外的 read 操作。
ips 192.168.41.100#對(duì)外提供的寫操作的虛擬 IP
mode exclusive#exclusive 代表只允許存在一個(gè)主,也就是只能提供一個(gè)寫的 IP
</role>
<role reader>#read 角色配置
hosts master2,slave1,slave2#對(duì)外提供讀操作的服務(wù)器的 host 名,當(dāng)然這里也可以
把 master 加進(jìn)來
ips 192.168.41.101, 192.168.41.102, 192.168.41.103#對(duì)外提供讀操作的虛擬 ip,這三個(gè) ip 和
host 不是一一對(duì)應(yīng)的,并且 ips 也 hosts 的數(shù)目也可以不相同,如果這樣配置的話其中一個(gè)
hosts 會(huì)分配兩個(gè) ip
mode balanced#balanced 代表負(fù)載均衡
</role>

mysql中的MMM的介紹以及部署方法
同時(shí)將這個(gè)文件拷貝到其它的服務(wù)器,配置不變
#for host in master1 master2 slave1 slave2 ; do scp /etc/mysql-mmm/mmm_common.conf
$host:/etc/mysql-mmm/ ; done
代理文件配置
編輯 4 臺(tái) mysql 節(jié)點(diǎn)機(jī)上的/etc/mysql-mmm/mmm_agent.conf
在數(shù)據(jù)庫服務(wù)器上,還有一個(gè) mmm_agent.conf 需要修改,其內(nèi)容是:
includemmm_common.conf
this master1
注意:這個(gè)配置只配置 db 服務(wù)器,監(jiān)控服務(wù)器不需要配置, this 后面的 host 名改成當(dāng)前服務(wù)器的主機(jī)名。
啟動(dòng)代理進(jìn)程
在 /etc/init.d/mysql-mmm-agent 的腳本文件的#!/bin/sh 下面,加入如下內(nèi)容
source /root/.bash_profile添加成系統(tǒng)服務(wù)并設(shè)置為自啟動(dòng)
#chkconfig --add mysql-mmm-agent
#chkconfigmysql-mmm-agent on
#/etc/init.d/mysql-mmm-agent start
注:添加 source /root/.bash_profile 目的是為了 mysql-mmm-agent 服務(wù)能啟機(jī)自啟。
自動(dòng)啟動(dòng)和手動(dòng)啟動(dòng)的唯一區(qū)別,就是激活一個(gè) console 。那么說明在作為服務(wù)啟動(dòng)的時(shí)候,
可能是由于缺少環(huán)境變量
服務(wù)啟動(dòng)失敗,報(bào)錯(cuò)信息如下:
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Can't locate Proc/Daemon.pm in @INC (@INC contains:
/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_agentd line
7.
BEGIN failed--compilation aborted at /usr/sbin/mmm_agentd line 7.
failed
解決方法:
#cpan Proc::Daemon
#cpan Log::Log4perl
#/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
#netstat -antp | grep mmm_agentd
tcp 0 0 192.168.31.83:9989 0.0.0.0:* LISTEN 9693/mmm_agentd

編輯 monitor 主機(jī)上的/etc/mysql-mmm/mmm_mon.conf
includemmm_common.conf

<monitor>
ip 127.0.0.1##為了安全性,設(shè)置只在本機(jī)監(jiān)聽, mmm_mond 默認(rèn)監(jiān)聽 9988
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/
status_path/var/lib/misc/mmm_mond.status
ping_ips192.168.41.10,192.168.41.11,192.168.41.12,192.168.41.13#用于測(cè)試網(wǎng)絡(luò)
可用性 IP 地址列表,只要其中有一個(gè)地址 ping 通,就代表網(wǎng)絡(luò)正常,這里不要寫入本機(jī)
地址
auto_set_online 0#設(shè)置自動(dòng) online 的時(shí)間,默認(rèn)是超過 60s 就將它設(shè)置為 online,默認(rèn)是
60s,這里將其設(shè)為 0 就是立即 online
</monitor>
<check default>check_period 5
trap_period 10
timeout 2
#restart_after 10000
max_backlog 86400
</check>
check_period
描述:檢查周期默認(rèn)為 5s
默認(rèn)值: 5s
trap_period
描述:一個(gè)節(jié)點(diǎn)被檢測(cè)不成功的時(shí)間持續(xù) trap_period 秒,就慎重的認(rèn)為這個(gè)節(jié)點(diǎn)失敗了。
默認(rèn)值: 10s
timeout
描述:檢查超時(shí)的時(shí)間
默認(rèn)值: 2s
restart_after
描述:在完成 restart_after 次檢查后,重啟 checker 進(jìn)程
默認(rèn)值: 10000
max_backlog
描述:記錄檢查 rep_backlog 日志的最大次數(shù)
默認(rèn)值: 60
<host default>
monitor_usermmm_monitor#監(jiān)控 db 服務(wù)器的用戶
monitor_password 123456#監(jiān)控 db 服務(wù)器的密碼
</host>

啟動(dòng)監(jiān)控進(jìn)程:
在 /etc/init.d/mysql-mmm-agent 的腳本文件的#!/bin/sh 下面,加入如下內(nèi)容
source /root/.bash_profile
添加成系統(tǒng)服務(wù)并設(shè)置為自啟動(dòng)
#chkconfig --add mysql-mmm-monitor
#chkconfigmysql-mmm-monitor on
#/etc/init.d/mysql-mmm-monitor start
啟動(dòng)報(bào)錯(cuò):
Starting MMM Monitor daemon: Can not locate Proc/Daemon.pm in @INC (@INC contains:
/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_mond line
11.
BEGIN failed--compilation aborted at /usr/sbin/mmm_mond line 11.
failed
解決方法: 安裝下列 perl 的庫
#cpanProc::Daemon
#cpan Log::Log4perl[root@monitor1 ~]# /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@monitor1 ~]# netstat -anpt | grep 9988  \沒有出來端口稍等一些時(shí)間
tcp 0 0 127.0.0.1:9988 0.0.0.0:* LISTEN 8546/mmm_mond
注 2: MMM 啟動(dòng)順序:先啟動(dòng) monitor,再啟動(dòng) agent
查看群集狀態(tài)
[root@monitor1 mysql-mmm]# mmm_control show
master1(192.168.41.10) master/ONLINE. Roles: writer(192.168.41.100)
master2(192.168.41.11) master/ONLINE. Roles: reader(192.168.41.101)
slave1(192.168.41.12) slave/ONLINE. Roles: reader(192.168.41.102)
slave2(192.168.41.13) slave/ONLINE. Roles: reader(192.168.41.103)
如果服務(wù)器狀態(tài)不是 ONLINE,可以用如下命令將服務(wù)器上線,例如:
#mmm_controlset_online 主機(jī)名
例如: [root@monitor1 ~]#mmm_control set_online master1
從上面的顯示可以看到,寫請(qǐng)求的 VIP 在 master1 上,所有從節(jié)點(diǎn)也都把 master1 當(dāng)做主節(jié)
點(diǎn)。
查看是否啟用 vip
[root@master1 ~]# ip addr show dev eno16777736

[root@master1 mysql-mmm]# ip addr show dev eno16777736
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:4b:7f:71 brd ff:ff:ff:ff:ff:ff
inet 192.168.41.10/24 brd 192.168.41.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.41.100/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe4b:7f71/64 scope link
valid_lft forever preferred_lft forever
[root@master2 mysql-mmm]# ip addr show dev eno16777736
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:c6:2f:5c brd ff:ff:ff:ff:ff:ff
inet 192.168.41.11/24 brd 192.168.41.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.41.101/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec6:2f5c/64 scope link
valid_lft forever preferred_lft forever
[root@slave1 mysql-mmm]# ip addr show dev eno16777736
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f6:45:7b brd ff:ff:ff:ff:ff:ff
inet 192.168.41.12/24 brd 192.168.41.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.41.102/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fef6:457b/64 scope link
valid_lft forever preferred_lft forever
[root@slave2 mysql-mmm]# ip addr show dev eno16777736
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:46:31:2a brd ff:ff:ff:ff:ff:ff
inet 192.168.41.13/24 brd 192.168.41.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.41.103/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe46:312a/64 scope link
valid_lft forever preferred_lft forever

MMM 高可用性測(cè)試:
服務(wù)器讀寫采有 VIP 地址進(jìn)行讀寫,出現(xiàn)故障時(shí) VIP 會(huì)漂移到其它節(jié)點(diǎn),由其它節(jié)點(diǎn)提供服
務(wù)。
首先查看整個(gè)集群的狀態(tài),可以看到整個(gè)集群狀態(tài)正常
[root@monitor1 ~]# mmm_control show
master1(192.168.41.10) master/ONLINE. Roles: writer(192.168.41.100)
master2(192.168.41.11) master/ONLINE. Roles: reader(192.168.41.101)
slave1(192.168.41.12) slave/ONLINE. Roles: reader(192.168.41.102)
slave2(192.168.41.13) slave/ONLINE. Roles: reader(192.168.41.103)
模擬 master1 宕機(jī),手動(dòng)停止 mysql 服務(wù),觀察 monitor 日志,master1 的日志如下:
[root@monitor1 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
查看群集的最新狀態(tài)
[root@monitor1 mysql-mmm]# mmm_control show
#Warning: agent on host master1 is not reachable
master1(192.168.41.10) master/HARD_OFFLINE. Roles:
master2(192.168.41.11) master/ONLINE. Roles: reader(192.168.41.102), writer(192.168.41.100)
slave1(192.168.41.12) slave/ONLINE. Roles: reader(192.168.41.101)
slave2(192.168.41.13) slave/ONLINE. Roles: reader(192.168.41.103)
從顯示結(jié)果可以看出 master1 的狀態(tài)有 ONLINE 轉(zhuǎn)換為 HARD_OFFLINE,寫 VIP 轉(zhuǎn)移到了
master2 主機(jī)上。
檢查所有的 db 服務(wù)器群集狀態(tài)
[root@monitor1 ~]# mmm_control checks all
mysql中的MMM的介紹以及部署方法
從上面可以看到 master1 能 ping 通,說明只是服務(wù)死掉了。
查看 master2 主機(jī)的 ip 地址:
[root@master2 ~]# ip addr show dev eno16777736
eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:c6:2f:5c brd ff:ff:ff:ff:ff:ff
inet 192.168.41.11/24 brd 192.168.41.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.41.102/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.41.100/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec6:2f5c/64 scope link
valid_lft forever preferred_lft forever

slave1 主機(jī):
mysql> show slave status\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.41.11
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
slave2 主機(jī):
mysql> show slave status\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.41.11
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
啟動(dòng) master1 主機(jī)的 mysql 服務(wù), 觀察 monitor 日志,master1 的日志如下:
[root@monitor1 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2018/07/30 14:57:07  INFO Check 'mysql' on 'master1' is ok!
2018/07/30 14:57:07  INFO Check 'rep_backlog' on 'master1' is ok!
2018/07/30 14:57:07  INFO Check 'rep_threads' on 'master1' is ok!
2018/07/30 14:57:10 FATAL State of host 'master1' changed from HARD_OFFLINE to AWAITING_RECOVERY
從上面可以看到 master1 的狀態(tài)由 hard_offline 改變?yōu)?awaiting_recovery 狀態(tài)
用如下命令將服務(wù)器上線:
[root@monitor1 ~]#mmm_control set_online master1
[root@monitor1 mysql-mmm]# mmm_control show
master1(192.168.41.10) master/ONLINE. Roles:
master2(192.168.41.11) master/ONLINE. Roles: reader(192.168.41.102), writer(192.168.41.100)
slave1(192.168.41.12) slave/ONLINE. Roles: reader(192.168.41.101)
slave2(192.168.41.13) slave/ONLINE. Roles: reader(192.168.41.103)
可以看到主庫啟動(dòng)不會(huì)接管主,只到現(xiàn)有的主再次宕機(jī)。
總結(jié)
(1)master2 備選主節(jié)點(diǎn)宕機(jī)不影響集群的狀態(tài),就是移除了 master2 備選節(jié)點(diǎn)的讀狀態(tài)。
(2)master1 主節(jié)點(diǎn)宕機(jī),由 master2 備選主節(jié)點(diǎn)接管寫角色, slave1,slave2 指向新 master2
主庫進(jìn)行復(fù)制, slave1,slave2 會(huì)自動(dòng) change master 到 master2.
(3)如果 master1 主庫宕機(jī),master2 復(fù)制應(yīng)用又落后于 master1 時(shí)就變成了主可寫狀態(tài),
這時(shí)的數(shù)據(jù)主無法保證一致性。
如果 master2,slave1,slave2 延遲于 master1 主,這個(gè)時(shí) master1 宕機(jī), slave1,slave2 將會(huì)
等待數(shù)據(jù)追上 db1 后,再重新指向新的主 node2 進(jìn)行復(fù)制操作,這時(shí)的數(shù)據(jù)也無法保證
同步的一致性。(4)如果采用 MMM 高可用架構(gòu),主,主備選節(jié)點(diǎn)機(jī)器配置一樣,而且開啟半同步進(jìn)一步
提高安全性或采用 MariaDB/mysql5.7 進(jìn)行多線程從復(fù)制,提高復(fù)制的性能。
附:
1、 日志文件:
日志文件往往是分析錯(cuò)誤的關(guān)鍵,所以要善于利用日志文件進(jìn)行問題分析。
db 端: /var/log/mysql-mmm/mmm_agentd.log
監(jiān)控端: /var/log/mysql-mmm/mmm_mond.log
2、 命令文件:
mmm_agentd: db 代理進(jìn)程的啟動(dòng)文件
mmm_mond:監(jiān)控進(jìn)程的啟動(dòng)文件
mmm_backup:備份文件
mmm_restore:還原文件
mmm_control:監(jiān)控操作命令文件
db 服務(wù)器端只有 mmm_agentd 程序,其它的都是在 monitor 服務(wù)器端。
3、 mmm_control 用法
mmm_control 程序可以用于監(jiān)控群集狀態(tài)、切換 writer、設(shè)置 online\offline 操作等。
Valid commands are:
help - show this message #幫助信息
ping - ping monitor #ping 當(dāng)前的群集是否正常
show - show status #群集在線狀態(tài)檢查
checks [<host>|all [<check>|all]] - show checks status#執(zhí)行監(jiān)控檢查操作
set_online<host> - set host <host> online #將 host 設(shè)置為 online
set_offline<host> - set host <host> offline #將 host 設(shè)置為 offline
mode - print current mode. #打印輸出當(dāng)前的 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> #移除 writer 服務(wù)器
為指定的 host 服務(wù)器(Only use --force if you know what you are doing!)
set_ip<ip><host> - set role with ip<ip> to host <host>
檢查所有的 db 服務(wù)器群集狀態(tài):
[root@monitor1 ~]# mmm_control checks all
檢查項(xiàng)包括: ping、 mysql 是否正常運(yùn)行、復(fù)制線程是否正常等
檢查群集環(huán)境在線狀況:
[root@monitor1 ~]# mmm_control show
對(duì)指定的 host 執(zhí)行 offline 操作:
[root@monitor1 ~]# mmm_controlset_offline slave2
對(duì)指定的 host 執(zhí)行 onine 操作:
[root@monitor1 ~]# mmm_controlset_online slave2
執(zhí)行 write 切換(手動(dòng)切換):
查看當(dāng)前的 slave 對(duì)應(yīng)的 master
[root@slave2 ~]# mysql -uroot -p123456 -e 'show slave status\G;'
mysql: [Warning] Using a password on the command line interface can be insecure. 1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.141
writer 切換,要確保 mmm_common.conf 文件中的 writer 屬性有配置對(duì)應(yīng)的 host,否則無法切

[root@monitor1 ~]# mmm_controlmove_role writer master1
OK: Role 'writer' has been moved from 'master2' to 'master1'. Now you can wait some time and
check new roles info!
[root@monitor1 ~]# mmm_control show
master1(192.168.41.10) master/ONLINE. Roles: writer(192.168.41.100)
master2(192.168.41.11) master/ONLINE. Roles: reader(192.168.41.101)
slave1(192.168.41.12) slave/ONLINE. Roles: reader(192.168.41.102)
slave2(192.168.41.13) slave/ONLINE. Roles: reader(192.168.41.103)
save 從庫自動(dòng)切換到了新的 master
[root@slave2 ~]# mysql -uroot -p123456 -e 'show slave status\G;'
mysql: [Warning] Using a password on the command line interface can be insecure.
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.41.10
4、 其它處理問題
如果不想讓 writer 從 master 切換到 backup(包括主從的延時(shí)也會(huì)導(dǎo)致寫 VIP 的切換),那么
可以在配置/etc/mysql-mmm/mmm_common.conf 時(shí), 去掉<role write>中的 backup
<role writer>#writer 角色配置
hosts master1 #這里只配置一個(gè) Hosts
ips 192.168.41.100#對(duì)外提供的寫操作的虛擬 IP
mode exclusive #exclusive 代表只允許存在一個(gè)主,也就是只能提供一個(gè)寫的 IP
</role>
這樣的話當(dāng) master1 出現(xiàn)故障了 writer 寫操作不會(huì)切換到 master2 服務(wù)器,并且 slave 也不
會(huì)指向新的 master,此時(shí)當(dāng)前的 MMM 之前對(duì)外提供寫服務(wù)。
5、 總結(jié)
1.對(duì)外提供讀寫的虛擬 IP 是由 monitor 程序控制。如果 monitor 沒有啟動(dòng)那么 db 服務(wù)器
不會(huì)被分配虛擬 ip,但是如果已經(jīng)分配好了虛擬 ip,當(dāng) monitor 程序關(guān)閉了原先分配的虛擬 ip
不會(huì)立即關(guān)閉外部程序還可以連接訪問(只要不重啟網(wǎng)絡(luò)),這樣的好處就是對(duì)于 monitor
的可靠性要求就會(huì)低一些,但是如果這個(gè)時(shí)候其中的某一個(gè) db 服務(wù)器故障了就無法處理切
換,也就是原先的虛擬 ip 還是維持不變,掛掉的那臺(tái) DB 的虛擬 ip 會(huì)變的不可訪問。
2.agent 程序受 monitor 程序的控制處理 write 切換,從庫切換等操作。如果 monitor 進(jìn)
程關(guān)閉了那么 agent 進(jìn)程就起不到什么作用,它本身不能處理故障。
3.monitor 程序負(fù)責(zé)監(jiān)控 db 服務(wù)器的狀態(tài),包括 Mysql 數(shù)據(jù)庫、服務(wù)器是否運(yùn)行、復(fù)制
線程是否正常、主從延時(shí)等;它還用于控制 agent 程序處理故障。
4.monitor 會(huì)每隔幾秒鐘監(jiān)控 db 服務(wù)器的狀態(tài),如果 db 服務(wù)器已經(jīng)從故障變成了正常,
那么 monitor 會(huì)自動(dòng)在 60s 之后將其設(shè)置為 online 狀態(tài)(默認(rèn)是 60s 可以設(shè)為其它的值),有
監(jiān)控端的配置文件參數(shù) “auto_set_online”決定 ,群集服務(wù)器的狀態(tài)有三種分別是 :
HARD_OFFLINE→AWAITING_RECOVERY→online
5.默認(rèn) monitor 會(huì)控制 mmm_agent 會(huì)將 writer db 服務(wù)器 read_only 修改為 OFF,其它的db 服務(wù)器 read_only 修改為 ON,所以為了嚴(yán)謹(jǐn)可以在所有的服務(wù)器的 my.cnf 文件中加入
read_only=1 由 monitor 控制來控制 writer 和 read,root 用戶和復(fù)制用戶不受 read_only 參數(shù)的
影響。

上述就是小編為大家分享的mysql中的MMM的介紹以及部署方法了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI