MySQL高可用組件MHA參數詳解
MHA目前在 MySQL高可用方面是一個相對成熟的解決方案,它由日本人開發,是一套優秀的作為 MySQL高可用性環境下故障切換和主從提升的高可用軟件。MHA提供了一系列配置參數,深入理解每個參數的具體含義,對優化配置、合理使用MHA非常重要,很多高可用性也都是通過合理配置一些參數而實現的。下面我們來詳細介紹一些在使用MHA過程中可能用到的一些參數~
Local :指每一個配置塊內部。 Local功能的參數需要放置在[server_xxx] 塊下面
App :參數作用於master/slave, 這些參數需要配置在[server_default]塊的下面
Global :作用於master/slave, Global級別的參數用於管理多組master/slave結構,可以統一化管理一些參數。
hostname:配置MySQL服務器的機器名或是IP地址,這個配置項是必須的,而且只能配置在[server_xxx]這個塊下面。
如:參數名 是否必須 作用域 默認值 例子及說明
hostname Yes Local Only – hostname=mysql_server1, hostname=192.168.0.1, etc
ip:MySQL服務器的ip地址。 默認從gethostname($hostname)中獲得。 默認不用配置這個參數,MHA可以通過hostname自動獲取,MHA通過IP地址連接MySQL服務器及SSH連接。
如:
參數名 是否必須 作用域 默認值 例子及說明
ip No Local Only 通過gethostbyname($hostname)獲得 ip=192.168.1.3
port:MySQL運行的端口號。 默認是3306. MHA使用IP和端口號連接MySQL
如:
參數名 是否必須 作用域 默認值 例子及說明
port No Local/App/Glbal 3306 port=3306
ssh_host:MHA要ssh上MySQL目標服務器使用hostname或是ip地址。這個參數主要用於在使用多個VLAN的環境中。為了安全原因ssh默認不允許。默認這個參數和hostname相同。
如:
參數名 是否必須 作用域 默認值 例子及說明
ssh_host No Local Only 和hostname相同 ssh_host=mysql_server1, ssh_host=192.168.0.1, etc
ssh_ip:(從MHA 0.53後開始支持) 和ssh_host作用相同。 默認是gethostname($ssh_host)獲得。
如:
參數名 是否必須 作用域 默認值 例子及說明
ssh_ip No Local Only gethostbyname($ssh_host) ssh_ip=192.168.1.3
ssh_port:(從MHA 0.53後開始支持) SSH使用的端口號,默認是22.
如:
參數名 是否必須 作用域 默認值 例子及說明
ssh_port No Local/App/Global 22 ssh_port=22
ssh_connection_timeout:(從MHA 0.54後支持)默認是5秒。在沒添加這個參數之前ssh超時時間是寫死的。
如:
參數名 是否必須 作用域 默認值 例子及說明
ssh_connection_timeout No Local/App/Global 5 ssh_connect_timeout=5
ssh_options:(從MHA 0.53後支持)添加ssh命令行的支持參數,例如加上特別文件名的key的支持等。
如:
參數名 是否必須 作用域 默認值 例子及說明
ssh_options No Local/App/Global “” 空的 ssh_options=”-i /root/.ssh/id_dsa2″
candidate_master:你可能對於同一組slave中有著不同的規劃,有的其望在Master故障時,提升為新的Master(如: Raid1的slave比Raid0的slave更適合做Master)
這個參數的作用是當設計candidate_master = 1時,這個服務器有較高的優先級提升為新的master(還要具備: 開啟binlog, 復制沒有延遲)。 所以當設置了candidate_master = 1的機器在master故障時必然成為新的master. 但這是很有用的設置優先級的一個參數。
如果設置了多台機器的caddidate_master = 1 , 優先策略依賴於塊名字([server_xxx]). [server_1] 優銜權高於[server_2].
如:
參數名 是否必須 作用域 默認值 例子及說明
candidate_master No Local Only 0 candidate_mast=1
no_master
當設置了no_master = 1的服務器,這個服務器永遠不會提升為新的master. 這個參數據對於永遠不期望成為master的機器很有用。 如: 你可能需要在使用raid0的機器上設置no_master = 1 或是你希望在遠程的idc裡運行一個slave. 注意: 當沒有可以成為新master的機器是MHA就直接退出來了同時停止監控和master故障切換。
如:
參數名 是否必須 作用域 默認值 例子及說明
no_master No Local Only 0 no_master=1
ignore_fail:在默認情況下,MHA manager不會在slave存在故障的情況下(已經不能通過SSH/MySQL進行連接,或是SQL Thread已經停止出錯,其它原因)的情況下進行Master的故障切換(當不存在slave時MHA manager也會退出)。 但有些情況下你期望在slave存在問題的情況下,也進行故障切換。 所以當設置了ignore_fail = 1時,MHA會在所有的機器有問題的時間也會進行故障切換。 默認是0.
如:
參數名 是否必須 作用域 默認值 例子及說明
ignore_fail No Local Only 0 ignore_fail=1
skip_init_ssh_check:在MHA manager啟動時跳過ssh檢查。
如:
參數名 是否必須 作用域 默認值 例子及說明
skip_init_ssh_check No Local Only 0 skip_init_ssh_check=1
skip_reset_slave::(從MHA 0.56開始支持) Master故障切換後新的master上執行RESET SLAVE(ALL).
如:
參數名 是否必須 作用域 默認值 例子及說明
skip_reset_slave No Local/App/Global 0 skip_reset_slave=1
user:用於管理MySQL的用戶名。這個最好使用root用戶,因為它需要執行:stop slave; change master to , reset slave. 默認: root
如:
參數名 是否必須 作用域 默認值 例子及說明
user No Local/App/Global root user=mysql_root
password:MySQL的管理用戶的密碼。 默認是空的
如:
參數名 是否必須 作用域 默認值 例子及說明
password No Local/App/Global 空的 password=rootpass
repl_user:MySQL用於復制的用戶,也是用於生成CHANGE MASTER TO 每個slave使用的用戶。 這個用戶必須有REPLICATION SLAVE權限在新的Master上。默認情況下 repl_user會在將來成為master的機器上運行show slave status獲取到。
如:
參數名 是否必須 作用域 默認值 例子及說明
repl_user No Local/App/Global 從show slave status repl_user=repl
repl_password:MySQL中repl_user用戶的密碼。 默認是當前復制用的密碼。 當你使用online_master_switch時,當使用–orig_master_is_new_slave(原來的Master成為新Master的一個slave)時,如果沒有repl_password 開啟同步就會失敗了。因為當前master上用於復制的用戶名和密碼都是空的(MHA在原來的Master上執行change master to 時沒有帶復制的密碼,雖然其它slave上設置了復制的密碼)
如:
參數名 是否必須 作用域 默認值 例子及說明
repl_password No Local/App/Global 當前復制用的密碼 repl_password=replpas
disable_log_bin:當設置了這個參數,在slave應用差異的relay log時不會產生二進制日志。內部實現通過mysqlbinlog的disable-log-bin實現。
如:
參數名 是否必須 作用域 默認值 例子及說明
disable_log_bin No Local/App/Global 0 disable_log_bin=1
master_pid_file:指定MySQL的pid文件。這個參數在一台服務器上運行多個MySQL服務進程時非常有用。
如:
參數名 是否必須 作用域 默認值 例子及說明
master_pid_file No Local/App/Global – master_pid_file=/var/lib/mysql/master1.pid
ssh_user:MHA Mananger, MHA node系統上的用戶。 這個帳號需要在遠程機器上有執行權限(Manager->MySQL),在slave成員之間復制差異的relay-log(MySQL->MySQL)
這個用戶必須有讀取MySQL的binary/relay日志和relay_log.info的權限,還需要對遠程MySQL上remote_workdir目錄的寫權限。
這個用戶還必須可以直接ssh到遠程機順上, 推薦使用ssh pbulic key . 一般使用的ssh_user也是運行manager那個那個用戶。
如:
參數名 是否必須 作用域 默認值 例子及說明
ssh_user No Local/App/Global 當前使用的系統用戶 ssh_user=root
remote_workdir:MHA node上工作目錄的全路徑名。如果不存在,MHA node會自動創建,如果不允許創建,MHA Node自動異常退出。 需要注意MHA manager 或是MHA node上需要檢查空間是否可用,所以需要注意檢查這個。 一般默認, remote_workdir是的”/var/tmp”
如:
參數名 是否必須 作用域 默認值 例子及說明
remote_workdir No Local/App/Global /var/tmp remote_workdir=/var/log/masterha/app1
master_binlog_dir:master上用於存儲binary日志的全路徑。這個參數用於當master上mysql死掉後,通過ssh連到mysql服務器上,找到需要binary日志事件。這個參數可以幫助用於無法找到master進程死掉後binary日志存儲位置。
一般: master_binlog_dir是”/var/lib/mysql/, /var/log/mysql”. “/var/lib/mysql/”是大多數系統發行版本的存放位置,”/var/log/mysql”是ubuntu發行版本的存放位置。 你也可以設置多個存放位置用逗號隔開。
如:
參數名 是否必須 作用域 默認值 例子及說明
master_binlog_dir No Local/App/Gobal /var/lib/mysql master_binlog_dir=/data/mysql1,/data/mysql2
log_level:設置MHA manager記錄LOG的級別。 默認是info級別而且大多數情況也是比較適合。 同樣可以設置為: debug/info/warning/error.
如:
參數名 是否必須 作用域 默認值 例子及說明
log_level No App/Global info log_level=debug
manager_workdir:用於指定mha manager產生相關狀態文件全路徑。 如果沒設置 默認是/var/tmp
如:
參數名 是否必須 作用域 默認值 例子及說明
manager_workdir No App /var/tmp manager_workdir=/var/log/masterha
manager_log:指定mha manager的絕對路徑的文件名日志文件。 如果沒設置MHA Manager將打印到STDOUT/STDERR。 當手工執行故障切換(交互模式切換),MHA Manager會忽略manager_log設置直接將日志輸出到STDOUT/STDERR.
如:
參數名 是否必須 作用域 默認值 例子及說明
manager_log No App STDERR manager_log=/var/log/masterha/app1.log
check_repl_delay:在默認情況下,當一個slave同步延遲超過100M relay log(需要應用超過100M relay log), MHA在做故障切換時不會選擇這個slave做為新的master,因為恢復需要經過很長時間.當設置了check_repl_delay = 0, MHA將忽略被選擇的slave上的同步延遲。 這個選項在設置了candidate_master = 1特聲明的期望這台機器成為master的情況下特別有用。
如:
參數名 是否必須 作用域 默認值 例子及說明
check_repl_delay No App/Golbal 1 check_repl_delay=0
check_repl_filter:在默認下情況,當master和slave設置了不同了binary log/replication 過濾規則時,MHA直接報錯不會進行監控和故障切換。 這些將會導致出現一些異想不到的錯誤”Table not exists”。如果你100%確認不同的過濾規則不會導致恢復中的錯誤,設置check_repl_filter=0。 需要注意: 當使用了check_repl_filter = 0時,MHA不會檢查過濾規則在應用差異的relay日志,所以有可能會出現”Table not exists”的錯誤。當你設置了這個參數請小心處理。
如:
參數名 是否必須 作用域 默認值 例子及說明
check_repl_filter No App/Global 1 check_repl_filter=0
latest_priority:在默認情況下,和Master最接近的slave(一個slave從Master上獲得了最一個binlog事件)是最有優先權成為新的master。 如果你想控制一下切換的策略(如: 先選擇host2,如果不行,選host3;host3不行,選host4…) 那麼設置latest_priority = 0 就可以了。
如:
參數名 是否必須 作用域 默認值 例子及說明
latest_priority No App/Global 1 latest_priority=0
multi_tier_slave:
從MHA 0.52開始, 多層復制可以支持了。在默認情況下,不支持三層或是更多層的復制配置。 如果: host2從host1上復制,host3從host2上復制。 在默認配置的情況下不支持寫host{1,2,3},因為這是一個三層的復制,MHA Manager會停止報錯。 當設置了multi_tier_slave, MHA Manager就不會在三層復制報錯停止。 但是會忽略第三層的機器。也就是如果host1掛了,host2將會成為新的master,host3還是從host2上進行復制。
這個參數在MHA Manager 0.52後的版開始支持。
如:
參數名 是否必須 作用域 默認值 例子及說明
muli_tier_slave No App/Global 0 multi_tier_slave=1
ping_interval:這個參數設置MHA Manager多長時間去ping一下master(執行一些SQL語句). 當失去和master三次償試,MHA Manager會認為MySQL Master死掉了。也就是說,最大的故障切換時間是4次ping_interval的時間,默認是3秒。
如果MHA Manager在和MySQL創建連接時都收到多連接錯誤或是認證錯誤,這個就不做重試就會認為master已經掛掉。
如:
參數名 是否必須 作用域 默認值 例子及說明
ping_interval No App/Global 3 ping_interval=5
ping_type:(從MHA 0.53後開始支持) 在默認情況下, MHA manager和MySQL創建一個連接執行”select 1″(ping_type=select)用於檢查master是否健康。 但有一些情況: 每次檢測都連接/然後斷開會比較好一點,這樣對於tcp方面的錯誤感知更快一點。設置ping_type=CONNECT 就行了。從MHA 0.56後pint_type=INSERT也被添加。
如:
參數名 是否必須 作用域 默認值 例子及說明
ping_type No App/Global SELECT ping_type=CONNECT
secondary_check_script:一般來講, 非常推薦使用更多網絡上機器是不同路由策略上的機器來檢查MySQL Master是否存活。 默認情況下,只有MHA Manager通過一個路由來檢查Master是否存活。這個也是不推薦的。MHA可以通過外部secondary_check_script配置的腳本來做到從多個路由策略下進行檢查。
secondary_check_script = masterha_secondary_check -s remote_host1 -s remote_host2
secondary_check_script包含在MHA Manager發行包中。 MHA中內置的secondary_check_script在大多數情況下工作良好,但並不是任何地都可以使用這個腳本。
在上面的例子中, MHA Manager通過Manager->(A)->remote_host1->(B)->master_host 和Manager->(A)-remote_host2->(B)->master_host來檢查MySQL master是否存活。如果在連接過程中通過A可以都成功,通過B是都失敗,secondary_\check_\script返回0,而且認為master已經死掉,進行故障切換。如果通過A成功,但返回代碼為: 2,則MHA manager有會認為是網絡問題,則不會進行故障切換。如果A成功,B也成功,masterha_secondary_check 退出返回:3 則MHA Manager就為認為MySQL Master為存活狀態, 則不會進行故障切換。
一般來講, remote_host1和remote_host2是和MHA Manager及MySQL Server位於不同的網段中。
MHA會調用secondary_check_script聲明的腳本並自動帶上一些參數。 masterha_secondary_check在很多場景都是適用的,但是你也可以自已實現這個程序帶有更多的功能。
–user=(在遠程機器上使用的SSH用戶名。 ssh_user的值將被使用)
–master_host = (master的hostname)
–master_ip = (master的ip地址)
–master_port = ( master的端口號)
masterha_secondary_check:腳本依賴於的Perl的IO::Socket::INET(Perl 5.6.0中是默認支持包含這個模塊)。 masterha_secondary_check需要通過ssh連接到遠程的機器上,所以需要manager到遠程機器上建立public key信任。另外masterha_secondary_check是通過和Master建立TCP的連接測試Master是否存活,所以mysql設置的max_connections不起作用。 但每次TCP連接成功後,MySQL的Aborted_connects 值都會加1。
如:
參數名 是否必須 作用域 默認值 例子及說明
secondary_check_script No App/Global null secondary_check_script= masterha_secondary_check -s remote_dc1 -s remote_dc2
master_ip_failover_script:
如:
參數名 是否必須 作用域 默認值 例子及說明
master_ip_failover_script No App/Global null master_ip_failover_script=/usr/local/custom_script/master_ip_failover
master_ip_online_changes_script:這個參數有點類似於master_ip_failover_script,但這個參數不用於master 故障轉意,只使用到master在線的切換。
凍結Master寫的過程:
–command=stop or stopssh
–orig_master_host = (當前master的主機名)
–orig_master_ip = (當前master的ip地址)
–orig_master_port = (當前master的port端口號)
–orig_master_user = (當前master的用戶)
–orig_master_password = (當前master的用戶名)
–orig_master_ssh_user = (從0.56支持,當前master的ssh的用戶名)
–orig_master_is_new_slave = (從 0.56 ,是否把原Master更改為新的slave)
新的Master接受寫的過程:
–command=start
–orig_master_host = ( 原master的機器名 )
–orig_master_ip = ( 原master的ip )
–orig_master_port = ( 原master的端口號 )
–new_master_host = (新master的機器名)
–new_master_ip = (新master的ip)
–new_master_port = (新master的端口號)
–new_master_user = (新master上的用戶名)
–new_master_password = (新master上的用戶名及密碼)
–new_master_ssh_user = (從0.56支持, 新master上的ssh用戶)
MHA在凍結寫的切換過程中會在Master上執行FlUSH TABLES WITH READ LOCK,在這個優雅的切換過程不會有任何寫入的。在新的Master在開始授權寫的過程中,你可以做和master_ip_failover_script一樣的事情。 例如: 創建用戶及權限, 執行set global read_only=0, 更新數據庫路由表竺。 如果腳本執行退出碼不是0 或是10, MHA Manager異常退出並發不會繼續進行master切換。
默認這個參數是空的,所以MHA Manager在默認情況下什麼也不做。
可以在(MHA Manager package)/samples/scripts/master_ip_online_change。裡找到例子腳本。例子腳本包含於MHA Manager源文件或是GitHub的分支中。
如:
參數名 是否必須 作用域 默認值 例子及說明
master_ip_online_change_script No App/Global null master_ip_online_change_script= /usr/local/custom_script/master_ip_online_change
shutdown_script:
如:
參數名 是否必須 作用域 默認值 例子及說明
shutdown_script No App/Global null shutdown_script= /usr/local/custom_script/master_shutdown
report_script:
在Master故障完畢後,也許想發一個送一個報告(如email)報告一下切換完畢或是發生的錯誤。report_script可以完成這個工作。MHA Manager可以通過以下參數使用:
–orig_master_host = (死掉master機器名)
–new_master_host = (新的master機器名)
–new_slave_hosts = (新的slave機器名列表,用逗號隔開)
–subject = (郵件名)
–body = (正文)
默認這些參數是空的。 所以默認MHA Manager什麼事情也不做。
可以在(MHA Manager package)/samples/scripts/send_report裡找到例子腳本。例子腳本包含於MHA Manager源文件或是GitHub的分支中。
如:
參數名 是否必須 作用域 默認值 例子及說明
report_script No App/Global null report_script= /usr/local/custom_script/report
init_conf_load_script:這個參數用於不想設置明文在配置文件中(如:密碼相關)。 只用返回”name=value”這樣的值。 這個可以用來復蓋global配置中的一些值。一個例子腳本如下。
#!/usr/bin/perl
print “password=$ROOT_PASS\n”;
print “repl_password=$REPL_PASS\n”;
如:
參數名 是否必須 作用域 默認值 例子及說明
init_conf_load_script No App/Global null report_script= /usr/local/custom_script/init_conf_loader