mysql之MHA、Mycat綜合分析

來源:互聯網
上載者:User

標籤:分組   inter   修改   off   訪問   image   nlog   mysql資料庫   公司   

一、簡介

  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秒,嘗試三次沒有回應的時候自動進行railover10 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.5020 port=330621 22 [server2]23 hostname=192.168.0.6024 port=330625 candidate_master=1   //設定為候選master,如果設定該參數以後,發生主從切換以後將會將此從庫提升為主庫,即使這個主庫不是叢集中事件最新的slave26 check_repl_delay=0   //預設情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對於這個slave的恢複需要花費很長時間,通過設定check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個參數對於設定了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master27 28 [server3]29 hostname=192.168.0.7030 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 perluse 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 ([email protected]) {            warn "Got Error: [email protected]\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 ([email protected]) {            warn [email protected];            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 mastersub start_vip() {    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;}# A simple system call that disable the VIP on the old_mastersub 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綜合分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.