生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL服务器如果其中有一台MySQL服务器挂掉后,另外一台能立马接替其进行工作。

本次介绍利用keepalive实现mysql数据库的高可用

keepalived + mysql

双主来实现mysql-HA,我们必须保证两台mysql数据库的数据完全一样。

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

拓扑环境:

OS:centos7.2

mysql-vip: 192.168.1.100

mysql-master1: 192.168.1.120

mysql-master2: 192.168.1.130

一、配置两台mysql主主同步

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务写入二进制日志。在事件写入二进制日志完成后,master通知存储引擎提交事务。下一步就是slave将master的binary

log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump

process。Binlog

dump process从master的二进制日志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。SQL

slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

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

1、修改mysql的配置文件

两台MySQL均要开启binlog日志功能,开启方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin选项,两台MySQL的server-ID不能一样,默认情况下两台MySQL的serverID都是1,需将其中一台修改为2即可。

master1中有关复制的配置如下:

log-bin = mysql-bin

binlog_format = mixed

server-id = 1

relay-log=

relay-bin

relay-log-index = slave-relay-bin.index

auto-increment-increment = 2

auto-increment-offset = 1

重启mysqld服务

master2中有关复制的配置如下:

log-bin = mysql-bin

binlog_format = mixed

server-id = 2

relay-log=

relay-bin

relay-log-index = slave-relay-bin.index

auto-increment-increment = 2

auto-increment-offset = 2

重启mysqld服务

注:master1和master2只有server-id不同和 auto-increment-offset不同。

mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。

auto-increment-increment表示自增长字段每次递增的量,其默认值是1。它的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2。

auto-increment-offset是用来设定数据库中自动增长的起点(即初始值),因为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突

注:可以在my.cnf文件中添加“binlog_do_db=数据库名”配置项(可以添加多个)来指定要同步的数据库

2、将master1设为myster2的主服务器

在master1主机上创建授权账户,允许在master2(192.168.1.102)主机上连接

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

查看master1的当前binlog状态信息

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

在master2上将master1设为自己的主服务器并开启slave功能

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

查看从的状态,以下两个值必须为yes,代表从服务器能正常连接主服务器

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

mysql> show slave status\G;

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

3、将master2设为master1的主服务器

在master2主机上创建授权账户,允许在master1(192.168.1.101)主机上连接

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

查看master2的当前binlog状态信息

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

在master1上将master2设为自已的主服务器并开启slave功能。

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

查看从的状态,以下两个值必须为yes,代表从服务器能正常连接主服务器

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

4 、测试主主同步

在master1上创建要同步的数据库如test_db,并在test_db中创建一张测试表如tab1

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

查看master2主机是否同步了master1上的数据变化

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

从上图可以看出master2同步了master的数据变化

在master2主机上向tab1表中插入数据

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

查看master1主机是否同步了master2上的数据变化

keepalived实现对mysql的双主 mysql keepalived双主双活_mysql

现在任何一台MySQL上更新数据都会同步到另一台MySQL,MySQL同步完成。

注:若主MYSQL服务器已经存在,只是后期才搭建从MYSQL服务器,在置配数据同步前应先将主MYSQL服务器的要同步的数据库拷贝到从MYSQL服务器上(如先在主MYSQL上备份数据库,再用备份在从MYSQL服务器上恢复)