mysql高可用MMM

一、MMM簡介

MMMMulti-Master Replication Manager for MySQL:mysql多主複製管理器,基於perl實現,關於mysql主主複製配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任何時候只有一個節點可以被寫入)

MMM也能對從服務器進行讀負載均衡,所以可以用它來在一組用於複製的服務器啓動虛擬ip

它還有實現數據備份、節點之間重新同步功能的腳本。

MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。

MMM不僅能提供浮動IP的功能,如果當前的主服務器掛掉後,會將你後端的從服務器自動轉向新的主服務器進行同步複製,不用手工更改同步配置。

這個方案是目前比較成熟的解決方案。詳情請看官網:http://mysql-mmm.org

wKiom1lfPbHjNTFaAAG_I5nm66A900.png


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

缺點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.264位)數據庫系統: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

5master1master2slave1、主機上安裝mysql5.7和配置複製

master1master2互爲主從,slave1、爲master1的從

在每個mysql的配置文件/etc/my.cnf中加入以下內容, 注意server-id不能重複。

master1主機

wKiom1lfPbTRtdluAAEJv54Tqj4238.png 

master2主機:

wKiom1lfPpzTpkXRAADHl60sCA0299.png 

 

slave1主機:

wKioL1lfPqCSWKmdAAFrYg5jkOQ903.png 

 

6在完成了對my.cnf的修改後,通過systemctl  restart mysqld重新啓動mysql服務

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

firewall-cmd --permanent --add-port=3306/tcp

firewall-cmd --reload

8主從配置(master1master2配置成主主,slave1配置成master1的從)

master1上授權

wKioL1lfPqOBqvhfAADAF95lHhw699.png 

 

master2上授權

wKiom1lfPqWBEjCwAACHVX5MrnM481.png 

 

master2slave1配置成master1的從庫:

 

master1上執行show master status; 獲取binlog文件和Position

wKioL1lfPqjRMMZUAAD84xvBt0g314.png 

 

master2slave1執行

wKiom1lfPquBMkIsAAC1TirY55k418.png 

wKiom1lfQnSwjDJmAAFx9-bn4ME960.png


驗證主從複製:

 

master2主機:

 

wKiom1lfQnSDX_8dAADsb9adCtQ639.png

slave1主機:

wKioL1lfQnXx03urAAHpYQS23B4191.png 

 

 

如果Slave_IO_RunningSlave_SQL_Running都爲yes,那麼主從就已經配置OK

master1配置成master2的從庫:

master2上執行show master status ;獲取binlog文件和Position

wKiom1lfQnawR-zQAACYbWzzHb4253.png 

+------------------+----------+--------------+------------------+----------------------------------------------------+

master1上執行:

wKioL1lfQnaCSFdQAAD2WpUPHJE328.png 

wKioL1lfQnbh1tc2AAAh3wnGCKc233.png 

驗證主從複製:

wKiom1lfQneSLWoTAAEH8R1b6zQ486.png 

如果Slave_IO_RunningSlave_SQL_Running都爲yes,那麼主從就已經配置OK

9 , mysql-mmm配置

3mysql節點上創建用戶

wKiom1lfQneyqlo8AAEQY-8wigE142.png 

wKioL1lfQnizN4oPAACq5am-Kc4503.png 

wKiom1lfQnijFOt6AAF8Db9Dxgg431.png 

 

注意1因爲之前的主複製,以及主從已經是ok的,所以我在master1服務器執行就ok了。

檢查master2slave1db上是否都存在監控和代理賬號

wKioL1lfSiGxPrjUAAD6otqqnS0793.png 

wKiom1lfSk7D4RfKAAGKHOPEVt8000.png


 

mmm_monitor用戶:mmm監控用於對mysql服務器進程健康檢查

mmm_agent用戶:mmm代理用來更改只讀模式,複製的主服務器等

10mysql-mmm安裝

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

wKioL1lfSk6TAncfAAIGZYdJvEY748.png 

在數據庫服務器(master1master2slave1)上安裝代理

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屬性關閉。

wKiom1lfTEujEYUMAAEQH6wrY44891.png 

 

wKiom1lfTGTxl_SFAAC9mOMZlek172.png 

 

下面是複製文本的詳細解釋

<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>#master1host

ip     192.168.0.100#master1ip

        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,這iphost不是一一對應的,並且ipshosts的數目也可以不相同,如果這樣配置的話其中一個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

wKioL1lfTISDX2q7AAD9x4Xx4Ao100.png 

 

 

12 代理文件配置

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

includemmm_common.conf

this master1

wKiom1lfTKPjYb_nAACmXY4Wg34820.png 

wKiom1lfT1bhX9aLAAA_y_4PE4s139.png 

wKioL1lfTzaSWv3NAADW7E2_OD4885.png 

注意:這個配置只配置db服務器,監控服務器不需要配置,this後面的host名改成當前服務器的主機名。

啓動代理進程 

/etc/init.d/mysql-mmm-agent的腳本文件#!/bin/sh下面,加入如下內容 
source /root/.bash_profile 

添加成系統服務並設置爲自啓動

wKioL1lfT3LgjwEVAACmrD23yKE302.png 

注意:添加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

wKiom1lfT5KS7my0AACzVnyisgI778.png 

 

配置防火牆或直接關閉防火牆

firewall-cmd --permanent --add-port=9989/tcp

firewall-cmd --reload

 

注意:以上部署在三臺mysql節點上都要完成

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

wKiom1lfT66ycW4HAAEJCqsGy8Y105.png 

 

解釋

<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正常模式,1debug模式

啓動監控進程

/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

wKioL1lfUxLTNBfGAACai56oSz4612.png 

spacer.gif 

注意1無論是在db端還是在監控端如果有對配置文件進行修改操作都需要重啓代理進程和監控進程

注意2MMM啓動順序:先啓動monitor,再啓動 agent

檢查集羣狀態:

wKiom1lfUzqweZohAADgaeph7b8347.png 

如果服務器狀態不是ONLINE,可以用如下命令將服務器上線,例如:

wKioL1lfU1nQS1HGAACnR4fBOLQ527.png 

 

 

上面的顯示可以看到,寫請求的VIPmaster1上,所有從節點也都把master1當做主節點。

查看是否啓用vip

wKiom1lfU5fjgU_7AAGljXl1JLk306.png

wKioL1lfU5fybkikAAG_AtY-X-s284.png

wKioL1lfU5iSL-yLAAGsBldfAA4450.png

 

 

 

MMM高可用性測試:

服務器讀寫採有VIP地址進行讀寫,出現故障時VIP會漂移到其它節點,由其它節點提供服務。

首先查看整個集羣的狀態,可以看到整個集羣狀態正常

wKiom1lfU8OwINN8AACh_6cOi2U765.png 

 

模擬master1宕機,手動停止mysql服務,觀察monitor日誌,master1的日誌如下:

wKioL1lfU-HwtraFAAHjpCUrsM4189.png 

查看羣集的最新狀態

wKioL1lfVEThaS3OAADYtQ2RQak265.png 

從顯示結果可以看出master1的狀態有ONLINE轉換爲HARD_OFFLINE,寫VIP轉移到了master2主機上。

檢查所有的db服務器羣集狀態

wKiom1lfVF3wsdobAAFtcglz6A4155.png 

從上面可以看到master1ping通,說明只是服務死掉了

查看master2主機的ip地址:

wKioL1lfVIfSx12JAAFlCughA_U617.png 

slave1主機:

wKiom1lfVJ2g4LJOAAHbaZRQQLc676.png 

啓動master1主機的mysql服務,觀察monitor日誌,master1的日誌如下:

wKiom1lfVO_xn7yMAAFuzbwKzqY119.png 

 

用如下命令將服務器上線:查看羣集最新狀態

wKioL1lfVQPRING3AACRtQV2uzw211.png 

可以看到主庫啓動不會接管主,只到現有的主再次宕機。

總結

(1)master2備選主節點宕機不影響集羣的狀態,就是移除了master2備選節點的讀狀態。
(2)master1主節點宕機,由master2備選主節點接管寫角色,slave1指向新master2主庫進行復制,slave1會自動change mastermaster2.
(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_agentddb代理進程的啓動文件

     mmm_mond:監控進程的啓動文件   

     mmm_backup:備份文件 

     mmm_restore:還原文件

      mmm_control:監控操作命令文件    

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

3mmm_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

檢查項包括:pingmysql是否正常運行、複製線程是否正常等

檢查羣集環境在線狀況

[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其它處理問題

 如果不想讓writermaster切換到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,但是如果已經分配好了虛擬ipmonitor程序關閉了原先分配的虛擬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=1monitor控制來控制writerread,root用戶和複製用戶不受read_only參數的影響

 


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