# IT明星不是夢 # MySQL高可用集羣之MMM

MySQL高可用集羣之MMM

1、MMM簡介

MMM即Multi-Master Replication Manager for MySQL(mysql多主複製管理器),基於perl實現,關於mysql主主複製配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任什麼時候候只有一個節點能夠被寫入),MMM也能對從服務器進行讀負載均衡,因此能夠用它來在一組用於複製的服務器啓動虛擬IP,除此以外,它還有實現數據備份、節點之間從新同步功能的腳本。MySQL自己沒有提供replication failover的解決方案,經過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。MMM不只能提供浮動IP的功能,若是當前的主服務器掛掉後,會將你後端的從服務器自動轉向新的主服務器進行同步複製,不用手工更改同步配置。這個方案是目前比較成熟的解決方案。詳情請看官網:http://mysql-mmm.org前端

優勢:

  • 高可用性,擴展性好,出現故障自動切換。
  • 對於主主同步,在同一時間只提供一臺數據庫寫操做,保證的數據的一致性。
  • 當主服務器掛掉之後,另外一個主當即接管,其餘的從服務器能自動切換,不用人工干預。

缺點:

  • monitor節點是單點,不過這個也能夠結合keepalived或者haertbeat作成高可用;
  • 至少三個節點,對主機的數量有要求,須要實現讀寫分離,還須要在前端編寫讀寫分離程序。
  • 在讀寫很是繁忙的業務系統下表現不是很穩定,可能會出現複製延時、切換失效等問題。

MMM方案並不太適應於對數據安全性要求很高,而且讀、寫繁忙的環境中。 適用場景: MMM的適用場景爲數據庫訪問量大,而且能實現讀寫分離的場景。 node

MMM主要功能由下面三個腳本提供:

1. mmm_mond:負責全部的監控工做的監控守護進程,決定節點的移除(mmm_mond進程定時心跳檢測,失敗則將write ip浮動到另一臺master)等等
2. mmm_agentd:運行在mysql服務器上的代理守護進程,經過簡單遠程服務集提供給監控節點
3. mmm_control:經過命令行管理mmm_mond進程 在整個監管過程當中,須要在mysql中添加相關受權用戶,受權的用戶包括一個mmm_monitor用戶和一個mmm_agent用戶,若是想使用mmm的備份工具則還要添加一個mmm_tools用戶。mysql

2、部署實施

環境:linux

  • 操做系統:Cent OS 7.3
  • 數據庫系統:mysql5.7
  • 關閉selinux,配置ntp同步時間
    # IT明星不是夢 # MySQL高可用集羣之MMM
主機 操做系統 IP地址 Write VIP Read VIP
mysql-master1 CentOS 7.3 192.168.1.1 192.168.1.100 NULL
mysql-master2 CentOS 7.3 192.168.1.8 NULL 192.168.1.80
mysql-slave1 CentOS 7.3 192.168.1.9 NULL 192.168.1.90
mysql-slave2 CentOS 7.3 192.168.1.12 NULL 192.168.1.120
monitor CentOS 7.3 192.168.1.3 NULL NULL

每臺mysql服務啓動,以及其它主機:關閉防火牆、關閉selinuxsql

systemctl start mysqld
systemctl stop firewalld
setenforce 0        //臨時關閉,永久關閉須要在/etc/selinux/config文件中設置

一、在全部主機上配置爲/etc/hosts文件,添加域名解析(5臺主機都須要作)

[root@mysql-master1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.1     mysql-master1
192.168.1.8     mysql-master2
192.168.1.9     mysql-slave1
192.168.1.12    mysql-slave2
192.168.1.3     monitor

# IT明星不是夢 # MySQL高可用集羣之MMM
將配置文件傳到其餘主機shell

[root@mysql-master1 ~]#for host in mysql-master2 mysql-slave1 mysql-slave2 monitor ; do scp /etc/hosts $host:/etc/hosts ; done

將mysql命令傳到monitor數據庫

[root@mysql-master1 ~]# scp /usr/local/mysql/bin/mysql 192.168.1.3:/usr/local/sbin

在全部主機上安裝依賴包vim

# yum -y install perl-* libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64
PS:使用centos7在線yum源安裝

二、安裝Perl的相關庫(5臺主機都須要作)

Perl的CPAN鏡像使用管理的文章,安裝perl下的不少模塊文件時,比較快捷的方法是使用cpan工具。默認cpan shell使用的是cpan.org的源,在國內使用的話速度會很是的慢。若是更換爲國內的如阿里或網易等公司的源的話,速度會明顯提升。修改方法以下:後端

1)執行cpan命令確認存在該命令,若是沒有使用yum -y install perl-CPAN或手動安裝這個模塊

# yum -y install perl-CPAN
# cpan      //一路回車

查看當前源配置centos

cpan[1]> o conf

# IT明星不是夢 # MySQL高可用集羣之MMM
增長源或移出源並提交

cpan[2]> o conf urllist push http://mirrors.aliyun.com/CPAN/
cpan[3]> o conf urllist ftp://mirrors.sohu.com/CPAN/ http://mirrors.163.com/cpan/

# IT明星不是夢 # MySQL高可用集羣之MMM
查看源配置

cpan[4]> o conf

# IT明星不是夢 # MySQL高可用集羣之MMM
例:移出一個源可使用pop函數,以下(能夠不作,知道方法就行)

cpan[5]>  o conf urllist pop http://mirrors.163.com/cpan/
cpan[6]> o conf

# IT明星不是夢 # MySQL高可用集羣之MMM
查看當前源信息,並提交

cpan[7]> o conf

# IT明星不是夢 # MySQL高可用集羣之MMM

cpan[8]> o conf commit
cpan[9]> exit

安裝

[root@mysql-master1 ~]# 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     //過程比較慢

# IT明星不是夢 # MySQL高可用集羣之MMM
配置NTP時間同步(在公司能夠聯通外網的話,能夠直接上百度搜索國內經常使用的NTP服務器,也能夠本身搭建一個NTP服務器)

[root@mysql-master1 ~]# vim /etc/chrony.conf

# IT明星不是夢 # MySQL高可用集羣之MMM
在其餘四個節點中的配置文件指向mysql-master1的IP地址,就能夠和mysql-master1進行同步。
# IT明星不是夢 # MySQL高可用集羣之MMM
配置完成後,從新啓動chronyd服務,配置開機自啓

# systemctl restart chronyd
# systemctl enable chronyd

可使用timedatectl / timedatectl status(效果相同)來查看時間

[root@mysql-master1 ~]# timedatectl status

# IT明星不是夢 # MySQL高可用集羣之MMM

三、在mysql-master一、mysql-master二、mysql-slave一、mysql-slave2主機上安裝mysql5.7(已經安裝完成)和配置主從複製。 mysql-master1和mysql-master2互爲主從,mysql-slave一、mysql-slave2爲master1的從。在每一個mysql的配置文件/etc/my.cnf中加入如下內容, 注意server-id不能重複。

mysql-master1主機:

[root@mysql-master1 ~]# vim /etc/my.cnf
log-bin=mysql-bin   //二進制日誌
binlog_format=mixed     //binlog日誌格式,mysql默認採用statement,建議使用mixed
server-id=1
relay-log=relay-bin     //中繼日誌,存儲全部主庫TP過來的binlog事件
relay-log-index=slave-relay-bin.index
log-slave-updates=1     //將主的二進制日誌導入中繼日誌的同時,也將操做寫入二進制日誌,切換到主,二進制日誌也是相同的,保證數據完整性
auto-increment-increment=2
auto-increment-offset=1

MySQL複製主要有三種方式:

  • 基於SQL語句的複製(statement-based replication, SBR)
  • 基於行的複製(row-based replication, RBR)
  • 混合模式複製(mixed-based replication, MBR)

對應的,binlog的格式也有三種:STATEMENT,ROW,MIXED。
1. STATEMENT模式(SBR)
每一條會修改數據的sql語句會記錄到binlog中。優勢是並不須要記錄每一條sql語句和每一行的數據變化,減小了binlog日誌量,節約IO,提升性能。缺點是在某些狀況下會致使master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)
2. ROW模式(RBR)
不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改爲什麼樣了。並且不會出現某些特定狀況下的存儲過程、或function、或trigger的調用和觸發沒法被正確複製的問題。缺點是會產生大量的日誌,尤爲是alter table的時候會讓日誌暴漲。
3. MIXED模式(MBR)
以上兩種模式的混合使用,通常的複製使用STATEMENT模式保存binlog,對於STATEMENT模式沒法複製的操做使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日誌保存方式。

mysql-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=1     //將主的二進制日誌導入中繼日誌的同時,也將操做寫入二進制日誌,切換到主,二進制日誌也是相同的,保證數據完整性
auto-increment-increment=2
auto-increment-offset=2

mysql-slave1主機:

server-id=3
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
read_only=1

mysql-slave2主機:

server-id=4
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
read_only=1

在完成了對my.cnf的修改後,從新啓動mysql服務

# systemctl restart mysqld

4臺數據庫主機若要開啓防火牆,要麼關閉防火牆或者建立訪問規則

防火牆規則:
        firewall-cmd --permanent --add-port=3306/tcp
        firewall-cmd --reload
    或關閉:
        systemctl stop firewalld


主從配置(mysql-master1和mysql-master2配置成主主,mysql-slave1和mysql-slave2配置成mysql-master1的從):
在mysql-master1上受權:

[root@mysql-master1 ~]# mysql -uroot -p123.com
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)

在mysql-master2上受權:

[root@mysql-master2 ~]# mysql -uroot -p123.com
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)

把mysql-master二、mysql-slave1和mysql-slave2配置成mysql-master1的從庫:
在mysql-master1上執行命令,獲取binlog文件和Position點

mysql> show master status;

# IT明星不是夢 # MySQL高可用集羣之MMM
在mysql-master二、mysql-slave1和mysql-slave2執行:

mysql> change master to master_host='192.168.1.1',master_port=3306,master_user='rep',master_password='123.com',master_log_file='mysql-bin.000001',master_log_pos=451;
mysql> start slave;

PS:若是是克隆的主機,那麼會出現UUID重複的錯誤,須要到/usr/local/mysql/data/auto.cnf文件中將UUID刪除並重啓服務便可

驗證主從複製:

mysql> show slave status\G

# IT明星不是夢 # MySQL高可用集羣之MMM
Slave_IO_Running和Slave_SQL_Running都爲yes,那麼主從就已經配置OK了
把mysql-master1配置成mysql-master2的從庫:
在mysql-master2上執行命令,獲取binlog文件和Position點

mysql> show master status;

# IT明星不是夢 # MySQL高可用集羣之MMM
在mysql-master1上執行:

mysql> change master to master_host='192.168.1.8',master_port=3306,master_user='rep',master_password='123.com',master_log_file='mysql-bin.000002',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

驗證主從複製:

mysql-master1主機:
mysql> show slave status\G

# IT明星不是夢 # MySQL高可用集羣之MMM
Slave_IO_Running和Slave_SQL_Running都爲yes,那麼主從就已經配置OK了

四、mysql-mmm配置:

在mysql-master1節點上建立用戶,由於是主,會同步到其餘DB:
建立代理帳號:

mysql> grant super,replication client,process on *.* to 'mmm_agent'@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)

建立監控帳號:

mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)

查看:

mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');

# IT明星不是夢 # MySQL高可用集羣之MMM
檢查mysql-master2和mysql-slave一、mysql-slave2三臺db上是否都存在監控和代理帳號:

mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');

或者使用:

mysql> show grants for 'mmm_agent'@'192.168.1.%';
mysql> show grants for 'mmm_monitor'@'192.168.1.%';

# IT明星不是夢 # MySQL高可用集羣之MMM

  • mmm_monitor用戶:MMM監控用於對mysql服務器進程健康檢查
  • mmm_agent用戶:MMM代理用來更改只讀模式,複製的主服務器等

五、mysql-mmm安裝

在monitor主機(192.168.1.3) 上安裝監控程序

[root@monitor ~]# cd /usr/local/
[root@monitor local]# wget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
[root@monitor local]# tar -zxf mysql-mmm-2.2.1.tar.gz 
[root@monitor local]# cd mysql-mmm-2.2.1/
[root@monitor mysql-mmm-2.2.1]# make install

在4臺DB安裝代理:

[root@mysql-master1 ~]# cd /usr/local/
[root@mysql-master1 local]# wget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
[root@mysql-master1 local]# tar -zxf mysql-mmm-2.2.1.tar.gz 
[root@mysql-master1 local]#  cd mysql-mmm-2.2.1/
[root@mysql-master1 mysql-mmm-2.2.1]# make install

六、配置MMM

編寫配置文件,五臺主機必須一致:
完成安裝後,全部的配置文件都放到了/etc/mysql-mmm/下面。
管理服務器和數據庫服務器上都要包含一個共同的文件mmm_common.conf,內容以下:

active_master_role      writer      //積極的master角色的標示,全部的db服務器要開啓read_only參數,對於writer服務器監控代理會自動將read_only屬性關閉。

<host default>
        cluster_interface               ens33   //羣集的網絡接口

        pid_path                                /var/run/mmm_agentd.pid //pid路徑
        bin_path                                /usr/lib/mysql-mmm/ //可執行文件路徑

    replication_user        rep     //複製用戶
    replication_password    123.com     //複製用戶密碼

        agent_user                              mmm_agent   //代理用戶
        agent_password                  123.com     //代理用戶密碼
</host>

<host mysql-master1>    //mysql-master1的主機名
        ip                                              192.168.1.1 //mysql-master1的IP地址
        mode                                    master      //角色屬性,master表明是主
        peer                                    mysql-master2   //與mysql-master1對等的服務器的host名,也就是mysql-master2的服務器host名
</host>

<host mysql-master2>    //和mysql-master1的概念同樣
        ip                                              192.168.1.8
        mode                                    master
        peer                                    mysql-master1
</host>

<host mysql-slave1> //從庫的host名,若是存在多個從庫能夠重複同樣的配置
        ip                                              192.168.1.9 //從的ip
        mode                                    slave   // slave的角色屬性表明當前host是從
</host>

<host mysql-slave2> 和mysql-slave1的概念同樣
        ip                                              192.168.1.12
        mode                                    slave
</host>

<role writer>   // writer角色配置
        hosts                                   mysql-master1, mysql-master2    //能進行寫操做的服務器的host名,若是不想切換寫操做這裏能夠只配置master,這樣也能夠避免由於網絡延時而進行write的切換,可是一旦master出現故障那麼當前的MMM就沒有writer了只有對外的read操做。
        ips                                             192.168.1.100   //對外提供的寫操做的虛擬IP
        mode                                    exclusive   // exclusive表明只容許存在一個主,也就是隻能提供一個寫的IP
</role>

<role reader>   // read角色配置
        hosts                                   mysql-master2, mysql-slave1, mysql-slave2   //對外提供讀操做的服務器的host名,固然這裏也能夠把master加進來
        ips                                             192.168.1.80, 192.168.1.90, 192.168.1.120       //對外提供讀操做的虛擬ip,這三個ip和host不是一一對應的,而且ips也hosts的數目也能夠不相同,若是這樣配置的話其中一個hosts會分配兩個ip
        mode                                    balanced    // balanced表明負載均衡
</role>

同時將這個文件拷貝到其它的服務器,配置不變

[root@mysql-master1 ~]# for host in mysql-master2 mysql-slave1 mysql-slave2 monitor ; do scp /etc/mysql-mmm/mmm_common.conf $host:/etc/mysql-mmm/ ; done

# IT明星不是夢 # MySQL高可用集羣之MMM

七、代理文件配置(四臺DB)

編輯 4臺mysql節點機上的/etc/mysql-mmm/mmm_agent.conf 在數據庫服務器上,還有一個mmm_agent.conf須要修改,其內容是:

# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this mysql-master1

PS:這個配置只配置db服務器,監控服務器不須要配置,this後面的host名改爲當前服務器的主機名。

啓動代理進程 (四臺DB)
在/etc/init.d/mysql-mmm-agent的腳本文件的#!/bin/sh下面,加入以下內容

# vim /etc/init.d/mysql-mmm-agent
source /root/.bash_profile

# IT明星不是夢 # MySQL高可用集羣之MMM
添加成系統服務並設置爲自啓動(四臺DB)

# chkconfig --add mysql-mmm-agent
# chkconfig mysql-mmm-agent on
# /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

PS:添加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   //安裝perl庫可能有的庫沒有安裝上,有的能夠看集羣狀態來查看出缺乏哪一個perl庫
# 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

查看端口是否啓動(四臺DB)

# ss -anplt |grep mmm_agent
LISTEN     0      10     192.168.1.1:9989                     *:*                   users:(("mmm_agentd",pid=3150,fd=3))

關於代理的防火牆配置:

配置策略:
        firewall-cmd --permanent --add-port=9989/tcp
        firewall-cmd --reload
    或關閉:
        systemctl stop firewalld

編輯 monitor主機上的/etc/mysql-mmm/mmm_mon.conf

[root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf
include mmm_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_ips                                192.168.1.1, 192.168.1.8, 192.168.1.9, 192.168.1.12 //用於測試網絡可用性 IP 地址列表,只要其中有一個地址 ping 通,就表明網絡正常,這裏不要寫入本機地址
        auto_set_online                         0   //設置自動online的時間,默認是超過60s就將它設置爲online,默認是60s,這裏將其設爲0就是當即online

</monitor>

<check default>
        check_period    5   //描述:檢查週期默認爲5s 默認值:5s
        trap_period     10  //描述:一個節點被檢測不成功的時間持續trap_period秒,就慎重的認爲這個節點失敗了。默認值:10s
        timeout         2   //描述:檢查超時的時間 默認值:2s
        restart_after   10000   //描述:在完成restart_after次檢查後,重啓checker進程默認值:10000
        max_backlog     86400   //描述:記錄檢查rep_backlog日誌的最大次數默認值:60
</check>

<host default>
        monitor_user                    mmm_monitor     //監控db服務器的用戶
        monitor_password                123.com     //監控db服務器的密碼
</host>

debug 0     debug 0正常模式,1爲debug模式

啓動監控進程: 在 /etc/init.d/mysql-mmm-agent的腳本文件的#!/bin/sh下面,加入以下內容

[root@monitor ~]# vim /etc/init.d/mysql-mmm-agent
source /root/.bash_profile

# IT明星不是夢 # MySQL高可用集羣之MMM
添加成系統服務並設置爲自啓動

[root@monitor ~]# chkconfig --add mysql-mmm-monitor
[root@monitor ~]# chkconfig mysql-mmm-monitor
[root@monitor ~]# /etc/init.d/mysql-mmm-monitor start

啓動報錯:

Starting MMM Monitor daemon: Base class package "Class::Singleton" is empty.
    (Perhaps you need to 'use' the module which defines that package first,
    or make that module available in @INC (@INC contains: /root/perl5/lib/perl5/5.16.3/x86_64-linux-thread-multi /root/perl5/lib/perl5/5.16.3 /root/perl5/lib/perl5/x86_64-linux-thread-multi /root/perl5/lib/perl5 /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/share/perl5/vendor_perl/MMM/Monitor/Agents.pm line 2.
BEGIN failed--compilation aborted at /usr/share/perl5/vendor_perl/MMM/Monitor/Agents.pm line 2.
Compilation failed in require at /usr/share/perl5/vendor_perl/MMM/Monitor/Monitor.pm line 15.
BEGIN failed--compilation aborted at /usr/share/perl5/vendor_perl/MMM/Monitor/Monitor.pm line 15.
Compilation failed in require at /usr/sbin/mmm_mond line 28.
BEGIN failed--compilation aborted at /usr/sbin/mmm_mond line 28.

解決方法:安裝下列perl的庫

[root@monitor ~]# cpan Proc::daemon
[root@monitor ~]# cpan Log::Log4perl
[root@monitor ~]# cpan Class::Singleton

[root@monitor ~]# /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 ~]# ss -anplt|grep 9988

# IT明星不是夢 # MySQL高可用集羣之MMM

PS:不管是在db端仍是在監控端若是有對配置文件進行修改操做都須要重啓代理進程和監控進程。MMM啓動順序:先啓動monitor,再啓動 agent 檢查集羣狀態:
# IT明星不是夢 # MySQL高可用集羣之MMM

啓動以後,若是出現上面的狀態,查看日誌

[root@monitor mysql-mmm-2.2.1]# tail -f /var/log/mysql-mmm/mmm_mond.log

# IT明星不是夢 # MySQL高可用集羣之MMM
使用mmm_control checks all命令查看信息:

[root@monitor mysql-mmm-2.2.1]#   mmm_control checks all

# IT明星不是夢 # MySQL高可用集羣之MMM

安裝上面所須要的perl庫(5臺)

# cpan DBD::mysql
# yum install perl-DBD-mysql

再查看狀態

[root@monitor mysql-mmm-2.2.1]# mmm_control show

# IT明星不是夢 # MySQL高可用集羣之MMM
若是服務器狀態是AWAITING_RECOVERY,就須要手動將服務器上線:

[root@monitor mysql-mmm-2.2.1]# mmm_control set_online mysql-master1
[root@monitor mysql-mmm-2.2.1]# mmm_control set_online mysql-master2
[root@monitor mysql-mmm-2.2.1]# mmm_control set_online mysql-slave1
[root@monitor mysql-mmm-2.2.1]# mmm_control set_online mysql-slave2
[root@monitor mysql-mmm-2.2.1]# mmm_control show

# IT明星不是夢 # MySQL高可用集羣之MMM
從上面的顯示能夠看到,寫請求的VIP在mysql-master1上,全部從節點也都把mysql-master1當作主節點。
查看是否啓用vip:
mysql-master1:

[root@mysql-master1 mysql-mmm-2.2.1]# ip a

# IT明星不是夢 # MySQL高可用集羣之MMM
mysql-master2:

[root@mysql-master2 mysql-mmm-2.2.1]# ip a

# IT明星不是夢 # MySQL高可用集羣之MMM
mysql-slave1:

[root@mysql-slave1 mysql-mmm-2.2.1]# ip a

# IT明星不是夢 # MySQL高可用集羣之MMM
mysql-slave2:

[root@mysql-slave2 mysql-mmm-2.2.1]# ip a

# IT明星不是夢 # MySQL高可用集羣之MMM
在mysql-master2,mysql-slave1,mysql-slave2主機上查看主mysql的指向:

# mysql -uroot -p123.com
mysql> show slave status\G;

# IT明星不是夢 # MySQL高可用集羣之MMM
經過VIP訪問mysql(測試,任何受權的用戶均可以):

[root@monitor mysql-mmm-2.2.1]# mysql -ummm_monitor -p123.com -P3306 -h192.168.1.100

# IT明星不是夢 # MySQL高可用集羣之MMM

八、MMM高可用性測試:

服務器讀寫採有VIP地址進行讀寫,出現故障時VIP會漂移到其它節點,由其它節點提供服務。
首先查看整個集羣的狀態,能夠看到整個集羣狀態正常

[root@monitor mysql-mmm-2.2.1]# mmm_control show

# IT明星不是夢 # MySQL高可用集羣之MMM
模擬mysql-master1宕機,手動中止mysql服務

[root@mysql-master1 mysql-mmm-2.2.1]# systemctl stop mysqld

觀察monitor日誌,mysql-master1的日誌以下:

[root@monitor mysql-mmm-2.2.1]# tail -f /var/log/mysql-mmm/mmm_mond.log

# IT明星不是夢 # MySQL高可用集羣之MMM
查看羣集的最新狀態

[root@monitor mysql-mmm-2.2.1]# mmm_control show

# IT明星不是夢 # MySQL高可用集羣之MMM
從顯示結果能夠看出mysql-master1的狀態有ONLINE轉換爲HARD_OFFLINE,寫VIP轉移到了mysql-master2主機上。
檢查全部的db服務器羣集狀態

[root@monitor mysql-mmm-2.2.1]# mmm_control checks all

# IT明星不是夢 # MySQL高可用集羣之MMM
從上面能夠看到mysql-master1能ping通,說明只是服務死掉了。
查看mysql-master2主機的ip地址:

[root@mysql-master2 mysql-mmm-2.2.1]# ip a

# IT明星不是夢 # MySQL高可用集羣之MMM
查看mysql-slave1,mysql-slave2的主從複製狀態

mysql> show slave status\G;

# IT明星不是夢 # MySQL高可用集羣之MMM
會發現主服務器自動變成了mysql-master2

依然能夠經過VIP訪問:

[root@monitor mysql-mmm-2.2.1]# mysql -ummm_monitor -p123.com -P3306 -h192.168.1.100

# IT明星不是夢 # MySQL高可用集羣之MMM
啓動master1主機的mysql服務:

[root@mysql-master1 mysql-mmm-2.2.1]# systemctl start mysqld

觀察monitor日誌,master1的日誌以下:

[root@monitor mysql-mmm-2.2.1]# tail -f /var/log/mysql-mmm/mmm_mond.log

# IT明星不是夢 # MySQL高可用集羣之MMM
從上面能夠看到mysql-master1的狀態由HARD_OFFLINE改變爲AWAITING_RECOVERY狀態
用以下命令將服務器上線,並查看集羣狀態:

[root@monitor mysql-mmm-2.2.1]# mmm_control set_online mysql-master1
[root@monitor mysql-mmm-2.2.1]# mmm_control show

# IT明星不是夢 # MySQL高可用集羣之MMM
能夠看到mysql-master1啓動不會接管主,直到現有的主再次宕機。

總結

  1. mysql-master2備選主節點宕機不影響集羣的狀態,就是移除了mysql-master2備選節點的讀狀態。
  2. mysql-master1主節點宕機,由mysql-master2備選主節點接管寫角色,mysql-slave1, mysql-slave2指向新mysql-master2主庫進行復制,mysql-slave1, mysql-slave2會自動change master到mysql-master2.
  3. 若是mysql-master1主庫宕機,mysql-master2複製應用又落後於mysql-master1時就變成了主可寫狀態,這時的數據主沒法保證一致性。 若是mysql-master2, mysql-slave1, mysql-slave2延遲於mysql-master1主,這個時mysql-master1宕機,mysql-slave1, mysql-slave2將會等待數據追上db1後,再從新指向新的主node2進行復制操做,這時的數據也沒法保證同步的一致性。
  4. 若是採用MMM高可用架構,主,主備選節點機器配置同樣,並且開啓半同步進一步提升安全性或採用MariaDB/mysql5.7進行多線程從複製,提升複製的性能。

3、服務文件及命令用法

一、日誌文件:

日誌文件每每是分析錯誤的關鍵,因此要善於利用日誌文件進行問題分析。

db端:/var/log/mysql-mmm/mmm_agentd.log
監控端:/var/log/mysql-mmm/mmm_mond.log

二、命令文件:

  • mmm_agentd:db代理進程的啓動文件
  • mmm_mond:監控進程的啓動文件
  • mmm_backup:備份文件
  • mmm_restore:還原文件
  • mmm_control:監控操做命令文件

db服務器端只有mmm_agentd程序,其它的都是在monitor服務器端。

三、mmm_control用法

mmm_control程序能夠用於監控羣集狀態、切換writer、設置online\offline操做等。

[root@monitor mysql-mmm-2.2.1]# mmm_control --help
Invalid command '--help'

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>(Only use --force if you know what you are doing!) //移除writer服務器爲指定的host服務器
    set_ip <ip> <host>  - set role with ip <ip> to host <host>  //檢查全部的db服務器羣集狀態
[root@monitor mysql-mmm-2.2.1]# mmm_control checks all
檢查項包括:ping、mysql是否正常運行、複製線程是否正常等 檢查羣集環境在線情況:

# IT明星不是夢 # MySQL高可用集羣之MMM

[root@monitor mysql-mmm-2.2.1]# mmm_control show

# IT明星不是夢 # MySQL高可用集羣之MMM

對指定的host執行offline操做:

[root@monitor mysql-mmm-2.2.1]# mmm_control set_offline 主機

對指定的host執行onine操做:

[root@monitor mysql-mmm-2.2.1]# mmm_control set_online 主機

4、其它問題處理

若是不想讓writer從master切換到backup(包括主從的延時也會致使寫VIP的切換),那麼能夠在配置/etc/mysql-mmm/mmm_common.conf時,去掉中的backup #writer角色配置 hosts master1#這裏只配置一個Hosts ips 192.168.1.100#對外提供的寫操做的虛擬IP mode exclusive #exclusive表明只容許存在一個主,也就是隻能提供一個寫的IP 這樣的話當master1出現故障了writer寫操做不會切換到master2服務器,而且slave也不會指向新的master,此時當前的MMM以前對外提供寫服務。

總結

  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參數的影響。
相關文章
相關標籤/搜索