1. 程式人生 > >mysql之MHA、Mycat綜合分析

mysql之MHA、Mycat綜合分析

one 你們 options 時間 .com eva new ive repl

一、簡介

  MHA:

    你可以把它看做是一個監控MySQL的工具,當master掛了之後,起一個slave作為master,另外一臺slave重新作為新master的備庫;

    所以MHA的架構做好是三臺數據庫,並且已經提前做好了主從模式(一主兩從),MHA可以管理多組MySQL主從集群;VIP的跳轉也

    是通過keepalived來實現的,總體的架構設計如下圖所示(借助網上的圖片):

技術分享圖片

  Mycat:

    實現讀寫分離、分庫分表的一個開源的工具,我這裏沒有使用到分庫分表的功能,只是單純的做讀寫分離;mycat實現讀寫分離是在配置文件

    中配置的,配置起來也比較的簡單,下面會詳細介紹,架構方面則是采用的如下圖所示的架構模式:

技術分享圖片

二、MHA搭建安裝

  2.1 搭建(一主兩從已經實現,這裏不做闡述

    包分為兩部分,一個是manager的包,另外一個是node包;包的下載地址為:https://pan.baidu.com/s/1D6v6yPeCTecaB68LwPZJ2A,密碼:oyez

    所有的節點都需要安裝node包,然後所有的節點你都需要安裝Perl的依賴包:perl-DBD-MySQL

    如果還缺少其它包的話,那就見招拆招唄!!

    還有一點需要註意:那個manager包你可以單獨部署在一臺服務器上,也可以部署在其中一臺node節點上

    所有的服務器建立key登錄,互信任

    2.1.1 manager節點


      mkdir -p /etc/masterha && cp mha4mysql-manager-0.53/samples/conf/app1.cnf /etc/masterha/

技術分享圖片
 1 [server default]
 2 manager_workdir=/var/log/masterha/app1.log              //設置manager的工作目錄
 3 manager_log=/var/log/masterha/app1/manager.log          //設置manager的日誌
 4 master_binlog_dir=/data/mysql                         //設置master 保存binlog的位置,以便MHA可以找到master的日誌,我這裏的也就是mysql的數據目錄
5 master_ip_failover_script= /usr/local/bin/master_ip_failover //設置自動failover時候的切換腳本 6 master_ip_online_change_script= /usr/local/bin/master_ip_online_change //設置手動切換時候的切換腳本 7 password=123456 //設置mysql中root用戶的密碼,這個密碼是前文中創建監控用戶的那個密碼 8 user=root 設置監控用戶root 9 ping_interval=1 //設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動進行railover 10 remote_workdir=/tmp //設置遠端mysql在發生切換時binlog的保存位置 11 repl_password=123456 //設置復制用戶的密碼 12 repl_user=repl //設置復制環境中的復制用戶名 13 report_script=/usr/local/send_report //設置發生切換後發送的報警的腳本 14 secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 15 shutdown_script="" //設置故障發生後關閉故障主機腳本(該腳本的主要作用是關閉主機放在發生腦裂,這裏沒有使用) 16 ssh_user=root //設置ssh的登錄用戶名 17 18 [server1] 19 hostname=192.168.0.50 20 port=3306 21 22 [server2] 23 hostname=192.168.0.60 24 port=3306 25 candidate_master=1 //設置為候選master,如果設置該參數以後,發生主從切換以後將會將此從庫提升為主庫,即使這個主庫不是集群中事件最新的slave 26 check_repl_delay=0 //默認情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對於這個slave的恢復需要花費很長時間,通過設置check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略復制延時,這個參數對於設置了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master 27 28 [server3] 29 hostname=192.168.0.70 30 port=3306
app1.conf

      

    註意:

      MHA在發生切換的過程中,從庫的恢復過程中依賴於relay log的相關信息,所以這裏要將relay log的自動清除設置為OFF,采用手動清除relay log的方式。在默認情況下,從服務器上的中繼日誌會在SQL線程執行完畢後被自動刪除。但是在MHA環境中,這些中繼日誌在恢復其他從服務器時可能會被用到,因此需要禁用中繼日誌的自動刪除功能。定期清除中繼日誌需要考慮到復制延時的問題。在ext3的文件系統下,刪除大的文件需要一定的時間,會導致嚴重的復制延時。為了避免復制延時,需要暫時為中繼日誌創建硬鏈接,因為在linux系統中通過硬鏈接刪除大文件速度會很快。(在mysql數據庫中,刪除大表時,通常也采用建立硬鏈接的方式)

    MHA節點中包含了pure_relay_logs命令工具,它可以為中繼日誌創建硬鏈接,執行SET GLOBAL relay_log_purge=1,等待幾秒鐘以便SQL線程切換到新的中繼日誌,再執行SET GLOBAL relay_log_purge=0

    

    檢查各節點間的ssh通信:

      masterha_check_ssh --conf=/etc/masterha/app1.cnf ;顯示所有的都成功,才算是成功,不然就檢查錯誤原因;我這裏有兩臺節點之間總是檢測不通過,手動測試互相連接都沒問題,但就是通過這個腳本沒法通過,我的解決辦法是刪除.ssh目錄,重新生成公鑰和秘鑰,重新建立信任

    然後再檢查復制情況:

      masterha_check_repl --conf=/etc/masterha/app1.cnf

      在執行這個腳本之前,你需要先配置好keepalived,因為master_ip_failover這個腳本會去尋找keepalived的VIP,如果沒有配置好keepalived,就先把master_ip_failover_script= /usr/local/bin/master_ip_failover這行給註釋掉(app1.conf文件)

  2.2 MHA引入keepalived(MySQL服務進程掛掉時通過MHA 停止keepalived)

    要想把keepalived服務引入MHA,我們只需要修改切換是觸發的腳本文件master_ip_failover即可,在該腳本中添加在master發生宕機時對keepalived的處理。

技術分享圖片
#!/usr/bin/env perl

use strict;
use warnings FATAL => ‘all‘;

use Getopt::Long;

my (
    $command,          $ssh_user,        $orig_master_host, $orig_master_ip,
    $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
);

my $vip = ‘192.168.0.88‘;
my $ssh_start_vip = "/etc/init.d/keepalived start";
my $ssh_stop_vip = "/etc/init.d/keepalived stop";

GetOptions(
    ‘command=s‘          => \$command,
    ‘ssh_user=s‘         => \$ssh_user,
    ‘orig_master_host=s‘ => \$orig_master_host,
    ‘orig_master_ip=s‘   => \$orig_master_ip,
    ‘orig_master_port=i‘ => \$orig_master_port,
    ‘new_master_host=s‘  => \$new_master_host,
    ‘new_master_ip=s‘    => \$new_master_ip,
    ‘new_master_port=i‘  => \$new_master_port,
);

exit &main();

sub main {

    print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

    if ( $command eq "stop" || $command eq "stopssh" ) {

        my $exit_code = 1;
        eval {
            print "Disabling the VIP on old master: $orig_master_host \n";
            &stop_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn "Got Error: $@\n";
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "start" ) {

        my $exit_code = 10;
        eval {
            print "Enabling the VIP - $vip on the new master - $new_master_host \n";
            &start_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn $@;
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "status" ) {
        print "Checking the Status of the script.. OK \n";
        #`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`;
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}

# A simple system call that enable the VIP on the new master
sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
     return 0  unless  ($ssh_user);
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
master_ip_failover

    因為我不懂Perl,這個配置語法也是從網上找的,沒有測試好使不好使;我這裏使用zabbix的監控,觸發腳本實現MySQL-master異常時,殺掉keepalived,使VIP跳轉到新的master上

  2.3 總結:

    目前高可用方案可以一定程度上實現數據庫的高可用,比如MMM,heartbeat+drbd,Cluster等。還有percona的Galera Cluster等。這些高可用軟件各有優劣。在進行高可用方案選擇時,主要是看業務還有對數據一致性方面的要求。最後出於對數據庫的高可用和數據一致性的要求,推薦使用MHA架構。

三、mycat搭建

  3.1 搭建

    mycat的搭建比較容易,直接解壓出來就可以了,主要就是看下配置文件的配置,主要就是server.xml和schema.xml

    server.xml:(主要是配置mycat的用戶名和密碼,以及可以管理的庫)

    技術分享圖片

    schema.xml:(配置讀寫分離)

技術分享圖片

  3.2 集群搭建

    兩臺或者多臺mycat服務器配置都是一樣的,中間也沒有直接的聯系,簡介中的那個圖說明的已經很明確了,是通過keepalived+nginx來實現代理轉發到mycat,實現的高可用,這裏就不做過多的闡述了

四、附加項

  想必有的同學會問,為啥不使用四臺服務器,兩臺master互為主備,中間通過keepalived實現VIP跳轉,兩臺slave都change master to VIP,這樣的話,也能實現高可用,而且不需要第三方的工具去監控跳轉

  缺點:

    1、比如你們公司訪問量很大,應用層已經針對不同的業務模塊分組了,那麽數據庫這塊也得分組,如果分三組的話,MHA的方案,最多使用十臺服務器,而下面這種方案的話,需要12臺服務器

    2、MySQL master互為主從的話,對服務器的性能考驗比較大,也容易出現各種問題,有一點數據不同步的話,slave就沒法獲取完整的數據

  優點:

    1、不需要第三方工具的依賴

    2、學習成本也比較的低

五、總結

  綜上所述,建議大家搭建MHA的監控,實現宕機跳轉的目的(這裏說一下那個中繼日誌的作用就是用於恢復slave數據使用的

mysql之MHA、Mycat綜合分析