mysql+MHA高可用

MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就任於Facebook公司)開發,是一套優秀的做爲MySQL高可用性環境下故障切換和主從提高的高可用軟件。在MySQL故障切換過程當中,MHA能作到在0~30秒以內自動完成數據庫的故障切換操做,而且在進行故障切換的過程當中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。node

• 自動故障檢測和自動故障轉移
MHA可以在一個已經存在的複製環境中監控MySQL,當檢測到Master故障後可以實現自動故障轉移,經過鑑定出最「新」的Salve的relay log,並將其應用到全部的Slave,這樣MHA就可以保證各個slave之間的數據一致性,即便有些slave在主庫崩潰時尚未收到最新的relay log事件。一個slave節點可否成爲候選的主節點可經過在配置文件中配置它的優先級。因爲master可以保證各個slave之間的數據一致性,因此全部的slave節點都有但願成爲主節點。在一般的replication環境中因爲複製中斷而極容易產生的數據一致性問題,在MHA中將不會發生。
• 交互式(手動)故障轉移
MHA能夠手動地實現故障轉移,而沒必要去理會master的狀態,即不監控master狀態,確認故障發生後可經過MHA手動切換mysql

• 在線切換Master到不一樣的主機
MHA可以在0.5-2秒內實現切換,0.5-2秒的寫阻塞一般是可接受的,因此你甚至能在非維護期間就在線切換master。諸如升級到高版本,升級到更快的服務器之類的工做,將會變得更容易sql

優點:數據庫

• 自動故障轉移快
• 主庫崩潰不存在數據一致性問題
• 配置不須要對當前mysql環境作重大修改
• 不須要添加額外的服務器(僅一臺manager就可管理上百個replication)
• 性能優秀,可工做在半同步複製和異步複製,當監控mysql狀態時,僅須要每隔N秒向master發送ping包(默認3秒),因此對性能無影響。你能夠理解爲MHA的性能和簡單的主從複製框架性能同樣。
• 只要replication支持的存儲引擎,MHA都支持,不會侷限於innodbcentos

組成:bash

MHA由Manager節點和Node節點組成。
MHA Manager能夠單獨部署在一臺獨立的機器上管理多個master-slave集羣,也能夠部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集羣中的master節點,當master出現故障時,它能夠自動將最新數據的slave提高爲新的master,而後將全部其餘的slave從新指向新的master。整個故障轉移過程對應用程序徹底透明服務器

MHA工做原理:app

• 從宕機崩潰的master保存二進制日誌事件(binlog events);
• 識別含有最新更新的slave;
• 應用差別的中繼日誌(relay log)到其餘的slave;
• 應用從master保存的二進制日誌事件(binlog events);
• 提高一個slave爲新的master;
• 使其餘的slave鏈接新的master進行復制;框架

MHA安裝 (如下以centos7爲例)
準備四個節點,其中一個是管理節點,三個是一主兩從的環境less

1.更換yum源
備份本地yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
獲取阿里yum源配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
更新cache
yum makecache  
yum -y update   ##可無

2.下載軟件包

連接:https://pan.baidu.com/s/1zguk1j07j6SCX0b3Fm60cw 
提取碼:voxa 

3. 在全部節點上安裝node節點

yum install –y perl-DBD-MySQL
rpm -ivh mha4mysql-node-0.54-0.noarch.rpm
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/bashrc ;source /etc/bashrc

4.在管理節點上安裝manager節點
安裝依賴 yum install –y perl-*
rpm -ivh mha4mysql-manager-0.55-0.el6.noarch.rpm報錯以下
錯誤:依賴檢測失敗:
perl(Parallel::ForkManager) 被 mha4mysql-manager-0.55-0.el6.noarch 須要
yum install -y perl-Parallel-ForkManager 報錯
沒有可用軟件包 perl-Parallel-ForkManager。
注:先:rpm -ivh epel-release-latest-7.noarch.rpm;而後在執行yum install -y perl-Parallel-ForkManager就能夠了

5.• 在四個節點的/etc/hosts中添加主機內容:

ip+主機名
192.168.237.132 mha
192.168.237.128 master
192.168.237.130 slave1
192.168.237.131 slave2

6.• 在管理節點建立配置文件

cat   /etc/app1.cnf
[server default]
# mysql user and password
user=帳號
password=密碼
ssh_user=root
# working directory on the manager
manager_workdir=/var/log/masterha/app1
# working directory on MySQL servers
remote_workdir=/var/log/masterha/app1
repl_user=repl
repl_password=mysql
[server1]
hostname=master
port=3308
master_binlog_dir=/usr/local/mysql/data
[server2]
hostname=slave1
port=3308
master_binlog_dir=/usr/local/mysql/data
[server3]
hostname=slave2
port=3308
master_binlog_dir=/usr/local/mysql/data

  

7.兩個從庫配置文件
log-bin=mysql-bin
relay_log_purge=0
log-slave-updates=true 

注:

MHA在發生切換的過程當中,從庫的恢復過程當中依賴於relay log的相關信息,因此這裏要將relay log的自動清除設置爲OFF,採用手動清除relay log的方式。在默認狀況下,從
服務器上的中繼日誌會在SQL線程執行完畢後被自動刪除。可是在MHA環境中,這些中繼日誌在恢復其餘從服務器時可能會被用到,所以須要禁用中繼日誌的自動刪除功能。

8.各個主機之間祕鑰認證

MHA manager經過SSH訪問全部的node節點,各個node節點也一樣須要經過SSH
來相互發送不一樣的relay log 文件,因此有必要在每個node和manager上配置SSH
無密碼登錄
ssh-keygen -t rsa
cat id_rsa.pub >>authorized_keys

9.設置目錄和軟鏈接

mkdir -p /var/log/masterha/app1
軟鏈接全部的機器都要執行
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

10.【管理節點】檢查ssh鏈接配置是否正常

MHAmanager可經過masterha_check_ssh腳本檢測SSH鏈接是否配置正常
# masterha_check_ssh --conf=/etc/app1.cnf

11.【管理節點】檢查mysql複製配置是否正常

爲了讓MHA正常工做,全部的master和slave必須在配置文件中正確配置,MHA可經過masterha_check_repl 腳本檢測複製是否正確配置

12.• 開啓Manager

nohup masterha_manager --conf=/etc/app1.cnf > /var/log/masterha/app1/mha_manager.log < /dev/null &  ##後臺運行

 masterha_stop --conf=/etc/app1.cnf ##中止

masterha_check_status --conf=/etc/app1.cnf ##檢查manager狀態是否正常

13.• 測試master的自動故障轉移

[root@master bin]# /etc/init.d/mysql.server stop
Shutting down MySQL............ SUCCESS!
這時候檢查manager的log日誌,看看slave1是否成功成爲新的master,而且slave2從slave1中複製

查看MHA切換日誌
vi /var/log/masterha/app1/mha_manager.log
----- Failover Report -----
app1: MySQL Master failover master to slave1 succeeded
Master master is down!
Check MHA Manager logs at mycat for details.
Started automated(non-interactive) failover.
The latest slave slave1(192.168.237.130:3308) has all relay logs for recovery.
Selected slave1 as a new master.
slave1: OK: Applying all logs succeeded.
slave2: This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
slave2: OK: Applying all logs succeeded. Slave started, replicating from slave1.
slave1: Resetting slave info succeeded.
Master failover to slave1(192.168.237.130:3308) completed successfully. 

 14.驗證MHA先獲取最新日誌再切換

• 先關閉兩個從庫的slave進程
mysql> stop slave;
• 在主庫上執行插入操做,而從庫沒辦法同步
mysql> insert into temp2 values(5000,'abc');
Query OK, 1 row affected (0.00 sec)
• 主庫MySQL直接關閉,兩個從庫開啓複製進程,依舊沒有最新數據
[root@master ~]# /etc/init.d/mysql.server stop
Shutting down MySQL.... SUCCESS!
mysql> select * from temp2 where id=5000;
Empty set (0.00 sec)
• 開啓mha進程,發現完成主從切換
----- Failover Report -----
app1: MySQL Master failover master to slave1 succeeded
Master master is down!
……
Master failover to slave1(192.168.237.130:3308) completed successfully.
• 查看新的主從上是否有5000這條記錄
mysql> select * from temp2 where id=5000;
+------+------+
| id | name |
+------+------+
| 5000 | abc |

15.手動切換

masterha_master_switch --master_state=dead --conf=/etc/app1.cnf --dead_master_host=master --dead_master_port=3308 --new_master_ip=192.168.237.131 --new_master_port=3308

16.在線切換條件

爲了保證數據徹底一致性,在最快的時間內完成切換,MHA的在線切換必須知足如下條件纔會切換成功,不然會切換失敗。
1.全部slave的IO線程都在運行
2.全部slave的SQL線程都在運行
3.全部的show slave status的輸出中Seconds_Behind_Master參數小於或者等於running_updates_limit秒,若是在切換過程當中不指定running_updates_limit,那麼默認狀況下running_updates_limit爲1秒。
4.在master端,經過show processlist輸出,沒有一個更新花費的時間大於running_updates_limit秒

17.添加VIP實現自動漂移

在master節點上執行ifconfig eno16777736:2 192.168.237.120/24

在監控節點的/etc/app1.cnf中添加此文件

在監控節點上配置/usr/local/bin/master_ip_failover

master_ip_failover_script=/usr/local/bin/master_ip_failover

[root@mha linshi]# cat 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.237.120/24';
my $key = '2';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";

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 \"`;
}
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";
}
腳本須要更改兩個標紅的地方
IP地址
網卡名稱

  

18.配置參數解釋  ###app1.cnf

[server default] 
manager_workdir=/var/log/masterha/app1.log //設置manager的工做目錄
manager_log=/var/log/masterha/app1/manager.log //設置manager的日誌
master_binlog_dir=/data/mysql //設置master 保存binlog的位置,以便MHA能夠找到master的日誌,我這裏的也就是
mysql的數據目錄
master_ip_failover_script= /usr/local/bin/master_ip_failover //設置自動failover時候的切換腳本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change //設置手動切換時候的切換腳本
password=123456 //設置mysql中root用戶的密碼,這個密碼是前文中建立監控用戶的那個密碼
user=root 設置監控用戶root 
ping_interval=1 //設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有迴應的時候自動進行failover 
remote_workdir=/tmp //設置遠端mysql在發生切換時binlog的保存位置
repl_password=123456 //設置複製用戶的密碼
repl_user=repl //設置複製環境中的複製用戶名
report_script=/usr/local/send_report //設置發生切換後發送的報警的腳本
secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 
shutdown_script="" //設置故障發生後關閉故障主機腳本(該腳本的主要做用是關閉主機放在發生腦裂,這裏沒有使用)
ssh_user=root //設置ssh的登陸用戶名
[server1] 
hostname=192.168.0.50 
port=3306 
[server2] 
hostname=192.168.0.60 
port=3306 
candidate_master=1 //設置爲候選master,若是設置該參數之後,發生主從切換之後將會將此從庫提高爲主庫,即便這個
主庫不是集羣中事件最新的
slave check_repl_delay=0 //默認狀況下若是一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave做爲
一個新的master,由於對於這個slave的恢復須要花費很長時間,經過設置check_repl_delay=0,MHA觸發切換在選擇一個
新的master的時候將會忽略複製延時,這個參數對於設置了candidate_master=1的主機很是有用,由於這個候選主在切換
的過程當中必定是新的master 
[server3] 
hostname=192.168.0.70 
port=3306 
相關文章
相關標籤/搜索