MHA高可用配置及故障切换

目录

一、MHA概述

1.什么是MHA

2.MHA的组成

3.MHA的特点

4.MHA的工作原理

[二、案例实施:搭建MySQL MHA高可用及故障切换](#二、案例实施:搭建MySQL MHA高可用及故障切换)

1、主从复制配置

1)时间同步

3)修改主机名和服务端的hosts文件

[4)vim /etc/my.cof](#4)vim /etc/my.cof)

5)主从服务器创建并授权数据库主从复制和MHA用户

6)主服务器验证

[2、安装 MHA 软件](#2、安装 MHA 软件)

[1)vim /etc/yum.conf](#1)vim /etc/yum.conf)

[2)下载 node 组件](#2)下载 node 组件)

3)所有服务器配置无密码认证

4)创建MHA软件目录并拷贝配置文件

5)在manager节点上测试ssh无密码认证

6)在manager节点上启动MHA

7)模拟故障

3、若原master修复完成,如何加入到集群中?

4、MHA高可用集群部署总结


高可用方案:keepalived高可用、MHA、MMM、MySQL Cluster、PXC

一、MHA概述

1.什么是MHA

MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。

MHA的出现就是解决MySQL 单点的问题。

MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

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

2.MHA的组成

MHA Node(数据节点)

MHA Node运行在每台MySQL服务器上。

MHA Manager(管理节点)

MHA Manager可以单独部署在一台独立的机器上,管理多个master-slave集群;也可以部署在一台slave节点上。

MHA Manager会定时探测集群中的master节点。当master出现故障时,它可以自动将最新数据的slave提升为新的master, 然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

3.MHA的特点

  • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
  • 使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
  • 目前MHA支持一主多从架构,最少三台服务,即一主两从

4.MHA的工作原理

MHA Node 部署在每台MySQL服务器上,MHA Manger 可以单独部署在一台独立服务器 上或者某个从库服务器上。

MHA Manger 会定时探测MySQL集群中主库的状态,当主库出现故障,MHA Manger会自动将一台拥有最新数据的从库提升为新的主库,也会在新的主库生成写入VIP,然后还会将其他的从库重新指向新的主库做主从复制,从而保证MySQL集群的高可用。整个故障转移过程对客户端应用来说是完全透明的。

二、案例实施:搭建MySQL MHA高可用及故障切换

服务端:20.0.0.114

主:20.0.0.110

从1:20.0.0.111

从2:20.0.0.113

1、主从复制配置

1)时间同步

###所有服务器关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

服务器

3)修改主机名和服务端的hosts文件

4)vim /etc/my.cof

vim /etc/my.cnf
server-id = 1 
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-log-bin    
relay-log-index=relay-log-bin.index
log-slave-updates = 1   
 
systemctl restart mysqld

5)主从服务器创建并授权数据库主从复制和MHA用户

mysql -uroot -p123
create user 'myslave'@'192.168.9.%' identified by 'myslave123';
grant replication slave on *.* to 'myslave'@'192.168.9.%';
create user 'manager'@'192.168.9.%' identified by 'manager123';
grant all on *.* to 'manager'@'192.168.9.%';
flush privileges;
show master status;

两个从库必须设置为只读模式:

6)主服务器验证

2、安装 MHA 软件

1)vim /etc/yum.conf

vim /etc/yum.conf
----
cachedir=/opt/yumcache
keepcache=1
----
cd /opt
mkdir /opt/yumcache
cd /etc/yum.repos.d
mv repo.bak/* ./
mv local.repo repo.bak
cd /opt/yumcache
yum install -y epel-release

服务端:

----安装依赖包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
----
mkdir mha
find ./ -name "*.rpm" -exec mv {} ./mha/ \;    #将依赖包挪入该目录
scp -r mha/ 192.168.9.150:/opt    #将包复制到主服务器
scp -r mha/ 192.168.9.210:/opt    #将包复制到从服务器
scp -r mha/ 192.168.9.120:/opt    #将包复制到从服务器

主:

服务端:

从:

vim /etc/yum.repos.d/local.repo

2)下载 node 组件

cd /opt
rz -E
#mha4mysql-node-0.57.tar.gz
tar xf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57/
perl Makefile.PL
make && make install

服务端下载两个组件:

cd /opt
rz -E
#mha4mysql-node-0.57.tar.gz
tar xf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57/
perl Makefile.PL
make && make install
rz -E
#mha4mysql-manager-0.57.tar.gz
tar xf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install

3)所有服务器配置无密码认证

主:

ssh-copy-id 20.0.0.111
ssh-copy-id 20.0.0.113

从1:

ssh-copy-id 20.0.0.110
ssh-copy-id 20.0.0.113

从2:

ssh-copy-id 20.0.0.110
ssh-copy-id 20.0.0.111

服务端:

ssh-copy-id 20.0.0.110
ssh-copy-id 20.0.0.111
ssh-copy-id 20.0.0.113

cd /opt/mha4mysql-manager-0.57/samples
cp -a scripts/ /usr/local/bin
cd /usr/local/bin
cp scripts/master_ip_failover /usr/local/bin

服务端:

------清空原先master_ip_failover的内容添加以下配置

#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
 
use Getopt::Long;
 
my (
    $command, $orig_master_host, $orig_master_ip,$ssh_user,
    $orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
    $orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);
 
# 这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效
my $vip = '20.0.0.200/24';
my $key = '1';
# 这里的网卡名称 "ens33" 需要根据你机器的网卡名称进行修改
# 如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一
# 我这边实际情况是修改成统一的网卡名称
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I ens33 -c 3 -A $vip";
 
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,
    'orig_master_ssh_port=i' => \$orig_master_ssh_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
    'new_master_ssh_port' => \$new_master_ssh_port,
    'new_master_user' => \$new_master_user,
    'new_master_password' => \$new_master_password
 
);
 
exit &main();
 
sub main {
    $ssh_user = defined $ssh_user ? $ssh_user : 'root';
    print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();
        &start_arp();
            $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() {
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
 
sub start_arp() {
    `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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";
}

4)创建MHA软件目录并拷贝配置文件

创建相关目录(所有节点)

cd /usr/local/bin/scripts
cp master_ip_online_change power_manager /usr/local/bin/
cd /usr/local/bin/
chmod +x master_ip_failover

服务端:

cd /opt
mkdir /opt/mysql-mha
cd mysql-mha
mkdir mha-manager
mkdir mha-node

vim mysql_mha.cnf

[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha-manager
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=manager
password=manager123
port=3306
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_user=myslave
repl_password=myslave123
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.111 -s 20.0.0.113
shutdown_script=""
ssh_user=root
 
[server1]
hostname=20.0.0.110
port=3306
 
[server2]
hostname=20.0.0.111
port=3306
 
[server3]
hostname=20.0.0.113
port=3306

5)在manager节点上测试ssh无密码认证

masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf
masterha_check_repl -conf=./mysql_mha.cnf   #测试mysql主从连接情况

主从服务器(三台服务器都设置)

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

6)在manager节点上启动MHA

nohup masterha_manager \
--conf=/opt/mysql-mha/mysql_mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &

--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。

--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在 app1.failover.complete 日志文件中记录,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换, 除非在第一次切换后删除该文件,为了方便,这里设置为--ignore_last_failover。


●使用&后台运行程序:结果会输出到终端;使用Ctrl+C发送SIGINT信号,程序免疫;关闭session发送SIGHUP信号,程序关闭。

●使用nohup运行程序:结果默认会输出到nohup.out;使用Ctrl+C发送SIGINT信号,程序关闭;关闭session发送SIGHUP信号,程序免疫。

●使用nohup和&配合来启动程序nohup ./test &:同时免疫SIGINT和SIGHUP信号。


7)模拟故障

主:

关闭MySQL

服务端:

从:

3、若原master修复完成,如何加入到集群中?

如何恢复原先192.168.9.150做主服务器?

修改MHA服务器

###启动MHA
nohup masterha_manager --conf=/opt/mysql-mha/mysql_mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
###检查状态
masterha_check_status -conf=/opt/mysql-mha/mysql_mha.cnf

4、MHA高可用集群部署总结

  • 1.采用一主两从架构
  • 2.一主两从先做主从复制
  • 3.给MHA进行登录授权,访问数据库的授权
  • 4.所有数据库节点安装mha node 组件,manager服务器还要安装mha manager 组件
  • 5.所有服务器相互组件做ssh免交互登录
  • 6.manager上准备好VIP故障转移脚本和MHA配置文件
  • 7.在master上创建VIP地址
  • 8.启动MHA进程并做故障转移测试

主从复制步骤

  • (1)主从服务器先做时间同步
  • (2)修改主从数据库的配置文件,主库开启二进制日志,从库开启中继日志
  • (3)在主库创建主从复制的用户,并授予主从复制的权限
  • (4)在从库使用 change master to 对接主库,并 start slave 开启同步
  • (5)在从库使用 show slave status\G 查看 IO线程和 SQL线程的状态是否都为 YES
相关推荐
数据猎手小k1 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
你的小102 小时前
JavaWeb项目-----博客系统
android
风和先行2 小时前
adb 命令查看设备存储占用情况
android·adb
AaVictory.3 小时前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list
似霰4 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
大风起兮云飞扬丶4 小时前
Android——网络请求
android
干一行,爱一行4 小时前
android camera data -> surface 显示
android
断墨先生4 小时前
uniapp—android原生插件开发(3Android真机调试)
android·uni-app
无极程序员6 小时前
PHP常量
android·ide·android studio
萌面小侠Plus7 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机