目录
是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障,提到单点故障,不免让人想到一个名词:”VVRP(虚拟路由冗余协议)“,巧的是,keepalived是以VRRP协议为实现基础的。
vrrp相关的内容可以看我之前的博客:https://blog.csdn.net/m0_71518373/article/details/125321132
https://blog.csdn.net/m0_71518373/article/details/125321132
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
使用wget或从其他设备上传输keepalived的软件包,以下为博客完成时间最新版本的keepalived软件包的官方下载网址:
Keepalived for Linux
https://www.keepalived.org/download.html
将软件包解压缩,进入解压缩目录,执行./configure进行自定义
- cd keepalived-2.2.7
- ./configure \
- --prefix=/usr/local/keepalived \
- --with-init=systemd \
- --with-systemdsystemunitdir=/usr/lib/systemd/system
如果遇到报错提示
- configure: erro:
- !!! OpenSSL is not properly installed on your system. !!!
- !!! Can not include OpenSSL headers files. !!!
-
- *** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
安装依赖
- yum install openssl-devel
-
- yum install -y libnl3-devel
最后 make && make install 进行安装
复制配置文件
- mkdir /etc/keepalived
- cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
设置系统服务
- cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
- cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
- ln -s /usr/local/sbin/keepalived /usr/sbin/
- ln -s /usr/local/keepalived/sbin/keepalived /sbin/
当然,也可以yum install -y 来进行下载,可能还更方便,哈哈
按照上面的步骤进行安装的话,keepalived的配置文件位于:
- cd /usr/local/keepalived/etc/keepalived/
- ls
- keepalived.conf.sample samples
mv ./keepalived.conf.sample ./keepalived.conf
如果是yum下载的,keepalived配置文件位于/etc/keepalived/keepalived.conf
进入配置文件,主要的内容我们留着,多余的配置信息咱先删去
master配置内容如下
- ! Configuration File for keepalived
-
- global_defs {
- router_id ljp
- }
-
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.116.16
- }
- }
backup配置内容如下
- ! Configuration File for keepalived
-
- global_defs {
- router_id ljpbak2
- }
-
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 80
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.116.16
- }
- }
需要注意的地方是global_defs里的router_id 是本机的主机名,virtual_router_id是关联共享vip的机器的组编号,priority就是优先级,注意master优先级要比backup机器的优先级高,authentication下的功能与virtual_router_id相同,标记了不同机器间进行联结的密码,最后是vip(virtual_ipaddress),指定了机器间漂移的ip
准备了两台机器:192.168.116.22|192.168.116.23 ;keepalived设置如上面所示,192.168.116.22是MASTER,我们查看22主机的网卡ip

23主机的网卡ip (关闭22主机上keepalived的情况下)

对两台机器的nginx页面index.html修改为两台主机的ip,随后在浏览器上对192.168.116.16网址进行访问

关闭22主机上的keepalived,再对页面进行刷新,192.168.116.16 从22主机上漂移到了23主机。

随即我们发现了一个问题,虽然说keepalived可以解决单点故障,让几台机器间互相监测,但在这里nginx+keepalived,我们发现master机器上的nginx宕掉了 ,由于keepalived仍然存活着,虚拟ip仍在nginx出现故障的机器上,想要让ip漂移只能是nginx宕机的那台机器,执行一个监测脚本当发现nginx不存活时,连同keepalived一起关闭,这样就可以达到vip漂移来解决nginx的单点故障。
通过在配置文件中添加
- # vi /etc/keepalived/keepalived.conf
- ! Configuration File for keepalived
- global_defs {
- router_id ljp # 标识本节点的字条串,通常为 hostname
- }
- # keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
- vrrp_script chk_nginx {
- script "/etc/keepalived/shutngx.sh" # 检测 nginx 状态的脚本路径
- interval 2 # 检测时间间隔
- weight -20 # 如果条件成立,权重-20
- }
- # 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
- vrrp_instance VI_1 {
- state MASTER # 主节点为 MASTER, 对应的备份节点为 BACKUP
- interface eth0 # 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同
- virtual_router_id 33 # 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
- mcast_src_ip 192.168.116.22 # 本机 IP 地址
- priority 100 # 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
- nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
- advert_int 1 # 组播信息发送间隔,两个节点设置必须一样, 默认 1s
- # 设置验证信息,两个节点必须一致
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- # 将 track_script 块加入 instance 配置块
- track_script {
- chk_nginx # 执行 Nginx 监控的服务
- }
- # 虚拟 IP 池
- virtual_ipaddress {
- 192.168.50.130 # 虚拟 ip,可以定义多个
- }
- }
nginx+keepalived监控脚本(master、backup都得写),检查nginx运行情况,如果不在运行,对nginx进行开启,如果nginx开启失败,则关闭keepalived实现vip 的跳转。
- #!/bin/bash
- ngcount=`ps -C nginx |grep -v PID |wc -l`
- if [ $ngcount -eq 0 ];then
- /usr/local/nginx/sbin/nginx
- if [ `ps -C nginx | grep -v PID | wc -l` -eq 0 ];then
- killall keepalived
- fi
- fi
主机:192.168.116.22 192.168.116.23
VIP:192.168.116.16
功能实现:22主机master,23主机backup,关闭22主机上的nginx,脚本监测来进行开启nginx,如果开启失败,则关闭22主机上的keepalived,来让16的IP进行一个IP漂移到23主机上,实现nginx的高可用。
22主机的keepalived配置:
- ! Configuration File for keepalived
-
- global_defs {
- router_id ljp
- }
- vrrp_script chk_nginx {
- script "/etc/keepalived/shutngx.sh"
- interval 2
- weight -20
- }
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- mcast_src_ip 192.168.116.22
- priority 100
- nopreempt
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script {
- chk_nginx
- }
- virtual_ipaddress {
- 192.168.116.16
- }
- }
23主机的keepalived配置:
- ! Configuration File for keepalived
-
- global_defs {
- router_id ljpbak2
- }
- vrrp_script chk_nginx {
- script "/etc/keepalived/shutngx.sh"
- interval 2
- weight -20
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- mcast_src_ip 192.168.116.23
- priority 80
- nopreempt
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script {
- chk_script
- }
-
- virtual_ipaddress {
- 192.168.116.16
- }
- }
我们正常开启22,23主机的nginx和keepalived,对16进行访问,master22正常

对22主机上的nginx进行关闭,再次进行访问16,刷新页面会稍微卡一会,但之后显示还是master主机,这里是nginx监测脚本运行成功,监测到nginx未处于开启状态,重新开启了nginx

如果我们将22主机上的nginx和keepalived一起关闭,再对16的页面进行刷新

VIP192.168.116.16漂移到了192.168.116.23上。