mha+keepalived安裝配置過程

isadba發表於2014-10-28

一、MHA的簡單介紹

MHA是由perl語言編寫的,用外掛指令碼的方式實現mysql主從複製的高可用性。MHA可以自動檢測mysql是否當機,如果當機,在10-30s內完成new master的選舉,應用所有差異的binlog日誌到所有slave,將所有的slave切換到新的master上來。

MHA除了自動檢測mysql是否當機,還能夠互動式的切換master,在日常的資料庫維護中,這個功能還是挺有用的。

由於MHA本身只負責資料庫主從的切換,但是應用程式並不知道資料庫的master變了。針對這種情況,可以使用MHA預留的幾個指令碼介面,通過虛擬IP或者修改全域性配置檔案的方法通知應用程式,master資料庫已經改變。

MHA還是一個很活躍的專案,生產環境的使用者眾多,不乏大公司,MHA的版本也很快,MHA作者在持續更新版本,最新版本已經支援GTID了。

二、MHA的原理

MHA的架構如下:
Mysql master1(MHA manger,MHA node)
|
____|____
| |
Mysql slave1(node) Mysql slave2(node)

首先介紹一下架構,上面這個圖很挫,大家見諒哈,看下面文字。
MHA只支援兩層的mysql複製架構,如上圖,Mysql slave1下面還有slave的話,那麼下面的slave屬於第三層了,MHA是沒法控制的。

在每個mysql的伺服器上,都需要安裝一個MHA的node節點。

全域性一個MHA manger,manger節點需要通過配置檔案中的賬號訪問到每個節點的Mysql,和ssh(非互動式)到每個節點的作業系統。所以這裡就需要通過ssh key來完成。

MHA manage節點包含這幾個程式:

masterha_manager (監控master,如果master down,自動完成failover)
masterha_master_switch (手動或者互動的完成failover或者master切換)
masterha_master_switch –conf=/etc/app1.cnf –master_state=dead –dead_master_host=192.168.153.150
masterha_master_switch –conf=/etc/app1.cnf –master_state=alive –new_master_host=192.168.153.151
masterha_check_status(檢查masterha_manager是否執行)
masterha_check_repl(檢查master複製環境是否正確)
masterha_stop(停止MHA)
masterha_conf_host
masterha_ssh_check (檢查通過ssh是否可以登入對應的node節點)
purge_relay_logs (刪除無用的relay log,避免延時)
masterha_secondary_check(通過其他路由去檢測master是否真的掛了)
masterha_secondary_check -s 192.168.153.151 -s 192.168.153.152 –user=root –master_host=localhost –master_ip=192.168.153.150 –master_port=3306
Master is reachable from 192.168.153.151!

MHA node節點包含著四個程式:

save_binary_logs(儲存和複製當掉的主伺服器二進位制日誌)
apply_diff_relay_logs(識別差異的relay log事件,並應用於其他salve伺服器)
purge_relay_logs(清除relay log檔案)
filter_mysqlbinlog(這個指令碼現在已經廢棄了)
需要在所有mysql伺服器上安裝MHA節點,MHA管理伺服器也需要安裝。MHA管理節點模組內部依賴MHA節點模組。MHA管理節點通過ssh連線管理mysql伺服器和執行MHA節點指令碼。

MHA的failover流程:

#啟動前的準備工作
#檢查資料庫伺服器狀態,獲取相關引數設定
#測試ssh連線是否成功
#測試MHA node是否可用
#建立MHA日誌目錄
#開始檢查slave的差異日誌應用許可權
#確定當前的複製架構
#除錯master_ip_failover_script
#除錯shutdown_script
#設定二次檢查的主機masterha_secondary_check
#MHA啟動完畢,進入監測狀態
#監測DB1伺服器掛了
#通過定義的二次監測,確認master是否掛了
#確認master掛了,開始進入failover流程
#再試嘗試連線master和master的ssh
#通過MHA配置檔案,監測其他slave的狀態
#再次監測slave的配置是否有變化,是否符合failover條件
#正式開始failover
#再次對slave配置做檢查
#對原Master做master_ip_failover_script和shutdown_script的操作
#開始差異日誌的恢復:獲取slave最後得到的binlog位置
#獲取原master的binlog日誌
#確定新的master
#在new master上應用差異的binlog日誌
#獲取new master的binlog位置。
#如果有master_ip_failover_script,那麼給new master設定VIP
#開始恢復其他slave,也是從原master的binlog對比來做恢復
#差異日誌應用完成以後,切換所有slave到new master。
#failover操作完成,生成failover報告

三、安裝配置

環境設定:
主機 角色 IP 安裝軟體
db1 MASTER 192.168.153.150 mysql,mha manger,mha node,keepalived
db2 SLAVE1 192.168.153.151 mysql,mha node,keepalived(候選MASTER)
db3 SLAVE2 192.168.153.152 mysql,mha node
VIP(virtual ip):192.168.153.100

大概的安裝流程:

1、關閉selinux和iptables
2、安裝開發庫和基礎庫,以及相關的開發工具,perl庫
3、配置ssh的公匙,免密碼登入
4、安裝配置mysql資料庫,並且授權
5、安裝mha node
6、安裝mha manager
7、修改mha配置檔案
8、測試mha切換
9、安裝,配置,測試keepalived
10、將mha和keepalived結合,加上相關指令碼,聯合除錯。

1、cat /etc/sysconfig/selinux
設定SELINUX=disabled
2、
#iptables -F INPUT
#service iptables save
#iptables -xvnL //檢視沒有任何規則為準,如果你真需要iptables規則,建議再安裝除錯玩MHA以後,在設定規則,再除錯一次規則是否對MHA有影響。

3、配置ssh key免密碼登入.
db1:
#ssh-keygen -t rsa //一路回車
#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.153.150
#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.153.151
#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.153.152

db2:
#ssh-keygen -t rsa //一路回車
#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.153.150
#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.153.152

db2:
#ssh-keygen -t rsa //一路回車
#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.153.150
#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.153.151

4、安裝mysql資料庫,並授權
所有機器上安裝mysql server,修改配置檔案,完成三臺機器主從複製的搭建,由於這塊描述起來挺多的,大家可以參考我寫的安裝mysql-mmm的資料.
《mysql-mmm安裝手冊》http://isadba.com/?p=142

5、安裝mha node,所有機器上都需要安裝
在https://code.google.com/p/mysql-master-ha/下載最新的rpm包或者原始碼包安裝,我使用的rpm包,如果包缺乏依賴關係,使用yum安裝對應的包就可以。
#rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm

6、在db1上安裝MHA manager軟體。
開始我也嘗試用rpm包安裝,但是遇見兩個相容行問題,我的yum庫沒有對應的包,使用CPAN安裝以後,rpm包不能識別,轉而使用了原始碼編譯.總的來說MHA的軟體包還是比較好安裝的。
#tar -zxvf mha4mysql-manager-0.55.tar.gz
#cd mha4mysql-manager-0.55
#ls
#perl Makefile.PL
#make install

7、修改配置檔案,配置檔案只需要mha_manager機器上存在就行了.

預設的配置檔案模板在原始碼包裡面有,具體位置如下.
/root/soft/mha4mysql-manager-0.55/samples/conf,有app1.cnf和masterha_default.cnf兩個配置檔案。masterha_manager會同時讀取這兩個配置檔案。

app1.cnf主要是存放node節點的配置,masterha_default.cnf主要存放伺服器端的配置.但是通常的處理方式是不用masterha_default.cnf,而是把這個檔案裡面的配置寫入到app1.cnf裡面。

我的app1.cnf配置如下:

# cat /etc/app1.cnf
[server default]
user=mha		//mha用來獲取資料庫一些配置和狀態的使用者
password=mha
ssh_user=root	//ssh key的使用者
repl_user=slave		//mysql複製使用的賬號和密碼
repl_password=slave
manager_workdir=/var/log/masterha/app1		//mha狀態和日誌,差異日誌儲存的目錄
manager_log=/var/log/masterha/app1/manager.log	//mha日誌
remote_workdir=/var/log/masterha/app1		//node節點的工作目錄
secondary_check_script="masterha_secondary_check -s 192.168.153.151 -s 192.168.153.152"	//二次檢查的配置.意思是manager將連線到192.168.153.151和152的系統上,測試master是否可用,避免腦裂問題.
//下面幾個指令碼控制稍後來講,我們現在先不啟用他們。
#master_ip_failover_script="/opt/master_ip_failover.sh"	//failover的控制Vip的指令碼
#master_ip_online_change_script=""	//互動式出發的線上切換時呼叫的指令碼
#shutdown_script="/opt/master_ip_failover.sh"	//關機指令碼
#report_script=""		//通知指令碼

//下面是每個node節點的單獨配置
[server1]
hostname=192.168.153.150
candidate_master=1

[server2]
hostname=192.168.153.151
candidate_master=1

[server3]
hostname=192.168.153.152
no_master=1

8、測試mha

首先兩個小測試:

#測試ssh key是否可用

# masterha_check_ssh --conf=/etc/app1.cnf
Sun Sep 28 14:39:57 2014 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Sep 28 14:39:57 2014 - [info] Reading application default configurations from /etc/app1.cnf..
Sun Sep 28 14:39:57 2014 - [info] Reading server configurations from /etc/app1.cnf..
Sun Sep 28 14:39:57 2014 - [info] Starting SSH connection tests..
Sun Sep 28 14:40:02 2014 - [debug]
Sun Sep 28 14:39:58 2014 - [debug]  Connecting via SSH from root@192.168.153.150(192.168.153.150:22) to root@192.168.153.151(192.168.153.151:22)..
Sun Sep 28 14:40:01 2014 - [debug]   ok.
Sun Sep 28 14:40:01 2014 - [debug]  Connecting via SSH from root@192.168.153.150(192.168.153.150:22) to root@192.168.153.152(192.168.153.152:22)..
Sun Sep 28 14:40:02 2014 - [debug]   ok.
Sun Sep 28 14:40:02 2014 - [debug]
Sun Sep 28 14:39:58 2014 - [debug]  Connecting via SSH from root@192.168.153.151(192.168.153.151:22) to root@192.168.153.150(192.168.153.150:22)..
Sun Sep 28 14:40:01 2014 - [debug]   ok.
Sun Sep 28 14:40:01 2014 - [debug]  Connecting via SSH from root@192.168.153.151(192.168.153.151:22) to root@192.168.153.152(192.168.153.152:22)..
Sun Sep 28 14:40:02 2014 - [debug]   ok.
Sun Sep 28 14:40:03 2014 - [debug]
Sun Sep 28 14:39:59 2014 - [debug]  Connecting via SSH from root@192.168.153.152(192.168.153.152:22) to root@192.168.153.150(192.168.153.150:22)..
Sun Sep 28 14:40:02 2014 - [debug]   ok.
Sun Sep 28 14:40:02 2014 - [debug]  Connecting via SSH from root@192.168.153.152(192.168.153.152:22) to root@192.168.153.151(192.168.153.151:22)..
Sun Sep 28 14:40:03 2014 - [debug]   ok.
Sun Sep 28 14:40:03 2014 - [info] All SSH connection tests passed successfully.

測試複製環境

# masterha_check_repl --conf=/etc/app1.cnf
Sun Sep 28 14:40:43 2014 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Sep 28 14:40:43 2014 - [info] Reading application default configurations from /etc/app1.cnf..
Sun Sep 28 14:40:43 2014 - [info] Reading server configurations from /etc/app1.cnf..
Sun Sep 28 14:40:43 2014 - [info] MHA::MasterMonitor version 0.55.
Sun Sep 28 14:40:53 2014 - [info] Checking replication health on 192.168.153.151..

省略若干行..............................
Sun Sep 28 14:40:53 2014 - [info]  ok.
Sun Sep 28 14:40:53 2014 - [info] Checking replication health on 192.168.153.152..
Sun Sep 28 14:40:53 2014 - [info]  ok.
Sun Sep 28 14:40:53 2014 - [warning] master_ip_failover_script is not defined.
Sun Sep 28 14:40:53 2014 - [info] Checking shutdown script status:
Sun Sep 28 14:40:53 2014 - [info]   /opt/master_ip_failover.sh --command=status --ssh_user=root --host=192.168.153.150 --ip=192.168.153.150
Sun Sep 28 14:40:53 2014 - [info]  OK.
Sun Sep 28 14:40:53 2014 - [info] Got exit code 0 (Not master dead).

如果以上兩個測試都通過,看來環境和配置基本OK,我們來啟動MHA

# masterha_manager  --conf=/etc/app1.cnf
Sun Sep 28 14:42:43 2014 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Sep 28 14:42:43 2014 - [info] Reading application default configurations from /etc/app1.cnf..
Sun Sep 28 14:42:43 2014 - [info] Reading server configurations from /etc/app1.cnf..

程式在切換觸發以後會自動關掉.這個命令建議放到screen裡面跑。
現在可以去# cd /var/log/masterha/app1/看看生成的日誌
如果沒有什麼很嚴重的錯誤資訊,那麼就可以準備嘗試failover了。

#開始failover
關閉master的mysql服務,觀察db02和db03的複製變化情況。
# service mysql stop
Shutting down MySQL (Percona Server)….. SUCCESS!
檢視/var/log/masterha/app1/manager.log的日誌.如果看見如下資訊,那麼就是failover成功了。

----- Failover Report -----

app1: MySQL Master failover 192.168.153.150 to 192.168.153.151 succeeded

Master 192.168.153.150 is down!

Check MHA Manager logs at localhost.localdomain:/var/log/masterha/app1/manager.log for details.

Started automated(non-interactive) failover.
The latest slave 192.168.153.151(192.168.153.151:3306) has all relay logs for recovery.
Selected 192.168.153.151 as a new master.
192.168.153.151: OK: Applying all logs succeeded.
192.168.153.152: This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
192.168.153.152: OK: Applying all logs succeeded. Slave started, replicating from 192.168.153.151.
192.168.153.151: Resetting slave info succeeded.
Master failover to 192.168.153.151(192.168.153.151:3306) completed successfully.

接下來觀察一下db2和db3的複製情況:
db2:

(root:hostname)[(none)]> show slave status\G
Empty set (0.00 sec)

db3:

(root:hostname)[(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.153.151
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000016
          Read_Master_Log_Pos: 688
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000016
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 688
              Relay_Log_Space: 452
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 151
                  Master_UUID: dd079e18-4244-11e4-b851-000c29da163e
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
1 row in set (0.00 sec)

9、安裝測試keepalived,在db1和db2上安裝keepalived。

關於keepalvied的資訊,可以閱讀《LVS+Keepalived使用總結》http://isadba.com/?p=67
或者搜尋《keepalived權威指南》
下載keepalived的軟體包

http://www.keepalived.org/download.html 下載最新的tar.gz包。
#yum install kernel-devel
#tar -zxvf keepalived-1.2.13.tar.gz
#cd keepalived-1.2.13
#./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.29.2.el6.x86_64/
# make && make install

安裝完成後,修改配置檔案,下面是db1上面的配置檔案,db2的話,將優先順序改低50就可以了。

# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0		//keepalived使用的網口
    virtual_router_id 51
    priority 150		//優先順序越高,優先獲取虛擬IP
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.153.100		//虛擬IP
    }
}

測試keepalived是否正常工作.

db1#service keepalived restart
db2#service keepalived restart

db1#ip add
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:da:16:3d brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.150/24 brd 192.168.153.255 scope global eth0
    inet 192.168.153.100/32 scope global eth0
    inet6 fe80::20c:29ff:feda:163d/64 scope link
       valid_lft forever preferred_lft forever

現在關掉db1的keepalived的程式:

db1# killall keepalived
db1#ip add
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:da:16:3d brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.150/24 brd 192.168.153.255 scope global eth0
    inet6 fe80::20c:29ff:feda:163d/64 scope link
       valid_lft forever preferred_lft forever

db2# ip add
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:da:16:3e brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.151/24 brd 192.168.153.255 scope global eth0
    inet 192.168.153.100/32 scope global eth0
    inet6 fe80::20c:29ff:feda:163e/64 scope link
       valid_lft forever preferred_lft forever

大家可以發現,虛擬IP瞬間已經漂移到了db2上面.除錯資訊可以在/var/log/messages 中看見。

我們使用keepalived的目的就是在MHA檢測到master掛掉的時候,呼叫shutdown_script關掉keepalived程式,從而是虛擬IP移動到新的master上面去。

9、聯合MHA和keepalived除錯.

在除錯之前,我們需要搞清楚一些事情.那就是關於上面我們註釋掉的幾個script,他們是幹什麼的,在什麼時候呼叫.
#master_ip_failover_script:

首先啟動的時候會呼叫這個指令碼
/opt/master_ip_failover_script.sh –command=status –ssh_user=root –orig_master_host=192.168.153.150 –orig_master_ip=192.168.153.150 –orig_master_port=3306

然後在正式failover過程中的第二步,Dead Master Shutdown Phase階段會在次執行。
/opt/master_ip_failover_script.sh –orig_master_host=192.168.153.150 –orig_master_ip=192.168.153.150 –orig_master_port=3306 –command=stopssh –ssh_user=root

在正式failover過程中的第3.4步驟中(選舉新的master以後,應用差異的binlog後),會再次執行。
/opt/master_ip_failover_script.sh –command=start –ssh_user=root –orig_master_host=192.168.153.150 –orig_master_ip=192.168.153.150 –orig_master_port=3306 –new_master_host=192.168.153.151 –new_master_ip=192.168.153.151 –new_master_port=3306 –new_master_user=’mha’ –new_master_password=’mha’

#master_ip_online_change_script:

在使用masterha_master_switch –conf=/etc/app1.cnf –master_state=alive –new_master_host=192.168.153.151主動切換mysql master的時候會呼叫.

在online切換的第二階段,拒絕寫入原master的時候執行。
/opt/master_ip_online_change_script.sh –command=stop –orig_master_host=192.168.153.150 –orig_master_ip=192.168.153.150 –orig_master_port=3306 –orig_master_user=’mha’ –orig_master_password=’mha’ –new_master_host=192.168.153.151 –new_master_ip=192.168.153.151 –new_master_port=3306 –new_master_user=’mha’ –new_master_password=’mha’

然後會在new master上執行
/opt/master_ip_online_change_script.sh –command=start –orig_master_host=192.168.153.150 –orig_master_ip=192.168.153.150 –orig_master_port=3306 –orig_master_user=’mha’ –orig_master_password=’mha’ –new_master_host=192.168.153.151 –new_master_ip=192.168.153.151 –new_master_port=3306 –new_master_user=’mha’ –new_master_password=’mha’

#shutdown_script:

首先啟動的時候會執行這個指令碼,執行時間緊跟著master_ip_failover_script第一次執行後面
/opt/shutdown_script.sh –command=status –ssh_user=root –host=192.168.153.150 –ip=192.168.153.150

第二次執行是在master_ip_failover_script第二次執行後面
/opt/shutdown_script.sh –command=stopssh –ssh_user=root –host=192.168.153.150 –ip=192.168.153.150 –port=3306

#report_script=”” //通知指令碼
在masterha_manager自動切換完成的最後會呼叫一次這個指令碼。
report_script.sh –orig_master_host=(dead master’s hostname) –new_master_host=(new master’s hostname) –new_slave_hosts=(new slaves’ hostnames, delimited by commas) –subject=(mail subject) –body=(body)

在mha4mysql-manager原始碼包的samples/scripts/目錄,會有幾個示例的指令碼.是perl編寫的,我不太懂perl啦.如果有一樣像我這樣不太懂perl的同學,可以根據上面的呼叫引數,使用shell或者python從新實現一次。
自己在從新實現這些指令碼的時候,有兩點注意:
1、儘量符合呼叫的引數,讓指令碼更人性化
2、指令碼的返回值需要是0或者10,不然會認為指令碼執行錯誤,後面的操作將不再繼續執行,failover操作將會停止。

我們現在需要自己寫一個shutdown_script的指令碼,內容就是檢測master上的mysql是否真的掛掉了,如果真的掛掉了,那麼就殺掉master上面的keepalived程式,觸發VIP的漂移。
修改app.cnf中被註釋掉的shutdown_script,指定到對應的指令碼.我的shutdow_script.sh指令碼在文章末尾公佈,其實最簡單的shutdown_script只需要幹兩個事情,一檢查mysql是否當掉,二如果當掉就killall keepalived。

下面我們開始聯合除錯.
檢查三臺mysql的複製情況
master和備用master開啟keepalived監聽,檢查虛擬ip是否在master上面。
啟動mha_manager
關閉master mysql
檢查slave的複製情況以及VIP漂移情況.

TIPS:有兩個資料安全方面可以需要優化的地方
1、設定所有slave的read_only=on
如果設定了這個引數,就需要使用master_ip_failover_script和master_ip_online_change_script引數,在新master初始化的時候設定成read_only=off.這個設定的主要目的是避免master的os當機時,keepalived的VIP比MHA先切換到new master.
2、設定所有的slave的relay_log_purge=0
設定這個引數以後,已完成的relay log就不會自動的purge掉.這個設定的主要目的是為了避免在failover的3.3和4.1階段,diff log需要某個slave的已經完成的relay log存在.使用這個引數以後,會產生一個問題,
那就是relay log會越來越來,並且清理relay log的時候可能會導致複製阻塞.所以MHA的node提供了一個指令碼purge_relay_logs來完成無阻塞的清理relay log.
我們需要在slave加上一個計劃任務.
[app@slave_host1]$ cat /etc/cron.d/purge_relay_logs
# purge relay logs at 5am
0 5 * * * app /usr/bin/purge_relay_logs –user=root –password=PASSWORD –disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

下面是我的shutdown_script指令碼,這個指令碼主要使用的是stopssh方法,stop方法一般沒有呼叫,如果你有需要,自己在稍微修改一下.
shutdown_script.sh:

[root@localhost opt]# cat shutdown_script.sh
#!/bin/bash
#       masterha shutdown_script.
#       version:        2013-11-06       frist version
#
#                               by andy.feng
#                               copy right
LANG=C
for i in $@
do
        if  [ ${i:2:2} = "ip" ]
                then
                IP=${i:5:20}
        elif [ ${i:2:7} = "command" ]
                then
                CMD=${i:10:20}
        elif [ ${i:2:4} = "port" ]
                then
                MYSQL_PORT=${i:7:20}
        fi
done
USER="mha"
PASSWORD="mha"
function stopssh {
        mysql -s -u$USER -p$PASSWORD -h$IP -P$MYSQL_PORT -e 'select count(*) as c from mysql.user;'  &> /dev/null
        if [ $? -ne 0 ]
        then
                ssh $IP 'killall keepalived'
                if [ $? != 0 ]
                        then
                        echo "$IP killall keepalived fail....."
                        return 1
                fi
                        return 0
        fi
}

function stop {
        mysql -s -u$USER -p$PASSWORD -h$IP -P$MYSQL_PORT -e 'select count(*) as c from mysql.user;'  &> /dev/null
        if [ $? -ne 0 ]
        then
                ssh $IP 'shutdown -h now'
               if [ $? != 0 ]
                        then
                        echo "$IP shutdown  fail....."
                        return 1
               fi
                        return 0
        fi
}

if [ $CMD = 'stopssh' ]
        then
        stopssh
fi

相關文章