MHA高可用配置及故障切换

目录

MHA高可用配置及故障切换

MHA定义

MAH的组成

MHA特点

MHA工作原理

[实验:搭建MySQL MHA](#实验:搭建MySQL MHA)

案例拓扑图

案例实施

四台服务器关闭防火墙防护,连接所有会话101、102、103、104

设置host文件

[安装MySQL数据库 连接会话102、103、104](#安装MySQL数据库 连接会话102、103、104)

设置主库配置

从服务器配置

启动

修改登录密码

[在所有Mylsq节点上配置授权 在102上授权](#在所有Mylsq节点上配置授权 在102上授权)

取消用户同步,单独针对一个节点去做操作

在mysql上查看mastar信息

在mysql2和mysql3设置slave配置主从环境

安装MHA软件

同时托入四个主机,连接101、102、103、104会话

设置阿里的yum基础源都安装MHA依赖的环境

在所有节点安装node组件

[在 MHA-manager上安装manager组件](#在 MHA-manager上安装manager组件)

配置无密码认证

[在 manager 上配置到所有节点的无密码认证](#在 manager 上配置到所有节点的无密码认证)

[在 Mysql1 上配置到数据库节点的无密码认证](#在 Mysql1 上配置到数据库节点的无密码认证)

[在 Mysql2 上配置到数据库节点的无密码认证](#在 Mysql2 上配置到数据库节点的无密码认证)

[在 Mysql3 上配置到数据库节点的无密码认证](#在 Mysql3 上配置到数据库节点的无密码认证)

配置MHA

[在 manager 节点上复制相关的脚本到/usr/local/bin目录](#在 manager 节点上复制相关的脚本到/usr/local/bin目录)

脚本具体作用

完整替换master_ip_failover文件的内容,IP部分更换为自己的IP地址

测试ssh无密码认证,如果正常最后输出successfully就是运行成功

[测试mysql主从连接情况,最后出现MySQL Replication Health is ok 字样说明正常](#测试mysql主从连接情况,最后出现MySQL Replication Health is ok 字样说明正常)

首次配置MHA的VIP地址需要手动配置(在mysql上)102主机

启动HMA(在mha-manager主机上)101主机

查看MHA状态,可以看到当前的master是Mysql1节点

查看MHA日志

模拟master故障

[用客户端链接群集 105主机](#用客户端链接群集 105主机)

[关闭当前的master 102](#关闭当前的master 102)

观察MHA日志,如果自动切换成功,最后输出successfully字样

在mysql2上查看状态


MHA高可用配置及故障切换

MHA定义

HMA(MasterHigh Availablity)是一套优秀的Mysql高可用环境下的故障切换和主从复制的软件

解决MySLQ单点的问题

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

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

MHA是建在主从复制的基础上的;0-30秒自动完成故障切换是MHA的特性

MAH的组成

  • MHA Manager(管理节点)
  • NHA Node(数据节点)

MHA特点

  • 自动故障奇幻过程种,MHA试图从宕机的主服务器上保存二进制日志,最大程度保证数据不丢失
  • 使用半同步复制,可以大大降低数据丢失的风险
  • 目前MHA支持一主多从架构,最少三台服务,即一主两从

MHA工作原理

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

识别含有最新的更新 slave 日志(可以理解为主从复制数据最新的从服务器)

应用差异的中继日志(relay log)到其他的slave(将数据信息最全最新的从服务器的中继日志给其他的从服务器)

应用从master保存的二进制日志事件

提升一个 salve 为新的master

使其他的slave连接行的master 进行复制。

实验:搭建MySQL MHA

目的:解决故障切换、尽可能的保存数据,以及所有节点日志的一致性

实验思路:搭建MHA机构---->数据库安装---->一主两从---->MHA搭建

故障模拟:主服务器失效---->主服务器的备胎服务器成为主服务器---->原故障

配置四台虚拟机

|-----|-----------|----------------|----------------------|
| 服务器 | 操作系统 | 主机名/IP 地址 | 角色 |
| 服务器 | CentOS7.9 | 192.168.10.101 | 管理节点,安装 manager 组件 |
| 服务器 | CentOS7.9 | 192.168.10.102 | Master 节点,安装 node 组件 |
| 服务器 | CentOS7.9 | 192.168.10.103 | Slave 节点,安装 node 组件 |
| 服务器 | CentOS7.9 | 192.168.10.104 | Slave 节点,安装 node 组件 |

案例拓扑图

案例实施

四台服务器关闭防火墙防护,连接所有会话101、102、103、104

复制代码
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# vim /etc/sysconfig/selinux 
SELINUX=disabled

设置host文件

修改每个节点的hosts文件

复制代码
[root@localhost ~]# vim /etc/hosts
192.168.10.101 MHA-manager
192.168.10.102 Mysql1
192.168.10.103 Mysql2
192.168.10.104 Mysql3

安装MySQL数据库 连接会话102、103、104

复制代码
[root@localhost ~]# yum -y install mariadb-server mysql

关闭掉101的同步

设置主库配置

复制代码
[root@localhost ~]# vim /etc/my.cnf
server-id=102
log-bin=master-bin
binlog-format=MIXED
relay-log-purge=0
log-slave-updates=true

当relay-log-purge=1时,旧relay logs会在SQL线程执行完毕后被自动删除;当relay-log-purge=0时,旧的 relaylog则会被保留

从服务器配置

复制代码
server-id=103
log-bin=master-bin
binlog-format=MIXED
relay-log-purge=0
log-slave-updates=true

server-id=104
log-bin=master-bin
binlog-format=MIXED
relay-log-purge=0
log-slave-updates=true

relay-log-purge=0 不自动删除中继日志,以便宕机后恢复数据

log-slave-updates=true Slave可以是其他Slave的Master,从而扩散Master的更新

启动

复制代码
[root@localhost ~]# systemctl start mariadb

修改登录密码

复制代码
[root@localhost ~]# mysqladmin -uroot password 'pwd123';

在所有Mylsq节点上配置授权 在102上授权

复制代码
[root@localhost ~]# mysql -uroot -ppwd123
MariaDB [(none)]> grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by '123456';
MariaDB [(none)]> grant all privileges on *.* to 'mha'@'192.168.10.%' identified by 'manager';
#创建以恶搞用户名为mha,密码为manager的用户允许该用户从以 192.168.10. 开头的IP地址段连接到MariaDB数据库,并且拥有对所有数据库和表的所有操作权限。
MariaDB [(none)]> grant all privileges on *.* to 'mha'@'mysql1' identified by 'manager';
MariaDB [(none)]> grant all privileges on *.* to 'mha'@'mysql2' identified by 'manager';
MariaDB [(none)]> grant all privileges on *.* to 'mha'@'mysql3' identified by 'manager';
用主机名去进行连接
MariaDB [(none)]> flush privileges;

取消用户同步,单独针对一个节点去做操作

在mysql上查看mastar信息
复制代码
MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |     1346 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

同步103、104会话

在mysql2和mysql3设置slave配置主从环境

复制代码
MariaDB [(none)]> change master to master_host='192.168.10.102',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=1346;
#
master_host='192.168.10.102'
: 这是主服务器(master)的IP地址或主机名,从服务器将连接到该地址获取主服务器的更新数据。
master_user='myslave'
: 这是连接到主服务器所使用的用户名。在这个例子中,从服务器将使用用户名 myslave 来连接到主服务器。
master_password='123456'
: 这是连接到主服务器所使用的密码。在这个例子中,密码是 123456。
master_log_file='master-bin.000003'
: 这是主服务器上当前的二进制日志文件名,从服务器将从这个日志文件开始读取日志信息。
master_log_pos=1346
: 这是主服务器上二进制日志文件的位置(偏移量),从服务器将从这个位置开始读取日志信息。

MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G

安装MHA软件

所有服务器上安装MHA依赖环境

同时托入四个主机,连接101、102、103、104会话

但我们这里用ftp的基础源去安装(快一点)

复制代码
ftp的基础源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo ftp://192.168.2.149/repo/CentOS-Base.repo
curl -o /etc/yum.repos.d/epel.repo ftp://192.168.2.149/repo/epel.repo
yum clean all

阿里的基础源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all

设置阿里的yum基础源都安装MHA依赖的环境

复制代码
yum install -y perl-DBD-MySQLperl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilderperl-ExtUtils-MakeMaker perl-CPAN

> perl-DBD-MySQL //perl针对于mysql数据库

> perl-Config-Tiny //从配置文件中提拿其中的值

> perl-Log-Dispatch //log-日志

> perl-Parallel-ForkManager //多线程管理

> perl-ExtUtils-CBuilder //扩展工具

> perl-ExtUtils-MakeMaker

> perl-CPAN //cpan perl中的数据库

在所有节点安装node组件

复制代码
[root@localhost ~]# tar zxvf  mha4mysql-node-0.57.tar.gz
[root@localhost ~]# cd mha4mysql-node-0.57
[root@localhost mha4mysql-node-0.57]# perl Makefile.PL 
[root@localhost mha4mysql-node-0.57]# make && make install

node工具(这些工具通常由MHAManager的脚本触发,无需人为操作)

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

在 MHA-manager上安装manager组件

不用同步只在manager上

复制代码
[root@localhost ~]# tar zxvf mha4mysql-manager-0.57.tar.gz
[root@localhost ~]# cd mha4mysql-manager-0.57
[root@localhost mha4mysql-manager-0.57]# perl Makefile.PL
[root@localhost mha4mysql-manager-0.57]# make && make install

manager工具

  • masterha_check_ssh:检查 MHA 的 SSH 配置状况。
  • masterha_check_repl:检查 MySQL 复制状况。第12 页 共 31 页
  • masterha_manger:启动 MHA
  • masterha_check_status:检测当前 MHA 运行状态。
  • masterha_master_monitor:检测 master 是否宕机。
  • masterha_master_switch:控制故障转移(自动或者手动)。
  • masterha_conf_host:添加或删除配置的 server 信息。

配置无密码认证

实现无密码认证方式,一种是账号密码,一种是密钥对

生成密钥对,取消同步功能

在 manager 上配置到所有节点的无密码认证

复制代码
[root@localhost ~]# ssh-keygen -t rsa
ssh-copy-id192.168.10.102
ssh-copy-id192.168.10.103
ssh-copy-id192.168.10.104

yes
密码就是你root用户的密码(aptech)

在 Mysql1 上配置到数据库节点的无密码认证

复制代码
[root@localhost ~]# ssh-keygen -t rsa
ssh-copy-id192.168.10.103
ssh-copy-id192.168.10.104

在 Mysql2 上配置到数据库节点的无密码认证

复制代码
[root@localhost ~]# ssh-keygen -t rsa
ssh-copy-id192.168.10.102
ssh-copy-id192.168.10.104

在 Mysql3 上配置到数据库节点的无密码认证

复制代码
[root@localhost ~]# ssh-keygen -t rsa
ssh-copy-id192.168.10.102
ssh-copy-id192.168.10.103

配置MHA

在 manager 节点上复制相关的脚本到/usr/local/bin目录

复制代码
cd/mha4mysql-manager-0.57/samples
[root@localhost samples]# cd scripts/
[root@localhost scripts]# ls
master_ip_failover  master_ip_online_change  power_manager  send_report
[root@localhost scripts]# cp * /usr/local/bin/
[root@localhost scripts]# cd /usr/local/bin/
脚本具体作用
  • master_ip_failover:自动切换时 VIP 管理的脚本
  • master_ip_online_change:在线切换时 vip 的管理
  • power_manager:故障发生后关闭主机的脚本
  • send_report:因故障切换后发送报警的脚本

完整替换master_ip_failover文件的内容,IP部分更换为自己的IP地址

复制master_ip_failover脚本到/usr/local/bin目录,这里使用脚本管理VIP

复制代码
[root@localhost bin]# rm -rf master_ip_failover              #删除该文件
[root@localhost bin]# chmod +x master_ip_failover          给该文件添加执行权

[root@localhost bin]# cd
[root@localhost ~]# cd /etc/
[root@localhost etc]# mkdir masterha
[root@localhost ~]# cd mha4mysql-manager-0.57
[root@localhost mha4mysql-manager-0.57]# cd samples/
[root@localhost samples]# ls
conf  scripts
[root@localhost samples]# cd conf/
[root@localhost conf]# ls
app1.cnf  masterha_default.cnf
[root@localhost conf]# cp app1.cnf /etc/masterha/
[root@localhost conf]# vim /etc/masterha/app1.cnf 

[server default] 
manager_workdir=/var/log/masterha/app1 
manager_log=/var/log/masterha/app1/manager.log 
master_binlog_dir=/usr/local/mysql/data 
#master_binlog_dir=/var/lib/mysql
master_ip_failover_script= /usr/local/bin/master_ip_failover 
master_ip_online_change_script=/usr/local/bin/master_ip_online_change 
user=mha 
password=manager 
ping_interval=1 
remote_workdir=/tmp 
repl_user=myslave 
repl_password=123456 
secondary_check_script= /usr/local/bin/masterha_secondary_check -s192.168.10.103 -s 192.168.10.104
shutdown_script="" 
ssh_user=root 
[server1] 
hostname=192.168.10.102
port=3306 
[server2] 
hostname=192.168.10.103
port=3306 
candidate_master=1
check_repl_delay=0
[server3] 
hostname=192.168.10.104 
port=3306
[root@localhost conf]# mkdir -p /var/log/masterha/app1       #创建这个目录
[root@localhost conf]# vim /etc/masterha/app1.cnf
注释master_binlog_dir=/usr/local/mysql/data
使用master_binlog_dir=/var/lib/mysql确认路径位置

测试ssh无密码认证,如果正常最后输出successfully就是运行成功

复制代码
[root@localhost ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf 

测试mysql主从连接情况,最后出现MySQL Replication Health is ok 字样说明正常

复制代码
[root@localhost ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf 

MySQL Replication Health is OK.

首次配置MHA的VIP地址需要手动配置(在mysql上)102主机

复制代码
[root@localhost ~]# ifconfig ens33:1 192.168.10.200
ifconfig        #查看和配置网络接口

启动HMA(在mha-manager主机上)101主机

复制代码
[root@localhost ~]# mkdir -p /var/log/masterha/app1
[root@localhost ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover </dev/null>/var/log/masterha/app1/manager.log 2>&1 &
[1] 14002

查看MHA状态,可以看到当前的master是Mysql1节点

复制代码
[root@localhost ~]# masterha_check_status --conf=/etc/masterha/app1.cnf

查看MHA日志

复制代码
[root@localhost ~]# cat /var/log/masterha/app1/manager.log

模拟master故障

用客户端链接群集 105主机

复制代码
yum -y install mysql
[root@localhost ~]# mysql -umha -pmanager -h 192.168.10.200

关闭当前的master 102

复制代码
[root@localhost ~]# systemctl stop mariadb

观察MHA日志,如果自动切换成功,最后输出successfully字样

复制代码
[root@localhost ~]# tailf /var/log/masterha/app1/manager.log

在mysql2上查看状态

复制代码
mysql> show masterstatus;
相关推荐
JhonKI3 小时前
【MySQL】存储引擎 - CSV详解
android·数据库·mysql
开开心心_Every3 小时前
手机隐私数据彻底删除工具:回收或弃用手机前防数据恢复
android·windows·python·搜索引擎·智能手机·pdf·音视频
大G哥4 小时前
Kotlin Lambda语法错误修复
android·java·开发语言·kotlin
鸿蒙布道师7 小时前
鸿蒙NEXT开发动画案例2
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei
androidwork7 小时前
Kotlin Android工程Mock数据方法总结
android·开发语言·kotlin
xiangxiongfly9159 小时前
Android setContentView()源码分析
android·setcontentview
人间有清欢11 小时前
Android开发补充内容
android·okhttp·rxjava·retrofit·hilt·jetpack compose
人间有清欢11 小时前
Android开发报错解决
android
每次的天空13 小时前
Android学习总结之kotlin协程面试篇
android·学习·kotlin
每次的天空15 小时前
Android学习总结之Binder篇
android·学习·binder