【MHA】--MHA 介紹(1)
MHA介紹
- master 宕機,自動從slave中,提升一個slave作為master,並且將其他slave指向該new master
MHA安裝
-
MHA Node 安裝
### 安裝依賴包 yum install perl-DBD-MySQL ### 安裝Node rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
-
MHA Mananger 安裝
### 安裝依賴文件 yum install perl-DBD-MySQL yum install perl-Config-Tiny yum install perl-Log-Dispatch yum install perl-Parallel-ForkManager ### 安裝 Node rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm ### 安裝Manager rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
MHA 配置
- manager 配置參數
[server default]
user=ms #mysql用戶
password=*** #密碼
ssh_user=*** #ssh賬號
port=3312 #mysql端口
repl_user=*** #複製的用戶
repl_password=*** #複製的密碼
manager_workdir=/home/mhaadmin/mha_3312 #manager 工作的目錄
manager_log=/home/mhaadmin/mha_3312/manager.log #manager 日誌位置
ping_interval=3 #檢測的間隔時間
master_ip_failover_script=/home/mhaadmin/mha_3312/master_ip_failover #切換調用的腳本
# shutdown_script= /script/masterha/power_manager # 強製關閉mysql的調用的腳本
# report_script= /script/masterha/send_report # 當failover發生以後可以發送一個報告
# master_ip_online_change_script= /script/masterha/master_ip_online_change #在線切換調用的腳本
[server1] #監控的實例一
hostname=mysql-ssd-128-test-001.m6 #主機名
master_binlog_dir=/data/mysql3312/log #mysql的binglog 位置
candidate_master=1 #slave 是否優先提升為master
[server2]
hostname=mysql-ssd-128-test-002.m6
master_binlog_dir=/data/mysql3312/log
candidate_master=1
[server3]
hostname=mysql-ssd-128-test-003.m6
master_binlog_dir=/data/mysql3312/log
no_master=1 #該server禁止提升為master
**MHA常用腳本
**
- master_ip_failover
常見的HA環境下,大多是情況會給master分配一個虛擬IP,如果master宕機,HA軟件像一個Pacemaker將虛擬IP轉移到備用的master上.
另外一種常見的方法就是創建一個全局目錄數據庫,包含所有應用和writer/reader ip地址.例如{app_master1,192.168.0.1},{app_master2,192.168.0.2}...,代替使用虛擬IP,這種情況,你需要在master宕機的時候更新目錄數據庫.
兩種方法都有好的或者不好的地方,MHA不強製要求使用哪一種,但是提供了master_ip_failover_script參數來完成此目的.換句話說,你需要寫一個腳本來調整應用服務連接到新的master,然後定義master_ip_failover_script的參數,下麵是一個實例:
master_ip_failover_script= /usr/local/sample/bin/master_ip_failover
你可以從(MHA Manager package)/samples/scripts/master_ip_failover找到一個簡單的腳本.這個腳本在manager的tarball和GitHUb branch中才包含.
MHA manager會調用master_ip_failover_script三次,第一次,在開始master monitor之前調用(目的是檢查腳本是否可用),第二次是在調用shutdown_script腳本前調用,第三次是在new master應用完所有的差異日誌以後,MHA manager會傳遞給腳本如下參數.(你不用在配置文件中指明這些參數)
- power_manager
你可能需要強製關閉master服務器,避免他再次提供服務,這對於避免腦裂很重要.下麵是一個實例:
shutdown_script= /usr/local/sample/bin/power_manager
你可以從(MHA Manager package)/samples/scripts/power_manager找到一個簡單的腳本.這個腳本在manager的tarball和GitHUb branch中才包含.
在調用shutdown_script腳本之前,MHA manager內部會通過ssh嚐試連接到mysql master,如果ssh可以連接(意思就是OS是存活的,但是Mysqld沒有運行),MHAmanager就會傳遞下麵的參數:
--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不能連接,那麼MHA會使用如下參數:
--command=stop (這個會通過fence設備關掉電源)
--host=(master's hostname)
--ip=(master's ip address)
這個腳本的大概功能如下,如果--command=stopssh被調用,腳本會使用killall -9 殺掉目標服務器上所有的mysqld_safe服務.如果--pid_file被設置,腳本嚐試kill指定的進程.如果腳本執行成功,那麼腳本會退出返回狀態10.如果退出狀態為10,MHA manager後麵會通過ssh連接到master,獲取需要的binary log.如果腳本通過ssh連接到服務器失敗,那麼就會傳遞--command=stop參數,這個參數嚐試關閉機器的電源,關閉電源依賴於H/W.HP(ILO),DELL(DRAC).如果power off成功,腳本會然會狀態0,其他情況會返回狀態1.當返回狀態是0的時候MHA manager 開始failover.如果返回狀態不是0或者10,那麼MHA manager會意外終止.這個參數默認是空,所以MHA manager不會調用任何腳本.
另外,MHA manager在啟動monitoring之前調用shutdown_script.這時候會傳遞下麵的參數.目的是檢測腳本是否可用,如果發現錯誤,你可以提前知道.
--command=status
--host=(master's hostname)
--ip=(master's ip address)
- send_report
你希望當failover發生以後可以發送一個報告(例如email),report_script可以達到這個目的,MHA manager傳遞下麵的參數.
--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)
默認這個參數是空的,所以MHA manager不調用任何腳本.
你可以從(MHA Manager package)/samples/scripts/send_report找到一個簡單的腳本.這個腳本在manager的tarball和GitHUb branch中才包含.
- master_ip_online_change
這是幾個簡單版本的master_ip_failover_script參數,但是master failover命令並不調用它.master online change命令會調用它.(masterha_master_switch --master_state=alive),傳遞以下參數:
Current master write freezing phase
--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)
--orig_master_ssh_user=(from 0.56, current master's ssh user)
--orig_master_is_new_slave=(from 0.56, notifying whether the orig master will be new slave or not)
New master granting write phase
--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)
--new_master_ssh_user=(from 0.56, new master's ssh user)
MHA在當前的master write freezing階段後執行FLUASH TABLES WITH READ LOCK, 在new mastergranting write階段你可以執行一些類似master_ip_failover_script的操作.比如創建一個有寫入權限的用戶,執行SET GLOBAL read_only=0,更新目錄數據庫等.如果你的腳本退出返回狀態不是1或者10,那麼MHA manager將會意外終止,停止master switch.
這個參數默認為空,所以MHA manager不做任何調用.
你可以從(MHA Manager package)/samples/scripts/master_ip_online_change找到一個簡單的腳本.這個腳本在manager的tarball和GitHUb branch中才包含.
MHA 注意事項
- manager 節點需要能夠SSH到Node節點,且Node節點之間需要SSH互通
- mysql 節點之間需要提供一個公共賬號,並且需要授予一定權限
- mysql replication的賬號,需要互相通用
- mysql manager 需要能夠讀取mysql節點的log目錄下的日誌
最後更新:2017-09-03 23:32:44