程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL高可用系列之MHA(二)

MySQL高可用系列之MHA(二)

編輯:MySQL綜合教程

MySQL高可用系列之MHA(二)


一.參數說明

MHA提供了一系列配置參數,深入理解每個參數的具體含義,對優化配置、合理使用MHA非常重要,很多高可用性也都是通過合理配置一些參數而實現的。
MHA包括如下配置參數,分別說明如下:
hostname/ip/port (Local Only)
hostname為MySQL Server的IP地址或主機名;
ip為MySQL Server的IP地址,缺省從$hostname中獲取;port為MySQL Server的端口號,缺省為3306

ssh_host/ssh_ip/ssh_port (Local Only)
這三個參數是從版本0.53才引入的,其中ssh_host同$hostname,ssh_ip同$ip;ssh_port為SSH通信使用的系統端口號,缺省為22。

ssh_connection_timeout (Local/App/Global) SSH連接超時閥值,缺省為5秒,該參數從版本0.54開始引入。

ssh_options (Local/App/Global) 額外的SSH命令選項,該參數從版本0.53開始引入。

candidate_master (Local Only)
該參數用於設置某個Slave是否可以優先成為Master。
若設置為1,則對應的那個Slave可優先成為新的Master;若多個Slave均設置該參數為1,則成為Master的優先級按照[server_1]/[server_2]/…排序;
缺省值為0,表示不設置某個Slave優先成為Master,即所有Slave成為Master的優先級一樣,此時MHA會選擇一個延遲最小的Slave成為新的Master。

no_master (Local Only)
是否禁止某個Slave成為Master,缺省值為0,表示每個Slave都有機會成為新的Master;
若設置為1,則對應的那個Slave永遠不會成為Master。

ignore_fail (Local Only)
缺省情況下,當某個Slave故障時(比如:不能通過MySQL/SSH連接,SQL線程因錯誤停止等),MHA不開啟故障切換;若設置為1,則對應的那個Slave出現故障時自動切換。

user/password (Local/App/Global)
MySQL數據庫管理賬戶及密碼,因為要執行一些必要的管理命令,比如:Stop Slave、Change Master、Reset Slave,所以該賬戶應該為root,這也是缺省值。

repl_user /repl_password (Local/App/Global) MySQL復制賬戶及密碼

disable_log_bin (Local/App/Global)
若設置該參數,則在Slave應用差異日志時,自身不生成二進制日志;MHA內部是通過在調用mysqlbinlog工具命令時加參數—disable-log-bin實現的,缺省值為0。

master_pid_file (Local/App/Global) 設置Master實例的pid文件,該參數適用於一台服務器安裝多個MySQL實例的情況。

ssh_user (Local/App/Global)
MHA Manager和Node訪問MySQL Server所使用的OS用戶,在多種情況下,都會用到該賬戶,比如:遠程執行命令、在Slave間拷貝差異的Relay logs等。
該用戶至少要擁有讀取MySQL binary/relay log文件和relay_log.info文件的權限,以及日志目錄的寫權限(remote_workdir參數指定的路徑)。
該用戶不需要交互即可連接到其它服務器上,所以建議使用SSH公共密鑰認證,即配置SSH等效性;缺省情況下,ssh_user為系統管理賬戶,即root賬戶。

remote_workdir (Local/App/Global)
每個MHA Node節點(運行MySQL實例的服務器)的工作目錄全路徑,其中會生成日志文件,缺省為/var/tmp;若路徑不存在,MHA Node會自動創建,當然這需要擁有足夠的權限。
注意:不管是Manager還是Node,都會檢查目錄的可用磁盤空間。

master_binlog_dir (Local/App/Global)
MySQL主庫的binlog日志文件的全路徑,缺省為/var/lib/mysql,根據實際情況設置為真實的路徑。
該參數適用於這麼一種情況:Master實例故障,但OS系統運行正常,此時MHA可通過SSH登錄,然後讀取並拷貝必須的二進制日志事件(即差異的日志)。
可見該參數是必要而有用的,因為Master死掉後,MHA無法自動獲取binlog日志文件的路徑。
另外,可用逗號隔開設置多個路徑。

log_level (App/Global) MHA Manager的日志等級,可設置為debug/info/warning/error,缺省為info
manager_workdir (App) MHA Manger節點生的工作目錄全路徑,其中生成各種相關的狀態文件,若未設置,則缺省為/var/tmp。

manager_log (App)
MHA Manager日志的全路徑名稱,若未設置,則輸出到STDOUT/STDERR;
需要注意的是:在執行手動故障切換時,MHA則忽略參數設置,而直接輸出到STDOUT/STDERR。

check_repl_delay (App/Global)
缺省情況下,如果某個Slave延遲超過100MB的relay logs,MHA則不會選擇該Slave成為新的Master,因為這需要太長的時間來恢復。
若設置該參數為0,MHA在選擇新的Master時,會忽略復制延遲。
當為某個Slave設置candidate_master=1,使其優先成為新的Master時,該參數非常有用。

check_repl_filter (App/Global)
缺省情況下,如果Master、Slaves擁有不同的binlog/replication過濾規則,MHA會報錯並且不開啟監控或故障切換,這是為了避免一些意想不到的恢復錯誤,比如:Table not exists等。
如果你百分百確信這些不同的過濾設置不會導致恢復問題,則設置該參數為0。
需要注意的是:當應用差異日志時,MHA並不檢查過濾規則,若設置該參數為0,可能會遇到“Table not exists”之類的錯誤,所以設置該參數時一定要小心,缺省設置為1。

latest_priority (App/Global)
缺省情況下,MHA選擇最新的Slave(即延遲最少的Slave)優先成為新的Master。如果你想完全控制每個Slave成為Master的順序,則可設置該參數為0,此時優先級由candidate_master參數
和每個Slave的[server_xxx]順序決定。

multi_tier_slave (App/Global)
缺省情況下,MHA是不允許配置多層(3層及以上)復制結構的,例如:host1->host2->host3,此時MHA會報錯而停止。
從版本0.52開始,MHA引入了新的參數――multi_tier_slave,以此來支持多層復制配置。
若設置了該參數,MHA不會因為3層復制結構而終止,而是忽略第三層復制;此時,若host1(master)崩潰,則host2被選擇成為新的Master,host3繼續從host2復制,好像第三層復制不存在一樣。

ping_interval (App/Global)
該參數用於設置MHA Manager多長時間ping(執行ping SQL語句)一次Master,即ping Master實例的時間間隔,缺省為3秒。
當連續丟失3次連接間隔,即連續ping了3次都失敗後,MHA Manager則認為Master已經死掉;所以通過這種ping機制發現故障的最長時間為ping_interval的4倍,即12秒。
注意:由於身份認證錯誤或MySQL實例連接數過多而導致的連接失敗次數不計入Master死亡統計數。

ping_type (App/Global)
缺省情況下,MHA創建一個到Master的持久連接,然後定期(由ping_interval參數決定)執行“SELECT 1”(ping_type=SELECT),以此來檢查Master的可用性。
但在有些情況下,通過定期地“創建/斷開連接”方式效果會更好,因為這種方式相對來說更嚴格,並且可以更快地監測到TCP連接級故障;若采用這種方式,需設置ping_type=CONNECT。
該參數是從版本0.53開始引入的,可設置為CONNECT或SELECT,缺省為SELECT。

secondary_check_script (App/Global)
默認情況下,MHA通過單個路由(即從Manager到Master)來檢查Master的可用性,這顯然是不夠完善的,強烈建議采用兩個或多個網絡路由來檢查Master的可用性。
MHA正是通過調用secondary_check_script參數定義的外部腳本來實現多路由監測的,比如:
secondary_check_script=masterha_secondary_check -s remote_host1 -s remote_host2
masterha_secondary_check包含於MHA Manager包中,其內置的腳本在多數情況下還是比較好用的;當然,若需要更多的功能,也可自定義一個網絡檢查腳本,然後通過該參數調用。
在上面的例子中,MHA通過如下兩條路徑來監測MySQL Master Server的活動:
Manager(A)->remote_host1(B)->master_host
Manager(A)->remote_host2(B)->master_host
通過這兩條路徑,若連接A成功,連接B失敗,masterha_secondary_check退出並返回代碼0,MHA Manager判斷Master已經真正死掉,並開始故障切換;如果A不成功,
masterha_secondary_check退出並返回代碼2,MHA Manager猜猜可能發生了網絡問題,並不開始故障切換;若B成功,則退出並返回代碼3,此時MHA Manager認為Master實際上是活著的,
也不開始故障切換。
一般來說,remote_host1和remote_host2這兩條從MHA Manager到MySQL Server的通道應該位於為不同的網段。
MHA調用該參數定義的腳本時,會自動傳遞user/master_host/master_ip/master_port這幾個參數,所以無需重復定義。

使用masterha_secondary_check,有以下幾點需要說明:
――內置腳本依賴於IO::Socket::INET Perl包,該包從Perl v5.6.0缺省已包含;
――內置腳本需要通過SSH連接到其它遠程服務器,所以需要設置SSH公共密鑰認證;
――另外,內置腳本嘗試從remote server建立到MySQL Master的TCP連接,這意味著MySQL配置文件中的max_connections設置不受影響,如果TCP連接成功,
則MySQL的aborted_connects狀態值遞增1。

master_ip_failover_script (App/Global)
常用的HA環境,通常是通過VIP來實現的,在Master上綁定一個VIP,Master崩潰後,由HA將VIP切換到Standby上。

另一種常見方法是創建一個全局目錄數據庫,裡面存放所有的應用和Writer/Reader IP地址映射列表,以此來代替VIP,這種情況下,若Master故障,則需更新映射列表。
這兩種方法各有利弊,MHA不限制使用哪一種,允許用戶使用任何基於IP地址的故障切換方案;該參數就是用於此目的,換句話說,就是需要自行編寫一個腳本來保證應用可以透明地
連接到新的Master上,並通過該參數調用,比如:master_ip_failover_script=/usr/local/sample/bin/master_ip_failover

示例腳本為(MHA Manager package)/samples/scripts/master_ip_failover。
整個運行期間,MHA Manager需要調用該腳本3次,第一次是在開始監控之前,目的是檢查腳本的可用性,第二次是在調用shutdown_script腳本之前,第三次是在新的Master應用完所有的
relay logs之後。調用期間,MHA Manager會傳遞如下參數:

 Checking phase
--command=status
--ssh_user=(current master's ssh username)
--orig_master_host=(current master's hostname)
--orig_master_ip=(current master's ip address)
--orig_master_port=(current master's port number)
 Current master shutdown phase
--command=stop or stopssh
--ssh_user=(dead master's ssh username,if reachable via ssh)
--orig_master_host=(current(dead) master's hostname)
--orig_master_ip=(current(dead) master's ip address)
--orig_master_port=(current(dead) master's port number)
 New master activation phase
--command=start
--ssh_user=(new master's ssh username)
--orig_master_host=(dead master's hostname)
--orig_master_ip=(dead master's ip address)
--orig_master_port=(dead master's port number)
--new_master_host=(new master's hostname)
--new_master_ip=(new master's ip address)
--new_master_port=(new master's port number)
--new_master_user=(new master's user)
--new_master_password=(new master's password)

如果采用的是在Master上綁定共享VIP方式,那麼在Master關閉階段,只需shutdown_script之後關閉主機電源即可,不需要做其它的事情;在新的Master啟動階段,將這個VIP分配到新的Master上。
如果采用的是目錄數據庫方式,那麼在Master關閉階段,需要刪除或修改dead master這條記錄;在新的Master啟動階段,需要插入或修改new master這條記錄。
此外,可能還需要做一些其它的事情,比如:SET GLOBAL read_only=0,創建擁有寫權限的用戶等,以便應用可以在新的Master上執行寫操作。
MHA Manager檢查腳本返回的代碼,並據此執行不同的操作,若腳本退出時返回代碼0或10,MHA Manager繼續操作;若腳本退出時返回0或10之外的代碼,
MHA Manager將終止而不會繼續故障切換。該參數默認值為空,所以MHA Manager缺省也不會調用任何東西。
master_ip_online_change_script (App/Global)
這個參數與master_ip_failover_script類似,但不是用於Master故障切換的,而是一個Master在線修改命令(masterha_master_switch –master_state=alive),不同階段傳遞的參數也不一樣,如下:
 Current master write freezing phase(當前Master寫凍結階段)
--command=stop or stopssh
--orig_master_host=(current master's hostname)
--orig_master_ip=(current master's ip address)
--orig_master_port=(current master's port number)
--orig_master_user=(current master's user)
--orig_master_password=(current master's password)
 New master granting write phase(新Master授權寫階段)
--command=start
--orig_master_host=(orig master's hostname)
--orig_master_ip=(orig master's ip address)
--orig_master_port=(orig master's port number)
--new_master_host=(new master's hostname)
--new_master_ip=(new master's ip address)
--new_master_port=(new master's port number)
--new_master_user=(new master's user)
--new_master_password=(new master's password)
在寫操作禁用階段後,MHA在當前的Master上執行“FLUSH TABLES WITH READ LOCK”命令,此時可通過一些邏輯操作來執行Master切換。在給新的Master賦予寫操作權限階段,可以執行一些類似master_ip_failover_script功能的操作,比如:創建一個特權用戶,執行“SET GLOBAL read_only=0”命令,修改目錄數據庫等。如果腳本返回的代碼不是0或10,MHA將終止操作,不會進行Master切換。
該參數默認值為空,所以MHA Manager缺省不會調用任何東西。
有些情況下,為了避免腦裂問題,可能需要強制關閉Master以隔離該節點,防止其重啟服務。
該參數就是為了實現這個目的的,它調用一個強制關閉master的腳本,比如:
shutdown_script=/usr/local/sample/bin/power_manager
(示例腳本位於MHA Manager源碼包中)
在調用shutdown_script之前,MHA Manager先執行一個內部檢查,看Master所在的服務器是否還可以通過SSH方式連接,若可以連接(比如:操作正常,而mysqld故障的情況),MHA Manager將傳遞如下參數:
--command=stopssh
--ssh_user=(ssh username so that you can connect to the master)
--host=(master's hostname)
--ip=(master's ip address)
--port=(master's port number)
--pid_file=(master's pid file)
如果Master所在的服務器已經故障,無法通過SSH連接,則傳遞如下參數:
--command=stop
--host=(master's hostname)
--ip=(master's ip address)
該示例腳本的工作原理大致如下:
如果成功傳遞了--command=stopssh,那麼說明Master所在的服務器系統是正常運行的,此時將通過SSH方式連接到該服務器,通過系統命令“kill -9”殺掉所有的mysqld和mysqld_safe進程;
如果--pid_file也成功傳遞,那麼腳本將試圖殺掉指定的某個進程,而不是所有的mysqld進程,這適用於一台服務器上安裝多個MySQL實例的情況。若mysqld進程成功殺掉,則腳本返回代碼10,MHA Manager據此再次連接Master,並保存必要的二進制日志。
如果不能通過SSH方式連接到Master服務器,或者傳遞的命令為--command=stop,那麼腳本將嘗試關閉該服務器的電源。關閉電源命令依賴於H/W,不同服務器也不盡相同,對於HP(iLO)來說,使用ipmitool或SSL命令;對於Dell(DRAC)來說,使用dracadm命令。若成功關閉了服務器電源,則腳本返回代碼0,否則返回代碼1。
如果返回的代碼為0,MHA Manager則開始故障切換過程,如果返回的是0或10之外的代碼,MHA Manager將終止故障切換。
該參數缺省值為空,所以不會執行任何操作。
另外,在啟動監控時,MHA Manager會調用shutdown_scrip腳本,並傳遞如下參數:
--command=status
--host=(master's hostname)
--ip=(master's ip address)
這裡,我們可以檢查腳本設置,電源控制依賴於H/W,因此強烈建議檢查電源狀態,若有某些錯誤,也可在啟動監控之前注意到。
report_script (App/Global)
當故障轉移成功完成,或者因錯誤而結束時,可以通過該參數來發送一個報告,此時會傳遞如下參數:
--orig_master_host=(dead master's hostname)
--new_master_host=(new master's hostname)
--new_slave_hosts=(new slaves' hostnames,delimited by commas:多個slave用逗號分割)
--subject=(mail subject:報告主題)
--body=(body:報告內容)
該參數缺省為空,示例腳本為(MHA Manager package)/samples/send_report。
init_conf_load_script App/Global
若想在配置文件中使用純文本(比如password和repl_password),可使用該參數,腳本返回“name=value”對,可以覆蓋全局配置文件中的參數,比如:
#! /usr/bin/perl
Print "password=$ROOT_PASS\n";
Print "repl_password=$REPL_PASS\n"
該參數默認為空。
備注:
 Local Scope――作用於每個服務器本地,在應用配置文件(app1.conf)中的[server_xxx]下配置;
 App Scope――作用於每一套MySQL Replication,在應用配置文件(app1.conf)中的[server_default]下配置;
 Global Scope――全局配置參數,適用於用一個Manager節點管理多套MySQL Replication的情況,在全局配置文件中(masterha_default.cnf)配置。 

了解了原理,我們再來坐下以下實驗,來真正試下MySQL高可用架構

二.MHA+Keepalived

在mastersql和backupsql中都安裝keepalived軟件(可參考http://blog.csdn.net/dbaxiaosa/article/details/22940483)

(1)安裝依賴包

(2)編譯安裝

# tar zxvf keepalived-1.1.19.tar.gz
# cd keepalived-1.1.19
# ./configure --sysconf=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.18-308.el5-x86_64/

(3)配置mastermysql上的keepalived

[root@node1 ~]# more /etc/keepalived/keepalived.conf
#writed by test 20140722

#global define
global_defs {
router_id mysqlmha
}

vrrp_script check_run {
script "/etc/keepalived/check_mysql.sh"
interval 1
}

############################################################
# internet
############################################################
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100 #master>slave slave90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}

track_script {
check_run
}
virtual_ipaddress {
192.168.3.33

}
}

(4)配置backupmysql上的keepalived

[root@node2 keepalived]# more /etc/keepalived/keepalived.conf
#writed by test 20140722

#global define
global_defs {
router_id mysqlmha
}

vrrp_script check_run {
script "/etc/keepalived/check_mysql.sh"
interval 1
}

############################################################
#
############################################################
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90 #master>slave slave90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}

track_script {
check_run
}
virtual_ipaddress {
192.168.3.33

}
}

(5)編輯腳本文件

大體意思是只要檢測到mysql服務停止keepalived服務也停止 ,因為keepalived是通過組播方式告訴本網段自己還活著 當mysql服務停止後keepalived還依然運行 這時就需要停止keepalived讓另一個主機獲得虛擬IP,可以在後台運行這個腳本 也可以在keepalived配置文件加入這個腳本。
mastermysql上

[root@node1 ~]# more /etc/keepalived/check_mysql.sh
#20140722
#!/bin/bash

MYSQL=/usr/bin/mysql
MYSQL_HOST=192.168.3.27
MYSQL_USER=root
MYSQL_PASSWORD=mysql
CHECK_TIME=3

#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
pkill keepalived
exit 1
fi
sleep 1
done

該腳本需要有執行權限,通過以下命令加上執行權限
[root@node2 keepalived]# chmod +x check_mysql.sh
[root@node2 keepalived]# ll
total 8
-rwxr-xr-x 1 root root 654 Jul 24 17:15 check_mysql.sh
-rw-r--r-- 1 root root 634 Jul 29 16:16 keepalived.conf

backupmysql上(腳本需要執行權限)

[root@node2 keepalived]# more check_mysql.sh
#20140722
#!/bin/bash

MYSQL=/usr/bin/mysql
MYSQL_HOST=192.168.3.28
MYSQL_USER=root
MYSQL_PASSWORD=mysql
CHECK_TIME=3

#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
pkill keepalived
exit 1
fi
sleep 1
done

(6)啟動keepalived,查看虛擬IP是否綁定成功

mastermysql

[root@node1 ~]# service keepalived start
查看keepalived狀態
[root@node1 ~]# service keepalived status
keepalived (pid 15712) is running...
查看是否綁定虛擬IP
[root@node1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:19:27:ad brd ff:ff:ff:ff:ff:ff
inet 192.168.3.27/24 brd 192.168.3.255 scope global eth0
inet 192.168.3.33/32 scope global eth0

backupMySQL
[root@node2 keepalived]# service keepalived status
keepalived (pid 13808) is running...
[root@node2 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:de:b3:a1 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.28/24 brd 192.168.3.255 scope global eth0

從上可以看到masteMySQL上虛擬IP綁定成功,backupMySQL上keepalived服務正常運行,但無虛擬IP(這屬於正常)

三.測試驗證

通過VIP 192.168.3.33登陸MySQL,正常使用

1.停止master上MySQL服務

[root@node1 ~]# service mysql stop
Shutting down MySQL... [ OK ]
[root@node1 ~]# service mysql status
MySQL is not running [FAILED]

MySQL服務停止後,查看keepalived服務是否運行
[root@node1 ~]# service keepalived status
keepalived dead but subsys locked
可見keepalived已經停止了

2.查看backupMySQL

[root@node2 keepalived]# service mysql status
MySQL running (13740) [ OK ]
[root@node2 keepalived]# service keepalived status
keepalived (pid 13808) is running...

mysql> show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.00 sec)

可見MySQL服務及keepalived都正常運行,切該庫處於可寫狀態

3.查看只讀庫slave狀態

mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.3.28
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000011
Read_Master_Log_Pos: 107
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000011
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: 107
Relay_Log_Space: 409
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: 28
1 row in set (0.00 sec)

可見master已由192.168.3.27切換為192.168.3.28

4.通過VIP訪問MySQL數據庫,我們繼續測試

刪除test庫下的student表
DROP TABLE student;
查看從庫,test庫下的student表已不存在,數據同步成功。

5.管理節點查看MHA運行情況

[root@mmm appl]# /usr/bin/masterha_check_status --conf=/etc/appl.cnf
appl is stopped(2:NOT_RUNNING).
注意:
a、切換之後需要刪除手工刪除/masterha/app1/app1.failover.complete,才能進行第二次測試
b、一旦發生切換管理進程將會退出,無法進行再次測試,需將故障數據庫加入到MHA環境中來
c、原主節點重新加入到MHA時只能設置為slave

手工刪除appl.failover.complete,啟動MHA
[root@mmm appl]# rm -f appl.failover.complete
重新啟動MHA
[root@mmm appl]# nohup /usr/bin/masterha_manager --conf=/etc/appl.cnf &
[1] 9659
[root@mmm appl]# nohup: appending output to `nohup.out'
查看MHA狀態
[root@mmm appl]# /usr/bin/masterha_check_status --conf=/etc/appl.cnf
appl (pid:9659) is running(0:PING_OK), master:192.168.3.28

6.主節點啟動mysql服務,keepalived服務,同時配置成新master(原backupMySQL)的從庫

[root@node1 ~]# service mysql start
Starting MySQL. [ OK ]
[root@node1 ~]# service keepalived start
Starting keepalived: [ OK ]
[root@node1 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 5.5.17-log MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

通過查詢只讀庫節點錯誤日志文件可以得到剛切換到新master的日志文件及位置
140729 17:03:29 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='192.168.3.27', master_port='3306', master_log_file=''
, master_log_pos='4'. New state master_host='192.168.3.28', master_port='3306', master_log_file='mysql-bin.000011', master_log_pos='107'.

mysql> change master to
-> master_host='192.168.3.28',
-> master_user='repl',
-> master_password='repl_pwd',
-> master_log_file='mysql-bin.000011',
-> master_log_pos=107;
Query OK, 0 rows affected (0.01 sec)

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

mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.3.28
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000011
Read_Master_Log_Pos: 216
Relay_Log_File: pid-relay-bin.000002
Relay_Log_Pos: 362
Relay_Master_Log_File: mysql-bin.000011
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: 216
Relay_Log_Space: 516
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: 28
1 row in set (0.00 sec)

7.停止新mastermysql(原backupMySQL)mysql服務

[root@node2 keepalived]# service mysql stop
Shutting down MySQL... [ OK ]
[root@node2 keepalived]# service keepalived status
keepalived dead but subsys locked

可見mysql服務停止後,keepalived服務也停止了

--查詢MasterMySQL
登陸mysql,test庫下的student表不存在,數據同步成功。

mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| deadlocks |
| test1 |
+----------------+
2 rows in set (0.00 sec)

mysql> show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.00 sec)

8.查看只讀庫slave狀態

mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.3.27
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 107
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000013
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: 107
Relay_Log_Space: 409
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: 27
1 row in set (0.00 sec)

可見master 已切換回MasterMySQL

9.啟動backupMySQL mysql服務、keepalived服務,配置成只讀庫

[root@node2 keepalived]# service mysql start
Starting MySQL.. [ OK ]
[root@node2 keepalived]# service keepalived start
Starting keepalived: [ OK ]
[root@node2 keepalived]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.5.17-log MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> change master to
-> master_host='192.168.3.27',
-> master_user='repl',
-> master_password='repl_pwd',
-> master_log_file='mysql-bin.000013',
-> master_log_pos=107;
Query OK, 0 rows affected (0.02 sec)

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

mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.3.27
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 107
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000013
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: 107
Relay_Log_Space: 409
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: 27
1 row in set (0.00 sec)

10.管理節點重新啟動MHA

[root@mmm appl]# rm appl.failover.complete
rm: remove regular empty file `appl.failover.complete'? yes
[root@mmm appl]# nohup /usr/bin/masterha_manager --conf=/etc/appl.cnf &
[1] 9890
[root@mmm appl]# nohup: appending output to `nohup.out'

[root@mmm appl]# /usr/bin/masterha_check_status --conf=/etc/appl.cnf
appl (pid:9890) is running(0:PING_OK), master:192.168.3.27

至此測試完畢,成功實現了MySQL高可用架構

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved