mysql mha高可用

一、前言

在原本的一主两从数据库架构中,是没有高可用功能的,当主库挂了时不会自动将剩下的从从升级为主库,只能等待主库恢复才能使用,或者手动切换,但是手动切换后需要更改后端服务中的数据库地址信息,在此情况下,需要引入mha服务来实现一主两从数据库的高可用,mha服务可以在主库挂掉时,自动从剩下的从库中选举出一个主库,再将剩下的从库变更为新主库的从库,该mha也有缺点,只能一次性使用,当发生了一次主从切换后,mha manage服务就会挂掉,挂掉的主库信息也会从mha manage配置文件中剔除,当原主库恢复后,需要手动将原主库更改为新主库的从库,再将信息写入mha manage的配置文件中,再启动mha manage,这样下次主从发生故障时mha manage才会再次发挥作用

mha对mysql高可用的实现原理,在主从的每个节点,以及mha manage节点部署mha node服务收集每个节点的信息发送到mha manage,当主节点发生故障时,mha manage节点会及时监控到,mha manage会首先检查每个从节点的健康状态,没问题就会在剩下的从节点中选举出新的主节点,然后对剩下的从节点进行主从配置并将从节点更改为只读,这样就完成了主从节点的故障切换

二、构架

|-------------|---------------------|---|
| ip | 服务 | |
| 10.1.60.113 | mysql、mha node | |
| 10.1.60.114 | mysql、mha node | |
| 10.1.60.115 | mysql、mha node | |
| 10.1.60.22 | mha manage、mha node | |

三、部署

需要提前部署好一主两从架构的mysql

参考:mysql一主两从读写分离搭建_mysql 一主两从搭建-CSDN博客

在github上下载mha node和mha manage安装包

mha manage

参考: Release mha4mysql-manager-0.58 · yoshinorim/mha4mysql-manager · GitHub

mha node

参考:https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58

所有节点安装mha依赖

bash 复制代码
yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN

在所有主机中创建存放mha安装包目录

mkdit /opt/mha && cd /opt/mha

将mha node安装包放到所有节点的mha目录下,mha manage安装包只放到mha manage目录下

先在所有节点安装mha node服务

tar -zxvf mha4mysql-node-0.58.tar.gz && ls

cd mha4mysql-node-0.58

perl Makefile.PL

make && make install

mha node服务安装完成后在mha manage节点安装mha manage服务

tar -zxvf mha4mysql-manager-0.58.tar.gz && ls

cd mha4mysql-manager-0.58

perl Makefile.PL

make && make install

在所有mysql节点创建软连接

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

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

配置所有节点互相免密登陆

bash 复制代码
#113节点执行
ssh-keygen  #一直按回车键即可

ssh-copy-id 10.1.60.114

ssh-copy-id 10.1.60.115

ssh-copy-id 10.1.60.22


#114节点执行
ssh-keygen  #一直按回车键即可

ssh-copy-id 10.1.60.113

ssh-copy-id 10.1.60.115

ssh-copy-id 10.1.60.22

#115节点执行
ssh-keygen  #一直按回车键即可

ssh-copy-id 10.1.60.114

ssh-copy-id 10.1.60.113

ssh-copy-id 10.1.60.22

#22节点执行
ssh-keygen  #一直按回车键即可

ssh-copy-id 10.1.60.114

ssh-copy-id 10.1.60.115

ssh-copy-id 10.1.60.113

在mha manage上执行以下拷贝文件命令

cp -rp /opt/mha/mha4mysql-manager-0.58/samples/scripts/send_report /usr/local/bin

ls /opt/mha/mha4mysql-manager-0.58/samples/scripts

script目录下有四个文件解释

master_ip_failover:发生故障时自动切换VIP的管理脚本

master_ip_online_change:在线切换vip 的管理脚本

power_manager:故障发生后关闭主机的脚本

send_report:故障切换后发送报警邮件的脚本

我的mysql架构中使用了proxysql读写分离组件,有集成主从故障切换的功能,所以不需要vip,就只拷贝了发送告警的脚本

在mysql主从配置的主库中创建以下用于监控的用户

mysql -u root -p

grant all privileges on *.* to 'mha'@'%' identified by '12345678'

flush privileges;

在mha manage节点中拷贝配置文件

mkdir /etc/masterha

cp /opt/mha/mha4mysql-manager-0.58/samples/conf/app1.cnf /etc/masterha

编辑配置文件

vi /etc/masterha/app1.cnf

bash 复制代码
[server default]
manager_log=/var/log/masterha/app1/manager.log  #mha manage日志
manager_workdir=/var/log/masterha/app1          #mha manage工作目录
master_binlog_dir=/var/lib/mysql/           #主库保存binlog的位置,这里的路径要与主库里配置的binlog的路径一致,以便MHA能找到
user=mha               #监控用户 
password=12345678      #监控用户密码
ping_interval=1         #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp     #远端mysql在发生切换时binlog的保存位置
repl_password=12345678   # 主从复制密码
repl_user=deploy             # 主从复制用户    
report_script=/usr/local/bin/send_report #设置发生故障切换后发送的报警的脚本
ssh_user=root               #设置ssh的登录用户名

[server1]                 #发生故障切换后会删除对应故障的地址项配置
hostname=10.1.60.113     #myqsl地址
port=3306                #myqsl端口

[server2]
hostname=10.1.60.114
port=3306

[server3]
hostname=10.1.60.115
port=3306

配置故障切换告警

vi /usr/local/bin/send_report

bash 复制代码
my $smtp='smtp.qq.com';             # smtp服务器
my $mail_from='123456@qq.com';    # 发件箱
my $mail_user='123456';           # 用户名 QQ号
my $mail_pass='iozjqgxcvasdwlbffb';   # 授权码
my $mail_to=['123456@qq.com'];    # 收件箱

执行mha脚本检查各节点ssh连接状态

masterha_check_ssh --conf=/etc/masterha/app1.cnf

检查数据库主从架构状态

masterha_check_repl --conf=/etc/masterha/app1.cnf

启动mha manage服务

bash 复制代码
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 &

tail -f /var/log/masterha/app1/manager.log

ps -ef|grep manage

至此mha搭建完成,现在是当mha发生主从故障切换时需要手动重新配置mha manage服务,重新在配置文件中新增故障的主节点信息,再重新启动mha manage服务

相关推荐
mmsx26 分钟前
android sqlite 数据库简单封装示例(java)
android·java·数据库
zpjing~.~1 小时前
Mongo 分页判断是否有下一页
数据库
2401_857600951 小时前
技术与教育的融合:构建现代成绩管理系统
数据库·oracle
秋恬意2 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
潇湘秦2 小时前
一文了解Oracle数据库如何连接(1)
数据库·oracle
雅冰石2 小时前
oracle怎样使用logmnr恢复误删除的数据
数据库·oracle
web前端神器2 小时前
mongodb给不同的库设置不同的密码进行连接
数据库·mongodb
从以前2 小时前
Berlandesk 注册系统算法实现与解析
数据库·oracle
Muko_0x7d22 小时前
Mongodb
数据库·mongodb
Ren_xixi2 小时前
redis和mysql的区别
数据库·redis·mysql