生产环境中一台mysql 主机存在单点故障,所以我们要确保 mysql 的高可用性,即两台 MySQL
服务器如果其中有一台 MySQL 服务器挂掉后,另外一台能立马接替其进行工作。
MySQL 的高可用方案一般有如下几种:
keepalived+双主,MHA,PXC,MMM,Heartbeat+DRBD 等,比较常用的是 keepalived+双主, MHA 和 PXC。
本节主要介绍了利用 keepalived 实现 MySQL 数据库的高可用。
Keepalived+mysql 双主来实现MySQL-HA,我们必须保证两台MySQL 数据库的数据完全一样,基本思路是两台 MySQL 互为主从关系,通过 Keepalived 配置虚拟 IP,实现当其中的一台MySQL 数据库宕机后,应用能够自动切换到另外一台 MySQL 数据库,保证系统的高可用。拓扑环境
OS:centos6.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 主主同步
该过程的第一部分就是 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 的缓存中,所以中继日志的开销很小。
主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。若 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)主机上连接
查看 master1 的当前 binlog 状态信息
在 master2 上将 master1 设为自已的主服务器并开启 slave 功能。
设置防火墙:
设置防火墙:
#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
3、将 master2 设为 master1 的主服务器
在 master2 主机上创建授权账户,允许在 master1(192.168.1.101)主机上连接
查看 master2 的当前 binlog 状态信息
在 master1 上将 master2 设为自已的主服务器并开启 slave 功能。
设置防火墙:
#iptables I INPUT –p tcp –dport 3306 –j ACCEPT #service iptables save
查看从的状态,以下两个值必须为 yes,代表从服务器能正常连接主服务器Slave_IO_Running:Yes
Slave_SQL_Running:Yes
4、测试主主同步
在 master1 上创建要同步的数据库如 test_db,并在 test_db 中创建一张测试表如 tab1
查看 master2 主机是否同步了 master1 上的数据变化
从上图可以看出master2 同步了 master 的数据变化
在 master2 主机上向 tab1 表中插入数据
查看 master1 主机是否同步了 master2 上的数据变化
现在任何一台MySQL 上更新数据都会同步到另一台MySQL,MySQL 同步完成。
注:若主 MYSQL 服务器已经存在,只是后期才搭建从 MYSQL 服务器,在置配数据同步前应先将主 MYSQL 服务器的要同步的数据库拷贝到从 MYSQL 服务器上(如先在主 MYSQL 上备份数据库,再用备份在从MYSQL 服务器上恢复)
下面我们就完成keepalived 的高可用性。
keepalived 是集群管理中保证集群高可用的一个软件解决方案,其功能类似于 heartbeat,用来防止单点故障
keepalived 是以 VRRP 协议为实现基础的,VRRP 全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将 N 台提供相同功能的路由器组成一个路由器组,这个组里面有一个 master 和多个 backup,master 上面有一个对外提供服务的 vip,master 会发组播(组播地址为 224.0.0.18),当 backup 收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。这样的话就可以保证路由器的高可用了。
keepalived 主要有三个模块,分别是 core 、check 和 vrrp。core 模块为 keepalived 的核心, 负责主进程的启动、维护以及全局配置文件的加载和解析。check 负责健康检查,包括常见的各种检查方式。vrrp 模块是来实现 VRRP 协议的。
二、keepalived 的安装配置
1、在 master1 和 master2 上安装软件包 keepalived
安装 keepalived 软件包与服务控制
在编译安装 Keepalived 之前,必须先安装内核开发包 kernel-devel 以及 openssl-devel、popt-devel 等支持库。
若没有安装则通过rpm 或yum 工具进行安装编译安装 Keepalived