生产环境中一台mysql 主机存在单点故障,所以我们要确保 mysql 的高可用性,即两台 MySQL

服务器如果其中有一台 MySQL 服务器挂掉后,另外一台能立马接替其进行工作。

MySQL 的高可用方案一般有如下几种:

keepalived+双主,MHAPXCMMMHeartbeat+DRBD 等,比较常用的是 keepalived+双主, MHA PXC

本节主要介绍了利用 keepalived 实现 MySQL 数据库的高可用。

Keepalived+mysql 双主来实现MySQL-HA,我们必须保证两台MySQL 数据库的数据完全一样,基本思路是两台 MySQL 互为主从关系,通过 Keepalived 配置虚拟 IP,实现当其中的一台MySQL 数据库宕机后,应用能够自动切换到另外一台 MySQL 数据库,保证系统的高可用。拓扑环境

OScentos6.5 x86_64

Mysql 版本:mysql 5.5.38

Keepalived: keepalived-1.2.20 Mysql-vip:192.168.1.100 Mysql-master1:192.168.1.101 Mysql-master2:192.168.1.102

一、配置两台 mysql 主主同步

 MySQL 高可用性keepalived+mysql_第1张图片

 

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

下一步就是slave master binary log 拷贝到它自己的中继日志。首先,slave 开始一个工作线程——I/O 线程I/O 线程在master 上打开一个普通的连接,然后开始 binlog dump processBinlog  dump  process master 的二进制日志中读取事件,如果已经同步了 master,它会睡眠并等待 master 产生新的事件。I/O 线程将这些事件写入中继日志。

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


主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。若 mysql 主机开启了防火墙,需要关闭防火墙或创建规则。

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 服务

#service mysqld restart

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 服务

#service mysqld restart

注: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 设为 master2 的主服务器

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

blob.png

查看 master1 的当前 binlog 状态信息

 MySQL 高可用性keepalived+mysql_第2张图片


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


设置防火墙:

blob.png

设置防火墙:

#iptables I INPUT –p tcp –dport 3306 –j ACCEPT #service iptables save

查看从的状态,mysql>show slave status\G;以下两个值必须为 yes,代表从服务器能正常连接主服务器

能正常连接主服务器

Slave_IO_Running:Yes 

Slave_SQL_Running:Yes


MySQL 高可用性keepalived+mysql_第3张图片

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


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


blob.png


查看 master2 的当前 binlog 状态信息

MySQL 高可用性keepalived+mysql_第4张图片

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

blob.png

设置防火墙:

#iptables I INPUT –p tcp –dport 3306 –j ACCEPT #service iptables save

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

Slave_SQL_Running:Yes

MySQL 高可用性keepalived+mysql_第5张图片





4、测试主主同步

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

MySQL 高可用性keepalived+mysql_第6张图片

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

MySQL 高可用性keepalived+mysql_第7张图片

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

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

blob.png

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

MySQL 高可用性keepalived+mysql_第8张图片


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

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

下面我们就完成keepalived 的高可用性。

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

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

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

keepalived 主要有三个模块,分别是 core check vrrpcore 模块为 keepalived 的核心, 负责主进程的启动、维护以及全局配置文件的加载和解析。check 负责健康检查,包括常见的各种检查方式。vrrp 模块是来实现 VRRP 协议的。

二、keepalived 的安装配置

1、在 master1 master2 上安装软件包 keepalived

安装 keepalived 软件包与服务控制


在编译安装 Keepalived 之前,必须先安装内核开发包 kernel-devel 以及 openssl-develpopt-devel 等支持库。


若没有安装则通过rpm yum 工具进行安装编译安装 Keepalived

blob.png