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版本中,利用多线程复制的方式可以很大程度降低复制延迟性。