1 MHA介绍
官方介绍:https://code.google.com/archive/p/mysql-master-ha/
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司的youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
1.1 基本介绍
该软件由两部分组成: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,另外一台充当从库。
MHA有两个重要的角色,一个是manager,另外一个是node;
MHA Manager:通常单独部署在一台独立机器上管理多个master/slave集群;
MHA node:运行在每台MySQL服务器上(master/slave/manager),它通过监控具备解析和清理logs功能的脚本来监控故障转移。
1.2 mha原理
通过上图:MHA Manager管理多组主从复制。可以将MHA工作原理总结为如下:
(1)从宕机崩溃的master保存二进制日志事件(binlog events);
(2)识别含有最新更新的slave;
(3)应用差异的中继日志(relay log)到其他的slave;
(4)应用从master保存的二进制日志事件(binlog events);
(5)提升一个slave为新的master;
(6)使其他的slave连接新的master进行复制;
1.3 实验环境
|
主机名 |
IP地址(NAT) |
描述 |
|
db01 |
eth0:10.10.16.224 |
系统:CentOS6.8 安装:mysql5.6.34 master(主) |
|
db02 |
eth0:10.10.16.225 |
系统:CentOS6.8 安装:mysql5.6.34 slave(从) |
|
db03 |
eth0:10.10.16.229 |
系统:CentOS6.8 安装:mysql5.6.34 slave(从) |
1.4 软件包准备
MHA软件由两部分组成,Manager工具包和 Node工具包,具体的说明如下:
链接: https://pan.baidu.com/s/1_4t_5vEyN8ckxyqoB7fCeg
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信息
Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括:
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
PS:这里建议将以上脚本统一放到bin目录下
mha管理节点安装包: mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56.tar.gz
mha node节点安装包: mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-node-0.56.tar.gz
mysql中间件: Atlas-2.2.1.el6.x86_64.rpm
2 mha部署
2.1 环境准备
这里是在所有节点上执行。
2.11 设置主机名解析
设置主机名解析主要是便于主机之间无间缝操作和互通:
[root@db01 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.10.16.224 db01 10.10.16.225 db02 10.10.16.229 db03
2.12 配置ssh互信
使用检查mha ssh插件脚本检测通过:
#创建秘钥对 [root@db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 #发送公钥,包括自己 [root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.10.16.224 [root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.10.16.225 [root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.10.16.229
2.13 关闭iptables和selinux
防报错,测试环境建议关闭iptables和selinux:
/etc/init.d/iptables stop #centos7关闭Firewall chkconfig iptables off sed -i 's#SELINUX=.*#SELINUX=disabled#g' /etc/selinux/config sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config grep SELINUX=disabled /etc/selinux/config setenforce 0 getenforce
2.14 使用epel源
安装阿里云epel源:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
2.15 安装依赖包
在所有节点安装MHA node所需的perl模块(需要有安装epel源)
yum install perl-DBD-MySQL -y
2.2 安装mysql
目前MHA主要支持一主多从的架构,要搭建MHA,要求一个主从复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器。
安装脚本参考:安装mysql5.6.34源码安装 此方式安装过程较长
手动安装步骤:建议二进制安装,安装包较大(300M),直接解压,步骤简洁,下面主要介绍手动安装:
2.21 手动安装
安装包下载地址:http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.6/
链接: https://pan.baidu.com/s/1YtSKlp2IPyRNPOSu9c87oQ 提取码: bj27
上传mysql安装包(mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz)至/home/tools
创建安装目录 [root@db01 tools]# mkdir /usr/local/mysql-5.6.34 #解压mysql二进制包 [root@db01 tools]# tar xf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz -C /usr/local/mysql-5.6.34 #做软链接 [root@db01 tools]# ln -s /usr/local/mysql-5.6.34/ /usr/local/mysql #创建mysql用户 [root@db01 tools]# useradd mysql -s /sbin/nologin -M #进入mysql初始化目录 [root@db01 tools]# cd /usr/local/mysql/scripts/ #初始化mysql [root@db01 scripts]# ./mysql_install_db \ --user=mysql \ --datadir=/usr/local/mysql/data/ \ --basedir=/usr/local/mysql/ #注解 --user: 指定mysql用户 --datadir:指定mysql数据存放目录 --basedir:指定mysql base目录 #拷贝mysql配置文件 [root@db01 ~]# \cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf #拷贝mysql启动脚本 [root@db01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #修改mysql默认安装目录(否则无法启动) 默认/usr/local不需要改 [root@db01 ~]# sed -i 's#/usr/local#/your_path#g' /etc/init.d/mysqld #这里省略... [root@db01 ~]# sed -i 's#/usr/local#/your_path#g' /usr/local/mysql/bin/mysqld_safe #这里省略... #配置mysql环境变量 [root@db01 ~]# echo 'export PATH="/usr/local/mysql/bin:$PATH"' >> /etc/profile.d/mysql.sh #刷新环境变量 [root@db01 ~]# source /etc/profile
启动mysql和设置密码:
#加入开机自启 [root@db01 ~]# chkconfig mysqld on #启动mysql [root@db01 ~]# /etc/init.d/mysqld start Starting MySQL........... SUCCESS! #启动成功 #配置mysql密码为 [root@db01 ~]# mysqladmin -uroot password 123456
说明:以上步骤在所有节点操作。
2.22 配置主从复制
先决条件:(任何一台服务器,除了MySQL主库)
● 主库和从库都要开启binlog
● 主库和从库server-id不同
● 要有主从复制用户
1.主库操作:
开启binlog和server_id修改:
#编辑mysql配置文件 [root@db01 ~]# vim /etc/my.cnf #在mysqld标签下配置 [mysqld] log_bin=mysql-bin #开启binlog日志 server_id =1 #主库server-id为1,从库必须大于1
创建主从复制用户:
#登录数据库 [root@db01 ~]# mysql -uroot –p'123456' #创建rep用户 mysql> grant replication slave on *.* to rep@'10.10.16.%' identified by '123456'; #监控用户(master和slave上都执行)
2.从库操作:开启binlog和server_id修改:
#修改db02配置文件 [root@db02 ~]# vim /etc/my.cnf #在mysqld标签下配置 [mysqld] log_bin=mysql-bin #开启binlog日志 server_id =5 #主库server-id为1,从库必须大于1 [root@db02 ~]# /etc/init.d/mysqld restart #重启mysql
从库db03同上,server_id=10,开启binlog,步骤省略。
注:在以往如果是基于binlog日志的主从复制,则必须要记住主库的master状态信息。
mysql> show master status; +------------------+----------+ | File | Position | +------------------+----------+ | mysql-bin.000002 | 120 | +------------------+----------+
3.开启GTID:
GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。参考官方说明。
没开启之前先看一下GTID的状态:
mysql> show global variables like '%gtid%';
编辑mysql配置文件(主库从库都需要修改):
主从环境的搭建和5.5没有什么区别,唯一需要注意的是:开启GTID需要启用这三个参数: [root@db01 ~]# vim /etc/my.cnf #在[mysqld]标签下添加 [mysqld] gtid_mode=ON log_slave_updates enforce_gtid_consistency #重启数据库 [root@db01 ~]# /etc/init.d/mysqld restart #检查GTID状态 mysql> show global variables like '%gtid%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | enforce_gtid_consistency | ON | #执行GTID一致 | gtid_executed | | | gtid_mode | ON | #开启GTID模块 | gtid_owned | | | gtid_purged | | +--------------------------+-------+
注:主库从库都需要开启GTID否则在做主从复制的时候就会报错:
配置mysql主从复制时,在从机上需要进行CHANGE MASTER TO操作,以确定需要同步的主机IP,用户名,密码,binlog文件,binlog位置等信息。
[root@db02 ~]# mysql -uroot -p'123456' mysql> change master to -> master_host='10.10.16.224', -> master_user='rep', -> master_password='123456', -> master_auto_position=1; ERROR 1777 (HY000): CHANGE MASTER TO MASTER_AUTO_POSITION = 1 can only be executed when @@GLOBAL.GTID_MODE = ON.
4.配置主从复制:
从库也需要创建主从复制用户:上面执行过可以忽略
mysql> grant replication slave on *.* to rep@'10.10.16.%' identified by '123456'; Query OK, 0 rows affected (0.00 sec) mysql> select user,host from mysql.user;
开始配置主从复制
mysql> change master to master_host='10.10.16.224',master_user='rep',master_password='123456',master_auto_position=1; 或者: CHANGE MASTER TO MASTER_HOST='10.10.16.224',MASTER_USER='rep', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=112; #可变化的位置点和log文件 mysql> start slave; #开启slave mysql> show slave status\G #查看slave状态
说明:master_auto_position=1 为GTID位置点为1,MASTER_LOG_FILE为master的binlog文件
从库设置禁用自动删除relay log 功能:
mysql> set global relay_log_purge = 0; mysql> set global read_only=1; #设置只读 #编辑配置文件 [root@db02 ~]# vim /etc/my.cnf [mysqld] #禁用自动删除relay log 永久生效 relay_log_purge = 0
至此,主从部署完成。
2.3 安装mha node
https://directory.fsf.org/wiki #Debian下载地址
https://code.google.com/p/mysql-master-ha/ #mha下载地址,需要FQ
在所有节点进行安装mha node: 链接: https://pan.baidu.com/s/1_4t_5vEyN8ckxyqoB7fCeg
根据系统环境上传对应mha安装包到指定目录:这里提供两种安装方式的包,便于理解
[root@db01 tools]# rz -be mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56.tar.gz mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-node-0.56.tar.gz
开始安装node包:这里使用rpm包安装
[root@db01 tools]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
添加mha管理账号:
#主库上创建一个管理mha的账号 mysql> grant all privileges on *.* to 'mha'@'10.10.16.%' identified by 'mha'; #主库上创建,从库会自动复制(在从库上查看) mysql> select user,host from mysql.user;
创建命令软链接(所有节点):
#如果不创建命令软连接,检测mha复制情况的时候会报错 [root@db01 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog [root@db01 ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
二进制安装mha node(任选其一):
[root@db01 ~]# yum -y install perl-DBD-MySQL //先安装所需的perl模块 [root@db01 ~]# tar -zvxf mha4mysql-node-0.56.tar.gz [root@db01 ~]# cd mha4mysql-node-0.56 [root@db01 mha4mysql-node-0.56]# perl Makefile.PL 这一步可能报错如下: 1)Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5...... 解决办法: [root@db01 mha4mysql-node-0.56]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker 2)Can't locate CPAN.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5.... 解决办法: [root@db01 mha4mysql-node-0.56]# yum install -y perl-CPAN [root@db01 mha4mysql-node-0.56]# make && make install