MySQL服務器羣集如何構建MHA?

前言

  • MHA目前在MySQL高可用方面是一個相對成熟的解決方案
  • 但是在搭建的過程中會經常報錯,且MHA的構建綜合了主從複製,所以MHA的安裝要思路清晰纔可

一:MHA概述

1.1:什麼是MHA?

  • 日本DeNA公司 youshimaton(現就職於 Facebook公司)開發
  • 一套優秀的作爲MySQL高可用性環境下故障切換和主從提升的高可用軟件
  • 支持故障切換
  • 在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成數據庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用
  • MHA還提供在線主庫切換的功能,能夠安全地切換當前運行的主庫到一個新的主庫中(通過將從庫提升爲主庫),大概0.5-2秒內即可完成

1.2:MHA的組成

  • MHA Manager(管理節點)
    • 用來接收外部信號,監控下方數據節點的工作狀態
  • MHA Node(數據節點)
    • 工作的單位,負責具體的工作

1.3:MHA有什麼特點?

  • 自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日誌,最大程度的保證數據的不丟失
  • 使用 MySQL55的半同步複製,可以大大降低數據丟失的風險

1.4:MHA形成的原因

  • 傳統mysql主從架構存在單點故障的問題

    mark

  • 傳統架構中,只有一個mysql主服務器,所以當出現單點故障的時候,整個服務器羣集就會癱瘓掉

  • 爲了解決這種情況,我們需要在主服務器宕機的時候,重新建立一臺主服務器,負責監控等工作

二:MHA實驗

2.1:實驗環境

2.2:拓撲圖

mark

2.3:實驗目的

  • 通過MHA監控MySQL數據庫,在故障時自動進行切換,不影響業務
  • 當主庫失效時,備選主庫自動成爲主庫

2.4:實驗過程

  • 因爲操作系統是centos7,所以要下載MHA 0.57版本
2.4.1:安裝gmake編譯軟件
[root@slave2 ~]# mount.cifs //192.168.11.11/ccc /mnt
Password for root@//192.168.11.11/ccc:  
[root@slave2 ~]# cd /mnt/shuju數據庫/mha
[root@slave2 mha]# 
[root@slave2 mha]# tar zxvf cmake-2.8.6.tar.gz -C /opt
[root@slave2 mha]# cd /opt/cmake-2.8.6/
[root@slave2 cmake-2.8.6]# ./configure 
[root@slave1 cmake-2.8.6]# gmake
[root@slave1 cmake-2.8.6]# gmake install
2.4.2:搭建mysql主從複製環境
  • https://blog.csdn.net/CN_TangZheng/article/details/103897251

  • 記得關閉防火牆

  • 主從複製環境中的mysql同步的用戶名爲:myslave 密碼:123456

  • 額外調整

    • 所有數據庫授權mha用戶對數據庫的操作權限,每一個mysql數據庫都要設置

      '//下面三條授權按理論是不用添加的,但是做案例實驗環境時候誦過MHA檢查MySQL主從有報錯,報兩個從庫通過主機名連接不上主庫,所以所有數據庫加上下面的授權;'
      mysql> grant all privileges on *.* to 'mha'@'master' identified by 'manager';
      mysql> grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
      mysql> grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
      '//三臺mysql服務器的授權增加一個給mha管理'
      mysql> grant all privileges on *.* to 'mha'@'192.168.79.%' identified by 'manager';
      '//主備mysql服務器添加用戶和權限'
      '//192.168.79.0段的從服務器擁有複製權限,可以使用myslave身份123456密碼複製所有的庫和表'
      mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.79.%' IDENTIFIED BY '123456';
      
    • slave1和slave2兩個從數據庫設置爲只讀

      mysql> set global read_only=1;
      
    • 所有slave節點配置二進制日誌,註釋掉client段的默認字符集

      [root@slave1 ~]# vim /etc/my.cnf
          [mysqld]段落添加
      log-bin=slave1-bin	'//添加二進制日誌'
      所以slave節點都要配置,我就不一一展示了
          '//從服務器上都註釋掉client段的默認字符集'
      [root@slave1 ~]# vim /etc/my.cnf
      [client]
      #default-character-set=utf8	'//註釋掉此'
      
    • 創建軟連接

      所有節點創建軟連接
      ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/
      創建mysql軟連接
      ln -s /usr/local/mysql/bin/mysql /usr/local/bin/
      
2.4.3:所有節點安裝環境和Node組件和Manager組件
  • 所有服務器上都要安裝mha依賴的環境,此處僅展示mha_manager的安裝

    [root@mha_manager ~]# yum install epel-release --nogpgcheck -y
    [root@mha_manager ~]# yum install -y perl-DBD-MySQL \
    perl-Config-Tiny \
    perl-Log-Dispatch \
    perl-Parallel-ForkManager \
    perl-ExtUtils-CBuilder \
    perl-ExtUtils-MakeMaker \
    perl-CPAN
    
  • 所有服務器都安裝安裝node組件,此處僅展示master服務器的安裝

  • [root@master ~]# tar zxvf /mnt/shuju數據庫/mha/mha4mysql-node-0.57.tar.gz 
    [root@master ~]# cd mha4mysql-node-0.57/
    [root@master mha4mysql-node-0.57]# yum install perl-Module-Install -y
    [root@master mha4mysql-node-0.57]# perl Makefile.PL 
    ==> Auto-install the 1 mandatory module(s) from CPAN? [y] y	'//輸入y'
    [root@master mha4mysql-node-0.57]# make
    [root@master mha4mysql-node-0.57]# make install
    
  • 僅mha_manager服務器安裝manager組件

    [root@mha_manager ~]# tar zxvf /mnt/shuju數據庫/mha/mha4mysql-manager-0.57.tar.gz 
    [root@mha_manager ~]# cd mha4mysql-manager-0.57/
    [root@mha_manager mha4mysql-manager-0.57]# perl Makefile.PL 
    [root@mha_manager mha4mysql-manager-0.57]# make
    [root@mha_manager mha4mysql-manager-0.57]# make install
    
2.4.4:配置節點間SSH面交互登陸
  • mha_manager主機配置到所有數據庫節點的密鑰對驗證

    [root@mha_manager ~]# ssh-keygen -t rsa
    	'//創建非對稱密鑰對'
        '//因爲想要免密登陸,所以三個都直接回車就行,不需要設置密碼'
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    '//上傳祕鑰到節點服務器'
    [root@mha_manager ~]# ssh-copy-id 192.168.79.134
    Are you sure you want to continue connecting (yes/no)? yes
    [email protected]'s password: 	//輸入密碼'
        '//相同方法建立其他服務器'
    [root@mha_manager ~]# ssh-copy-id 192.168.79.135
    [root@mha_manager ~]# ssh-copy-id 192.168.79.136
    
  • 在master上配置到數據庫節點slave1和slave2的免密驗證

    [root@master mha4mysql-node-0.57]# ssh-keygen -t rsa	'//創建非對稱密鑰對'
        '//用上述方法建立其他服務器'
    [root@master mha4mysql-node-0.57]# ssh-copy-id 192.168.79.135
    [root@master mha4mysql-node-0.57]# ssh-copy-id 192.168.79.136
    
  • 在slave1上配置到數據庫節點master和slave2的免密驗證

    [root@slave1 ~]# ssh-keygen -t rsa
    [root@slave1 ~]# ssh-copy-id 192.168.79.134
    [root@slave1 ~]# ssh-copy-id 192.168.79.136
    
  • 在slave2上配置到數據庫節點master和slave1的免密驗證

    [root@slave2 ~]# ssh-keygen -t rsa
    [root@slave2 ~]# ssh-copy-id 192.168.79.134
    [root@slave2 ~]# ssh-copy-id 192.168.79.135
    
2.4.5:配置MHA-Manager組件
  • 複製相關腳本到/usr/local/bin目錄

    [root@mha_manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
    [root@mha_manager samples]# ls -l /usr/local/bin/scripts/
    -rwxr-xr-x. 1 1001 1001  3648 5月  31 2015 master_ip_failover  自動切換時 VIP管理的腳本
    -rwxr-xr-x. 1 1001 1001  9870 5月  31 2015 master_ip_online_change  在線切換VIP的管理 
    -rwxr-xr-x. 1 1001 1001 11867 5月  31 2015 power_manager  故障發生後關閉主機的腳本
    -rwxr-xr-x. 1 1001 1001  1360 5月  31 2015 send_report  因故障切換後發送報警的腳本
    [root@mha_manager ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/	'//自動切換時 VIP管理的腳本'
    
  • 修改master_ip_failover 腳本

    [root@mha_manager ~]# vim /usr/local/bin/master_ip_failover 
    '//刪除內容,重新編寫腳本'
    #!/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.79.100';
    my $brdc = '192.168.79.255';
    my $ifdev = 'ens33';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
    my $exit_code = 0;
    #my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
    #my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
    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";
    exit 0;
    }
    else {
    &usage();
    exit 1;
    }
    }
    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() {
    `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";
    }
    
  • 創建MHA軟件目錄並拷貝配置文件

    [root@mha_manager ~]# mkdir /etc/masterha
    [root@mha_manager ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
    [root@mha_manager ~]# vim /etc/masterha/app1.cnf 
        '//刪除內容,重新編寫腳本'
    [server default]
    manager_log=/var/log/masterha/app1/manager.log
    manager_workdir=/var/log/masterha/app1
    master_binlog_dir=/usr/local/mysql/data
    master_ip_failover_script=/usr/local/bin/master_ip_failover
    master_ip_online_change_script=/usr/local/bin/master_ip_online_change
    password=manager
    ping_interval=1
    remote_workdir=/tmp
    repl_password=123456
    repl_user=myslave
    secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.79.135 -s 192.168.79.136
    shutdown_script=""
    ssh_user=root
    user=mha
    
    [server1]
    hostname=192.168.79.134
    port=3306
    
    [server2]
    candidate_master=1
    hostname=192.168.79.135
    check_repl_delay=0
    port=3306
    
    [server3]
    hostname=192.168.79.136
    port=3306
    
2.4.6:測試SSH與mysql主從連接
  • 驗證密鑰對

    [root@mha_manager ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
    Fri Jan 10 01:14:10 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
    Fri Jan 10 01:14:10 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
    Fri Jan 10 01:14:10 2020 - [info] Reading server configuration from /etc/masterha/app1.cnf..
    Fri Jan 10 01:14:10 2020 - [info] Starting SSH connection tests..
    Fri Jan 10 01:14:11 2020 - [debug] 
    Fri Jan 10 01:14:10 2020 - [debug]  Connecting via SSH from [email protected].135(192.168.79.135:22) to [email protected].136(192.168.79.136:22)..
    Fri Jan 10 01:14:11 2020 - [debug]   ok.
    Fri Jan 10 01:14:12 2020 - [debug] 
    Fri Jan 10 01:14:10 2020 - [debug]  Connecting via SSH from [email protected].136(192.168.79.136:22) to [email protected].135(192.168.79.135:22)..
    Fri Jan 10 01:14:11 2020 - [debug]   ok.
    Fri Jan 10 01:14:12 2020 - [info] All SSH connection tests passed successfully.
    
  • 測試mysql主從連接

    [root@mha_manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf
    
  • 相關報錯,請查閱我的博客

    https://blog.csdn.net/CN_TangZheng/article/details/103925515

2.4.7:配置虛擬IP,啓動MHA
  • 添加虛擬IP

    [root@master ~]# /sbin/ifconfig ens33:1 192.168.79.100/24
    
  • 啓動MHA

    [root@mha_manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > 
    [root@mha_manager ~]# /var/log/masterha/app1/manager.log 2>&1 &
    '//查看到當前的master節點是誰'
    [root@mha_manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
    '//查看當前日誌信息'
    [root@mha_manager ~]# cat /var/log/masterha/app1/manager.log 
    
2.4.8:模擬故障
  • 啓動監控觀察日誌記錄

    [root@mha_manager ~]# tailf /var/log/masterha/app1/manager.log 
    
  • 關掉master服務器

    [root@master ~]# pkill -9 mysqld 
    

2.5:實驗驗證

2.5.1:主服務器變更成功
  • 此時發現主服務器已經變更

    slave1查看

    [root@slave1 ~]# ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.79.135  netmask 255.255.255.0  broadcast 192.168.79.255
            inet6 fe80::159a:a8d1:5769:74d0  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:34:57:c1  txqueuelen 1000  (Ethernet)
            RX packets 347068  bytes 28229347 (26.9 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 528201  bytes 67755670 (64.6 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.79.100  netmask 255.255.255.0  broadcast 192.168.79.255
            ether 00:0c:29:34:57:c1  txqueuelen 1000  (Ethernet)
    
  • mha_manager查看

    '//會動態顯示後續信息'
    Generating relay diff files from the latest slave succeeded.
    192.168.79.136(192.168.79.136:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.79.135(192.168.79.135:3306)
    192.168.79.135(192.168.79.135:3306): Resetting slave info succeeded.
    Master failover to 192.168.79.135(192.168.79.135:3306) completed successfully.
    
2.5.2:嘗試從客戶端通過虛擬IP連接上數據庫
  • 直接在mha_manager上安裝mysql

    [root@mha_manager ~]# yum install mysql -y
    
  • 在vip的數據庫服務器上提取

    [root@slave1 ~]# mysql -uroot -p
    Enter password: 
    mysql> grant all on *.* to 'root'@'%' identified by 'abc123';
    
  • 在客戶機(mha_manager)上用虛擬IP進行登錄

    [root@mha_manager ~]# mysql -h 192.168.79.100 -uroot -pabc123
    MySQL [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | yiku               |
    | mysql              |
    | performance_schema |
    | erku              |
    | sanku               |
    | sys                |
    +--------------------+
    8 rows in set (0.00 sec)
    
發佈了126 篇原創文章 · 獲贊 62 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章