一、MySQL高可用方案
1、MHA架构介绍:
- MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
2、MHA节点组成:
- MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
3、MHA自动故障切换过程
- MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
4、MHA节点集群条件
- 目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。
二、MHA工具:
- MHA软件的架构:由两部分组成,Manager工具包和Node工具包,具体的说明如下。
1、Manager工具包主要包括以下几个工具:
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_manger 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
2、Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
save_binary_logs(保存二进制日志) 保存和复制master的二进制日志
apply_diff_relay_logs(应用差异中继日志) 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs(清理中继日志) 清除中继日志(不会阻塞SQL线程)
3、MHA保持数据的一致性
- 主要通过MHA node的以下几个工具实现,但是这些工具由mha manager触发:
- save_binary_logs 如果master的二进制日志可以存取的话,保存复制master的二进制日志,最大程度保证数据不丢失
- apply_diff_relay_logs 相对于最新的slave,生成差异的中继日志并将所有差异事件应用到其他所有的slave
注意:
对比的是relay log,relay log越新就越接近于master,才能保证数据是最新的。
purge_relay_logs删除中继日志而不阻塞sql线程
三、MHA的优势
1、故障切换快
- 在主从复制集群中,只要从库在复制上没有延迟,MHA通常可以在数秒内实现故障切换。
2、master故障不会导致数据不一致
- 当目前的master出现故障时,MHA自动识别slave之间中继日志(relay log)的不同,并应用到所有的slave中。这样所有的salve能够保持同步,只要所有的slave处于存活
状态。和Semi-Synchronous Replication一起使用,(几乎)可以保证没有数据丢失。
3、无需修改当前的MySQL设置
MHA的设计的重要原则之一就是尽可能地简单易用。MHA工作在传统的MySQL版本5.0和之后版本的主从复制环境中。和其它高可用解决方法比,MHA并不需要改变MySQL的部署环境。MHA适用于异步和半同步的主从复制。
启动/停止/升级/降级/安装/卸载MHA不需要改变(包扩启动/停止)MySQL复制。当需要升级MHA到新的版本,不需要停止MySQL,仅仅替换到新版本的MHA,然后重启MHA Manager
就好了。MHA运行在MySQL 5.0开始的原生版本上。MHA工作的包括5.0/5.1/5.5的原生版本的MySQL上,如果现有老版本实现高可用,并不需要迁移新版本。
4、无需增加大量的服务器
- MHA由MHA Manager和MHA Node组成。MHA Node运行在需要故障切换/恢复的MySQL服务器上,因此并不需要额外增加服务器。MHA Manager运行在特定的服务器上,因此需要增加一台(实现高可用需要2台),但是MHA Manager可以监控大量(甚至上百台)单独的master,因此,并不需要增加大量的服务器。即使在一台slave上运行MHA Manager也是可以的。综上,实现MHA并没用额外增加大量的服务。
5、无性能下降
- MHA适用与异步或半同步的MySQL复制。监控master时,MHA仅仅是每隔几秒(默认是3秒)发送一个ping包,并不发送重查询。可以得到像原生MySQL复制一样快的性能。
6、适用于任何存储引擎
- MHA可以运行在只要MySQL复制运行的存储引擎上,并不仅限制于InnoDB,即使在不易迁移的传统的MyISAM引擎环境,一样可以使用MHA。
四、实验示例
MHA 下载地址:
0.57版本下载地址 (本文可用)
- manager下载:https://raw.githubusercontent.com/linyue515/mysql-master-ha/master/mha4mysql-manager-0.57-0.el7.noarch.rpm
- node下载: https://raw.githubusercontent.com/linyue515/mysql-master-ha/master/mha4mysql-node-0.57-0.el7.noarch.rpm
0.58版本下载地址(适合myql5.7以上,本文mariadb不支持super_read_only)
- manager下载:https://github.com/yoshinorim/mha4mysql-manager/releases
- node下载:https://github.com/yoshinorim/mha4mysql-node/releases
1、 主节点配置:192.168.1.19
#安装mariadb同步时间
[root@mysql-19 ~]# yum install mariadb-server ntpdate -y
[root@mysql-19 ~]# ntpdate time1.aliyun.com
# 修改Mariadb配置文件
[root@mysql-19 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
innodb_file_per_table=ON
skip_name_resolve=ON
server_id=1
log_bin=master-log
relay_log=relay-log
#安装MHA的node软件
[root@mysql-19 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@mysql-19 ~]# systemctl restart mariadb #重启服务
#MHA用户授权
MariaDB [(none)]> GRANT ALL ON *.* TO 'mhadmin'@'192.168.1.%' IDENTIFIED BY 'mhapass';
Query OK, 0 rows affected (0.00 sec)
#从节点授权
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repladmin'@'192.168.1.%' IDENTIFIED BY 'replpass';
Query OK, 0 rows affected (0.05 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
#生成ssh秘钥
[root@mysql-19 ~]# ssh-keygen -t rsa -P ''
SHA256:CLgVL5NWYnswUiZKKTLfihEyicoGpS7a9h01DwQXo+o root@mysql-19
The key's randomart image is:
+---[RSA 2048]----+
|.+=.O o +. |
|%+ * X + . |
|X=..O + . |
|+o.+.* o |
|o+... . S |
|+... . + |
|. o E . . |
| . . . . |
| . . |
+----[SHA256]-----+
#分配给本机一个秘钥
[root@mysql-19 ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
#拷贝到其他节点上 ,如果提示未找到.ssh目录,到/root下创建
[root@mysql-19 ~]# scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} [email protected]:/root/.ssh/
[root@mysql-19 ~]# scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} [email protected]:/root/.ssh/
[root@mysql-19 ~]# scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} [email protected]:/root/.ssh/
#测试秘钥是否可用
[root@mysql-19 ~]# ssh [email protected] 'ifconfig'
#返回配置表示秘钥可用
ens33: flags=4163 mtu 1500
inet 192.168.1.20 netmask 255.255.255.0 broadcast 192.168.1.255
2、从节点一配置:192.168.1.20
#安装mariadb同步时间
[root@mysql-20 ~]# yum install mariadb-server ntpdate -y
[root@mysql-20 ~]# ntpdate time1.aliyun.com
# 修改Mariadb配置文件
[root@mysql-20 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
innodb_file_per_table=ON
skip_name_resolve=ON
server_id=11
relay_log=relay-log
log_bin=master-log
relay_log_purge=0
read_only=1
[root@mysql-20 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@mysql-20 ~]# systemctl restart mariadb #重启服务
3、从节点二配置:192.168.1.21
#安装mariadb同步时间
[root@mysql-21 ~]# yum install mariadb-server ntpdate -y
[root@mysql-21 ~]# ntpdate time1.aliyun.com
# 修改Mariadb配置文件
[root@mysql-21 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
innodb_file_per_table=ON
skip_name_resolve=ON
server_id=13
relay_log=relay-log
log_bin=master-log
relay_log_purge=0
read_only=1
[root@mysql-21 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@mysql-21 ~]# systemctl start mariadb #重启服务
4、安装MHA节点:192.168.1.60
- 下载MHA两rpm包,不太好找,github网站的文件由于较长时间没有维护了,编译安装一直没有成功,所以在csdn上面找到的rpm包安装。
- MHA节点manager和node包都要安装,其他从节点只安装node包即可。
注意:安装顺序为先安装node包-->manager包,否则会报错。
#因为需要perl环境,所以要先安装epel源
[root@proxysql-60 ~]# yum install epel-release -y #安装epel源
#下载两个rpm包
[root@mha-60 ~]# ls
mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm
#首先安装node包,顺序很重要
[root@mha-60 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
#再安装manager包
[root@mha-60 ~]# yum install mha4mysql-manager-0.56-0.el6.noarch.rpm -y
#编辑MHA主节点配置文件
[root@mha-60 ~]# mkdir /etc/masterha
[root@mha-60 ~]# vim /etc/masterha/app1.cnf
[server default] #默认配置段
user=mhadmin
password=mhapass
repl_user=repladmin
repl_password=replpass
ssh_user=root
ssh_port=22
#ssh_connection_timeout=30
#ssh_options="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
ping_interval=1
manager_workdir=/data/masterha/app1
manager_log=/data/masterha/app1/manager.log
remote_workdir=/data/masterha/app1
[server1]
hostname=192.168.1.19
candidate_master=1 #是否可以提升为主节点
[server2]
hostname=192.168.1.20
candidate_master=1 #是否可以提升为主节点
[server3]
hostname=192.168.1.21
candidate_master=1 #是否可以提升为主节点
#检查ssh通信
[root@mha-60 ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
........OK
........OK
All SSH connection tests passed successfully.
#检查主从节点
[root@mha-60 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
..............
MySQL Replication Health is OK.
#启动MHA,并指明保存日志的路径,最后的&符号代表在后台执行
[root@mha-60 data]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /data/masterha/app1/manager.log &
[2] 3544
#检查启动进程
[root@mha-60 ~]# ps aux
root 2724 0.1 2.1 297028 21616 pts/1 S 08:00 0:00 perl /usr/bin/masterha_manager --conf=/etc/masterha/app1.cnf
#查看当前主节点状态
[root@mha-60 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:13567) is running(0:PING_OK), master:192.168.1.19
#停止MHA
[root@mha-60 ~]# masterha_stop --conf=/etc/masterha/app1.cnf
MHA Manager is not running on app1(2:NOT_RUNNING).
- 启动时时候,如果碰到not running on app1(2:NOT_RUNNING).,把已有的perl进程kill掉,再次尝试启动。
- 常用查看状态命令:
检查MHA运行状态
- masterha_check_status --conf=/etc/masterha/app1.cnf
检查MHA互信
- masterha_check_ssh --conf=/etc/masterha/app1.cnf
检查复制情况
- masterha_check_repl --conf=/etc/masterha/app1.cnf
五、测试:
1、主节点切换测试
- 现在数据库主节点是192.168.1.19,首先停掉主节点sql进程
#安装killall
[root@mysql-19 ~]# yum install psmisc -y
#停止mysql服务进程
[root@mysql-19 ~]# killall -9 mysqld mysqld_safe
- 查看MHA日志,切换是否成功
#自动切换成功
[root@mha-60 ~]# tail -100 /data/masterha/app1/manager.log
----- Failover Report -----
app1: MySQL Master failover 192.168.1.19(192.168.1.19:3306) to 192.168.1.20(192.168.1.20:3306) succeeded #主节点已经切换
Master 192.168.1.19(192.168.1.19:3306) is down! #原主节点已下线
.......
Selected 192.168.1.20(192.168.1.20:3306) as a new master. #新主节点
192.168.1.20(192.168.1.20:3306): OK: Applying all logs succeeded. #新主节点获取所有日志成功
192.168.1.21(192.168.1.21:3306): This host has the latest relay log events. #从节点
.......
#自动切换后MHA线程停止工作
[root@mha-60 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
- 在新主节点192.168.1.20上测试,是否为变成主节点
#新主节点创建新表
MariaDB [mydb]> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| tbl1 |
+----------------+
1 row in set (0.00 sec)
MariaDB [mydb]> create table tbl2(num int(10),addr char(50));
Query OK, 0 rows affected (0.02 sec)
MariaDB [mydb]> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| tbl1 |
| tbl2 |
+----------------+
2 rows in set (0.00 sec)
#在192.168.1.21从节点查看
MariaDB [mydb]> show tables; #已同步
+----------------+
| Tables_in_mydb |
+----------------+
| tbl1 |
| tbl2 |
+----------------+
2、故障节点恢复
- 新主节点192.168.1.20备份数据库
#新节点数据库备份
[root@mysql-20 ~]# mysqldump -uroot -x -R -E --triggers --master-data=2 --all-databases > alldb.sql
#备份传给故障节点
[root@mysql-20 ~]# scp alldb.sql 192.168.1.19:/root/
- 故障节点192.168.1.19数据库恢复
# 修改Mariadb配置文件
[root@mysql-19 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
innodb_file_per_table=ON
skip_name_resolve=ON
server_id=1
log_bin=master-log
relay_log=relay-log
relay_log_purge=0
read_only=1
#启动mysql,恢复数据库
[root@mysql-19 ~]# systemctl start mariadb
[root@mysql-19 ~]# mysql < alldb.sql
#查看二进制文件位置
[root@mysql-19 ~]# less -30 alldb.sql
.........
-- CHANGE MASTER TO MASTER_LOG_FILE='master-log.000001', MASTER_LOG_POS=352;
#根据二进制日志恢复并启动从节点
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.1.20',MASTER_USER='repladmin',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-log.000001',MASTER_LOG_POS=352;
Query OK, 0 rows affected (0.02 sec)
#启动线程
MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
#查看信息
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.20
Master_User: repladmin
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000001
Read_Master_Log_Pos: 352
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 530
Relay_Master_Log_File: master-log.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
- MHA启动
[root@mha-60 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
.........
MySQL Replication Health is OK.
#启动
[root@mha-60 ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &>> /data/masterha/app1/manager.log &
[2] 18978
参考文献连接:https://www.cnblogs.com/xuanzhi201111/p/4231412.html
https://www.cnblogs.com/kevingrace/p/5662839.html