Mysql

MySQL高可用MHA

mysql高可用MHA,MySQL高可用,MHA


1.MHA 介绍

1.1 理解MHA 

    1.1.1 MHA是什么 是 MHA是mysql高可用解决方案之一。 

         1当mysql主库发生故障,MHA提升从库为主库,确保主库高可用。

         2 MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

1.1.2 MHA由什么组成 

         1 MHA Manager(管理节点) 建议将MHA Manager单独部署在一台独立的机器上管理多个master-slave集群。 

         2 MHA Node(数据节点) MHA Node运行在每台MySQL服务器上,是MHA Manager的员工,接收Manager的命令并执行

1.1.3 MHA各个工具包的作用

    manager工具包:

        masterha_check_ssh 检查MHA的SSH配置状况 

        masterha_check_repl 检查MySQL复制状况 

        masterha_manger 启动MHA 

        masterha_check_status 检测当前MHA运行状态 

        masterha_master_monitor 检测master是否宕机

        masterha_master_switch 控制故障转移(自动或者手动)

        masterha_conf_host 添加或删除配置的server信息

    node工具包:

        save_binary_logs 保存和复制master的二进制日志 

        apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave 

        filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具) 

        purge_relay_logs 清除中继日志(不会阻塞SQL线程)

1.1.4 MHA工作原理 

        1. 从宕机崩溃的master保存二进制日志事件(binlog events)

        2. 识别含有最新更新的slave 

        3. 应用差异的中继日志(relay log)到其他的slave; 

        4. 应用从master保存的二进制日志事件(binlog events); 

        5. 提升一个slave为新的master; 

        6. 使其他的slave连接新的master进行复制;

manager干啥: 

        1 心跳检测: 检测master是否宕机。 

        2 一旦宕机,manager会以发送指令给node的方式协调整个主从切换的过程。

        每台都有ip地址, 但是我们应用程序不直接访问这些IP,我们暴露给应用程序的是一个虚拟IP,简称VIP,应用程序通过 VIP访问master。期初,这个VIP(例如:192.168.232.99)是位于我们的master(例如主节点:192.168.168.232.101),后面主机宕机了,VIP漂移到 slave1(重节点:192.168.168.232.102)或者slave2(重节点192.168.168.232.102)的服务器上。那么应用程序就会写入其中的slave了。

2.环境搭建

    2.1 秘钥互信 每个节点都执行

[root@100 ~]# cd ~
[root@100 ~]# ssh-keygen -t rsa #看到提示不用管,一路回车就是 
[root@100 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 
[root@100 ~]# chmod 600 ~/.ssh/authorized_key

只要在一个节点执行即可。例如:这里在 192.168.232.100上执行

[root@100 ~]# ssh 192.168.232.101 cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys 
[root@100 ~]# ssh 192.168.232.102 cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys 
[root@100 ~]# ssh 192.168.232.103 cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

分发整合后的文件到其它节点

[root@100 ~]# scp ~/.ssh/authorized_keys 192.168.232.101:~/.ssh/ 
[root@100 ~]# scp ~/.ssh/authorized_keys 192.168.232.102:~/.ssh/ 
[root@100 ~]# scp ~/.ssh/authorized_keys 192.168.232.103:~/.ssh/

  2.2 安装基础依赖包 在所有机器上执行:

yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel- ForkManager perl-Time-HiRes

2.3 安装MHA组件

    2.3.1 安装安 MHA Node组件组 我们登陆101这台机器

[root@100 ~]# cd /usr/local/src/mha

下载安装包上传至这个目录,如下:

链接:https://pan.baidu.com/s/1xpkDHBrrBwXFVKgdKeoCCQ 

提取码:08jh 

[root@100 mha]# ll | grep mha 
-rw-r--r-- 1 root root 119801 Sep 15 16:11 mha4mysql-manager-0.58.tar.gz 
-rw-r--r-- 1 root root 56220 Sep 15 16:11 mha4mysql-node-0.58.tar.gz

将mha4mysql-node-0.58.tar.gz分发到其它3台机器

scp mha4mysql-node-0.58.tar.gz root@192.168.232.101:/usr/local/src/mha/ 
scp mha4mysql-node-0.58.tar.gz root@192.168.232.102:/usr/local/src/mha/ 
scp mha4mysql-node-0.58.tar.gz root@192.168.232.103:/usr/local/src/mha/

解压安装(在所有机器上执行:):

[root@node01 soft]# tar xf mha4mysql-node-0.58.tar.gz 
[root@node01 soft]# cd mha4mysql-node-0.58 
[root@node01 mha4mysql-node-0.58]# perl Makefile.PL
[root@node01 mha4mysql-node-0.58]# make && make install

Node安装完成后会得到四个工具,位于/usr/local/bin/下面

[root@localhost ~]# ll /usr/local/bin/ 
total 20876 
-r-xr-xr-x 1 root root 17639 Sep 15 02:44 apply_diff_relay_logs 
-r-xr-xr-x 1 root root 4807 Sep 15 02:44 filter_mysqlbinlog 
-r-xr-xr-x 1 root root 8337 Sep 15 02:44 purge_relay_logs 
-r-xr-xr-x 1 root root 7525 Sep 15 02:44 save_binary_logs

2.3.2 安装安 MHA Manager 组件组 只在100上安装:

[root@100 mha]# cd /usr/local/src/mha 
[root@100 mha]# tar -zxxf mha4mysql-manager-0.58.tar.gz 
[root@100 mha]# # cd mha4mysql-manager-0.58 
[root@100 mha4mysql-manager-0.58]# ls 
AUTHORS blib debian lib Makefile.PL META.yml README samples tests 
bin COPYING inc Makefile MANIFEST pm_to_blib rpm t 
[root@manager mha4mysql-manager-0.58]# perl Makefile.PL 
[root@manager mha4mysql-manager-0.58]# make && make install

查看 Manager 工具

[root@101 mha4mysql-manager-0.58]# ll /usr/local/bin/ | grep master 
-rw-r--r-- 1 root root 406891 Jul 30 12:58 compose-master.zip 
-r-xr-xr-x 1 root root 1995 Sep 15 03:17 masterha_check_repl 
-r-xr-xr-x 1 root root 1779 Sep 15 03:17 masterha_check_ssh 
-r-xr-xr-x 1 root root 1865 Sep 15 03:17 masterha_check_status 
-r-xr-xr-x 1 root root 3201 Sep 15 03:17 masterha_conf_host 
-r-xr-xr-x 1 root root 2517 Sep 15 03:17 masterha_manager 
-r-xr-xr-x 1 root root 2165 Sep 15 03:17 masterha_master_monitor
-r-xr-xr-x 1 root root 2373 Sep 15 03:17 masterha_master_switch 
-r-xr-xr-x 1 root root 5172 Sep 15 03:17 masterha_secondary_check 
-r-xr-xr-x 1 root root 1739 Sep 15 03:17 masterha_stop 
-rwxr-xr-x 1 root root 3648 Sep 16 02:47 master_ip_failover 
-rwxr-xr-x 1 root root 9870 Sep 16 02:47 master_ip_online_change

2.4 安装mysql 这里就不写了主要是是安装1主2重

2.6 MHA 构建

我们这里演示的vip 是: 192.168.232.99 大家根据自己的情况,做出对应的修改。 

MHA Manager 配置,在192.168.232.100上:

创建MHA配置文件目录 
[root@100 ~]# mkdir /etc/mha 
# 创建MHA脚本目录
[root@100 ~]# mkdir /etc/mha/scripts 
# 创建MHA日志目录 
[root@100 ~]# mkdir /var/log/mha/ 
# 创建日志目录 
[root@100 ~]# mkdir /var/log/mha/app1 -p 
# 创建日志文件 
[root@100 ~]# touch /var/log/mha/app1/manager.log

2.6.1 MHA 配置文件这里大家要修改成自己的

配置文件1:

vim /etc/mha/app1.cnf 

[server default] 
manager_workdir=/var/log/masterha/app1 
manager_log=/var/log/masterha/app1/manager.log 
[server1] 
hostname=192.168.232.101 
port=3306 
[server2] 
hostname=192.168.232.102 
port=3306 
candidate_master=1 
[server3] 
hostname=192.168.232.103 
port=3306

上面这个配置主要是一个mysql主从的名单。

candidate_master=1的意思是是否能提升为master。

配置文件2:

vim /etc/masterha_default.cnf 
[server default] 
user=root #注释请去掉,避免报错 
password=123456
repl_user=repl 
repl_password=123456 
ssh_user=root 
ping_interval=1 
master_binlog_dir=/opt/mysql_data 
manager_workdir=/var/log/mha/app1 
manager_log=/var/log/mha/manager.log 
master_ip_failover_script="/etc/mha/scripts/master_ip_failover" 
master_ip_online_change_script="/etc/mha/scripts/master_ip_online_change" 
report_script="/etc/mha/scripts/send_report" 
remote_workdir=/tmp 
secondary_check_script= /usr/local/bin/masterha_secondary_check -s 192.168.232.101 -s 192.168.232.102 -s 192.168.232.103 
shutdown_script=""

MHA主要配置文件说明

manager_workdir=/var/log/masterha/app1:设置manager的工作目录
manager_log=/var/log/masterha/app1/manager.log:设置manager的日志文件 
master_binlog_dir=/opt/mysql_data:设置master 保存binlog的位置,以便MHA可以找到master的日志
master_ip_failover_script="/etc/mha/scripts/master_ip_failover":设置自动failover时候的切换脚本 
master_ip_online_change_script="/etc/mha/scripts/master_ip_online_change":设置手动切换时候的切换脚本 
user=root:设置监控mysql的用户 
password=dayi123:设置监控mysql的用户,需要授权能够在manager节点远程登录 
ping_interval=1:设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行
railover remote_workdir=/tmp:设置远端mysql在发生切换时binlog的保存位置 repl_user=repl :设置mysql中用于复制的用户密码 
repl_password=replication:设置mysql中用于复制的用户 report_script=/usr/local/send_report:设置发生切换后发送的报警的脚本 
shutdown_script="":设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用) 
ssh_user=root //设置ssh的登录用户名 candidate_master=1:在节点下设置,设置当前节点为候选的
master slave check_repl_delay=0 :在节点配置下设置,默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master;这个选项对于对于设置了candidate_master=1的主机非常有用

2.6.2 脚本配置 脚 2.6.2.1 自动自 VIP 管理配置

[root@100 ~]# vim /etc/mha/scripts/master_ip_failover

在配置的时候,注意把下文中的我的是ens33,所 以写的是ens33

#!/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.169.10';
my $key = '0';
my $ssh_start_vip = "ifconfig ens33:0 192.168.169.10 netmask 255.255.255.0 up";
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";
}

最后给刚刚配置的三个脚本增加执行权限

[root@100 ~]# chmod +x /etc/mha/scripts/master_ip_failover

2.7 验证 MHA 相关操作

 2.7.1 通过通 masterha_check_ssh 命令验证 命 ssh 信任登录是否成功

[root@100 mha4mysql-manager-0.58]# masterha_check_ssh --conf=/etc/mha/app1.cnf 
Thu Sep 17 16:01:24 2020 - [info] Reading default configuration from /etc/masterha_default.cnf.. 
Thu Sep 17 16:01:24 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf.. 
Thu Sep 17 16:01:24 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
..
Thu Sep 17 16:01:32 2020 - [info] All SSH connection tests passed successfully. 
Use of uninitialized value in exit at /usr/local/bin/masterha_check_ssh line 44.

可见验证通过

2.7.2 通过通 masterha_check_repl 命令验证 命 mysql 主从复制是否成功 

[root@100 mha4mysql-manager-0.58]# masterha_check_repl --conf=/etc/mha/app1.cnf 
# 最后出现以下提示,则表示通过 
MySQL Replication Health is OK

2.8 启动 MHA 初次使用的时候,需要先在master上添加vip,以后就不需要了

ifconfig ens33:0 192.168.232.99 netmask 255.255.255.0 up

注意: ens33是我虚拟机上的网卡名,这里要换成自己的。192.168.232.99也要换成自己的。

启动manager, 这一步在manager上操作:

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

检查 MHA 状态

[root@100 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

MHA 的日志保存在/var/log/masterha/app1/manager.log 下

[root@localhost mha4mysql-manager-0.58]# tail -f /var/log/mha/app1/manager.log 
Thu Sep 17 10:49:17 2020 - [info] Reading default configuration from /etc/masterha_default.cnf.. 
Thu Sep 17 10:49:17 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf.. 
Thu Sep 17 10:49:17 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..

2.8.1 关闭关 MHA

masterha_stop --conf=/etc/mha/app1.cnf

2.9 宕机测试 手动停止101 的 MySQL master,然后查看其它节点情况。

[root@node01 ~]# systemctl stop mysqld

在192.168.232.102上查看VIP

[root@102 ~]# ifconfig | grep 232 
inet 192.168.232.102 netmask 255.255.255.0 broadcast 192.168.232.255 
inet 192.168.232.99 netmask 255.255.255.0 broadcast 192.168.232.255

发现192.168.232.99已经从192.168.232.101漂移到192.168.232.102上面了。 

在192.168.232.103上查看复制状态:

[root@103 ~]# mysql -uroot -p123456 -e "show slave status\G" | egrep 'Master_Host' 
mysql: [Warning] Using a password on the command line interface can be insecure. Master_Host: 192.168.232.102

发现103已经变成从102复制内容了, 103之前是从101复制内容的。之所以发生变化,是因为101宕机了,所以mha将102提升为master,然后将其他slave的 复制源从原先的101转而指向102。

至此,我们的MHA大功告成了。

3 总结 MHA 的切换过程 的 ,共包括以下的步骤:

1. 配置文件检查阶段,这个阶段会检查整个集群配置文件配置 

2. 宕机的 master 处理,这个阶段包括虚拟 ip 摘除操作,主机关机操作(由于没有定义power_manager脚本,不会关机) 

3. 复制 dead maste 和最新 slave 相差的 relay log,并保存到 MHA Manger 具体的目录下 

4. 识别含有最新更新的 slave 

5. 应用从 master 保存的二进制日志事件(binlog events)(这点信息对于将故障master修复后加入集群很重要) 

6. 提升一个 slave 为新的 master 进行复制 

7. 使其他的 slave 连接新的 master 进行复制

(0)
分享:

本文由:xiaoshu168.com 作者:xiaoshu发表,转载请注明来源!

相关阅读