MHA 高可用

MHA(Master High Availability)

MySQL高可用解决方案, 它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的MySQL故障切换和主从提升的高可用软件 ,在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作 。

该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)

作者 Github : https://github.com/yoshinorim

实现原理:

MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master

MHA的核心实现为虚拟IPweb服务器mysql连接指向虚拟IPMaster服务器添加与之对应的虚拟IP,当Master宕掉后,新的Master再设置同样的虚拟IP,以此保证web服务高可用。

1.环境准备

机器环境

IDIPHostnameserver_idRemark
110.1.1.10mha.tigeru.cn-MHA 管理机
210.1.1.20master.tigeru.cn20
310.1.1.30slave1.tigeru.cn30从1
410.1.1.40slave2.tigeru.cn40从2

软件环境

系统版本MySQLMHA
CentOS 7.6MySQL-5.6.35mha4mysql-manager-0.57
mha4mysql-node-0.57

2.系统初始化

①配置IP

②配置主机名

③配置hosts,实现互相通信

10.1.1.10    mha.tigeru.cn     mha
10.1.1.20    master.tigeru.cn  master
10.1.1.30    slave1.tigeru.cn  slave1
10.1.1.40    slave2.tigeru.cn  slave2

注意:重启网络服务

④同步时间

3.构建主从

①软件安装

Master

# !/bin/bash
#1.解压安装包
tar -zvxf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
#2.移动到安装目录 /usr/local/mysql
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
#3.创建mysql账号
useradd -r -s /sbin/nologin mysql
#4.分配安装目录权限
chown -R mysql.mysql /usr/local/mysql
#5.进入安装目录
cd /usr/local/mysql 
#6.删除 mariadb-libs 数据库 
yum remove mariadb-libs -y 
#7.初始化数据库vim
scripts/mysql_install_db --user=mysql
#8.将服务添加到 /etc/init.d/ 目录下
cp support-files/mysql.server /etc/init.d/mysql
#9.启动 mysql 服务
service mysql start
#10.数据库安全设置,
#设置root密码,移除匿名用户,允许root远程连接,删除test数据库
bin/mysql_secure_installation

Slave1 && Slave2

从服务并不需要进行初始化,直接从通过rsync从主服务器拉过来

# !/bin/bash
#1.解压安装包
tar -zvxf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
#2.移动到安装目录 /usr/local/mysql
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
#3.创建mysql账号
useradd -r -s /sbin/nologin mysql
#4.分配安装目录权限
chown -R mysql.mysql /usr/local/mysql
#5.进入安装目录
cd /usr/local/mysql
#6.删除 mariadb-libs 数据库 ,并清空 mysql/data目录内容
yum remove mariadb-libs -y 
rm -rf data/*
#--------------------------
#7.将 Master 服务器 mysql/data 目录中的数据拉到 data 目录下,  ***
rsync -av  root@10.1.1.20:/usr/local/mysql/data/ /usr/local/mysql/data/ 
#--------------------------
#8. 删除 data/auto.cnf ,该文件中保存MySQL的UUID
rm -rf data/auto.cnf
#9.将服务添加到 /etc/init.d/ 目录下
cp support-files/mysql.server /etc/init.d/mysql
#10.启动 mysql 服务
service mysql start

②修改配置

基于GTIDs配置

Master

# vim /usr/local/mysql/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
server_id = 20
socket = /tmp/mysql.sock
character_set_server=utf8mb4
log-bin = /usr/local/mysql/data/binlog
log-error = /usr/local/mysql/data/mysql.err
# 添加3行配置
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency

Slave1 && Slave2

注意:Slave1与Slave2 需要设置不同的server_id

# vim /usr/local/mysql/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
# 根据规划设置不同 id
server_id = 30/40
socket = /tmp/mysql.sock
character_set_server=utf8mb4
# 从服务器也需要开启二进制日志
log-bin = /usr/local/mysql/data/binlog
relay-log=/usr/local/mysql/data/relaylog
log-error = /usr/local/mysql/data/mysql.err
# 添加4行配置
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency=1
skip-slave-start

③Master 创建同步账号

grant replication slave on *.* to 'slave'@'10.1.1.%' identified by '123';
flush privileges;

④Slave1与Slave2 开启同步

change master to master_host='10.1.1.20',master_user='slave',master_password='123',master_port=3306,master_auto_position=1;
--开启同步
start slave;
show slave status\G

4. MHA软件安装

①软件下载

mha4mysql-nodehttps://github.com/yoshinorim/mha4mysql-node/releases/

mha4mysql-managerhttps://github.com/yoshinorim/mha4mysql-manager/releases

旧版本: https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

②软件安装

第一步:MHA服务器安装Node节点与Manager管理节点

注意:安装前需要配置epel源,用于安装相关依赖

注意:先安装node 再安装 manager

注意:注意安装依赖perl-DBD-MySQL时会自动安装 mariadb-libs ,所以我们需要删除 /etc/my.cnf

yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

第二步:在其他三台服务器中(Master,Slave1,Slave2)安装Node节点

yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

5.配置SSH互信

①免密登录

MHA 需要不停的与其他三台服务器进行通信,来检测MySQL集群中各台机器的状态

四台机器(MHA,Master,Slave1,Slave2)上创建账号,

useradd admin
echo 123|passwd --stdin admin

配置免秘钥登录

注意 :使用 admin账户

# 1.切换为admin用户
su - admin
# 2.生成公钥
ssh-keygen -P "" -f ~/.ssh/id_rsa
# 2.进入目录
cd .ssh/
# 3.重命名
mv id_rsa.pub authorized_keys
# 4.拷贝秘钥到其他三台服务器(Master,Slave1,Slave2)
for i in 20 30 40;do scp -r ../.ssh/ 10.1.1.$i:~/;done

②配置SUDO

Master,Slave1,Slave2 配置sudo允许admin用户配置虚拟IP

Master服务器配置sudo

[root@master ~]# vim /etc/sudoers.d/admin

#User_Alias  表示具有sudo权限的用户列表; Host_Alias表示主机的列表
User_Alias MYSQL_USERS = admin
#Runas_Alias  表示用户以什么身份登录
Runas_Alias MYSQL_RUNAS = root
#Cmnd_Alias  表示允许执行命令的列表
Cmnd_Alias MYSQL_CMNDS = /sbin/ifconfig,/sbin/arping
MYSQL_USERS ALL = (MYSQL_RUNAS) NOPASSWD: MYSQL_CMNDS

Slave1,Slave2 拷贝 /etc/sudoers.d/admin

[root@master ~] for i in 30 40;do scp /etc/sudoers.d/admin 10.1.1.$i:/etc/sudoers.d/; done

注意:使用 root用户向Slave1,Slave2推送/etc/sudoers.d/admin文件

③为Master挂载虚拟IP

# su - admin
[admin@master ~] # sudo /sbin/ifconfig ens33:1 10.1.1.100 broadcast 10.1.1.255 netmask 255.255.255.0
# 让VIP立即生效
[admin@master ~] # sudo /sbin/arping -f -q -c 5 -w 5 -I ens33 -s 10.1.1.100 -U 10.1.1.30

参数说明

-f:收到第一个响应包后退出。
-q:quite模式,不显示输出。
-c:发送指定的count个ARP REQUEST包后停止。如果指定了-w参数,则会等待相同数量
的ARP REPLY包,直到超时为止。
-w:指定一个超时时间,单位为秒,arping在到达指定时间后退出,无论期间发送或接收
了多少包。在这种情况下,arping在发送完指定的count(-c)个包后并不会停止,而是
等待到超时或发送的count个包都进行了回应后才会退出。
-I:指定设备名,用来发送ARP REQUEST包的网络设备的名称。
-D:重复地址探测模式,用来检测有没有IP地址冲突,如果没有IP冲突则返回0。
-s:设置发送ARP包的IP资源地址5.4 创建mha相关配置文件
创建mha相关的工作目录
创建mha局部配置文件
-U:无理由的(强制的)ARP模式去更新别的主机上的ARP CACHE列表中的本机的信息,不需要响应。

6. MHA 配置

①创建MHA配置文件目录

[admin@mha ~]$ su - root
[root@mha ~]# mkdir /etc/mha
[root@mha ~]# mkdir -p /data/mha/masterha/app1
[root@mha ~]# chown -R admin. /data/mha

②下载配置文件

下载地址: https://github.com/yoshinorim/mha4mysql-manager/tree/master/samples/scripts

把MHA的4个配置文件上传到/etc/mha目录

app1.conf master_ip_failover.sh master_ip_online_change.sh power_manager

③修改配置文件 app1.conf

要在MASTER数据库主机中,创建一个mha账号,用于检测主从状态。从服务器会自动同步创建*

mysql> grant all privileges on *.* to mha@'10.1.1.10' identified by '123';
mysql> flush privileges;

修改文件内容

# cd /etc/mha
# vim app1.conf
[server default]
# 设置监控用户和密码(检测主从运行状态,必须创建在master主机上)
user=mha
password=123
# 设置复制环境中的复制用户和密码
repl_user=slave
repl_password=123
# 设置ssh的登录用户名
ssh_user=admin
# 设置监控主库,发送ping包的时间间隔,默认是 3 秒,尝试三次没有回应的时候自动进行failover
ping_interval=3
# 设置mgr的工作目录
manager_workdir=/data/mha/masterha/app1
# 设置mysql master 保存 binlog 的目录,以便 MHA 可以找到 master 的二进制日志
master_binlog_dir=/usr/local/mysql/data
# 设置 master 的 pid 文件
master_pid_file=/usr/local/mysql/data/master.tigeru.cn.pid
# 设置 mysql master 在发生切换时保存 binlog 的目录(在mysql master上创建这个目录)
remote_workdir=/data/mysql/mha
# 设置 mgr 日志文件
manager_log=/data/mha/masterha/app1/app1-3306.log
# MHA 到 master 的监控之间出现问题,MHA Manager 将会尝试从slave1和slave2登录到master上
# ------------------------- 分割线 --------------------------
secondary_check_script=/usr/bin/masterha_secondary_check -s 10.1.1.30 -s 10.1.1.40 --user=admin --port=22 --master_host=10.1.1.20 --master_port=3306
# 设置自动 failover 时候的切换脚本
master_ip_failover_script="/etc/mha/master_ip_failover.sh 10.1.1.100 1"

[server1]
# master主机IP
hostname=10.1.1.20
port= 3306
candidate_master=1
[server2]
# slave1主机IP
hostname=10.1.1.30
port= 3306
candidate_master=1
[server3]
# slave2主机IP
hostname=10.1.1.40
port= 3306
candidate_master=1

④. 修改自动切换脚本

修改脚本文件

master_ip_failover.sh  
master_ip_online_change.sh

修改网卡信息ens33)和互信用户名称(admin)

为脚本文件添加执行权限

[root@mha ~]# chmod +x /etc/mha/master_ip_*

7.检测

检查MHA,SSH互信与主从状态

注意:切换为admin用户检测

#检测 SSH 互信 
[admin@mha ~]$ masterha_check_ssh --conf=/etc/mha/app1.conf
# 检测主从状态
[admin@mha ~]$ masterha_check_repl --conf=/etc/mha/app1.conf

注意:请确保Slave 已经开启同步,mysql 重启后,主从同步会停止,需要手动开启

8.启动MHA

检测运行状态:

[admin@mha ~] $ masterha_check_status --conf=/etc/mha/app1.conf

启动MHA

[admin@mha ~] $ nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover &

如果MHA启动异常,可以通过cat命令,查看nohup.out(所有错误信息都会写入此文件)

停止MHA:

masterha_stop --conf=/etc/mha/app1.conf

查看自动切换过程:

 tail -f /data/mha/masterha/app1/app1-3306.log

9.注意事项

①两台从服务器的my.cnf不能拥有相同的server_id

②删除从服务器data/auto.cnf,确保每个机器UUID是不一样的

③重启mysql以后,主从会自动关闭,必须手工start slave重新开启

Last modification:April 12th, 2019 at 10:56 pm