[MySQL]-双主+keepalived实现高可用
梁森 | 2023年1月
本文旨在记录学习主从时的拓展内容,怎么借助keepalived实现简单的高可用。
一、环境介绍
1.1 keepalived
keepalived的作用是检测服务器的状态,若某一台服务器宕机,会通过VIP(虚拟IP)的漂移选择另一台服务器,从而实现高可用。
它的工作原理是VRRP,即虚拟路由冗余协议,其中有两组重要概念:
- VRRP路由器 & 虚拟路由器
- 主控路由器 & 备份路由器
其实也好理解,对于第一组概念,VRRP路由器是物理实体,指的是运行VRRP的路由器;虚拟路由器是VRRP创建的,是一种逻辑概念,一组VRRP路由器协同工作,共同构成一台虚拟路由器。
对于第二组概念,其协议中存在着一种选举机制,用于选出提供服务的路由即为主控路由,其他的则成了备份路由。当主控路由失效后,会从备份路由中重新选举出一个主控路由,来继续工作,保障服务的不间断。
1.2 双主
对于主从同步的模式分为很多,这里选择用双主模式,个人理解为,两台机器互为主备,一台主机宕机,另一台机器可以继续提供服务。
1.3 基本原理
两台机器做双主同步,如果一台宕机,在没有VIP的时候,是不是需要我们手动去切换节点,这个过程是相对是非常耗时的,加入keepalived后,我们服务器的请求直接发送到VIP上,由VIP选择要去访问的IP,对于用户可以认为是无感知的,这也是它最大的优点。
二、实战操作
2.1 双主的配置
和主从同步的配置是一样的,这里可以参照我的上一篇文章《[MySQL]-主从同步实战》。
唯一要注意的就是,这篇文章是一主一从,对于双主,就是在两台机器上都布置下一主一从就可以,同时第二台机器部署主从同步时,可以不需要再去dump了。
2.2 keepalived的部署
开始之前呢,我们需要两台机器,和一个其他机器的IP当做VIP来使用。
要在两台机器上都部署keepalived
# 下载
wget http://www.keepalived.org/software/keepalived-1.4.5.tar.gz
# 解压缩
tar -zxf keepalived-1.4.5.tar.gz
# 编译安装
cd keepalived-1.4.5
./configure --prefix=/xx/xx/keepalived (你的安装路径)
make && make install
# 复制所需文件
cp /xx/xx/keepalived/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
cp /xx/xx/keepalived/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# 复制配置文件
mkdir /etc/keepalived
cp /xx/xx/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
echo "/etc/init.d/keepalived start" >> /etc/rc.local
# 编辑配置文件
vim /etc/keepalived/keepalived.conf
机器1的配置:
! Configurateon Fll-cmd --list-portsile for keepalived
global_defs {
router_id 1
}
vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/etc/keepalived/mysql.sh" #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
# state MASTER
state BACKUP
nopreempt #非抢占模式
interface ens192 #指定虚拟ip的网卡接口
mcast_src_ip IP2 #机器1的IP
virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的
priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
VIP #虚拟IP
}
track_script {
chk_mysql_port
}
}
机器2的配置:
! Configuration File for keepalived
global_defs {
router_id 2
}
vrrp_script { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/etc/keepalived/mysql.sh" #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
# state MASTER
state BACKUP
nopreempt #非抢占模式
interface ens192 #指定虚拟ip的网卡接口
mcast_src_ip IP2 #机器2的IP
virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
VIP #虚拟IP
}
track_script {
chk_mysql_port
}
}
检测脚本 mysql.sh (我这里的两台机器数据库的端口为3307)
#!bin/bash
source ~/.bash_profile
counter=$(netstat -na|grep "LISTEN"|grep "3307"|wc -l)
if [ "${counter}" -eq 0 ]; then
/etc/init.d/keepalived stop
fi
chmod 755 /etc/keepalived/mysql.sh
启动
/etc/init.d/keepalived start
正在启动 keepalived: [确定]
2.3 测试
# 查看两台机器的网卡情况
# 因为我们给机器1的priority要大一些,所以机器1的网卡上可以看到VIP的信息
inet VIP/32 scope global ens192
下面我们试着让机器1的mysql宕机,宕机之后我们再看一下VIP是在哪台机器上
# 这里模拟的比较简单,直接将3307端口干掉了
lsof -i:3307 | awk 'NR!=1{print $2}' | xargs kill -9
之后如果你的配置一切正常,再次查看两台机器的网卡情况后,如果在机器2上看到VIP的信息,那么到这里就说明你的双主+keepalived的高可用配置成功了。你的用户只需要访问VIP的地址,对IP的漂移是无感知的。这样一来,等到下次你的机器挂掉一台,就不用再去进行手动切换了。
三、总结
本文章介绍了MySQL最普通的一种高可用方案,优点很明显,但是回过头来,我们也要去思考是否存在缺点。下面是小编个人总结的优缺点:
优点:
- 部署方便,成本低
- 对用户无感知,不用再让运维人员手动进行切换
缺点:
- 脚本检测不完美。想要写出一份完美的检测脚本是很困难的,简单地去判断端口是否有服务是不够,倘若数据库假死怎么去避免呢?
- 数据的延迟。主从同步在大量数据写入时宕机,怎么保证数据的一致性呢?
所以,这么看来,任何一种方案都不是完美的,继续加油学习吧!