天天看點

修改MySQL高可用子產品接收自定義VIP參數

   但凡是MySQL DBA肯定都聽說過MHA個高可用方案,而且很多公司都是通過對MHA做二次開發來實作MySQL高可用的。如果MHA不結合VIP的話,每次主庫切換都需要程式修改連資料庫的配置,這樣比較麻煩。而采用MHA+VIP的方式時可以在主庫切換的過程中讓VIP漂移到新主庫,省去了改資料庫配置這一過程。

    公司以前是每一組主從複制叢集都配置一個manager結點,然後将vip和網絡接口等資訊都寫死在master_ip_failover和master_ip_online_change腳本中。當主從叢集數量太多的情況下要維護的manager結點很多,管理起來很麻煩。

如何實作用一個Manager結點管理多個支援VIP的mysql主從叢集呢?有兩種實作方式:

1,每一組主從複制叢集維護兩個切換腳本,将VIP和網絡接口資訊寫死在腳本裡。

2,修改MHA的相關子產品,使其能識别我們自定義的參數,我們隻需要在每一組主從複制叢集的配置檔案中給參數傳值。

    很明顯,第1種方式太low了,需要維護大量的切換腳本。那我們需要修改哪些子產品呢?

    看一下masterha_check_repl這段腳本,可以看到檢測主從複制狀态的時候會調用MasterMonitor子產品。

<code>$exit_code = MHA::MasterMonitor::main( </code><code>"--interactive=0"</code><code>, </code><code>"--check_only"</code><code>,</code>

<code>  </code><code>"--check_repl_health"</code><code>, @ARGV );</code>

<code>if</code> <code>( $exit_code == 0 ) {</code>

<code>  </code><code>print </code><code>"\nMySQL Replication Health is OK.\n"</code><code>;</code>

<code>}</code>

<code>else</code> <code>{</code>

<code>  </code><code>print </code><code>"\nMySQL Replication Health is NOT OK!\n"</code><code>;</code>

通過masterha_master_switch這段腳本可以看到線上切換是調用的MasterRotate子產品,故障切換是調用的MasterFailover子產品。

<code>if</code> <code>( $master_state </code><code>eq</code> <code>"dead"</code> <code>) {</code>

<code>  </code><code>$exit_code = MHA::MasterFailover::main(@ARGV);</code>

<code>elsif ( $master_state </code><code>eq</code> <code>"alive"</code> <code>) {</code>

<code>  </code><code>$exit_code = MHA::MasterRotate::main(@ARGV);</code>

<code>  </code><code>pod2usage(1);</code>

MasterMonitor.pm,MasterRotate.pm,MasterFailover.pm這三個子產品都是調用Config.pm子產品來讀取參數配置,是以我們隻需要修改這幾個子產品即可。

為了不平的網絡環境,我在配置檔案加了這三個配置項:

app_vip :主庫的VIP

netmask :  VIP的網絡位

interface :VIP要綁定的網上

對應調整的代碼如下:

Config.pm:

申明變量:

<code>my @PARAM_ARRAY =</code>

<code>  </code><code>qw/ </code><code>hostname</code> <code>ip port ssh_host ssh_ip ssh_port ssh_connection_timeout ssh_options node_label candidate_master no_master ignore_fail skip_init_ssh_check skip_reset_slave user password repl_user repl_password disable_log_bin master_pid_file handle_raw_binlog ssh_user remote_workdir master_binlog_dir log_level manager_workdir manager_log check_repl_delay check_repl_filter latest_priority multi_tier_slave ping_interval ping_type secondary_check_script master_ip_failover_script master_ip_online_change_script shutdown_script report_script init_conf_load_script client_bindir client_libdir use_gtid_auto_pos app_vip netmask interface/;</code>

給變量指派:

<code>  </code><code>$value{app_vip} = $param_arg-&gt;{app_vip};</code>

<code>  </code><code>if</code> <code>( !defined( $value{app_vip} ) ) {</code>

<code>    </code><code>$value{app_vip} = $default-&gt;{app_vip};</code>

<code>  </code><code>}</code>

<code>  </code><code>$value{netmask} = $param_arg-&gt;{netmask};</code>

<code>  </code><code>if</code> <code>( !defined( $value{netmask} ) ) {</code>

<code>    </code><code>$value{netmask} = $default-&gt;{netmask};</code>

<code>  </code><code>$value{interface} = $param_arg-&gt;{interface};</code>

<code>  </code><code>if</code> <code>( !defined( $value{interface} ) ) {</code>

<code>    </code><code>$value{interface} = $default-&gt;{interface};</code>

MasterMonitor.pm :

修改複制檢測時的指令:

<code>"$current_master-&gt;{master_ip_failover_script} --command=status --ssh_user=$current_master-&gt;{ssh_user} --orig_master_host=$current_master-&gt;{hostname} --orig_master_ip=$current_master-&gt;{ip} --orig_master_port=$current_master-&gt;{port}  --app_vip=$current_master-&gt;{app_vip} --netmask=$current_master-&gt;{netmask} --interface=$current_master-&gt;{interface}"</code><code>;</code>

MasterMonitor.pm :

修改停原主庫寫入的指令:

<code>"$orig_master-&gt;{master_ip_online_change_script} --command=stop --orig_master_host=$orig_master-&gt;{hostname} --orig_master_ip=$orig_master-&gt;{ip} --orig_master_port=$orig_master-&gt;{port} --orig_master_user=$orig_master-&gt;{escaped_user} --orig_master_password=$orig_master-&gt;{escaped_password} --new_master_host=$new_master-&gt;{hostname} --new_master_ip=$new_master-&gt;{ip} --new_master_port=$new_master-&gt;{port} --new_master_user=$new_master-&gt;{escaped_user} --new_master_password=$new_master-&gt;{escaped_password} --app_vip=$orig_master-&gt;{app_vip} --netmask=$orig_master-&gt;{netmask} --interface=$orig_master-&gt;{interface}"</code><code>;</code>

修改允許在新主庫寫入的指令:

<code>"$new_master-&gt;{master_ip_online_change_script} --command=start --orig_master_host=$orig_master-&gt;{hostname} --orig_master_ip=$orig_master-&gt;{ip} --orig_master_port=$orig_master-&gt;{port} --orig_master_user=$orig_master-&gt;{escaped_user} --orig_master_password=$orig_master-&gt;{escaped_password} --new_master_host=$new_master-&gt;{hostname} --new_master_ip=$new_master-&gt;{ip} --new_master_port=$new_master-&gt;{port} --new_master_user=$new_master-&gt;{escaped_user} --new_master_password=$new_master-&gt;{escaped_password} --app_vip=$orig_master-&gt;{app_vip} --netmask=$orig_master-&gt;{netmask} --interface=$orig_master-&gt;{interface}"</code><code>;</code>

MasterFailover.pm:

修改禁用原從庫的vip指令:

<code> </code><code>"$dead_master-&gt;{master_ip_failover_script} --orig_master_host=$dead_master-&gt;{hostname} --orig_master_ip=$dead_master-&gt;{ip} --orig_master_port=$dead_master-&gt;{port} --app_vip=$dead_master-&gt;{app_vip}  --netmask=$dead_master     -&gt;{netmask} --interface=$dead_master-&gt;{interface}"</code><code>;</code>

修改啟用原從庫vip的指令:

<code> </code><code>"$new_master-&gt;{master_ip_failover_script} --command=start --ssh_user=$new_master-&gt;{ssh_user} --orig_master_host=$dead_master-&gt;{hostname} --orig_master_ip=$dead_master-&gt;{ip} --orig_master_port=$dead_master-&gt;{port} --new_m     aster_host=$new_master-&gt;{hostname} --new_master_ip=$new_master-&gt;{ip} --new_master_port=$new_master-&gt;{port} --new_master_user=$new_master-&gt;{escaped_user} --new_master_password=$new_master-&gt;{escaped_password} --app_vip=$de     ad_master-&gt;{app_vip} --netmask=$dead_master-&gt;{netmask} --interface=$dead_master-&gt;{interface}"</code><code>;</code>

版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任

本文轉自 emma_cql 51CTO部落格,原文連結:http://blog.51cto.com/chenql/1939105

繼續閱讀