一、MHA優缺點
優點:
1、MHA自動化主服務器故障轉移,快速將從服務器晉級爲主服務器(通常在10-30s),而不影響複製的一致性,不會有性能損耗,容易安裝,不必更改現有的部署環境,適用於任何存儲引擎。
2、MHA提供在線主服務器切換,改變先正運行的主服務器到另外一臺上,這個過程只需0.5-2s的時間,這個時間內數據無法寫入。MHA Manager通過ssh連接mysql slave服務器。
3、使用半同步複製,可以大大降低數據丟失的風險。MHA可以與半同步複製結合起來。如果只有一個slave已經收到了最新的二進制日誌,MHA可以將最新的二進制日誌應用於其他所有的slave服務器上,因此他們彼此保持一致性。
缺點:
1、雖然MHA試圖從宕機的主服務器上保存二進制日誌,但也會有問題。例如,如果主服務器硬件故障或無法通過ssh訪問,MHA沒法保存二進制日誌,只進行故障轉移而丟失最新數據。
2、當主DB故障,切換到另外的服務器上後,即使恢復了原來的主DB,也不能立即加入整套MHA系統中,得重新部署。而且當發生一次切換後,管理節點的監控進程就會自動退出,需要用腳本來自動啓動。另外還得刪除app1.failover.complete這個文件,否則新的主DB出現問題MHA就不會切換了。
二、簡單的架構圖
MHA最少需要兩臺服務器組成,也就是M-S架構,並使用從DB作爲監控機。
本次整理的方案使用了4臺虛擬機,爲M-M-S加監控機的組合。
Mysql請求發往VIP:10.1.1.190,當現有的主(10.1.1.191)故障,VIP會指向10.1.1.192,mysql請求也會轉過去。
請看簡圖:
一、環境搭建
1、部署MHA
MHA節點包含三個腳本,依賴perl模塊。
save_binary_logs:保存和複製當掉的主服務器二進制日誌。
apply_diff_relay_logs:識別差異的relay log事件,並應用於其他salve服務器。
purge_relay_logs:清除relay log文件。
需要在所有mysql服務器上安裝MHA節點,MHA管理服務器也需要安裝。MHA管理節點模塊內部依賴MHA節點模塊。MHA管理節點通過ssh連接管理mysql服務器和執行MHA節點腳本。MHA節點依賴perl的DBD::mysql模塊。
a)安裝MHA Node,4臺機器都需要安裝
yum –y install perl-DBD-MySQL
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54.tar.gz
tar zxf mha4mysql-node-0.54.tar.gz
cd mha4mysql-node-0.54
perl Makefile.PL
make && make install
b)安裝MHA manager,只需要安裝在監控機(10.1.1.112)
yum –y install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.54.tar.gz
tar zxf mha4mysql-manager-0.54.tar.gz
cd mha4mysql-manager-0.54
perl Makefile.PL
make && make install
需要注意的是mha-manager和mha-node版本必須一致,另外切記管理機也要安裝node包。
2、部署keepalive
2.1在10.1.1.191和10.1.1.192上部署keepalived
wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz
tar zxvf keepalived-1.1.17.tar.gz
cd keepalived--1.1.17.tar.gz
./configure --prefix=/usr/local/keepalived
make
make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
MASTER Keepalived的配置:
cat /etc/keepalived/keepalived.conf
#Configuration File for keepalived
global_defs {
notification_email {######定義接受郵件的郵箱
}
notification_email_from [email protected]######定義發送郵件的郵箱
smtp_server mail.tuge.com
smtp_connect_timeout 10
}
vrrp_script check_mysql {######定義監控mysql的腳本
script "/etc/keepalived/check_mysql.sh"
interval 2######監控時間間隔
weight 2######負載參數
}
vrrp_instance vrrptest {######定義vrrptest實例
state MASTER######服務器狀態(主爲MASTER,從爲BACKUP)
interface eth0######使用的接口
virtual_router_id 51######虛擬路由的標誌,一組lvs的虛擬路由標識必須相同,這樣才能切換
priority 150######服務啓動優先級,值越大,優先級越高,BACKUP 不能大於MASTER
advert_int 1######服務器之間的存活檢查時間
notify /etc/keepalived/alert.sh######keepalive發生切換的報警郵件
authentication {
auth_type PASS######認證類型
auth_pass ufsoft######認證密碼,一組lvs 服務器的認證密碼必須一致
}
track_script {######執行監控mysql進程的腳本
check_mysql
}
virtual_ipaddress {######虛擬IP地址
10.1.1.190
}
}
BACKUP Keepalived的配置
cat /etc/keepalived/keepalived.conf
#Configuration File for keepalived
global_defs {
notification_email {######定義接受郵件的郵箱
}
notification_email_from [email protected]######定義發送郵件的郵箱
smtp_server mail.tuge.com
smtp_connect_timeout 10
}
vrrp_script check_mysql {######定義監控mysql進程的腳本
script "/etc/keepalived/check_mysql.sh"
interval 2######監控時間間隔
weight 2######負載參數
}
vrrp_instance vrrptest {######定義vrrptest實例
state BACKUP######服務器狀態(主爲MASTER,從爲BACKUP)
interface eth0######使用的接口
virtual_router_id 51######虛擬路由的標誌,一組lvs的虛擬路由標識必須相同,這樣才能切換
priority 100######服務啓動優先級,值越大,優先級越高,BACKUP 不能大於MASTER
advert_int 1######服務器之間的存活檢查時間
notify /etc/keepalived/alert.sh######keepalive發生切換的報警郵件
authentication {
auth_type PASS######認證類型
auth_pass ufsoft######認證密碼,一組lvs 服務器的認證密碼必須一致
}
track_script {######執行監控NGINX進程的腳本
check_mysql
}
virtual_ipaddress {######虛擬IP地址
10.1.1.190
}
}
2.2監控腳本說明:
2.2.1監控mysql
/etc/keepalived/check_mysql.sh
#!/bin/bash
if [ "$(ps -ef | egrep "mysqld|mysqld_safe" | grep -v egrep )" == "" ]
then
/etc/init.d/keepalived stop
fi
功能:判斷當mysql進程不存在,則kill掉keepalive,將虛擬IP切換到BACKUP-Keepalive。
2.2.2 監控腳本/etc/keepalived/alert.sh
主要是在keepalive發生切換的時候發郵件報警用的。
初步的架構就這樣了,具體還得調整,盼大牛指教。