本文介绍利用keepalived实现mysql数据库的高可用,Keepalived+Mysql双主来实现MYSQL-HA,我们必须保证两台mysql数据库的数据完全一致,实现方法是两台mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台mysql数据库宕机后,应用能够自动切换到另外一台mysql数据库上去,保证系统的高可用。
实验环境:
操作系统:RedHat7.3 x86_64
MySQL版本:mysql 5.5.27
Keepalived版本:keepalibed-1.2.13
Mysql-master-1: 10.7.12.50
Mysql-master-2: 10.7.12.60
Mysql-VIP:10.7.12.70
一、搭建Mysql双主同步环境:
1、 准备工作:
配置IP地址:
Master-1的地址为10.7.12.50 ; Master-2的地址为10.7.12.60
两台机器安装mysql,关闭firewalld和selinux。
2、 修改master-1上mysql的配置文件:
#vim /etc/my.cnf 修改如下配置项:
log-bin=mysql-bin //启用二进制日志功能
binlog_format=mixed //设置binlog日志格式
server-id=1 //给服务器分配一个ID编号
relay-log=relay-bin //配置中继日志
relay-log-index=slave-relay-bin.index //配置中继日志名
auto_increment_increment=2 //设置自增字段每次递增的值
auto_increment_offset=1 //用来设定数据库中自动增长的起点
#systemctl restart mysqld //修改完配置文件后重启mysql
3、 修改master-2上mysql的配置文件:
#vim /etc/my.cnf 修改如下配置项:
log-bin=mysql-bin //启用二进制日志功能
binlog_format=mixed //设置binlog日志格式
server-id=2 //给服务器分配一个ID编号
relay-log=relay-bin //配置中继日志
relay-log-index=slave-relay-bin.index //配置中继日志名
auto_increment_increment=2 //设置自增字段每次递增的值
auto_increment_offset=2 //用来设定数据库中自动增长的起点
#systemctl restart mysqld //修改完配置文件后重启mysql
这里还有一个配置项“binlog_do_db=db_name”(可以添加多个),用来指定要同步的数据库。
4、 将master-1设置成master-2的主服务器:
1) 在master-1主机上创建授权账户,允许在master-2(10.7.12.60)上连接master-1的数据库:
2) 查看master-1的当前binlog状态信息:
3) 在master-2上将master-1设置为自己的主服务器,并开启自己的slave功能:
4) 查看master-2的同步状态:
5、 将master-2设置成master-1的主服务器:
步骤同上4中所述步骤,只是服务器调换角色即可。
6、 测试双主同步:
1) 在master-1主机上创建要同步的数据库如abcd,并在abcd中创建一张测试表如t1:
2) 在master-2上查看是否同步了master-1的变化:
3) 在master-2上插入一条数据:
master-1上也能查看到同步变化;
现在可以确定,在任意一台mysql上的数据操作都会同步到另一台mysql上,双主同步环境搭建完成。
如果mysql数据库之前已经存在,且有数据,只是后期才搭建从服务器,配置了数据同步,这种情况应先将主服务器上要同步的数据手动备份到从服务器的对应数据库上。
二、利用keepalived实现mysql数据库的高可用:
1、 在master-1和master-2上安装keepalived软件;
2、 首先安装kernel-devel、openssl-devel及popt-devel等支持库;
#yum –y install kernel-devel openssl-develpopt-devel
#yum –y install keepalived
3、 修改keepalived的配置文件:
Keepalived只有一个配置文件/etc/keepalived/keepalived.conf,里面包括以下几个配置项:
global_defs:主要配置故障发生时的通知对象及机器标识;
vrrp_instance:用来定义对外提供服务的VIP区域及相关属性;
virtual_server:虚拟服务器定义。
A、修改master-1的keepalived.conf文件如下:
B、修改master-2的keepalived.conf文件如下:
主要参数:
router-idMYSQL-1 MYSQL-2 主机标识符;
stateBACKUP 表示keepalived角色,都是设成BACKUP则以优先级为主要参考;
interfaceens32 指定HA监听的网络接口;
virtual_router_id 虚拟路由标识,取值0-255,master-1和master-2保持一致;
priority 90 优先级,用来选举master,取值范围1-255;
advert_int 1 发VRRP包时间间隔,即多久进行一次master选举;
nopreempt不抢占,即允许一个priority值比较低的一个节点作为master;
delay_loop 2 设置运行情况检查时间,单位为秒;
lb_algorr 设置后端调度器算法,rr为轮询算法;
lb_kindDR 设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选;
persistence_timeout 60 会话保持时间,单位为秒;
protocol TCP 指定转发协议,有 TCP和UDP可选;
notify_down 检查mysql服务down掉后执行的脚本;
以上参数中router_id、priority和real_server三处不同,其他部分都相同。
启动keepalived服务:
#systemctl start keepalived
4、 为master-1和master-2添加检测脚本:
当mysql服务停止工作时,自动关闭本机的keepalived服务,实现将故障机剔除;
#mkdir –pv /etc/keepalived/bin/
#vim /etc/keepalived/bin/mysql.sh内容如下:
#!/bin/bash
pkill keepalived
/sbin/ifdown ens160 && /sbin/ifupens160
#chmod +x /etc/keepalived/bin/mysql.sh
两个节点配置相同,只是ens接口不同。
5、 测试:
a在master-1和master-2上分别查看两节点对VIP10.7.12.70的控制:
10.7.12.70/32在master-1上,说明此时master-1为master,master-2为备份节点。若此时停止master-1的mysql服务,VIP会被转移至master-2上,这样就能实现故障转移。
BMYSQL远程登录测试:
为MYSQL服务授权允许远程登录,两台节点都要授权:
Mysql>grant all on *.* to likai@’%’ identified by ‘123456a!’;
用客户端登录查看数据库内容:
此时停掉10.7.12.50的mysql服务:#systemctlstop mysqld
客户端重新连接查看如下:
可看到10.7.12.60可以自动接管服务。
总结:
Keepalived+mysql双主一般适用于中小型规模的公司环境。此方案有几个需要注意的地方:
1、 采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下相互抢占导致两个节点内写入相同的数据而引发冲突;
2、 把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(字增起始值)设置成不同值,其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原master上冲突,因此一开始就错开;
3、 Slave节点服务器配置不要太差,否则更容易导致复制延迟,作为热备节点的slave服务器,硬件配置不能低于master节点;
如果对延迟很敏感的话,可考虑使用MariaDB分支版本,或者直接上线MySQL5.7最新版本,利用多线程复制的方式可以很大降低复制延迟。