mysql+keepalived实现高可用+主主复制模式

为了解决mysql的单点故障问题,衍生出很多mysql的高可用方案:

keepalived+双主、MHA、PXC、MMM、Hearbeat+DRBD等,比较常用的一般是keepalived+双主,MHA和PXC

在此搭建实验环境,实现keepalived+mysql双主模式。

实验思路:

两台MySQL互为主从关系(双主),通过keepalived配置虚拟vip,实现当其中的一台MySQL数据库宕机后,应用能自动切换到另外一台MySQL数据库,保证系统的高可用。

keepalived的概念:

keepalived是集群管理中保证集群高可用的一个软件解决方案,其功能类似于hearbeat,用来防止单点故障。

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip地址,master会发送组播(组播地址为224.0.0.18),当backup收不到vrrp包时就认为master已经down掉,这是就需要根据VRRP的优先级来选举一个backup当master,这样就可以保证路由器的高可用了。

keepalived主要有三个模块:

core模块:主要负责主进程的启动,维护以及全局配置文件的加载和解析

check模块:主要负责健康检查,常见的健康检查方式有:

(1)、TCP_CHECK:工作在四层

(2)、HTTP_GET | SSL_GET :向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配的从服务器池中移除。

(3)、misc_check:用脚本来检测方式

(4)、smtp_check:用来检测邮件服务

vrrp模块:实现vrrp协议。

实验环境:

OS:centos7 x86_64

Mysql版本:mysql5.7.13

Mysql-vip地址:192.168.1.100

Mysql-master1:192.168.1.101

Mysql-master2:192.168.1.102

MySQL主主同步:


(1)、master将更新的数据存入Binary log(二进制日志)中。

(2)、slave启用一个I/O线程负责将binary log中变化的数据拷贝至slave的relay log(中继日志)中。

(3)、slave启用SQL线程,重放relay log中的事件而更新slave数据,使其与master中的数据一致。

主主同步就是两台机器互为主从关系,在任何一台机器上写入都会同步

实现主主同步的思路:

(1)、分别修改mysql配置文件,启动二进制日志,分别开启relay-log日志。修改server-id值,注两台机器不可相同。

(2)、分别创建用于复制数据的用户,并授权

(3)、查看binlog日志信息和当前binlog的位置信息。

(4)、分别在互为从服务器上执行change master to操作,用于更新当前位置开始的数据。

在实现主主同步中,需要注意的事项为:

(1)、mysql中有自增长字段,需要在配置文件中指定自动增长值和起始值,两台不可唯一,防止自动增长列的冲突。

例如:

在一张表有id列,设为自动增长,默认值为1,设为主键,当在同步数据中,因其中一台master故障,无法实时同步此时的数据,另一台会继续写入数据,当修复后,此时写入数据id=3,同步至另一台服务器时,因设置了自动增长,会发现id=3的列已经有了,此时同步就会出错,所以一般,第一台服务器设置增长值为偶数,第二台服务器增长值为基数值,这样就不会造成冲突。

配置参数:

auto-increment-increment = 2 :表示自增长字段每次递增的量。默认值为1

auto-increment-offset = 1: 表示起始值,可以将两台服务器的起始值设置为不一样,就可以避免两台服务器数据同步时出现主键冲突。

注:可以在my.cnf文件中添加binlog_do_db=’数据库名’:用来指定要同步的数据库。

接下来就是具体实施此方案的流程:(在虚拟环境中进行测试)

实验步骤:

防火墙添加3306端口,将ip地址规划完成!

1、在master1上修改mysql配置文件:

首先确保mysql服务正常启动,防火墙添加3306端口:


修改配置文件

vim  /etc/my.cnf


master-2的配置:


修改mysql配置文件:

vim  /etc/my.cnf


分别在两台机器上执行重启mysqld服务

2、授予用户权限,用于同步数据,并查看当前binlog日志信息(master-1)


3、在master-2上执行change master to操作,指定同步master上此位置的数据信息,并启动slave


查看同步状态:


如果发现状态不是以上所标记的状态信息,根据下图中标记位置,查看错误信息是什么,根据错误来判断具体的问题出在哪里?


一般问题为:

确保两台主机的通信正常;

确保防火墙问题;

如果为克隆机器,需修改uuid值。vim /usr/local/mysql/data/auto.cnf,在原有的基础上,将uuid随意改动一个值即可。

4、以上只实现了单主从复制,即master-1为主,master-2为从,所谓主主复制就是互为主从,接下来还是根据此前的步骤,设置master-2为主,master-1为从,无非就是在master-1上执行change master to操作,同步master-2的数据。

(1)、在master-2上创建授权用户,用于同步数据,并查看当前binlog日志信息;


(2)、在master-1上执行change master to操作,并启用slave


查看同步状态:


测试:

在master-1上创建数据库test_db,创建表tb1,插入数据zhangsan,lisi,在master-2上查看是否同步。


在master-2上查看:


在master-2上向test_db.tb1表插入一条数据wanwu,查看master-2是否同步:


在master-1上查看:


master-1上也同步了数据,从实验中分析,无论master-1如何更新新的数据,id列的值永远是基数,这就保证了当master-2因故障再次修复后,同步数据时防止主键ID列冲突的问题!

注:

若主mysql服务器已经存在,只是后期才搭建从mysql服务器,在配置数据同步前应先将主mysql服务器要同步的数据拷贝至从mysql服务器上,才可以开始执行同步操作。

将主mysql服务器的数据拷贝至从mysql服务器上,可以使用以下方法:

(1)、使用mysqldump备份数据,将数据拷贝至从服务器上恢复数据。

(2)、使用xtrabackup功能备份数据,将数据拷贝至从服务器上恢复数据。

小结:

此上已经实现主主复制功能,但是依然存在单点故障的问题,所以以下实验通过keepalived软件实现主主的高可用功能。

二、keepalived的安装配置:

1、在master-1和master-2上分别安装软件包keepalived

(1)、在master-1和master-2上分别使用yum安装内核开发包kernel-devel以及openssl-devel ,popt-devel等支持库


(2)、编译安装keepalived


注释:

在centos6.5中,编译安装时,使用指定的linux内核位置对keepalived进行配置,使用此参数

--with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64,并将安装路径指定为根目录,这样就无需额外创建连接文件了。

在centos7中,不需要指定linux内核位置。

执行make install操作之后,会自动生成/etc/init.d/keepalived脚本文件,但还需要手动添加为系统服务,使用service、chkconfig工具对keepalived进行管理。


在master-2上也执行相同的操作,进行编译安装keepalived

2、上述已介绍过keepalived通过组播地址224.0.0.18发送报文,用于告知本机的存活信息,如果开启了防火墙,需要添加规则,在centos7中创建富策略规则:


在master-2上也执行相同的操作,添加防火墙规则。

3、修改keepalived配置文件(修改前,建议先做个备份)


keepalived.conf配置文件注释:



在master-1主机上具体的配置信息如下:(无用的配置参数可以删除)



创建mysql.sh脚本,并添加执行权限


启动keepalived服务


4、master-2主机上的keepalived.conf文件的修改



同上,创建/etc/keepalived/bin/mysql.sh脚本文件,添加执行权限


启动keepalived服务


5、测试:

在master-1和master-2上分别执行ip a命令,查看master-1和master-2对vip(群集虚拟ip)的控制权

(1)、master-1上查看


(2)、master-2上查看:


master-2对VIP地址无控制权,此时为备用状态。

(3)、将master-1的mysql服务停掉,查看keepalived.conf配置文件中定义的脚本,是否顺利执行,将keepalived服务停止,master-2将成为主服务器


keepalived已成功被停止掉

在master-2上查看,是否已为主服务器,拥有vip地址的控制权


此时master-2已为主服务器。

(3)通过客户端测试:(mysql的高可用)

在客户端使用mysql命令通过vip地址,连接mysql

需要分别在master-1和master-2上创建授权用户


在master-2上也执行此操作。

测试客户端登录:


在mysql中执行命令查看当前的server id是:


将master-1的mysql服务down掉,再次执行命令查看server id号


在客户端上查看:


说明master-2已成为主服务器,工作状态。

总结:

(1)、keepalived+mysq双主一般来说,中小型规模的时候,采用这种架构是最省事的。

在master节点发生故障后,利用keepalived的高可用机制实现快速切换到备用节点。

在这个方案里,有几个需要注意的地方:

1、采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下(比如脑裂)相互抢占导致往两个节点写入相同数据而发生冲突。

2、把两个节点的auto_increment_increment(自动增长)和auto_increment_offset(起始值)设为不同值,其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master冲突。

3、slave节点服务器配置不要太差,否则容易导致复制延迟。作为热备节点的slave服务器硬件配置不能低于master节点

4、在mysql5.7版本中,利用多线程复制的方式可以很大程度降低复制延迟性。