1、MMM簡介:前端
MMM即Multi-Master Replication Manager for MySQL:mysql多主複製管理器,基於perl實現,關於mysql主主複製配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任什麼時候候只有一個節點能夠被寫入)node
MMM也能對從服務器進行讀負載均衡,因此能夠用它來在一組用於複製的服務器啓動虛擬ipmysql
它還有實現數據備份、節點之間從新同步功能的腳本。linux
MySQL自己沒有提供replication failover的解決方案,經過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。sql
MMM不只能提供浮動IP的功能,若是當前的主服務器掛掉後,會將你後端的從服務器自動轉向新的主服務器進行同步複製,不用手工更改同步配置。數據庫
這個方案是目前比較成熟的解決方案。詳情請看官網:http://mysql-mmm.org後端
優勢:高可用性,擴展性好,出現故障自動切換,對於主主同步,在同一時間只提供一臺數據庫寫操做,保證的數據的一致性。當主服務器掛掉之後,另外一個主當即接管,其餘的從服務器能自動切換,不用人工干預。
centos
缺點:monitor節點是單點,不過這個你也能夠結合keepalived或者haertbeat作成高可用;至少三個節點,對主機的數量有要求,須要實現讀寫分離,還須要在前端編寫讀寫分離程序。在讀寫很是繁忙的業務系統下表現不是很穩定,可能會出現複製延時、切換失效等問題。MMM方案並不太適應於對數據安全性要求很高,而且讀、寫繁忙的環境中。安全
適用場景:bash
MMM的適用場景爲數據庫訪問量大,而且能實現讀寫分離的場景。
Mmm主要功能由下面三個腳本提供:
mmm_mond 負責全部的監控工做的監控守護進程,決定節點的移除(mmm_mond進程定時心跳檢測,失敗則將write ip浮動到另一臺master)等等
mmm_agentd 運行在mysql服務器上的代理守護進程,經過簡單遠程服務集提供給監控節點
mmm_control 經過命令行管理mmm_mond進程
在整個監管過程當中,須要在mysql中添加相關受權用戶,受權的用戶包括一個mmm_monitor用戶和一個mmm_agent用戶,若是想使用mmm的備份工具則還要添加一個mmm_tools用戶。
2、部署實施
1、環境介紹
OS:centos7.2(64位)數據庫系統:mysql5.7.13
關閉selinux
配置ntp,同步時間
角色 |
IP |
hostname |
Server-id |
Write vip |
Read vip |
Master1 |
192.168.0.100 |
master1 |
1 |
192.168.0.1 |
|
Master2(backup) |
192.168.0.200 |
master2 |
2 |
192.168.0.2 |
|
Slave1 |
192.168.0.159 |
slave1 |
3 |
192.168.0.3 |
|
monitor |
192.168.0.133 |
monitor |
無 |
2、在全部主機上配置/etc/hosts文件,添加以下內容:
192.168.0.100 master1
192.168.0.200 master2
192.168.0.159 slave1
192.168.0.133 montitor
3在全部主機上安裝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源安裝
4 安裝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 Proc::Daemon Log::Log4perl
5在master1、master2、slave1、主機上安裝mysql5.7和配置複製
master1和master2互爲主從,slave1、爲master1的從
在每一個mysql的配置文件/etc/my.cnf中加入如下內容, 注意server-id不能重複。
master1主機
:
master2主機:
slave1主機:
6:在完成了對my.cnf的修改後,經過systemctl restart mysqld從新啓動mysql服務
7:3臺數據庫主機若要開啓防火牆,要麼關閉防火牆或者建立訪問規則:
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
8主從配置(master1和master2配置成主主,slave1配置成master1的從):
①在master1上受權:
在master2上受權:
②把master2、slave1配置成master1的從庫:
在master1上執行show master status; 獲取binlog文件和Position點
在master2和slave1執行
③驗證主從複製:
master2主機:
slave1主機:
若是Slave_IO_Running和Slave_SQL_Running都爲yes,那麼主從就已經配置OK了
把master1配置成master2的從庫:
在master2上執行show master status ;獲取binlog文件和Position點
+------------------+----------+--------------+------------------+----------------------------------------------------+
在master1上執行:
驗證主從複製:
若是Slave_IO_Running和Slave_SQL_Running都爲yes,那麼主從就已經配置OK了
9 , mysql-mmm配置:
在3臺mysql節點上建立用戶
注意1:由於以前的主從複製,以及主從已是ok的,因此我在master1服務器執行就ok了。
檢查master2和slave1兩臺db上是否都存在監控和代理帳號
或
mmm_monitor用戶:mmm監控用於對mysql服務器進程健康檢查
mmm_agent用戶:mmm代理用來更改只讀模式,複製的主服務器等
10、mysql-mmm安裝
在monitor主機(192.168.0.133) 上安裝監控程序
在數據庫服務器(master1、master2、slave1)上安裝代理
cd /tmp
wget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar zxf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install
11、配置mmm
編寫配置文件,四臺主機必須一致:
完成安裝後,全部的配置文件都放到了/etc/mysql-mmm/下面。管理服務器和數據庫服務器上都要包含一個共同的文件mmm_common.conf,內容以下:
active_master_rolewriter#積極的master角色的標示,全部的db服務器要開啓read_only參數,對於writer服務器監控代理會自動將read_only屬性關閉。
下面是複製文本的詳細解釋
<host default>
cluster_interfaceeno16777736#羣集的網絡接口
pid_path /var/run/mmm_agentd.pid#pid路徑
bin_path /usr/lib/mysql-mmm/#可執行文件路徑
replication_user rep#複製用戶
replication_password 123456#複製用戶密碼
agent_user mmm_agent#代理用戶
agent_password 123456#代理用戶密碼
</host>
<host master1>#master1的host名
ip 192.168.0.100#master1的ip
mode master#角色屬性,master表明是主
peer master2#與master1對等的服務器的host名,也就是master2的服務器host名
</host>
<host master2>#和master的概念同樣
ip 192.168.0.200
mode master
peer master1
</host>
<host slave1>#從庫的host名,若是存在多個從庫能夠重複同樣的配置
ip 192.168.0.159#從的ip
mode slave#slave的角色屬性表明當前host是從
</host>
<role writer>#writer角色配置
hosts master1,master2#能進行寫操做的服務器的host名,若是不想切換寫操做這裏能夠只配置master,這樣也能夠避免由於網絡延時而進行write的切換,可是一旦master出現故障那麼當前的MMM就沒有writer了只有對外的read操做。
ips 192.168.0.1#對外提供的寫操做的虛擬IP
mode exclusive#exclusive表明只容許存在一個主,也就是隻能提供一個寫的IP
</role>
<role reader>#read角色配置
hosts master2,slave1#對外提供讀操做的服務器的host名,固然這裏也能夠把master加進來
ips 192.168.0.2, 192.168.0.3, #對外提供讀操做的虛擬ip,這兩個ip和host不是一一對應的,而且ips也hosts的數目也能夠不相同,若是這樣配置的話其中一個hosts會分配兩個ip
mode balanced#balanced表明負載均衡
</role>
同時將這個文件拷貝到其它的服務器,配置不變
#for host in master1 master2 slave1 monitor ; do scp /etc/mysql-mmm/mmm_common.conf $host:/etc/mysql-mmm/ ; done
12 代理文件配置
編輯 3臺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
添加成系統服務並設置爲自啓動
注意:添加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
配置防火牆,或直接關閉防火牆
firewall-cmd --permanent --add-port=9989/tcp
firewall-cmd --reload
注意:以上部署在三臺mysql節點上都要完成
13編輯 monitor主機上的/etc/mysql-mmm/mmm_mon.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.31.83,192.168.0.10,192.168.0.20,192.168.0.30#用於測試網絡可用性 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_user mmm_monitor#監控db服務器的用戶
monitor_password 123456#監控db服務器的密碼
</host>
debug 0#debug 0正常模式,1爲debug模式
啓動監控進程:
在 /etc/init.d/mysql-mmm-agent的腳本文件的#!/bin/sh下面,加入以下內容
source /root/.bash_profile
添加成系統服務並設置爲自啓動
#chkconfig --add mysql-mmm-monitor
#chkconfig mysql-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的庫
#cpan Proc::Daemon
#cpan Log::Log4perl
注意1:不管是在db端仍是在監控端若是有對配置文件進行修改操做都須要重啓代理進程和監控進程。
注意2:MMM啓動順序:先啓動monitor,再啓動 agent
檢查集羣狀態:
若是服務器狀態不是ONLINE,能夠用以下命令將服務器上線,例如:
從上面的顯示能夠看到,寫請求的VIP在master1上,全部從節點也都把master1當作主節點。
查看是否啓用vip
MMM高可用性測試:
服務器讀寫採有VIP地址進行讀寫,出現故障時VIP會漂移到其它節點,由其它節點提供服務。
首先查看整個集羣的狀態,能夠看到整個集羣狀態正常
模擬master1宕機,手動中止mysql服務,觀察monitor日誌,master1的日誌以下:
查看羣集的最新狀態
從顯示結果能夠看出master1的狀態有ONLINE轉換爲HARD_OFFLINE,寫VIP轉移到了master2主機上。
檢查全部的db服務器羣集狀態
從上面能夠看到master1能ping通,說明只是服務死掉了。
查看master2主機的ip地址:
slave1主機:
啓動master1主機的mysql服務,觀察monitor日誌,master1的日誌以下:
用以下命令將服務器上線:,並查看羣集最新狀態
能夠看到主庫啓動不會接管主,只到現有的主再次宕機。
總結
(1)master2備選主節點宕機不影響集羣的狀態,就是移除了master2備選節點的讀狀態。
(2)master1主節點宕機,由master2備選主節點接管寫角色,slave1指向新master2主庫進行復制,slave1會自動change master到master2.
(3)若是master1主庫宕機,master2複製應用又落後於master1時就變成了主可寫狀態,這時的數據主沒法保證一致性。
若是master2,slave1延遲於master1主,這個時master1宕機,slave1將會等待數據追上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.31.83) master/ONLINE. Roles: writer(192.168.31.2)
master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5)
slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)
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.31.83
4、其它處理問題
若是不想讓writer從master切換到backup(包括主從的延時也會致使寫VIP的切換),那麼能夠在配置/etc/mysql-mmm/mmm_common.conf時,去掉<role write>中的backup
<role writer>#writer角色配置
hosts master1 #這裏只配置一個Hosts
ips 192.168.31.2#對外提供的寫操做的虛擬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參數的影響。