背景:
该软件由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。MHA Manager 可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。MHA Node 运行在每台 MySQL 服务器上,MHA Manager 会定时探测集群中的 master 节点,当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master,然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。
在 MHA 自动故障切换过程中,MHA 试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA 没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用 MySQL 5.5 的半同步复制,可以大大降低数据丢失的风险。MHA 可以与半同步复制结合起来。如果只有一个 slave 已经收到了最新的二进制日志,MHA 可以将最新的二进制日志应用于其他所有的 slave 服务器上,因此可以保证所有节点的数据一致性。
目前 MHA 主要支持一主多从的架构,要搭建 MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当 master,一台充当备用 master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。
准备条件:
四台主机:
一台MHA Manager (192.168.6.129) 管理调度器
三台主从复制架构(一主多从)
Master(192.168.6.130)
Slave1 (192.168.6.131)
Slave2 (192.168.6.132)
系统:centos 7.6
数据库: MariaDB-server-10.2.32
MHA软件包:mha4mysql-manager-0.56,mha4mysql-node-0.56
实验开始:yum 仓库配置好 mariadb 和阿里云的epel 源
1.在三台主机下安装好mariadb 数据库 版本号要一致
[root@master ~]# yum install -y mariadb-server
[root@slave1 ~]# yum install -y mariadb-server
[root@slave2 ~]# yum install -y mariadb-server
2、准备MHA软件包,MHA Manager 主机节点需要 mha4mysql-manager 和 mha4mysql-node,其它三个节点只需要 mha4mysql-node
[root@MHAserver data]# ll
total 124
-rw-r--r-- 1 root root 87119 Aug 4 14:51 mha4mysql-manager-0.56-0.el6.noarch.rpm
-rw-r--r-- 1 root root 36326 Aug 4 14:51 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@master data]# ll
total 36
-rw-r--r-- 1 root root 36326 Aug 4 14:51 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@salve1 data]# ll
total 36
-rw-r--r-- 1 root root 36326 Aug 4 14:51 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@slave2 data]# ll
total 36
-rw-r--r-- 1 root root 36326 Aug 4 14:51 mha4mysql-node-0.56-0.el6.noarch.rpm
3.安装MHA软件包,MHA Manager 主机节点安装 mha4mysql-manager 时需要依赖 epel 源,这里使用阿里云的epel源,要先搭建好yum 仓库
注:这里要用到光盘的依赖包,所以需要启动autofs.server 服务
这里设置成永久永久启动
systemctl start autofs.service
systemctl enable autofs.service
在MHAserver管理器上安装rpm 包
[root@MHAserver data]# ll
total 124
-rw-r--r-- 1 root root 87119 Aug 4 14:51 mha4mysql-manager-0.56-0.el6.noarch.rpm
-rw-r--r-- 1 root root 36326 Aug 4 14:51 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@MHAserver data]# yum install -y mha4mysql-*
在master(192.168.6.130)主节点上安装mha4mysql-node-0.56-0.el6.noarch.rpm
[root@master data]# yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@master data]# yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
在salve1(192.168.6.131)主节点上安装mha4mysql-node-0.56-0.el6.noarch.rpm
[root@salve1 data]# yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
-rw-r--r-- 1 root root 36326 Aug 4 14:51 mha4mysql-node-0.56-0.el6.noarch.rpm
在salve2(192.168.6.131)主节点上安装mha4mysql-node-0.56-0.el6.noarch.rpm
[root@salve2 data]# yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
-rw-r--r-- 1 root root 36326 Aug 4 14:51 mha4mysql-node-0.56-0.el6.noarch.rpm
4.在主节点上(192.168.6.130)上配置
Vim /etc/my.cnf
[mysqld]
server-id=1
log-bin
skip_name-resolve=1
启动服务器
Systemctl start mariadb
初始化数据库
/usr/bin/mysql_secure_installation
进入数据库
mysql -uroot -p123456
show master logs;
授权从节点远程主机 账户和密码
grant replication slave on *.* to repluser@'192.168.6.%' identified by 'centos';
授权mha主机 账户和密码
grant all on *.* to mhauser@'192.168.6.%' identified by 'mhauser';
5.配置从节点slave1
[mysqld]
server-id=2
log-bin
read-only
relay_log_purge=0
skip_name_resolve=1
启动数据库
Systemctl start mariadb
进入数据库
Mysql -uroot -p123456
修改:
CHANGE MASTER TO
MASTER_HOST='192.168.6.130',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=1408;
启动slave;
Start slave;
Show slave status\G;
6.配置salve2(192.168.6.132)
[mysqld]
server-id=3
log-bin
read-only
relay_log_purge=0
skip_name_resolve=1
启动mariadb 数据库
Systemctl start mariadb
进入数据库
Mysql -uroot -p123456
配置
CHANGE MASTER TO
MASTER_HOST='192.168.6.130',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=1408;
启动从节点服务
Start slave;
查看从节点信息;
Show salve status\G;
5.配置MHA manager(192.168.6.129)主机和其他三台主机的Key验证的ssh服务,MHA是基于ssh 免登录的
[root@MHAserver ~]# cd .ssh/
[root@MHAserver .ssh]# ll
total 12
-rw------- 1 root root 1679 Aug 4 17:43 id_rsa
-rw-r--r-- 1 root root 408 Aug 4 17:43 id_rsa.pub
-rw-r--r-- 1 root root 175 Jul 30 18:14 known_hosts
实现免登录操作
[root@MHAServer ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.6.129
[root@MHAServer ~]# scp -r .ssh root@192.168.6.130:/root/
[root@MHAServer ~]# scp -r .ssh root@192.168.6.131:/root/
[root@MHAServer ~]# scp -r .ssh root@192.168.6.132:/root/
6.配置MHA Manager 节点的配置文件
[root@MHAServer ~]# mkdir /etc/mha/
[root@MHAServer ~]# vim /etc/mha/mha.cnf
[server default]
user=mhauser
password=mhauser
manager_workdir=/data/mastermha/
manager_log=/data/mastermha/manager.log
remote_workdir=/data/mastermha/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1
[server1]
hostname=192.168.6.130
candidate_master=1
[server2]
hostname=192.168.6.131
candidate_master=1
[server3]
hostname=192.168.6.132
7.开启MHA服务之前的验证和启动
[root@MHAserver mha]# masterha_check_ssh --conf=/etc/mha/mha.cnf #验证ssh
[root@MHAserver mha]# masterha_check_repl --conf=/etc/mha/mha.cnf #验证主从复制
[root@MHAserver mha]# masterha_manager --conf=/etc/mha/mha.cnf #启动
8.测试当master(192.168.6.130)主机节点断开时,主从的切换
[root@master cd]# systemctl stop mariadb.service # 停掉master(192.168.6.130)的数据库
在slave1(192.168.6.131)上查看
查询为空,说明已经切换为主服务点了
查看
MariaDB [(none)]> show variables like 'read_only';
在slave2(192.168.6.132)上查看主节点是否转为salve1(192.168.6.131)