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,另外一台充当从库。

Mysql集群高可用之mha

  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
View Code

相关文章: