使用MHA实现mysql高可用性(centos7.5+mysql5.7.23+MHA0.58)

一、MHA概述

1、MHA

         MHA(Master High Availability)事由日本人DeNA开发的一套MySQL高可用性环境下故障切换和主从提升的软件,目前在MySQL高可用方面是一个相对成熟的解决方案。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

2、MHA的主要功能

(1)自动故障检测和自动故障转移

(2)交互式(手动)故障转移

(3)在线切换Master到不同的主机

3、MHA的优势

(1)自动故障转移快

(2)主库崩溃不存在数据一致性问题

(3)配置不需要对当前mysql环境做重大修改

(4)不需要添加额外的服务器(仅一台manager就可管理上百个replication)

(5)性能优秀,可工作在半同步复制和异步复制

(6)只要replication支持的存储引擎,MHA都支持,不会局限于innodb

4、MHA的组成部分

         MHA由Manager节点和Node节点组成;MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上。

5、MHA工作原理

(1)MHA Manager会定时探测集群中的master节点

(2)当master出现故障时,从宕机崩溃的master保存二进制日志事件(binlog events);

(3)识别含有最新更新的slave;

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

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

(6)提升一个slave为新的master,使其他的slave连接新的master进行复制;

二、MHA安装部署

1、环境准备

(1)环境准备

主机名

IP地址

节点信息

数据库版本

系统版本

MYSQL01

192.168.16.151

Mysql主节点

5.7.23

centos7.5

MYSQL02

192.168.16.152

Mysql从节点

5.7.23

centos7.5

MYSQL03

192.168.16.153

Mysql从节点

5.7.23

centos7.5

MANAGER

192.168.16.155

MHA manager节点

 

centos7.5

(2)拓扑结构

使用MHA实现mysql高可用性(centos7.5+mysql5.7.23+MHA0.58)_第1张图片

(3)设置主机名并互相做秘钥的认证

         首先需要在各个节点上配置各个主机的主机名,使各节点通过主机名能够互相解析。

]# tail -4f /etc/hosts
192.168.16.151 MYSQL01
192.168.16.152 MYSQL02
192.168.16.152 MYSQL03
192.168.16.155 MANAGER

         由于MHA manager通过SSH访问所有的node节点,各个node节点也同样通过SSH来相互发送不同的relay log 文件,所以要在每一个node和manager上配置SSH无密码登陆。

# 在每个节点上分别生成秘钥对
[root@MYSQL01 ~]# ssh-keygen
# 每台节点分别将自己的公钥发送到另外的三台节点
]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

2、配置mysql主从环境

(1)配置mysql主节点及从节点

         Mysql主节点的配置如下:

[mysqld]
log-bin=mysql-bin 
server-id=1
replicate-do-db=course
character-set-server=utf8
init_connect='SET AUTOCOMMIT=0;set names utf8'

         mysql两台slave节点的配置如下:

[mysqld]
log-bin=mysql-bin 
server-id=2|3     #两个节点的id配置不同
replicate-do-db=course   # 只同步course库
# 更新数据的语句也记录在slave自己的bin log中
log-slave-updates=true
# 设置relay_log的清除方式
relay_log_purge=0 
skip-slave-start=1
# 设置字符集及连接客户端字符集
character-set-server=utf8
init_connect='SET AUTOCOMMIT=0;set names utf8'

(2)创建用于复制的用户

         由于同步数据时将所有的数据都同步到了主库,所有创建用于同步的用户时只需在主库创建,如果同步时不同步”mysql”库,需要在三台数据库主机上分别创建用于复制的用户。

# 创建用于复制的用户
mysql> CREATE USER 'repl'@'192.168.16.%' IDENTIFIED BY 'replication';   
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.16.%';

(3)同步数据

         1)获取主库的bin log信息以及备份主库

# 将主库锁定
mysql> FLUSH TABLES WITH READ LOCK;
# 获取bin log日志信息
mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000006
         Position: 4838
# 备份库
]# mysqldump --all-databases --master-data -u root -p > course.sql
# 登录主库释放锁
mysql>  unlock tables;
# 将备份文件传到从库
]# scp course.sql [email protected]:/data/
]# scp course.sql [email protected]:/data/

         2)在从库上导入数据并开启主从复制

# 在两台slave上分别导入数据
]# mysql -uroot -p  CHANGE MASTER TO
    -> MASTER_HOST='192.168.16.151',
    -> MASTER_PORT=3306,
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='replication',
    -> MASTER_LOG_FILE='mysql-bin.000006',
    -> MASTER_LOG_POS=4838;
# 开启同步
mysql> start slave;

(4)设置mysql程序及binglog程序的软连接

         虽然mysql程序已经加入了环境变量,如果缺省路径下mysql客户端不存在在使用MHA时会报错。

]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog

3、安装MHA

(1)在各节点上安装mha4mysql-node

         在四台机器上上分别安装mha4mysql-node。

         mha4mysql-node下载地址:https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58

         mha4mysql-manager下载地址:https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58

# 安装net-tools,最小化安装的centos7中没有一些网络管理工具
]# yum install –y net-tools
# 安装epel yum源
]# yum install epel-release
# 在安装前先安依赖软件
]# yum install –y perl-DBD-MySQL
# 安装mha4mysql-node
]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

(3)在管理节点上安装manage节点

# 在管理节点安装依赖软件
]# yum install -y perl-Config-Tiny perl-Log-Dispatch  perl-Parallel-ForkManager
# 在管理节点安装mha4mysql-manager
]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

(4)manager管理工具

         在manager节点安装完成后会生成一些管理工具,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信息

4、配置MHA

(1)配置MHA

         MHA管理端和客户端安装完成后,在管理端需要创建MHA的配置文件,配置文件内容如下:

# 创建manager工作目录
]# mkdir /data/manager –p
# manager的配置文件
[root@MANAGER ~]# cat /etc/manager/manager.conf 
[server default] 
user=root 
password=dayi123
ssh_user=root 
manager_workdir=/data/manager
remote_workdir=/tmp
repl_user=repl 
repl_password=replication 
[server1] 
hostname=MYSQL01
port=3306 
master_binlog_dir=/data/mysql/data

[server2] 
hostname=MYSQL02
port=3306 
master_binlog_dir=/data/mysql/data
[server3] 
hostname=MYSQL03
port=3306 
master_binlog_dir=/data/mysql/data

(2)MHA主要配置文件说明

         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的日志                      

         master_ip_failover_script= /usr/local/bin/master_ip_failover:设置自动failover时候的切换脚本

         master_ip_online_change_script= /usr/local/bin/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的主机非常有用

5、检查MHA的环境是否工作正常

(1)通过masterha_check_ssh脚本检测SSH连接是否配置正常

]# masterha_check_ssh --conf=/etc/app1.cnf 
Mon Oct 29 12:05:48 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Oct 29 12:05:48 2018 - [info] Reading application default configuration from /etc/app1.cnf..
Mon Oct 29 12:05:48 2018 - [info] Reading server configuration from /etc/app1.cnf..
Mon Oct 29 12:05:48 2018 - [info] Starting SSH connection tests..
Mon Oct 29 12:05:53 2018 - [debug] 
…….
Mon Oct 29 12:05:52 2018 - [debug]  Connecting via SSH from root@MYSQL03(192.168.16.153:22) to root@MYSQL02(192.168.16.152:22)..
Mon Oct 29 12:05:52 2018 - [debug]   ok.
Mon Oct 29 12:05:53 2018 - [info] All SSH connection tests passed successfully.

(2)在管理节点检查复制配置

         为了让MHA正常工作,所有的master和slave必须在配置文件中正确配置,MHA可通过masterha_check_repl 脚本检测复制是否正确配置。

]# masterha_check_repl --conf=/etc/app1.cnf 
Fri Nov  2 16:27:47 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Nov  2 16:27:47 2018 - [info] Reading application default configuration from /etc/app1.cnf..
……
Fri Nov  2 16:27:53 2018 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.

三、MHA的管理

         Mysql中主从的工作状态监测及切换事由manager节点来完成的,MHA安装完成以及检测通过后就可以根据自己的需求开启以及停止manager,让manager工作起来。

1、启动Manager

         Manager是通过 masterha_manager 命令开启,启动后需要将它放在后台运行。

         当MHA manager启动监控以后,如果没有异常则不会打印任何信息。我们可通过masterha_check_status命令检查manager的状态。

# 启动Manager
]# nohup masterha_manager --conf=/etc/app1.cnf > /var/log/mha_manager.log < /dev/null &
# 检测manager的工作状态
]# masterha_check_status --conf=/etc/app1.cnf
app1 (pid:22330) is running(0:PING_OK), master:MYSQL0

2、停止MHA manager

         当需要停止manager时,可以通过 masterha_stop命令来停止manager。

# 停止manager
]#  masterha_stop --conf=/etc/app1.cnf 
Stopped app1 successfully.

3、故障的切换

(1)自动故障切换

         Manager启动后,manager会自动去监测主从同步的状态,当主节点故障时,会自动进行故障的转移将从节点提升为主节点,让其他的从节点去新的主节点同步。

# 将主库192.168.16.151关闭后,查看manager的日志,主要的切换记录如下:
]# tail -100f /var/log/mha_manager.log
……
app1: MySQL Master failover MYSQL01(192.168.16.151:3306) to MYSQL02(192.168.16.152:3306) succeeded
Master MYSQL01(192.168.16.151:3306) is down!
Check MHA Manager logs at MANAGER for details.
Started automated(non-interactive) failover.
The latest slave MYSQL02(192.168.16.152:3306) has all relay logs for recovery.
Selected MYSQL02(192.168.16.152:3306) as a new master.
MYSQL02(192.168.16.152:3306): OK: Applying all logs succeeded.
MYSQL03(192.168.16.153:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
MYSQL03(192.168.16.153:3306): OK: Applying all logs succeeded. Slave started, replicating from MYSQL02(192.168.16.152:3306)
MYSQL02(192.168.16.152:3306): Resetting slave info succeeded.
Master failover to MYSQL02(192.168.16.152:3306) completed successfully.

(2)手动故障切换

         当在业务上没有启用MHA自动切换功能,当主服务器故障时,需要人工手动调用MHA来进行故障切换操作。

# 进行配置停掉的主节点,让成新的从节点;并manager进程时停掉的,否则会影响手动故障转移
]#  masterha_stop --conf=/etc/app1.cnf
# 切换时需要将master停掉,否则会报错,在切换命令中使用主机名,不要使用ip,否则也会报错,在切换时也需要确认切换
]# masterha_master_switch --master_state=dead --conf=/etc/app1.cnf --dead_master_host=MYSQL02 --dead_master_port=3306 --new_master_host=MYSQL01 --new_master_port=3306 --ignore_last_failover……..
Started manual(interactive) failover.
The latest slave MYSQL01(192.168.16.151:3306) has all relay logs for recovery.
Selected MYSQL01(192.168.16.151:3306) as a new master.
MYSQL01(192.168.16.151:3306): OK: Applying all logs succeeded.
MYSQL03(192.168.16.153:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
MYSQL03(192.168.16.153:3306): OK: Applying all logs succeeded. Slave started, replicating from MYSQL01(192.168.16.151:3306)
MYSQL01(192.168.16.151:3306): Resetting slave info succeeded.
Master failover to MYSQL01(192.168.16.151:3306) completed successfully.

(3)在线切换

         为了保证数据完全一致性,在最快的时间内完成切换,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秒。

# 在切换前先停掉manage,同时也恢复上面手动切换时停掉的MYSQL02为MYSQL01的从节点
]# masterha_stop --conf=/etc/app1.cnf
# 在线切换MYSQL03为主节点,切换时不需要停掉现有的主节点,在切换的过程中需要确认
]# masterha_master_switch --conf=/etc/app1.cnf --master_state=alive --new_master_host=MYSQL03 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
…..
Sat Nov  3 11:17:27 2018 - [info]  Executed CHANGE MASTER.
Sat Nov  3 11:17:27 2018 - [info]  Slave started.
Sat Nov  3 11:17:27 2018 - [info] All new slave servers switched successfully.
Sat Nov  3 11:17:27 2018 - [info] 
Sat Nov  3 11:17:27 2018 - [info] * Phase 5: New master cleanup phase..
Sat Nov  3 11:17:27 2018 - [info] 
Sat Nov  3 11:17:27 2018 - [info]  MYSQL03: Resetting slave info succeeded.
Sat Nov  3 11:17:27 2018 - [info] Switching master to MYSQL03(192.168.16.153:3306) completed successfully.

         在线切换完成后,从节点MYSQL03成为了主节点,原来的主节点MYSQL01变为从节点,两个从节点会去新的主节点MYSQL03复制。

         在切换过程中的参数说明:

         -orig_master_is_new_slave:切换时加上此参数是将原 master 变为 slave 节点,如果不加此参数,原来的 master 将不启动

         --running_updates_limit=10000:故障切换时,候选master 如果有延迟的话, mha 切换不能成功,加上此参数表示延迟在此时间范围内都可切换(单位为s),但是切换的时间长短是由recover 时relay 日志的大小决定。

4、在MHA环境中配置VIP

         通过MHA进行故障转以后,连接Mysql数据库的服务并不知道Mysql复制环境中进行了故障的转移,同时连接mysql的服务也无法知晓主节点是哪一个,此时,可以通过配置VIP的方式让所有的应用程序连接VIP,当mysql故障切换时,VIP会自动漂移到新的主节点。vip配置可以采用两种方式,一种通过keepalived的方式管理;另外一种通过脚本方式启动VIP,下面以脚本的方式进行演示。

# 为mysql主节点在配置一个IP地址
]# ifconfig eno16777736:2 192.168.16.156/24
# 修改manager配置文件,添加VIP漂移脚本配置文件
master_ip_failover_script=/usr/local/bin/master_ip_failover
# 创建脚本/usr/local/bin/master_ip_failover,内容如下
]# cat /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.16.156/24';
my $key = '2';
my $ssh_start_vip = "/sbin/ifconfig eno16777736:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eno16777736:$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";
}
# 为脚本赋予执行的权限
]# chmod a+x master_ip_failover

         切换脚本中的去连接mysql各节点配置vip是通过”user”@”hostname”的方式去连接各节点配置vip的,所以在配置完各节点配置完ssh秘钥认证后,要通过”ssh user@hostname”的方式去连接各个节点建立缓存(第一次通过秘钥登录需要输入”yes”确认);否则脚本在执行到”Disabling the VIP on old master”会执行不下去。

 

你可能感兴趣的:(数据库)