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;
相关推荐
似霰36 分钟前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
大风起兮云飞扬丶36 分钟前
Android——网络请求
android
干一行,爱一行39 分钟前
android camera data -> surface 显示
android
断墨先生1 小时前
uniapp—android原生插件开发(3Android真机调试)
android·uni-app
无极程序员2 小时前
PHP常量
android·ide·android studio
萌面小侠Plus4 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农4 小时前
Android Profiler 内存分析
android
大风起兮云飞扬丶4 小时前
Android——多线程、线程通信、handler机制
android
L72564 小时前
Android的Handler
android
清风徐来辽4 小时前
Android HandlerThread 基础
android