keepalived是什么?
- Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。为Linux系统和基于Linux的基础架构提供简单而强大的负载平衡和高可用性设施。
- 可以检测服务器(TCP)状态,将有故障的服务器剔除,并启用备用服务器,等故障服务器解决故障时,恢复。
- 内部基于
VRRP协议
实现,即虚拟路由冗余协议
,该协议本身是用于保证实现路由节点高可用的(冗余路由节点,当被冗余节点故障时,使用冗余节点替换该节点)。 - 下面通过和nginx搭配实现nginx高可用来演示。
怎么做?
- 安装:在主nginx服务器(假设为192.168.117.129)和备用nginx(假设为192.168.117.128)安装keepalived和nginx,nginx这里使用tengine。keepalived安装 :
yum -y install keepalived
;tengine安装如下:
#在 http://tengine.taobao.org/download_cn.html 找到要下载版本的下载地址,如2.3.0
wget http://tengine.taobao.org/download/tengine-2.3.0.tar.gz
#[可选]检查安装或更新一些依赖等
yum install gcc-c++ && yum -y install pcre pcre-devel && yum -y install zlib zlib-devel && yum -y install openssl openssl-devel
#tar解压
tar -zxvf tengine-2.3.0.tar.gz
#进入目录
cd tengine-2.3.0
#配置安装路径
./configure --prefix=/nginx
#编译&编译安装
make && make install
#使用默认配置,启动tengine
/nginx/sbin/nginx && /nginx/sbin/nginx -s reload
访问服务器地址,看到下图说明tengine安装&启动成功
- 配置主服务器keepalived并运行,
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #全局配置
notification_email {
shenxxxxxxx1992@xxx.com #定义报警邮件地址
xxxxx@xxx.com #定义报警邮件地址
}
notification_email_from shenshaoqin@xxx.com #设置邮件的发送地址
smtp_server 127.0.0.1 #邮箱服务器
smtp_connect_timeout 30 #定义超时时间
router_id LVS_DEVEL #定义路由标识信息,相同局域网唯一,发邮件时显示在邮件主题的信息
}
vrrp_script chk_nginx
{
script "/nginx/check_nginx.sh" #该脚本检测ngnix的运行状态,并在nginx进程不存在时尝 试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
interval 2 #每2s检测一次
weight 2 #检测失败(脚本返回非0)则优先级2
}
vrrp_instance VI_1 { #定义实例
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
interface ens33 #虚IP地址放置的网卡位置
virtual_router_id 55 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 100 # 优先级决定是主还是备 越大越优先
advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass shenshaoqin #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.0.130
}
track_script {
chk_nginx #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
}
}
检查tengine状态的脚本,检查nginx状态有几种方式:1)进程 2)端口 3)url能否访问等。这里简单使用检查进程去简单判断 vi /nginx/check_nginx.sh
#!/bin/bash
count=`ps -ef | grep "nginx: master process"| grep -v grep|wc -l`
echo "$count"
if [ $count -eq 0 ];then
service keepalived stop # 或使用pkill keepalived
fi
给脚本赋权限等
chmod 777 /nginx/check_nginx.sh
setenforce 0 # 关闭selinux
# tail -f /var/log/messages # 可以看到keepalived的输出。
keepalived启动前,ip addr
结果
service keepalived start
启动后 ip addr
结果
启动后192.168.117.130
访问结果:
由于我们还没有配置从服务器,因此service keepalived stop
关闭keepalived后再访问192.168.117.130
就没有上面效果了。重新启动keepalived,我们接下来开始配置从服务器。
- 配置从keepalived,基本一样。
! Configuration File for keepalived
global_defs { #全局配置
notification_email {
shenxxxxxxx1992@xxx.com #定义报警邮件地址
xxxxx@xxx.com #定义报警邮件地址
}
notification_email_from shenshaoqin@xxx.com #设置邮件的发送地址
smtp_server 127.0.0.1 #邮箱服务器
smtp_connect_timeout 30 #定义超时时间
router_id LVS_DEVEL #定义路由标识信息,相同局域网唯一,发邮件时显示在邮件主题的信息
}
vrrp_script chk_nginx
{
script "/nginx/check_nginx.sh" #该脚本检测ngnix的运行状态,并在nginx进程不存在时尝 试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
interval 2 #每2s检测一次
weight 2 #检测失败(脚本返回非0)则优先级2
}
vrrp_instance VI_1 { #定义实例
state BACKUP #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
interface ens33 #虚IP地址放置的网卡位置
virtual_router_id 55 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 50 # 优先级决定是主还是备 越大越优先
advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass shenshaoqin #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.0.130
}
track_script {
chk_nginx #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
}
}
从服务器同样也需要tengine的检查脚本,以及赋权等操作。 配置完成启动keepalived。启动前 ip addr
结果:
由于主服务器目前现在正常运行,因此,keepalived启动后ip addr
也是一样的效果。我们现在模拟故障,关闭主服务器的nginx ,pkill nginx
即可,可以发现主服务器的 keepalived也随之关闭了,但是 192.168.117.130
却仍可以访问。现在查看从服务器ip ip addr
, 可以发现从服务器的ip多了 192.168.117.130
,如图
去除故障后,重新启动主服务器的nginx服务和keepalived。再检查从服务器的ip可以发现,从服务器的ip变回初始的状态了。
脑裂
- 产生原因:当主备无法互相连接时(即认为对方都‘挂’了),可能会造成脑裂
- 对于无状态的主备,如nginx本身不保留状态,脑裂问题没有大的影响,对有状态服务如MySQL,需要防止异常脑裂。
- 思路:增加类似上面检查nginx的脚本检测,检测方向:检查服务器是否连接网关;检查是否能够连接外界某个服务等。如果不行,则说明是本服务器出了问题,应该关闭自己。
文章参考:
keepalived实现服务高可用
High Availability Support for NGINX Plus in On-Premises Deployments