MHA高可用与故障切换配置

本文详细介绍了MySQL高可用解决方案MHA(Master High Availability)的原理、配置步骤和故障切换流程。MHA通过监控主节点,当主节点故障时能自动将一个从节点提升为主节点,确保数据一致性,并支持一主多从架构。配置包括服务器设置、授权、日志配置、安装MHA等,最后通过模拟故障验证了MHA的故障切换能力。
摘要由CSDN通过智能技术生成

  

目录

        一、MHA概述

        1.1 概述

        1.2 组成

        1.3 特点

        1.4 切换过程

        二、MHA高可用配置

        2.1 服务器配置

         2.2 实验配置

         2.4 安装MHA


        一、MHA概述

        1.1 概述

        —套优秀的MySQL高可用环境下故障切换和主从复制的软件MHA的出现就是解决MySQL单点的问题。

         MHA: Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从。

        MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用

        1.2 组成

        MHA Manager(管理节点)

Manager工具包主要包括以下几个工具:
masterha_check_ssh检查MHA的SSH配置状况
masterha_check_rep1检查MySQL复制状况
masterha_manger启动MHA
masterha_check_status检测当前MHA运行状态
masterha_master_monitor检测master是否宕机
masterha_master_switch故障转移(自动或手动)
masterha_conf_host添加或删除配置的server信息
masterha_stop--conf=app1.cnf停止MHA
masterha_secondary_check两个或多个网络线路检查MySQL主服务器的可用

        MHA Node(数据节点)

Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
save_binary_1ogs#保存和复制master的二进制日志
apply_diff_relay_logs#识别差异的中继日志事件并将其差异的事件应用于其他的s1ave
filter_mysq1binlog#去除不必要的ROLLBACK事件(MHA已不再使用此工具)
purge_re1ay_1ogs#清除中继日志(不会阻塞SQL线程)

        1.3 特点

        自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。

        使用半同步复制,可以大大降低数据丢失的风险。

        目前MHA支持一主多从架构,最少三台服务,即一主两从。 

        1.4 切换过程

(1)从宕机崩溃的master保存二进制日志事件(binlog events);
(2)识别含有最新更新的slave;
(3)应用差异的中继日志(relay log)到其他 slave;
(4)应用从master保存的二进制日志事件(binlog events);
(5)提升一个slave为新master;
(6)使其他的slave连接新的master进行复制

        二、MHA高可用配置

        2.1 服务器配置

主master:192.168.162.100

从slave1:192.168.162.111

从slave2:192.168.162.102

MHA服务器:

         2.2 实验配置

##关闭主从服务器服务器防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0



##修改主从服务器节点的主机名
[root@lppdff mysql]# hostnamectl set-hostname mysql1
[root@lppdff mysql]# hostnamectl set-hostname mysql2
[root@lppdff mysql]# hostnamectl set-hostname mysql3


##修改添加主机记录
[root@mysql1 mysql]# vim /etc/hosts
192.168.162.100 mysql1
192.168.162.111 mysql2
192.168.162.102 mysql3

##修改主服务器日志
[root@mysql1 ~]# vim /etc/my.cnf
server-id = 1
log_bin = master-bin
log-slave-updates = true

##重启服务
[root@mysql3 ~]# systemctl restart mysqld.service


##创建软连接
[root@mysql1 ~]# ln -s /usr/local/mysql/bin/{mysql,mysqlbinlog} /usr/sbin/

##修改从1服务器日志
[root@mysql2 mysql]# vim /etc/my.cnf
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

##重启服务
[root@mysql3 ~]# systemctl restart mysqld.service


##创建软连接
[root@mysql2 ~]# ln -s /usr/local/mysql/bin/{mysql,mysqlbinlog} /usr/sbin/

##修改从服务器2日志
[root@mysql3 ~]# vim /etc/my.cnf
server-id = 3
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

##重启服务
[root@mysql3 ~]# systemctl restart mysqld.service

##创建软连接
[root@mysql3 ~]# ln -s /usr/local/mysql/bin/{mysql,mysqlbinlog} /usr/sbin/

##主服务器授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.162.%' identified by '123123';
mysql> grant all privileges on *.* to 'mha'@'192.168.162.%' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)


##从服务器1授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.162.%' identified by '123123';
mysql> grant all privileges on *.* to 'mha'@'192.168.162.%' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

##从服务器2授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.162.%' identified by '123123';
mysql> grant all privileges on *.* to 'mha'@'192.168.162.%' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

##查看主服务器状态
mysql> show master status;

##从节点从服务器1配置
mysql> change master to master_host='192.168.162.100',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1747;


##开启
mysql> start slave;

##查看状态
mysql> show slave status\G

##从服务器2配置
mysql> change master to master_host='192.168.162.100',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1747;


##开启
mysql> start slave;

##查看状态
mysql> show slave status\G

         主从验证

         2.4 安装MHA

##MHA服务器关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

##在所有服务器上安装所需环境
##使用阿里云源仓库下载
[root@localhost yum.repos.d]# yum install epel-release --nogpgcheck -y
[root@localhost yum.repos.d]#yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

##将HMA安装包放入MHA服务器
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57.tar.gz 
[root@localhost opt]# ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57.tar.gz  rh



##主从服务器上放入mha4mysql-node-0.57.tar.gz
[root@localhost opt]# ls
mha4mysql-node-0.57.tar.gz


##MHA服务器解压包(主从服务器同样操作)
[root@localhost opt]# tar zxvf mha4mysql-node-0.57.tar.gz 
[root@localhost opt]# cd mha4mysql-node-0.57/
[root@localhost mha4mysql-node-0.57]# perl Makefile.PL 
[root@localhost mha4mysql-node-0.57]# make && make install

##MHA服务器配置
[root@localhost opt]#tar zxvf mha4mysql-manager-0.57.tar.gz 
[root@localhost opt]#cd mha4mysql-manager-0.57/
[root@localhost mha4mysql-manager-0.57/]#perl Makefile.PL
[root@localhost mha4mysql-manager-0.57/]#make && make install

#manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:
masterha_check_ssh 检查 MHA 的 SSH 配置状况
masterha_check_repl 检查 MySQL 复制状况
masterha_manger 启动 manager的脚本
masterha_check_status 检测当前 MHA 运行状态
masterha_master_monitor 检测 master 是否宕机
masterha_master_switch 控制故障转移(自动或者 手动)
masterha_conf_host 添加或删除配置的 server 信息
masterha_stop  关闭manager

#node 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)

##MHA设置免密登录
[root@localhost ~]# ssh-copy-id 192.168.162.100
[root@localhost ~]# ssh-copy-id 192.168.162.111
[root@localhost ~]# ssh-copy-id 192.168.162.102


##主服务器免密登录

[root@localhost ~]#ssh-keygen -t rsa 
[root@localhost ~]#ssh-copy-id 192.168.162.111
[root@localhost ~]#ssh-copy-id 192.168.162.102


##从服务器免密登录

[root@localhost ~]#ssh-keygen -t rsa 
[root@localhost ~]#ssh-copy-id 192.168.162.100
[root@localhost ~]#ssh-copy-id 192.168.162.102

##从服务器免密登录

[root@localhost ~]#ssh-keygen -t rsa 
[root@localhost ~]#ssh-copy-id 192.168.162.100
[root@localhost ~]#ssh-copy-id 192.168.162.111
##MHA服务器在 manager 节点上复制相关脚本到/usr/local/bin 目录
[root@localhost scripts]# cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
[root@localhost scripts]# cd /usr/local/bin/
[root@localhost bin]# cp scripts/* ./


##添加启动脚本(12.7)
[root@localhost bin]# vim master_ip_failover  

##MHA服务器修改运行脚本
[root@localhost opt]/cd /mha4mysql-manager-0.57/samples
[root@localhost samples]#cd conf/
[root@localhost conf]#ls
app1.cnf  masterha_default.cnf

[root@localhost conf]#mkdir /etc/masterha
[root@localhost conf]#cp app1.cnf /etc/masterha/
[root@localhost conf]# cd /etc/masterha/
[root@localhost masterha]#vim /etc/masterha/app1.cnf

 ##在主服务器添加虚拟网卡

[root@mysql1 mha4mysql-node-0.57]# ifconfig ens33:1 192.168.162.188/24

##MHA服务器测试 ssh 无密码认证,如果正常最后会输出 successfully,

[root@localhost masterha]# masterha_check_ssh -conf=/etc/masterha/app1.cnf

##MHA服务器测试mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常

##启动MHA会出现进程号

[root@localhost opt]#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 &

 ​​​​​​

         模拟故障验证

##关闭主服务器mysql

[root@mysql1 ~]# systemctl stop mysqld.service

##此时主服务器网卡虚拟地址分配给从服务器中

##如果将主服务器故障消失再次在MHA服务器上 修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
vi /etc/masterha/app1.cnf

[server1]
hostname=192.168.162.100
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.162.111
port=3306

[server3]
hostname=192.168.162.102
port=3306

##再次重启主服务器Mysql,修复主从

show master status; ##查看主从节点号

change master to master_host='192.168.162.101',master_user='myslave',master_password='123123',master_log_file='master-bin.000002',master_log_pos=154;   ##添加记录

start slave; ##开启

##MHA服务器上启动服务

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 &

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值