MySQL MHA高可用、故障切换

402 阅读6分钟

前言

MySQL服务器中,单台服务器无法承载服务量就配置多台MySQL服务器 多台MySQL服务器或者MySQL服务器无冗余的情况下,配置主从复制 MySQL服务器的读和写的压力不均衡使用MySQL的读写分离 MySQL的读写分离中Msater存在单点故障,就用到了MHA,也就是本篇会详细介绍的高可用

一、MHA概述

1.1、简介

  • 主要是为了解决msater只有一台,若master出现故障时就使用MHA解决单点故障问题
  • 一套优秀的MySQL高可用环境下故障切换和主从复制的软件
  • MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换

1.2、MHA的组成(性能、组件)

  1. MHA Manager (管理节点)可以借助于node组件,实现健康检查(ssh、主从复制)、控制故障切换

  2. MHA Node 组件(数据节点)部署在所有MySQL服务器内;主要作用:定时汇报给主manager节点,mysql服务的状态监控本地mysql服务功能主从复制架构:主从复制(一主多从) ; MHA架构(多主多从) ; MMM架构(双主多从)

1.3、特点

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

    • 自动故障切换过程的本质

    • 故障切换(本质VIP漂移)

    • 自动(使用脚本触发自动)

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

1.4、总结

MHA为了解决的是故障切换,数据尽可能的保存,以及所有节点日志的一致性

image.png 当主宕机,提升从服务器为master服务器的机制

  1. 先取出bin-log和relay-log相差的日志值,如上图是相差100M的日志;即预选
  2. 择优;mster 1000M多个slave 980 900 920;即优选

二、搭建MySQL-MHA

2.1、实验环境

MHA-manager:192.168.35.30 管理节点,安装manager组件与node组件 MySQL服务器:只要用来调控与调用

角色ip
MHA-manager192.168.35.30
master192.168.35.40
slave1192.168.35.10
slave2192.168.35.20

定义节点服务器名称:

hostnamectl set-hostname manager
su
hostnamectl set-hostname master
su
hostnamectl set-hostname slave1
su
hostnamectl set-hostname slave2
su

2.2、mysql服务器配置

2.2.1、配置主从复制

需要注释掉从服务器配置文件/etc/my.cnf内的character_set_server=utf8 image.png

2.2.2、所有库配置软链接

ln -s /usr/local/mysql/bin/mysql /usr/sbin ##优化管理  mysql命令 
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin  ##节点恢复

2.2.3、所有数据库提权

grant replication slave on *.* to 'myslave'@'192.168.35.%' identified by '123'; 
grant all privileges on *.* to 'mha'@'192.168.35.%' identified by 'manager';
grant all privileges on *.* to 'mha'@'master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
set global read_only=1;		##不会对超级管理员super生效,普通用户
flush privileges;

测试:验证从服务器只读功能

msater端创建数据表ss 
use zyt;
create table ss(id int);

image.png

只读功能验证 在slave1服务器上

mysql -umyslave -p123 -h 192.168.35.40 -P 3306

image.png 这时slave1创建数据库gggg,报错提示只读,无法创建

2.3、配置MHA

2.3.1、安装epel源

在所有服务器上安装MHA依赖环境,首先安装epel源,只有安装了源perl才会有

yum install epel-release --nogpgcheck -y   ##安装epel源,并且不进行gph检查
yum install -y 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中的数据库
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

MHA 软件包对于每个操作系统版本不一样,这里Centos7.4必须选择0.57版本 在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装manager组件 因为manager依赖node组件

2.3.2、所有服务器同步阿里云时间

[root@master bin]# ntpdate ntp.aliyun.com
20 Jul 19:34:27 ntpdate[60181]: adjust time server 203.107.6.88 offset 0.002699 sec
[root@master bin]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@master bin]# 
[root@master bin]# crontab -l
*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com

2.3.3、所有服务器安装node组件

当前目录上传node压缩包、上传manager压缩包

tar zxvf mha4mysql-node-0.57.tar.gz -C /root 
cd mha4mysql-node-0.57 
perl Makefile.PL 
make && make install

2.3.4、在MHA节点上安装manager组件

tar xf mha4mysql-manager-0.57.tar.gz -C /root 
cd mha4mysql-manager-0.57 
perl Makefile.PL 
make && make install

2.3.5、检测manager和node

manager 安装后在/usr/local/bin目录下会生成几个工具,主要包括以下:
masterha-check_ssh 检查MHA的SSH配置状况(免交互)
masterha_check_repl 检查MySQL复制状况
masterha_manager 启动manager的脚本
masterha_check_status 检查当前MHA运行状态
masterha_master_monitor 检查master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
masterha_stop 关闭manager
node 安装后也会在/usr/local/bin目录下生成几个脚本,需要进行检查,主要包括以下
save_binary_logs #保存和复制master的二进制日志
apply_diff_relay_logs #识别差异的中继日志时间,并将其差异的事件应用于其他的slave;filter:过滤
filter_mysqlbinlog #去除不必要的ROLLBACK回滚事件(MHA 已不适用这个工具)
purge_relay_logs #清除中继日志(不会阻塞 SQL线程)

image.png master宕机之后,slave1主备顶上,实现方式:vip虚拟ip漂移到slave1

2.4、配置无密码认证

2.4.1、在mannager上配置到所有数据库节点的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.35.10
ssh-copy-id 192.168.35.20
ssh-copy-id 192.168.35.30
ssh-copy-id 192.168.35.40

image.png

2.4.2、模拟master宕机,查看master的变化

master配置虚拟网卡VIP192.168.35.100

image.png

systemctl  stop mysqld		##msater服务器停止mysql服务
masterha_check_status --conf=/etc/masterha/app1.cnf		##manager服务器查看master节点变为slave1:192.168.35.10

image.png 查询原slave1的状态,已切换成master

image.png

查询slave的状态,master的ip已切换成原slave1

image.png 此时slave1上可以查询到设置的vip,已漂移成功

image.png

查看当前日志信息,可以看到详细过程 tail -f /var/log/masterha/app1/manager.log

2.5、Master故障修复

  1. 修复db(原master)
    原的master现在变成slave,取消同步的,增加中继日志的内容
vim  /etc/my.cnf
	log_bin=master-bin
	#log_slave=updates=true
	relay-log=relay-log-bin
	relay-log-index=slave-relay-bin.index
systemctl  start mysqld

image.png

  1. 修复主从(在原master数据库中输入)
systemctl start mysqld			##开启服务,进入数据库,修复的master
change master to master_host='192.168.35.10',master_user='myslave',master_password='123',master_log_file='master-bin.000004',master_log_pos=154;
start slave;
set global read_only=1;
flush privileges;

slave2需要更新二进制日志起点**

stop slave;
change master to master_host='192.168.35.10',master_user='myslave',master_password='123',master_log_file='master-bin.000004',master_log_pos=154;
flush privileges;
start slave;
show slave status\G;

修改MHA的配置文件(再把这个记录添加进去,因为它检测到失效时候会自动消失

image.png

---->wq保存配置文件
测试免密和主从
masterha_check_repl -conf=/etc/master

image.png

三、总结

  • MHA主要是为了解决msater只有一台,若master出现故障时就使用MHA解决单点故障问题

  • 组件:

  • MHA Manager (管理节点)

  • 可以借助于node组件,实现健康检查(ssh、主从复制)、控制故障切换

  • MHA Node 组件(数据节点):

部署在所有MySQL服务器内;主要作用: 定时汇报给主manager节点,mysql服务的状态 监控本地mysql服务功能 配置步骤 实验环境:四台服务器,一台master,二台slave,一台MHA(在MHA节点上安装manager组件 )

 ①:首选需要三台服务器配置主从复制
 ②:所有服务器上的数据库提权,针对四个用户(myslave、mha、master、slave1、slave2)
 ③:所有服务器配置ssh免密认证
 ④:在mysql服务器上设置监控用户
 ⑤:修改manager的配置文件master_ip_failover和app1.cnf
 ⑥:在MHA上测试免密和主从服务
 ⑦:后台启动MHA
 ⑧:验证(模拟master宕机,查看master的变化)