mysql之MHA、Mycat綜合分析

1、簡介html

  MHA: node

    你能夠把它看作是一個監控MySQL的工具,當master掛了以後,起一個slave做爲master,另一臺slave從新做爲新master的備庫;mysql

    因此MHA的架構作好是三臺數據庫,而且已經提早作好了主從模式(一主兩從),MHA能夠管理多組MySQL主從集羣;VIP的跳轉也linux

    是經過keepalived來實現的,整體的架構設計以下圖所示(藉助網上的圖片):nginx

 

  Mycat:sql

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

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

 

2、MHA搭建安裝架構

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

    包分爲兩部分,一個是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  總結:

 

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

 

 

3、mycat搭建

  3.1 搭建

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

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

    

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

  3.2 集羣搭建

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

 

4、附加項

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

  缺點:

    一、好比大家公司訪問量很大,應用層已經針對不一樣的業務模塊分組了,那麼數據庫這塊也得分組,若是分三組的話,MHA的方案,最多使用十臺服務器,而下面這種方案的話,須要12臺服務器

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

  優勢:

    一、不須要第三方工具的依賴

    二、學習成本也比較的低

 

5、總結

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

       FLUSH TABLES WITH READ LOCK  (mysql 鎖整個庫實例)

相關文章
相關標籤/搜索