-
mha配置參數詳解:
參數名字 | 是否必須 | 參數作用域 | 默認值 | 示例 |
---|---|---|---|---|
hostname | Yes | Local Only | - | hostname=mysql_server1, hostname=192.168.0.1, etc |
ip | No | Local Only | gethostbyname($hostname) | ip=192.168.1.3 |
port | No | Local/App/Global | 3306 | port=3306 |
ssh_host | No | Local Only | same as hostname | ssh_host=mysql_server1, ssh_host=192.168.0.1, etc |
ssh_ip | No | Local Only | gethostbyname($ssh_host) | ssh_ip=192.168.1.3 |
ssh_port | No | Local/App/Global | 22 | ssh_port=22 |
ssh_connection_timeout | No | Local/App/Global | 5 | ssh_connection_timeout=20 |
ssh_options | No | Local/App/Global | ""(empty string) | ssh_options="-i /root/.ssh/id_dsa2" |
candidate_master | No | Local Only | 0 | candidate_master=1 |
no_master | No | Local Only | 0 | no_master=1 |
ignore_fail | No | Local Only | 0 | ignore_fail=1 |
skip_init_ssh_check | No | Local Only | 0 | skip_init_ssh_check=1 |
skip_reset_slave | No | Local/App/Global | 0 | skip_reset_slave=1 |
user | No | Local/App/Global | root | user=mysql_root |
password | No | Local/App/Global | ""(empty string) | password=rootpass |
repl_user | No | Local/App/Global | Master_User value from SHOW SLAVE STATUS | repl_user=repl |
repl_password | No | Local/App/Global |
|
repl_user=replpass |
disable_log_bin | No | Local/App/Global | 0 | disable_log_bin=1 |
master_pid_file | No | Local/App/Global | ""(empty string) | master_pid_file=/var/lib/mysql/master1.pid |
ssh_user | No | Local/App/Global | current OS user | ssh_user=root |
remote_workdir | No | Local/App/Global | /var/tmp | remote_workdir=/var/log/masterha/app1 |
master_binlog_dir | No | Local/App/Global | /var/lib/mysql | master_binlog_dir=/data/mysql1,/data/mysql2 |
log_level | No | App/Global | info | log_level=debug |
manager_workdir | No | App | /var/tmp | manager_workdir=/var/log/masterha |
client_bindir | No | App | - | client_bindir=/usr/mysql/bin |
client_libdir | No | App | - | client_libdir=/usr/lib/mysql |
manager_log | No | App | STDERR | manager_log=/var/log/masterha/app1.log |
check_repl_delay | No | App/Global | 1 | check_repl_delay=0 |
check_repl_filter | No | App/Global | 1 | check_repl_filter=0 |
latest_priority | No | App/Global | 1 | latest_priority=0 |
multi_tier_slave | No | App/Global | 0 | multi_tier_slave=1 |
ping_interval | No | App/Global | 3 | ping_interval=5 |
ping_type | No | App/Global | SELECT | ping_type=CONNECT |
secondary_check_script | No | App/Global | null | secondary_check_script= masterha_secondary_check -s remote_dc1 -s remote_dc2 |
master_ip_failover_script | No | App/Global | null | master_ip_failover_script=/usr/local/custom_script/master_ip_failover |
master_ip_online_change_script | No | App/Global | null | master_ip_online_change_script= /usr/local/custom_script/master_ip_online_change |
shutdown_script | No | App/Global | null | shutdown_script= /usr/local/custom_script/master_shutdown |
report_script | No | App/Global | null | report_script= /usr/local/custom_script/report |
init_conf_load_script | No | App/Global | null | report_script= /usr/local/custom_script/init_conf_loader |
作用域范圍解釋: Local Scope 表示可以設置在單個app配置文件中的[server_xx]塊標記下邊的參數;App Scope表示可以針對單個app內所有的master和slave設置,可以設置在單個app配置文件中的[server_default]塊標記下邊;Global Scope表示全局參數,可以設置在全局配置文件中
-
以下是配置文件中具體每個配置參數的解釋:
-
hostname:目標實例的主機名或者IP地址,這個參數是強制的,只能配置在app配置文件的[server_xxx]段落標記下
-
ip:目標實例的ip地址,默認從hostname獲取,MHA內部管理節點與數據節點之間的mysql和ssh通過這個IP連接,正常情況下你不需要配置這個參數,因為MHA會自動解析Hostname獲得
-
port:目標實例的端口,默認是3306,MHA使用mysql server的IP和port連接
-
ssh_host:從0.53版本開始支持,默認情況下和hostname參數相同,當你使用了VLAN隔離的時候,比如為了安全,把ssh網段和訪問數據庫實例的網段分開使用兩個不同的IP,那么就需要單獨配置這個參數
-
ssh_ip:從0.53版本開始支持,默認情況下與ssh_host相同
-
ssh_port:從0.53版本開始支持,目標數據庫的ssh端口,默認是22
-
ssh_connection_timeout:從0.54版本開始支持,默認是5秒,增加這個參數之前這個超時時間是寫死在代碼里的
-
ssh_options:從0.53版本開始支持,額外的ssh命令行選項
-
candidate_master:從不同的從庫服務器中,提升一個可靠的機器為新主庫,(比如:RAID 10比RAID0的從庫更可靠),可以通過在配置文件中對應的從庫服務器的配置段下添加candidate_master=1來提升這個從庫被提升為新主庫的優先級(這個從庫要開始binlog,以及沒有顯著的復制延遲,如果不滿足這兩個條件,也並不會在主庫掛掉的時候成為新主庫,所以,這個參數只是提升了優先級,並不是說指定了這個參數就一定會成為新主庫)
-
no_master:通過在目標服務器的配置段落設置no_master=1,它永遠也不會變為新主庫,用於配置在不想用於接管主庫故障的從庫上,如:只是一個binlog server,或者硬件配置比較差的從庫上,或者這個從庫只是一個遠程災備的從庫,但是,要注意,不能把所有的從庫都配置這個參數,這樣MHA檢測到沒有可用備主的時候,會中斷故障轉移操作
-
ignore_fail:默認情況下,MHA在做故障轉移的時候,會去檢測所有的server,如果發現有任何的從庫有問題(比如不能通過SSH檢測主機或者mysql的存活,或者說有SQL線程復制錯誤等)就不會進行故障轉移操作,但是,有時候可能需要在特定從庫有故障的情況下,仍然繼續進行故障轉移,就可以使用這個參數指定它。默認是0,需要設置時在對應服務器的配置段下添加ignore_fail=1
-
skip_init_ssh_check:監控程序啟動的時候,跳過SSH連接檢測
- skip_reset_slave:0.56開始支持,master故障轉移之后,跳過執行reset slave all語句
- user:目標mysql實例的管理帳號,盡量是root用戶,因為運行所有的管理命令(如:stop slave,change master,reset slave)需要使用,默認是root
-
password:user參數指定的用戶的密碼,默認為空
-
repl_user:在所有slave上執行change master的復制用戶名,這個用戶最好是在主庫上擁有replication slave權限
-
repl_password:repl_user參數指定的用戶的密碼,默認情況下,是當前復制帳號的密碼,如果你運行了online master switch腳本且使用了–orig_master_is_new_slave做在線切換,當前主庫作為了從庫加入新主庫,此時,如果你沒有設置repl_password來指定復制帳號的密碼,當前主庫作為從庫加入新主庫的時候會在change master的時候失敗,因為默認情況下這個密碼是空的,MHA做切換的時候,其他所有作為從庫加入新主庫時,都需要使用這個密碼
-
disable_log_bin:如果設置這個參數,當應用差異日志到從庫時,slave不生成binlog寫入,內部通過mysqlbinlog命令的–disable-log-bin選項實現
-
master_pid_file:設置master的pid,在運行多實例的環境下,你可能需要用到這個參數來指定master的pid,參考shutdown_script參數詳解
-
ssh_user:訪問MHA manger和MHA mysql節點的OS系統帳號,需要使用它來遠程執行各種各樣的管理mysql節點的命令(從manager到mysql),從latest slave拷貝差異日志到其他從庫上(從mysql到mysql),該用戶必須要能夠沒有任何交互地連接到服務器,通常使用ssh key認證,默認情況下,這個用戶是manager所在的OS系統用戶。
-
remote_workdir:每一個MHA node(指的是mysql server節點)生成日志文件的工作路徑,這個路徑是絕對路徑,如果該路徑目錄不存在,則會自動創建,如果沒有權限訪問這個路徑,那么MHA將終止后續過程,另外,你需要關心一下這個路徑下的文件系統是否有足夠的磁盤空間,默認值是/var/tmp
-
master_binlog_dir:在master上生成binlog的絕對路徑,這個參數用在master掛了,但是ssh還可達的時候,從主庫的這個路徑下讀取和復制必須的binlog events,這個參數是必須的,因為master的mysqld掛掉之后,沒有辦法自動識別master的binlog存放目錄。默認情況下,master_binlog_dir的值是/var/lib/mysql,/var/log/mysql,/var/lib/mysql目錄是大多數mysql分支默認的binlog輸出目錄,而 /var/log/mysql是ubuntu包的默認binlog輸出目錄,這個參數可以設置多個值,用逗號隔開
-
log_level:manager記錄日志的等級,默認以及大多數場景下都是info級別,可以設置的值為debug/info/warning/error
-
manager_workdir:mha manager生成的相關狀態文件的絕對路徑,如果沒有設置,則默認使用/var/tmp
-
client_bindir: 如果mysql命令工具是安裝在非標准路徑下,那么使用這個參數指定絕對路徑
-
client_libdir:如果mysql的庫文件是安裝在非標准路徑下,那么使用這個參數指定據對路徑
-
manager_log:mha manager生成的日志據對路徑,如果沒有設置,mha manager將打印在標准輸出,標准錯誤輸出上,如:當mha manager執行故障轉移的時候,這些信息就會打印
-
check_repl_delay:默認情況下,如果從庫落后主庫100M的relay logs,MHA不會選擇這個從庫作為新主庫,因為它會增加恢復的時間,設置這個參數為0,MHA在選擇新主庫的時候,則忽略復制延遲,這個選項用在你使用candidate_master=1 明確指定需要哪個從庫作為新主庫的時候使用。
-
check_repl_filter:默認情況下,如果master和slave相互之間有任何不同的binlog復制過濾規則,MHA將打印錯誤日志並拒絕啟動監控程序或者拒絕故障轉移操作,這是為了避免意外出現類似Table not exists這樣的錯誤,如果你100%確定不同的復制過濾規則不會出現恢復問題,那么就設置check_repl_filter = 0,此時MHA在應用差異日志的時候就不會去檢測復制過濾規則,但是你可能會碰到Table not exists這樣的錯誤,使用這個參數要非常小心
-
latest_priority:默認情況下,latest slave(收到最新的binlog的slave),優先作為新主庫,如果你想控制這個優先級順序,可以通過 latest_priority=0,此時,就會按照配置文件中配置的順序來選擇新主庫(如 host2->host3->host4)。
-
multi_tier_slave:從0.52版本開始,支持多個主庫的復制架構,默認情況下,在配置文件中不支持三個或更多層級的復制架構,例如:host2從host1復制,host3從host2復制,默認情況下,是不允許host1,2,3同時可寫的。因為這個是一個三層復制,MHA manager會報錯並停止,設置這個參數之后,MHA manager不會中斷三層復制架構的監控,只是忽略了第三層,即host3,如果host1掛了,host2將接管host1,被選擇為新主庫,host3繼續從host3復制。
-
ping_interval:這個參數表示mha manager多久ping(執行select ping sql語句)一次master,連續三個丟失ping連接,mha master就判定mater死了,因此,通過4次ping間隔的最大時間的機制來發現故障,默認是3,表示間隔是3秒
-
ping_type:從0.53版本開始支持,默認情況下,mha master基於一個到master的已經存在的連接執行select 1(ping_type=select)語句來檢查master的可用性,但是在有些場景下,最好是每次通過新建/斷開連接的方式來檢測,因為這能夠更嚴格以及更快速地發現TCP連接級別的故障,把ping_type設置為connect就可以實現。從0.56開始新增了ping_type=INSERT類型。
-
secondary_check_script:通常,推薦通過兩個或者更多的網絡路徑來檢測master的可用性,默認情況下,MHA只是通過單個網絡路徑來檢測,即從mha master到master的路線,但是不推薦這么做,mha可以通過secondary_check_script 參數來調用一個外部的腳本來實現兩個或更多個網絡路徑來檢測master的可用性,配置示例如下:
secondary_check_script = masterha_secondary_check -s remote_host1 -s remote_host2 masterha_secondary_check 腳本包含在mha manager的安裝包里,這個腳本適合大多數的場景,但是你可以調用任何你自定義的腳本。 在上述的示例中,mha manager檢測master的存活的網絡路徑是:mha manager–>remote_host1–>master_host和mha manager–>remote_host2–>master_host,如果兩條線路中,mha master到遠程主機的連接是通的,但是遠程主機到master不通,這個腳本返回狀態0,那么mha就判定master死了。 將開始執行故障轉移。如果mha manager到遠程主機都不通,那么這個腳本返回狀態2,mha manager就猜測網絡可能發生了問題了,拒絕執行故障轉移操作。如果兩條線路從頭到位都走通了,那么這個腳本返回狀態3,此時mha master知道主庫是或者的,就不會進行故障轉移操作。 通常來說,remote_host1和remote_host2需要處於本地的兩個不同的網段 mha調用secondary_check_script 腳本自動地傳遞如下參數(不需要你在配置文件中的secondary_check_script 參數中指定這些參數),如果你需要更多的功能,你可以自定義這個腳本: –user:遠程主機ssh用戶名,如果指定了這個,那么ssh_user參數就會被忽略 –master_host:指定master的主機名(實例) –master_ip:指定master的IP(實例) –master_port:指定master的端口號(實例) PS:運行這個腳本需要依賴perl的 IO::Socket::INET包,這個包包含在perl的5.6.0里,masterha_secondary_check 腳本仍然通過免密鑰的ssh來連接遠程服務器,這個腳本嘗試從遠程服務器建立到master的TCP連接,這個意思是my.cnf中的max_connections 參數對這個么有 影響,如果這個TCP連接成功了,在mysql的Aborted_connects 變量中會增加1 -
master_ip_failover_script:通常在MHA環境下,通常需要分配一個VIP供master用於對外提供讀寫服務,如果master掛了,HA軟件指引備用服務器接管VIP,另外一個通用的方法,是在數據庫中創建一個全局的應用程序名稱與讀寫IP地址之間的全局類目映射( {app1_master1, 192.168.0.1}, {app_master2, 192.168.0.2}, …)來代替VIP地址的使用,在這種情況下,如果你的master掛了,你需要更新這個數據庫中的全局類目映射。第二種方法這里個人覺得跟智能DNS解析類似。
兩種方法各有優缺點,MHA不強制使用哪一種方法,但是允許用戶使用任何IP地址做故障轉移的方案,master_ip_failover_script 參數可以用於實現這個目的,換句話說,你需要自己編寫一個腳本來透明地把應用程序連接到新主庫上。需要在配置文件中定義這個參數,示例如下: master_ip_failover_script= /usr/local/sample/bin/master_ip_failover mha manager安裝包中(tar包和githup分支上才有,rpm包沒有)的samples/scripts/master_ip_failover路徑下有一個簡單的腳本 mha manager會調用master_ip_failover_script 這個參數指定的腳本三次,第一次是在進入主庫監控之前(為了檢測腳本的有效性),第二次是將要調用shutdown_script參數的腳本之前,第三次是新主庫應用完成了差異relay log之后,mha manager調用這個腳本會用到如下參數(注意:你不需要在配置文件中這個參數上單獨設置這些) 檢測階段參數: –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) 關閉當前master的階段參數(注意,到調用shutdown_script的時候,主庫已經被判定為死了): –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) 新的master激活階段參數: –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階段就不需要做任何事情,只要在shutdown_script腳本關閉機器的電源之后,在新的master的激活階段,在新的master上分配這個VIP即可,如果你使用的是一個全局類目映射的方案,你可能需要在shutdown死掉的master階段之后,刪除或者更新對應的dead master的記錄。在新的master的激活階段,你可以新增或者更新對應的新的master的記錄,然后,你可以做一些事情(如:在新主庫上執行set global read_only=0;以及創建數據庫用戶的寫權限),以便應用程序就可以在新的主庫上寫入數據了 mha manager會檢測腳本執行退出的代號,如果是0或者10,mha manager則繼續操作,如果返回的是0和10以外的代號,mha manager停止並中斷故障轉移,默認情況下,這個參數為空,所以,默認情況下mha不會調用這個腳本做任何事情。 -
master_ip_online_change_script:這是一個與master_ip_failover_script 參數很接近的參數,但是這個參數不使用故障轉移命令,而是master的在線change命令(masterha_master_switch –master_state=alive),使用如下參數(注意:你不需要在配置文件中這個參數上單獨設置這些):
凍結當前主庫寫操作階段的參數: –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) 允許新的主庫寫階段的參數: –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 manager在當前主庫上執行FLUSH TABLES WITH READ LOCK,你可以寫任何的邏輯來優雅地實現主庫的切換(參考http://www.slideshare.net/matsunobu/automated-master-failover/44),在新的master允許寫的階段,你可以做和master_ip_failover_script腳本的第三階段幾乎一樣的事情,例如:在新的主庫上創建寫權限用戶和執行set global read_only=0語句,或者更新全局類目映射記錄,如果這個腳本執行返回狀態嗎是0或者10以外的值,mha manager將終止並停止master在線切換操作。默認這個參數為空,mha不會調用這個參數做任何事情,在mha manager的tar包和githup分支下的samples/scripts/master_ip_online_change路徑下有一個簡單的腳本。 -
shutdown_script:你可能想要強制關閉master節點來避免master節點重新啟動服務,這對於避免腦裂來說是很重要的,示例:
shutdown_script= /usr/local/sample/bin/power_manager 在mha manager的tar包和github的分支的samples/scripts/power_manager路徑下有一個簡單的腳本,在調用這個腳本之前,mha manager內部會通過ssh去檢測master是否可達,如果ssh可達(主機OS活着但是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不可達,那么mha manager就會使用如下參數: –command=stop –host=(master's hostname) –ip=(master's ip address) 這個腳本工作流程如下: 如果通過–command=stopssh參數,這個腳本通過ssh過去master上kill -9殺掉mysqld和mysqld_safe進程,如果同時也通過–pid_file參數,這個腳本通過ssh過去主庫上只kill -9殺掉指定的進程號,不會殺掉所有的進程,這個對在master上運行多實例的時候有幫助,如果通過ssh停止成功,這個腳本退出狀態是10,如果退出狀態是10,mha manager隨后就通過ssh連接到master保存必要的binlog,如果這個腳本通過ssh連接master失敗,或者mha manager是使用的參數 –command=stop,這個腳本就會嘗試關閉機器的電源,關閉機器的命令依賴硬件(For HP(iLO), 通常是ipmitool or SSL,For Dell(DRAC), 通常是dracadm),如果關閉電源成功,這個腳本的退出狀態是0,否則退出的狀態是1,如果這個腳本的退出狀態是0,則mha manager開始執行故障轉移過程,如果這個狀態是0和10以外的其他狀態,則mha終止故障轉移,默認這個參數為空,所以mha不會調用這個參數做任何事情。 另外,mha manager開始監控的時候會調用shutdown_script 參數,在這次調用會使用以下參數,在這里可以檢測腳本的設置,控制電源需要高度依賴硬件,所以建議要檢測電源的狀態,如果發現什么問題,你可以在啟動監控程序之前去解決。 –command=status –host=(master's hostname) –ip=(master's ip address) -
report_script:在故障轉移完成或者說因為錯誤而終止的時候,你可能希望發送一個報告出來,這就是使用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的tar包和github分支的samples/scripts/send_report路徑下有一個簡單的腳本。 -
init_conf_load_script:這個腳本在你不想在配置文件中設置純文本的信息的時候使用(比如:password和repl_password),從這個腳本返回name=value的鍵值對,它可以作為全局配置文件參數,示例腳本內容如下:
-
#!/usr/bin/perl
print "password=$ROOT_PASS\n";
print "repl_password=$REPL_PASS\n";
這個參數默認為空,所以mha manager不會調用這個參數做任何事情