mysql高可用MHA

目录

主服务器的自动监控和故障转移原理

1、准备环境

2、安装数据库

3、MySQL主从配置

4、MHA高可用搭建


主服务器的自动监控和故障转移原理

MHA监控复制架构的主服务器,一旦检测到主服务器故障,就会自动进行故障转移。即使有些从服务器没有收到最新的relay log,MHA自动从最新的从服务器上识别差异的relay log并把这些日志应用到其他从服务器上,因此所有的从服务器保持一致性了。MHA通常在几秒内完成故障转移,9-12秒可以检测出主服务器故障,7-10秒内关闭故障的主服务器以避免脑裂,几秒中内应用差异的relay log到新的主服务器上,整个过程可以在10-30s内完成。还可以设置优先级指定其中的一台slave作为master的候选人。由于MHA在slaves之间修复一致性,因此可以将任何slave变成新的master,而不会发生一致性的问题,从而导致复制失败。

交互式主服务器故障转移

可以只使用MHA的故障转移,而不用于监控主服务器,当主服务器故障时,人工调用MHA来进行故障故障。

非交互式的主故障转移

不监控主服务器,但自动实现故障转移。这种特征适用于已经使用其他软件来监控主服务器状态,比如heartbeat来检测主服务器故障和虚拟IP地址接管,可以使用MHA来实现故障转移和slave服务器晋级为master服务器。

在线切换主从服务器

在许多情况下,需要将现有的主服务器迁移到另外一台服务器上。比如主服务器硬件故障,RAID控制卡需要重建,将主服务器移到性能更好的服务器上等等。维护主服务器引起性能下降,导致停机时间至少无法写入数据。另外,阻塞或杀掉当前运行的会话会导致主主之间数据不一致的问题发生。MHA提供快速切换和优雅的阻塞写入,这个切换过程只需要0.5-2s的时间,这段时间内数据是无法写入的。在很多情况下,0.5-2s的阻塞写入是可以接受的。因此切换主服务器不需要计划分配维护时间窗口(呵呵,不需要你在夜黑风高时通宵达旦完成切换主服务器的任务)。

MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)

要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,管理节点可以和master在一台机器上。所以如果你只有二台机器的话,heartbeat,keepalive等都是不错的选择了。

展示了如何通过MHA Manager管理多组主从复制。可以将MHA工作原理总结为如下:

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

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

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

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

(5)提升一个slave为新的master;

(6)使其他的slave连接新的master进行复制

MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。

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工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

save_binary_logs                保存和复制master的二进制日志
apply_diff_relay_logs           识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog              去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs                清除中继日志(不会阻塞SQL线程)
注意:

为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制。关于半同步复制原理各位自己进行查阅。(不是必须)

———————————————————————————————————————————

1、准备环境

主机名

IP地址

角色

master

192.168.184.127

主库Master

slave1

192.168.184.128

从库Slave1(主备)

slave2

192.168.184.129

从库Slave2

mha

192.168.184.130

管理节点Mha_manage

1. MySQL安装(3台)Master\Slave1\Slave2三台都需要安装mysql

分别修改主机名称

[root@master ~]# hostnamectl set-hostname master

[root@slave1 ~]# hostnamectl set-hostname slave1

[root@slave2 ~]# hostnamectl set-hostname slave2

[root@mha ~]# hostnamectl set-hostname mha

将上面的内容添加到每台/etc/hosts当中

# vim /etc/hosts

192.168.184.127 master

192.168.184.128 slave1

192.168.184.129 slave2

192.168.184.130 mha

服务器之间,无密码ssh登录

# ssh-keygen -t rsa

# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.184.127

# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.184.128

# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.184.129

# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.184.130

———————————————————————————————————————————

2、安装数据库

创建安装用户组mysql

# useradd  mysql

设置ulimit参数

# sudo vim /etc/security/limits.conf

文件最后添加

* soft nofile 65536

* hard nofile 131072

* soft nproc 65536

* hard nproc 65536

(1)开始执行安装

# yum install -y libaio

# tar -xvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local

# cd /usr/local/

# mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql

# cd /usr/local/mysql

# chown -R mysql.mysql .

创建数据存放目录

# mkdir -p /data/mysql

# chown -R mysql.mysql /data/mysql

执行初始化命令

# bin/mysqld --initialize --user=mysql --datadir=/data/mysql

如下图红框内是初始密码,需要记录下来。

(2) 将mysql注册为系统服务

# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld

# chmod 700 /etc/rc.d/init.d/mysqld

# chkconfig --add mysqld  配置成开机自启

# service mysqld start

本地连接数据库,密码是上图红框中的初始密码

# cd /usr/local/mysql/bin/

# ./mysql -uroot -p

alter user 'root'@'localhost' IDENTIFIED BY '123456';

update mysql.user set host = '%' where user = 'root' and host='localhost';

flush privileges;

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'ziguangruanjian';

(3)关闭防火墙
不同的MySQL直接要互相访问,需要关闭Linux的防火墙,否则就要在配置/etc/sysconfig/iptables中增加规则。配置防火墙不是本次作业的重点,所以四台服务器均关闭防火墙。

# systemctl stop firewalld
永久关闭防火墙:(可选)
# systemctl disable firewald
 


3、MySQL主从配置

(1)Master节点修改配置文件
# vim /etc/my.cnf

#bin_log配置 
log_bin=mysql-bin 
server-id=1 
sync-binlog=1 
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performance_schema 
binlog-ignore-db=sys 
#relay_log配置 
relay_log=mysql-relay-bin 
log_slave_updates=1 
relay_log_purge=0

重启服务

# service restart mysqld


(2)主库给从库授权

登录Master_MySQL,在MySQL命令行执行如下命令:

mysql> grant replication slave on *.* to root@'%' identified by '123456'; 
mysql> grant all privileges on *.* to root@'%' identified by '123456'; 
mysql> flush privileges; 
//查看主库状态信息,例如master_log_file='mysql-bin.000007',master_log_pos=154 
mysql> show master status;
 


(3)Slave1节点
修改Slave的MySQL配置文件my.cnf,两台Slave的server-id分别设置为2和3

# vim /etc/my.cnf

#bin_log配置 
log_bin=mysql-bin 
#服务器ID,从库1是2,从库2是3 
server-id=2 
sync-binlog=1 
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performance_schema 
binlog-ignore-db=sys 
#relay_log配置 
relay_log=mysql-relay-bin 
log_slave_updates=1 
relay_log_purge=0 
read_only=1

重启服务

# service restart mysqld


(4)开启同步
登录MySQL,在Slave节点的MySQL命令行执行同步操作,例如下面命令(注意参数与上面show master status操作显示的参数一致):

mysql>change master to master_host='192.168.184.127',master_port=3306,master_user='root',master_password ='123456',master_log_file='mysql-bin.000001',master_log_pos=154; 

mysql>start slave; // 开启同步


(5)Slave2节点
执行与Slave1相同的节点,唯一的区别是:server-id不同

(6) 配置半同步复制
Master节点
登录MySQL,在MySQL命令行执行下面命令安装插件

mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so'; 
show variables like '%semi%';


# vim /etc/my.cnf

# 自动开启半同步复制 
rpl_semi_sync_master_enabled=ON 
rpl_semi_sync_master_timeout=1000

重启MySQL服务

# service restart mysqld
 


(7)Slave节点
两台Slave节点都执行以下步骤。
登录MySQL,在MySQL命令行执行下面命令安装插件

mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

# 自动开启半同步复制

# vim /etc/my.cnf
rpl_semi_sync_slave_enabled=ON

重启服务

# service restart mysqld
 

(8)测试半同步状态
首先通过MySQL命令行检查参数的方式,查看半同步是否开启。

mysql>show variables like '%semi%';
 


然后通过MySQL日志再次确认。

#cat /var/log/mysqld.log

可以看到日志中已经启动半同步信息,例如:

Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000005, 154)
 

———————————————————————————————————————————
若从库日志有如下报错,是因为虚机是克隆的master节点,克隆的虚拟机与原虚拟机的UUID是一样的,冲突了

[ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593

解决方案:
删除slave1、slave2、mha机器上的这个文件/data/mysql/auto.cnf,然后重启数据库即可解决
这个文件删除,重启MySQL之后,会自动生成,无须担心

再次查看master节点的日志,如下图:证明半同步开启成功~

cat /var/log/mysqld.log
 

4、MHA高可用搭建

分别在mysql的服务器上执行以下命令

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

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


(1)MHA下载安装
MySQL5.7对应的MHA版本是0.5.8,所以在GitHub上找到对应的rpm包进行下载,MHA manager和node的安装包需要分别下载:

https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58 
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
下载后,将Manager和Node的安装包分别上传到对应的服务器。

三台MySQL服务器需要安装node,MHA Manager服务器需要安装manager和node
提示:也可以使用wget命令在linux系统直接下载获取,例如

wget https://github.com/yoshinorim/mha4mysql- manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

(2)MHA node安装:
在四台服务器上安装mha4mysql-node。
# yum install perl-DBD-MySQL -y 
# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
 

(3)MHA manager安装:
在MHA Manager服务器安装mha4mysql-node和mha4mysql-manager。
# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# rpm -ivh epel-release-latest-7.noarch.rpm
# yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y

# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
 

提示:由于perl-Log-Dispatch和perl-Parallel-ForkManager这两个被依赖包在yum仓库找不到,
因此安装epel-release-latest-7.noarch.rpm。在使用时,可能会出现下面异常:Cannot
retrieve metalink for repository: epel/x86_64。可以尝试使
用/etc/yum.repos.d/epel.repo,然后注释掉metalink,取消注释baseurl。

(4)MHA 配置文件
MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的
Master/Slave 集群也可共享全局配置。

初始化配置目录
#目录说明 
# /var/log                              (CentOS目录) 
# /mha                                 (MHA监控根目录) 
# /app1                                (MHA监控实例根目录)
# /manager.log                    (MHA监控实例日志文件) 

# mkdir -p /var/log/mha/app1 
# touch /var/log/mha/app1/manager.log

需要先在master的MySQL主库执行命令,创建一个新用户mha

# mysql -uroot -p

mysql> create user 'mha'@'%' identified by 'root'; 
mysql> grant all on *.* to mha@'%' identified by 'root'; 
mysql> flush privileges; 

———————————————————————————————————————————
配置监控全局配置文件

# vim /etc/masterha_default.cnf
[server default] 
user=mha 
password=root 
port=3306 
#ssh登录账号 
ssh_user=root
#从库复制账号和密码 
repl_user=root 
repl_password=123456
port=3306 
#ping次数 
ping_interval=1 
#二次检查的主机 
secondary_check_script=masterha_secondary_check -s 192.168.184.127 -s 192.168.184.128 -s 192.168.184.129

———————————————————————————————————————————
配置监控实例配置文件
# mkdir -p /etc/mha

# vim /etc/mha/app1.cnf

[server default]
#MHA监控实例根目录 
manager_workdir=/var/log/mha/app1 
#MHA监控实例日志文件 
manager_log=/var/log/mha/app1/manager.log 

#[serverx]             服务器编号 
#hostname             主机名 
#candidate_master     可以做主库 
#master_binlog_dir     binlog日志文件目录 

[server1] 
hostname=192.168.184.127 
candidate_master=1 
master_binlog_dir="/var/lib/mysql" 

[server2] 
hostname=192.168.184.128 
candidate_master=1 
master_binlog_dir="/var/lib/mysql"

[server3] 
hostname=192.168.184.129
candidate_master=1 
master_binlog_dir="/var/lib/mysql"

———————————————————————————————————————————

(5)编辑自动failover脚本

[root@mha ~]# vim /etc/mha/scripts/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.184.131/24';

my $key = '1';

my $ssh_start_vip = "/usr/sbin/ifconfig ens33:$key $vip";

my $ssh_stop_vip = "/usr/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";

}

———————————————————————————————————————————

(6)配置手动 failover脚本

[root@mha ~]# vim /etc/mha/scripts/master_ip_online_change

#!/bin/bash

source /root/.bash_profile

vip=`echo '192.168.184.131/24'`  #设置VIP

key=`echo '1'`



command=`echo "$1" | awk -F = '{print $2}'`

orig_master_host=`echo "$2" | awk -F = '{print $2}'`

new_master_host=`echo "$7" | awk -F = '{print $2}'`

orig_master_ssh_user=`echo "${12}" | awk -F = '{print $2}'`

new_master_ssh_user=`echo "${13}" | awk -F = '{print $2}'`



#要求服务的网卡识别名一样,都为eth1(这里是)

stop_vip=`echo "ssh root@$orig_master_host /usr/sbin/ifconfig ens33:$key down"`

start_vip=`echo "ssh root@$new_master_host /usr/sbin/ifconfig ens33:$key $vip"`



if [ $command = 'stop' ]

     then

      echo -e "\n\n\n****************************\n"

       echo -e "Disabled thi VIP - $vip on old master: $orig_master_host \n"

       $stop_vip

       if [ $? -eq 0 ]

         then

        echo "Disabled the VIP successfully"

          else

        echo "Disabled the VIP failed"

        fi

        echo -e "***************************\n\n\n"

      fi



if [ $command = 'start' -o $command = 'status' ]

      then

        echo -e "\n\n\n*************************\n"

        echo -e "Enabling the VIP - $vip on new master: $new_master_host \n"

        $start_vip

        if [ $? -eq 0 ]

          then

        echo "Enabled the VIP successfully"

          else

        echo "Enabled the VIP failed"

       fi

       echo -e "***************************\n\n\n"

Fi

将脚本赋予可执行权限

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

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

———————————————————————————————————————————

(7)MHA 配置检测/执行ssh通信检测:
在MHA Manager服务器上执行,如下图所示验证成功:

# masterha_check_ssh --conf=/etc/mha/app1.cnf

———————————————————————————————————————————
(8)检测MySQL主从复制:
在MHA Manager服务器上执行:

# masterha_check_repl --conf=/etc/mha/app1.cnf

 出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。

———————————————————————————————————————————

(9)MHA Manager启动

先在master上绑定vip,(只需要在master绑定这一次,以后会自动切换)

# yum -y install net-tools

[root@master ~]# /usr/sbin/ifconfig ens33:1 192.168.184.131/24

在MHA 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@mha ~]# tailf /var/log/mha/app1/manager.log

如果最后一行是如下,表明启动成功

Ping(SELECT) succeeded, waiting until MySQL doesn’t respond..


查看监控状态命令如下:

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

#关闭mha

[root@mha ~]# masterha_stop --conf=/etc/masterha/app1.cnfz

———————————————————————————————————————————
(10)测试MHA故障转移,模拟主节点崩溃
在MHA Manager服务器执行打开日志命令:

# service stop mysqld

# tail -200f /var/log/mha/app1/manager.log
查看MHA日志,可以看的主机会切换为新的主库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值