使用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)拓扑结构

(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 root@192.168.16.151
]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.16.152
]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.16.153
]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.16.155

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 root@192.168.16.152:/data/
]# scp course.sql root@192.168.16.153:/data/

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

# 在两台slave上分别导入数据
]# mysql -uroot -p </data/mysql.sql
# 登录两台从库分别配置同步
mysql> 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”会执行不下去。

 

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值