MySQL高可架构之MHA搭建
本文中设计到的环境都是真实的腾讯云环境,下面设计到的虚拟IP需要使用腾讯云的高可用虚拟 IP
前期准备
三台服务器,分别为节点一、二、三,节点一为主服务器,节点二、三为从服务器,
节点一: 172.27.0.13 (主)
节点二: 172.27.0.11 (从--安装manager)
节点三: 172.27.0.17 (从)
在他们之间配置好基于gtid主从复制,可以参考MySQL主从复制(日志点和gtid)
MHA是基于SSH服务的,所以我们先在集群的所有服务器中建立ssh免认证登录,这样使用ssh链接的时候就不需要在输入密码了,具体操作如下:
1. 在节点一上执行 ssh-keygen,然后三次回车后就生成了ssh秘钥
文章图片
2. 使用ssh-copy-id将秘钥拷贝到各个服务器上,包括当前(自己)服务器,也就是说这里在每个服务器都要要拷贝三次
【MySQL高可架构之MHA搭建】ssh-copy-id -i 上一步秘钥生成的位置 -p ssh登录的端口 usernname@ip地址,下面例子:
ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 root@172.27.0.17
文章图片
mkdir -p /home/mysql_mha三次配置完成后,可以在服务器上执行ssh链接看是否还需要输入密码,如果不需要则成功
最后登录其他两个服务器重复上面两个步骤
安装软件包
一、下载node和manager软件包
wget https://raw.githubusercontent.com/linyue515/mysql-master-ha/master/mha4mysql-node-0.57-0.el7.noarch.rpm
wget https://raw.githubusercontent.com/linyue515/mysql-master-ha/master/mha4mysql-manager-0.57-0.el7.noarch.rpm
文章图片
二、查看系统中是否已经有存在的软件包
安装之前最好查看一下系统中是否已经安装了软件包,有的话可以先卸载安装上面的版本,因为老的版本可能有很多坑(亲身体会)
文章图片
三、安装node软件包
node包需要在三台服务器都安装,安装之前需要先安装perl的几个依赖包(perl-DBD-MySQL ncftp perl-DBI.x86),,然后在安装node.执行下面两个命令
yum install -y perl-DBD-MySQL ncftp perl-DBI.x86
rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
文章图片
四、安装manager软件包
和node不同,manage包只需要安装到一个服务器就行,这里我直接安装到作为从服务器的节点二上面,当然,服务器资源充足的情况下,单独用一台服务器安装manager包更好.
和安装node相同的,也需要你先安装相关的依赖包,然后在安装manager包.执行如下两条命令
yum install -y perl-Config-Tiny.noarch perl-Time-HiRes.x86_64 perl-Parallel-ForkManager perl-Log-Dispatch.noarch perl-DBD-MySQL ncftp
rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm
文章图片
ps: 安装node或者manager包的时候,必须要相关的依赖包,确定相关的依赖包安装成功了
配置MHA 在安装有manager包的节点二,创建一个放MHA的配置目录,其他节点上不需要配置
1. 在主服务器(节点一)上建立一个mha用户(就可以直接同步到所有从服务器,配置文件中需要)
grant all privileges on *.* to 'mha'@'172.27.0.%' identified by 'Mha123456.';
文章图片
2. 在集群所有服务器中都先建立一个mha工作目录(配置文件需要用)
mkdir -p /home/mysql_mha3. 在节点二(manager)上的/opt/soft/mha目录(自定义)下建立一个配置文件mysql_mha.cnf(名字自定义)
[server default]remote_workdir=/home/mysql_mha 三个节点都要建立
user=mha
password=Mha123456.
manager_workdir=/home/mysql_mha
manager_log=/home/mysql_mha/manager.log
remote_workdir=/home/mysql_mha
ssh_user=rootrepl_user=repl
repl_password=Repl123456.
ping_interval=1
master_binlog_dir=/var/log/sql_log
master_ip_failover_script=/usr/bin/master_ip_failover
secondary_check_script=/usr/bin/masterha_secondary_check -s 172.27.0.11 -s 172.27.0.13 -s 172.27.0.17
[server1]
hostname=172.27.0.13
candidate_master=1
[server2]
hostname=172.27.0.17
candidate_master=1
[server1]
hostname= 172.27.0.11
no_master=1
ping_interval=1 manager进程去检查主数据库是否联通的时间间隔,用ping命令检查 1S
master_binlog_dir 配置好的二进制日志文件的目录,集群中参与选举主服务器的数据库的二进制文件都配置在相同的目录下,方便主从切换后,不需要修改配置文件
master_ip_failover_script: (可选),指定一个脚本---在完成主从切换后,可以把主的虚拟ip绑定在新选举的主上,如果不提供这个参数,要实现这种虚拟ip的转移,就需要借助第三方的组件了,比如keepalived
secondary_check_script: 通过多个网络检测master是否可用,安装好以后再服务器上就有
ps:master_ip_failover_script这个本可以在这里下载,也可以网上搜一个,只需要改一个vip(虚拟ip)就行
文章图片
检测mha配置是否正确
masterha_check_ssh --conf=/opt/soft/mha/mysql_mha.cnf
文章图片
检测主从复制环境
masterha_check_repl --conf=/opt/soft/mha/mysql_mha.cnf
文章图片
后台启动mha
nohup masterha_manager --conf=/opt/soft/mha/mysql_mha.cnf &
启动后,主服务器(节点一)会自动分配相应的虚拟ip,如果不分配就按照下面方式手动分配
ifconfig eth0:1 172.27.0.19/20
文章图片
简单测试故障转移
在主服务器(节点一)停掉mysql,监听节点二上/home/mysql_mha/manager.log日志
文章图片
分别查看节点一和节点三的虚拟IP是否已经转移
文章图片
文章图片
在节点二上查看当前的主从复制链路,确认主服务器已经转移到节点三
文章图片
ps: 还可以测试一下这种架构的压力和其他故障处理的情况,比如加大主库的并发写入; 停止一台从库,让二进制文件落后主库,看最后会不会恢复等等.
推荐阅读
- MySQL查询为什么没走索引(这篇文章带你全面解析)
- java架构学习|java架构学习——27. SpringBoot基础
- 微服务的学习|微服务24_服务异步通信04(RabbitMQ高可用问题、镜像集群、仲裁队列)
- 微服务架构(10)(消息队列&RabbitMQ)
- rocket|rocket mq 监听端口_微服务异步架构——MQ之RocketMQ
- 太牛了!吊打全网的MySQL进阶面试突击,吃透最少阿里P7
- 数据库|mysql查询结果去重
- Java面试总结|MySQL数据库面试题总结(2022最新版)
- Docker部署Mysql8的实现步骤
- Docker安装MySql8并远程访问的实现