前言
MHA是由日本人youshimaton(原就职于DeNA,现就职于FaceBook)开发的比较成熟的MySQL高可用方案。MHA能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品TMHA,目前已支持一主一从。
一:MHA架构
** MHA由MHA Manager和MHA Node组成。如下图:**
1.1:MHA概述
- —套优秀的MySQL高可用环境下故障切换和主从复制的软件
- MySQL故障过程中,MHA能做到O-30秒内自动完成故障切换
1.2:MHA的组成
- MHA Manager(管理节点)
- MHA Node(数据节点)
1.3:MHA Manager与MHA Node的作用
1.31:MHA Manager
- 运行一些工具,比如masterha_manager工具实现自动监控MySQL Master和实现master故障切换,其它工具实现手动实现master故障切换、在线mater转移、连接检查等等。一个Manager可以管理多个master-slave集群。
1.32:MHA Node
-
部署在所有运行MySQL的服务器上,无论是master还是slave。主要作用有三个。
-
Ⅰ、保存二进制日志如果能够访问故障master,会拷贝master的二进制日志
-
II、应用差异中继日志从拥有最新数据的slave上生成差异中继日志,然后应用差异日志。
-
III、清除中继日志在不停止SQL线程的情况下删除中继日志
1.4:MHA特点
-
自动故障切换过程中,MHA视图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
-
使用半同步复制,可以大大降低数据丢失的风险
-
目前MHA支持一主多从架构,最少三台服务,即一两从
1.5:MHA工作原理
-
当master出现故障时,通过对比slave之间I/O线程读取masterbinlog的位置,选取最接近的slave做为latestslave。其它slave通过与latest slave对比生成差异中继日志。在latest slave上应用从master保存的binlog,同时将latest slave提升为master。最后在其它slave上应用相应的差异中继日志并开始从新的master开始复制。
-
在MHA实现Master故障切换过程中,MHA Node会试图访问故障的master(通过SSH),如果可以访问(不是硬件故障,比如InnoDB数据文件损坏等),会保存二进制文件,以最大程度保证数据不丢失。MHA和半同步复制一起使用会大大降低数据丢失的危险。
二:案列环境
-
案列拓扑图如下
-
实验思路:
- 1、 安装MySQL数据库
- 2、 配置MySQl一主两从
- 3、 安装MHA软件
- 4、 配置无密码认证
- 5、 配置MySQL MHA 高可用
- 6、 模拟 master 故障切换
-
实验过程
-
因为操作系统是centos7,所以要下载MHA 0.57版本 系统:centos 7.6
在三台MySQL 节点上分别安装数据库,MySQL版本请使用5.6.36,cmake版本请使用2.8.6。下面只在Mysql1上面做演示,安装过程如下。
主服务器(master) IP:20.0.0.41
从服务器(slave) IP:20.0.0.42
主/从服务器 (tom03) IP:20.0.0.43
MHA-manager IP: 20.0.0.44
- 软件包直接下载即可
链接:https://pan.baidu.com/s/1loTBbGw88a9yv5MOi98ZnQ
提取码:owxk
2.1:搭建Mysal主从复制环境
2.21:修改主机名便于分区各个服务器
- 关闭所有防火墙跟安装防护功能
[root@localhost ~]# hostnamectl set-hostname MHA
[root@localhost ~]# su
[root@mha ~]# iptables -F
[root@mha ~]# setenforce 0
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@master ~]# iptables -F
[root@master ~]# setenforce 0
[root@localhost ~]# hostnamectl set-hostname slave
[root@localhost ~]# su
[root@slave ~]# iptables -F
[root@slave ~]# setenforce 0
#作为主备
[root@tom03 ~]# iptables -F
[root@tom03 ~]# setenforce 0
2.22:安装编译依赖的环境
- 三台服务器都安装
[root@master~]# yum install ncurses-devel gcc-c++ gcc perl-Module-Install -y
2.23:安装gmak
#把安装包移动到家目录
[root@master ~]# ls
anaconda-ks.cfg mha4mysql-manager-0.57.tar.gz ruby-2.4.1.tar.gz 图片 桌面
cmake-2.8.6 mha4mysql-node-0.57.tar.gz 公共 文档
cmake-2.8.6.tar.gz mysql-5.6.36 模板 下载
initial-setup-ks.cfg mysql-5.6.36.tar.gz 视频 音乐
#进行解压camke
[root@master ~]# tar zxvf cmake-2.8.6.tar.gz
#切换到cmake目录
[root@master ~]# cd cmake-2.8.6/
#执行脚本配置文件
[root@master cmake-2.8.6]# ./configure
#编译安装
[root@master cmake-2.8.6]# gmake && gmake install
2.24:安装Mysql数据库
#解压mysql
[root@master ~]# tar zxvf mysql-5.6.36.tar.gz
[root@master ~]# cd mysql-5.6.36/
[root@master mysql-5.6.36]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFDIR=/etc
#编译
[root@master mysql-5.6.36]# make
[root@master mysql-5.6.36]# make install
#把主配置文件复制到etc/my.cf
[root@master mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
#启动脚本
[root@master mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
#增加执行权限
[root@localhost mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld
#将mysql加入到chkconfig系统表中
[root@master mysql-5.6.36]# chkconfig --add mysqld
#配置环境变量便于系统所识别
[root@master mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
#使环境变量生效
[root@master mysql-5.6.36]# source /etc/profile
#设置组
[root@master mysql-5.6.36]# groupadd mysql
[root@master mysql-5.6.36]# useradd -M -s /sbin/nologin mysql -g mysql
[root@master mysql-5.6.36]# chown -R mysql.mysql /usr/local/mysql/
#创建数据文件存放位置
[root@master mysql-5.6.36]# mkdir -p /data/myssql
#初始化数据库
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data \
--user=mysql
2.25:修改Master的主配置文件
- 三台服务器的server-id不能一样
[root@master mysql-5.6.36]# vim /etc/my.cnf
[mysqld]段落添加
server-id =1 //表示唯一id
log_bin=master-bin //主服务器日志文件
log-slave-updates=true //从服务器更新二进制日志
#配置从从服务器
[root@slave ~]# vim /etc/my.cnf
[mysqld]段落添加
server-id = 2 //不能与主服务器一样
log_bin = master-bin
relay