mysql+高可用MMM

一、 MMM 簡介:
MMM 即 Multi-Master Replication Manager for MySQL:mysql 多主複製管理器,基於 perl 實現,
關於 mysql 主主複製配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任何時候只
有一個節點可以被寫入), MMM 也能對從服務器進行讀負載均衡,所以可以用它來在一組
用於複製的服務器啓動虛擬 ip,除此之外,它還有實現數據備份、節點之間重新同步功能的
腳本。 MySQL 本身沒有提供 replication failover 的解決方案,通過 MMM 方案能實現服務器
的故障轉移,從而實現 mysql 的高可用。 MMM 不僅能提供浮動 IP 的功能,如果當前的主服
務器掛掉後,會將你後端的從服務器自動轉向新的主服務器進行同步複製,不用手工更改同
步配置。這個方案是目前比較成熟的解決方案。
mysql+高可用MMM
優點: 高可用性,擴展性好,出現故障自動切換,對於主主同步,在同一時間只提供一臺數
據庫寫操作,保證的數據的一致性。 當主服務器掛掉以後,另一個主立即接管,其他的從服
務器能自動切換,不用人工干預。
缺點: monitor 節點是單點,不過這個你也可以結合 keepalived 或者 haertbeat 做成高可用;
至少三個節點,對主機的數量有要求,需要實現讀寫分離,還需要在前端編寫讀寫分離程序。
在讀寫非常繁忙的業務系統下表現不是很穩定,可能會出現複製延時、切換失效等問題。
MMM 方案並不太適應於對數據安全性要求很高,並且讀、寫繁忙的環境中。
適用場景:
MMM 的適用場景爲數據庫訪問量大,並且能實現讀寫分離的場景。
Mmm 主要功能由下面三個腳本提供:
mmm_mond 負責所有的監控工作的監控守護進程,決定節點的移除(mmm_mond 進程定時
心跳檢測,失敗則將 write ip 浮動到另外一臺 master)等等
mmm_agentd 運行在 mysql 服務器上的代理守護進程,通過簡單遠程服務集提供給監控節點
mmm_control 通過命令行管理 mmm_mond 進程
在整個監管過程中,需要在 mysql 中添加相關授權用戶,授權的用戶包括一個 mmm_monitor
用戶和一個 mmm_agent 用戶,如果想使用 mmm 的備份工具則還要添加一個 mmm_tools用戶。
二、 部署實施
建議安裝包完在克隆虛擬機
1、 環境介紹
OS:centos7.2(64 位) 數據庫系統: mysql5.7.13
關閉 selinux
配置 ntp,同步時間
關閉防火牆

角色 IP hostname server-id write vip read vip
master1 192.168.41.10 master1 1 192.168.41.100
master2(backup) 192.168.41.11 master2 2 192.168.41.101
slave1 192.168.41.12 slave1 3 192.168.41.102
slave2 192.168.41.13 slave2 4 192.168.41.103
monitor 192.168.41.14 monitor1 192.168.41.14

2、在所有主機上配置/etc/hosts 文件,添加如下內容:
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
在 所 有 主 機 上 安 裝 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 的相關庫
#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 主機上安裝 mysql5.7 和配置複製
master1 和 master2 互爲主從, slave1、 slave2 爲 master1 的從
在每個 mysql 的配置文件/etc/my.cnf 中加入以下內容, 注意 server-id 不能重複。
master1 主機:
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 主機:
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 主機:
server-id = 3
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
slave2 主機:
server-id = 4
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
在完成了對 my.cnf 的修改後,通過 systemctl restart mysqld 重新啓動 mysql 服務
主從配置(master1 和 master2 配置成主主, slave1 和 slave2 配置成 master1 的從):
在 master1 上授權:
mysql> grant replication slave on . to rep@'192.168.31.%' identified by '123456';
在 master2 上授權:
mysql> grant replication slave on . to rep@'192.168.31.%' identified by '123456';
把 master2、 slave1 和 slave2 配置成 master1 的從庫:
在 master1 上執行 show master status; 獲取 binlog 文件和 Position 點
mysql+高可用MMM
在 master2、 slave1 和 slave2 執行
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;
驗證主從複製:
master2 主機:
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果 Slave_IO_Running 和 Slave_SQL_Running 都爲 yes,那麼主從就已經配置 OK 了
把 master1 配置成 master2 的從庫:
在 master2 上執行 show master status ;獲取 binlog 文件和 Position 點
mysql> show master status;
mysql+高可用MMM

在 master1 上執行:
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;
驗證主從複製:
master1 主機:
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果 Slave_IO_Running 和 Slave_SQL_Running 都爲 yes,那麼主從就已經配置 OK 了
4、 mysql-mmm 配置:
在 4 臺 mysql 節點上創建用戶
創建代理賬號:
mysql> grant super,replication client,process on . to 'mmm_agent'@'192.168.41.%' identified
by '123456';
創建監控賬號:
mysql> grant replication client on . to 'mmm_monitor'@'192.168.41.%' identified by '123456';
注 1: 因爲之前的主從複製,以及主從已經是 ok 的,所以我在 master1 服務器執行就 ok 了。
檢查 master2 和 slave1、 slave2 三臺 db 上是否都存在監控和代理賬號
mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');
mysql+高可用MMM
注 2:
mmm_monitor 用戶: mmm 監控用於對 mysql 服務器進程健康檢查
mmm_agent 用戶: mmm 代理用來更改只讀模式,複製的主服務器等
5、 mysql-mmm 安裝
在 monitor 主機(192.168.41.14) 上安裝監控程序
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
在數據庫服務器(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
編寫配置文件,五臺主機必須一致:
完成安裝後,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服務器和數據庫服務器
上都要包含一個共同的文件 mmm_common.conf,內容如下:
active_master_rolewriter#積極的 master 角色的標示,所有的 db 服務器要開啓 read_only 參
數,對於 writer 服務器監控代理會自動將 read_only 屬性關閉。

<host default>
cluster_interface eno16777736#羣集的網絡接口
pid_path /var/run/mmm_agentd.pid#pid 路徑
bin_path /usr/lib/mysql-mmm/#可執行文件路徑
replication_user rep#複製用戶
replication_password 123456#複製用戶密碼
agent_usermmm_agent#代理用戶
agent_password 123456#代理用戶密碼
</host>
<host master1>#master1 的 host 名
ip 192.168.41.10#master1 的 ipmode master#角色屬性, master 代表是主
peer master2#與 master1對等的服務器的 host名,也就是 master2的服務器 host
名
</host>
<host master2>#和 master 的概念一樣
ip 192.168.41.11
mode master
peer master1
</host>
<host slave1>#從庫的 host 名,如果存在多個從庫可以重複一樣的配置
ip 192.168.41.12#從的 ip
mode slave#slave 的角色屬性代表當前 host 是從
</host>
<host slave2>#和 slave 的概念一樣
ip 192.168.41.13
mode slave
</host>
<role writer>#writer 角色配置
hosts master1,master2#能進行寫操作的服務器的 host 名,如果不想切換寫操
作這裏可以只配置 master,這樣也可以避免因爲網絡延時而進行 write 的切換,但是一旦
master 出現故障那麼當前的 MMM 就沒有 writer 了只有對外的 read 操作。
ips 192.168.41.100#對外提供的寫操作的虛擬 IP
mode exclusive#exclusive 代表只允許存在一個主,也就是隻能提供一個寫的 IP
</role>
<role reader>#read 角色配置
hosts master2,slave1,slave2#對外提供讀操作的服務器的 host 名,當然這裏也可以
把 master 加進來
ips 192.168.41.101, 192.168.41.102, 192.168.41.103#對外提供讀操作的虛擬 ip,這三個 ip 和
host 不是一一對應的,並且 ips 也 hosts 的數目也可以不相同,如果這樣配置的話其中一個
hosts 會分配兩個 ip
mode balanced#balanced 代表負載均衡
</role>

mysql+高可用MMM
同時將這個文件拷貝到其它的服務器,配置不變
#for host in master1 master2 slave1 slave2 ; do scp /etc/mysql-mmm/mmm_common.conf
$host:/etc/mysql-mmm/ ; done
代理文件配置
編輯 4 臺 mysql 節點機上的/etc/mysql-mmm/mmm_agent.conf
在數據庫服務器上,還有一個 mmm_agent.conf 需要修改,其內容是:
includemmm_common.conf
this master1
注意:這個配置只配置 db 服務器,監控服務器不需要配置, this 後面的 host 名改成當前服務器的主機名。
啓動代理進程
在 /etc/init.d/mysql-mmm-agent 的腳本文件的#!/bin/sh 下面,加入如下內容
source /root/.bash_profile添加成系統服務並設置爲自啓動
#chkconfig --add mysql-mmm-agent
#chkconfigmysql-mmm-agent on
#/etc/init.d/mysql-mmm-agent start
注:添加 source /root/.bash_profile 目的是爲了 mysql-mmm-agent 服務能啓機自啓。
自動啓動和手動啓動的唯一區別,就是激活一個 console 。那麼說明在作爲服務啓動的時候,
可能是由於缺少環境變量
服務啓動失敗,報錯信息如下:
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 主機上的/etc/mysql-mmm/mmm_mon.conf
includemmm_common.conf


<monitor>
ip 127.0.0.1##爲了安全性,設置只在本機監聽, mmm_mond 默認監聽 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#用於測試網絡
可用性 IP 地址列表,只要其中有一個地址 ping 通,就代表網絡正常,這裏不要寫入本機
地址
auto_set_online 0#設置自動 online 的時間,默認是超過 60s 就將它設置爲 online,默認是
60s,這裏將其設爲 0 就是立即 online
</monitor>
<check default>check_period 5
trap_period 10
timeout 2
#restart_after 10000
max_backlog 86400
</check>
check_period
描述:檢查週期默認爲 5s
默認值: 5s
trap_period
描述:一個節點被檢測不成功的時間持續 trap_period 秒,就慎重的認爲這個節點失敗了。
默認值: 10s
timeout
描述:檢查超時的時間
默認值: 2s
restart_after
描述:在完成 restart_after 次檢查後,重啓 checker 進程
默認值: 10000
max_backlog
描述:記錄檢查 rep_backlog 日誌的最大次數
默認值: 60
<host default>
monitor_usermmm_monitor#監控 db 服務器的用戶
monitor_password 123456#監控 db 服務器的密碼
</host>

啓動監控進程:
在 /etc/init.d/mysql-mmm-agent 的腳本文件的#!/bin/sh 下面,加入如下內容
source /root/.bash_profile
添加成系統服務並設置爲自啓動
#chkconfig --add mysql-mmm-monitor
#chkconfigmysql-mmm-monitor on
#/etc/init.d/mysql-mmm-monitor start
啓動報錯:
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 \沒有出來端口稍等一些時間
tcp 0 0 127.0.0.1:9988 0.0.0.0:* LISTEN 8546/mmm_mond
注 2: MMM 啓動順序:先啓動 monitor,再啓動 agent
查看羣集狀態
[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)
如果服務器狀態不是 ONLINE,可以用如下命令將服務器上線,例如:
#mmm_controlset_online 主機名
例如: [root@monitor1 ~]#mmm_control set_online master1
從上面的顯示可以看到,寫請求的 VIP 在 master1 上,所有從節點也都把 master1 當做主節
點。
查看是否啓用 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 高可用性測試:
服務器讀寫採有 VIP 地址進行讀寫,出現故障時 VIP 會漂移到其它節點,由其它節點提供服
務。
首先查看整個集羣的狀態,可以看到整個集羣狀態正常
[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 宕機,手動停止 mysql 服務,觀察 monitor 日誌,master1 的日誌如下:
[root@monitor1 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
查看羣集的最新狀態
[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)
從顯示結果可以看出 master1 的狀態有 ONLINE 轉換爲 HARD_OFFLINE,寫 VIP 轉移到了
master2 主機上。
檢查所有的 db 服務器羣集狀態
[root@monitor1 ~]# mmm_control checks all
mysql+高可用MMM
從上面可以看到 master1 能 ping 通,說明只是服務死掉了。
查看 master2 主機的 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 主機:
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 主機:
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
啓動 master1 主機的 mysql 服務, 觀察 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 的狀態由 hard_offline 改變爲 awaiting_recovery 狀態
用如下命令將服務器上線:
[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)
可以看到主庫啓動不會接管主,只到現有的主再次宕機。
總結
(1)master2 備選主節點宕機不影響集羣的狀態,就是移除了 master2 備選節點的讀狀態。
(2)master1 主節點宕機,由 master2 備選主節點接管寫角色, slave1,slave2 指向新 master2
主庫進行復制, slave1,slave2 會自動 change master 到 master2.
(3)如果 master1 主庫宕機,master2 複製應用又落後於 master1 時就變成了主可寫狀態,
這時的數據主無法保證一致性。
如果 master2,slave1,slave2 延遲於 master1 主,這個時 master1 宕機, slave1,slave2 將會
等待數據追上 db1 後,再重新指向新的主 node2 進行復制操作,這時的數據也無法保證
同步的一致性。(4)如果採用 MMM 高可用架構,主,主備選節點機器配置一樣,而且開啓半同步進一步
提高安全性或採用 MariaDB/mysql5.7 進行多線程從複製,提高複製的性能。
附:
1、 日誌文件:
日誌文件往往是分析錯誤的關鍵,所以要善於利用日誌文件進行問題分析。
db 端: /var/log/mysql-mmm/mmm_agentd.log
監控端: /var/log/mysql-mmm/mmm_mond.log
2、 命令文件:
mmm_agentd: db 代理進程的啓動文件
mmm_mond:監控進程的啓動文件
mmm_backup:備份文件
mmm_restore:還原文件
mmm_control:監控操作命令文件
db 服務器端只有 mmm_agentd 程序,其它的都是在 monitor 服務器端。
3、 mmm_control 用法
mmm_control 程序可以用於監控羣集狀態、切換 writer、設置 online\offline 操作等。
Valid commands are:
help - show this message #幫助信息
ping - ping monitor #ping 當前的羣集是否正常
show - show status #羣集在線狀態檢查
checks [<host>|all [<check>|all]] - show checks status#執行監控檢查操作
set_online<host> - set host <host> online #將 host 設置爲 online
set_offline<host> - set host <host> offline #將 host 設置爲 offline
mode - print current mode. #打印輸出當前的 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 服務器
爲指定的 host 服務器(Only use --force if you know what you are doing!)
set_ip<ip><host> - set role with ip<ip> to host <host>
檢查所有的 db 服務器羣集狀態:
[root@monitor1 ~]# mmm_control checks all
檢查項包括: ping、 mysql 是否正常運行、複製線程是否正常等
檢查羣集環境在線狀況:
[root@monitor1 ~]# mmm_control show
對指定的 host 執行 offline 操作:
[root@monitor1 ~]# mmm_controlset_offline slave2
對指定的 host 執行 onine 操作:
[root@monitor1 ~]# mmm_controlset_online slave2
執行 write 切換(手動切換):
查看當前的 slave 對應的 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 屬性有配置對應的 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 從庫自動切換到了新的 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(包括主從的延時也會導致寫 VIP 的切換),那麼
可以在配置/etc/mysql-mmm/mmm_common.conf 時, 去掉<role write>中的 backup
<role writer>#writer 角色配置
hosts master1 #這裏只配置一個 Hosts
ips 192.168.41.100#對外提供的寫操作的虛擬 IP
mode exclusive #exclusive 代表只允許存在一個主,也就是隻能提供一個寫的 IP
</role>
這樣的話當 master1 出現故障了 writer 寫操作不會切換到 master2 服務器,並且 slave 也不
會指向新的 master,此時當前的 MMM 之前對外提供寫服務。
5、 總結
1.對外提供讀寫的虛擬 IP 是由 monitor 程序控制。如果 monitor 沒有啓動那麼 db 服務器
不會被分配虛擬 ip,但是如果已經分配好了虛擬 ip,當 monitor 程序關閉了原先分配的虛擬 ip
不會立即關閉外部程序還可以連接訪問(只要不重啓網絡),這樣的好處就是對於 monitor
的可靠性要求就會低一些,但是如果這個時候其中的某一個 db 服務器故障了就無法處理切
換,也就是原先的虛擬 ip 還是維持不變,掛掉的那臺 DB 的虛擬 ip 會變的不可訪問。
2.agent 程序受 monitor 程序的控制處理 write 切換,從庫切換等操作。如果 monitor 進
程關閉了那麼 agent 進程就起不到什麼作用,它本身不能處理故障。
3.monitor 程序負責監控 db 服務器的狀態,包括 Mysql 數據庫、服務器是否運行、複製
線程是否正常、主從延時等;它還用於控制 agent 程序處理故障。
4.monitor 會每隔幾秒鐘監控 db 服務器的狀態,如果 db 服務器已經從故障變成了正常,
那麼 monitor 會自動在 60s 之後將其設置爲 online 狀態(默認是 60s 可以設爲其它的值),有
監控端的配置文件參數 “auto_set_online”決定 ,羣集服務器的狀態有三種分別是 :
HARD_OFFLINE→AWAITING_RECOVERY→online
5.默認 monitor 會控制 mmm_agent 會將 writer db 服務器 read_only 修改爲 OFF,其它的db 服務器 read_only 修改爲 ON,所以爲了嚴謹可以在所有的服務器的 my.cnf 文件中加入
read_only=1 由 monitor 控制來控制 writer 和 read,root 用戶和複製用戶不受 read_only 參數的
影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章