一、keepalived介绍
1.keepalived是什么
Keepalived 是一个用 C 语言编写的路由软件。该项目的主要目标是为 Linux 系统和基于 Linux 的基础架构提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于众所周知且广泛使用的LVS (IPVS) 内核模块,提供第 4 层负载平衡。Keepalived 实现了一组检查器,以根据其健康状况动态和自适应地维护和管理负载平衡的服务器池。另一方面,高可用性是通过 VRRP实现的协议。VRRP 是路由器故障转移的基础。此外,Keepalived 实现了一组与 VRRP 有限状态机的挂钩,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived 实现了BFD协议。VRRP 状态转换可以考虑 BFD 提示来驱动快速状态转换。Keepalived 框架可以单独使用,也可以一起使用,以提供弹性基础架构。
2.VRRP是什么
VRRP全称:Virtual Router Redundancy Protocol,虚拟路由冗余协议。是一种用于提高网络可靠性的容错协议。通过VRRP,可以在主机的下一跳设备出现故障时,及时将业务切换到备份设备,从而保障网络通信的连续性和可靠性。
3.VRRP的相关术语
1. 虚拟路由器:由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关。 2. VRID:虚拟路由器的标识。有相同VRID的一组路由器构成一个虚拟路由器。 3. Master路由器:虚拟路由器中承担报文转发任务的路由器。 4. Backup路由器:Master路由器出现故障时,能够代替Master路由器工作的路由器。 5. 虚拟IP地址:虚拟路由器的IP地址。一个虚拟路由器可以拥有一个或多个IP地址。 6. IP地址拥有者:接口IP地址与虚拟IP地址相同的路由器被称为IP地址拥有者。 7. 虚拟MAC地址:一个虚拟路由器拥有一个虚拟MAC地址。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。 8. 优先级:VRRP根据优先级来确定虚拟路由器中每台路由器的地位。 9. 非抢占方式:如果Backup路由器工作在非抢占方式下,则只要Master路由器没有出现故障,Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器。 10. 抢占方式:如果Backup路由器工作在抢占方式下,当它收到VRRP报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的Master路由器的优先级高,就会主动抢占成为Master路由器;否则,将保持Backup状态。
以上说了keepalived是什么,并介绍了他的工作原理,总结下就是keepalived利用vrrp实现了ip的漂移从而保证应用的高可用。
二、nginx+keepalived实现高可用
1.环境准备
1).两台nginx服务器 - 192.168.150.166 - 192.168.150.166
2).标识出两台nginx服务 便于后面区分服务到底打在了哪个服务之上,可以更改nginx的index.html页面信息
2.安装keepalived
sudo yum install -y keepalived
3.编写nginx检测脚本为脚本赋执行权限
检测脚本如下check_nginx.sh:
#!/bin/bash counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl start nginx sleep 2 counter=$(ps ‐C nginx ‐‐no‐heading|wc ‐l) if [ "${counter}" = "0" ]; then systemctl stop keepalived fi fi
为该脚本赋予所属者的执行权限和同组用户的执行权限
chmod 755 /etc/keepalived/check_nginx.sh
4.MASTER的配置文件keepalived.conf
配置文件的信息并不复杂,主要分为5块:
全局配置
配置检测脚本
vrrp实例
指定执行脚本
虚拟ip
详细配置详见下面的配置文件:
! Configuration File for keepalived # 全局配置,路由ID,固定不变,标识路由的唯一性,主备之间无需一致 global_defs { router_id LVS_DEVEL } # 定义Nginx状态脚本 vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" # 间隔时间,单位为秒,默认1秒 interval 2 # 权重,当脚本成功或失败对当前节点的优先级是增加还是减少 weight ‐5 } #VRRP实例 vrrp_instance VI_1 { # 主节点 state MASTER # 绑定的网卡,使用ifconfig命令查看获取 interface eno16777736 # 虚拟路由id,主备之间必须相同 virtual_router_id 51 # 优先级,抢占模式下优先级高的成为主机,优先级相同情况下看ip priority 101 # 指定发送VRRP通告的间隔。单位是秒。 advert_int 2 # 安全认证用的密码,自定义即可 authentication { auth_type PASS auth_pass 1111 } # 指定Nginx执行状态脚本 track_script { check_nginx } # 对外暴露的VIP地址 virtual_ipaddress { 192.168.150.172 } }
5.BACKUP的配置文件keepalived.conf
备机的配置文件其实只有三处与主机不同,其余都是一样的。
路由id配置:标识唯一路由
state:标识主备
优先级:标识master选举的优先顺序,选取更大者
若是只是做高可用的话,一般主机配置会更好些,备机可能作为闲置资源配置不会太高,因为在故障恢复后,他还是会继续闲置。
! Configuration File for keepalived global_defs { router_id LVS_BACKUP } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 weight ‐5 } vrrp_instance VI_1 { state BACKUP interface eno16777736 virtual_router_id 51 priority 100 advert_int 2 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.150.172 } track_script { check_nginx }
6.启动keepalived
systemctl start keepalived systemctl enable keepalived # 添加开机启动项
keepalived会在主备之间进行通信,一旦master挂掉vip就会漂移到备机上,同时备机会变成master,在抢占模式下,当原master恢复时,会根据优先级判断谁是主机,若是原maser优先级较高,则原主机会成为新的主机,备机仍还是备机。若是两台优先级相同则会比较ip,较高者成为master,这里不太靠谱,所以一般还是将配置更高的机子的优先级调高(低于255)。若是只是nginx挂了的话,则会通过检测脚本来检测到nginx的失活,首先是通过脚本进行尝试重启,重启失败则会将keepalived进行关闭,这样也会实现虚拟ip的漂移。从而保证了应用的高可用。
三、测试展示
这里先做个构建完成后的展示:
1.直接关闭nginx
在主机上关闭nginx查看效果,预期效果是主备并不会从新分配,主机还是主机,因为我们检测脚本里有nginx服务异常重启的命令。
从上图可以看出我们访问的还是node1,还是主机上的nginx,所以脚本重启nginx是有效的。
2.异常关闭nginx
这里通过更改nginx的配置文件名称,然后再停掉nginx,这样nginx就不会重启,预期master的keepalived会被停掉然后发生ip的漂移,访问192.168.150.172展示的应该是原备机的nginx初始页信息:
可以看到此时访问nginx发现页面已经是node2了,说明ip已经发生了漂移。
3.直接关闭keepalived
这个结果会直接导致ip的漂移,因为ip漂移就是根据keepalived是否存活来做的,其实上面通过更改nginx配置文件,然后杀死nginx就是为了能正常关闭keepalived。和这里其实是一样的。这里就不重复贴图了。
四、总结
keepalived免费开源,性能经过这么多年的实践也无需担心,中小企业做高可用,完全可以选择它,若是需要增加负载均衡的考虑,可以再搭配下LVS或者HAproxy来实现这些,不过中小企业应为日活量并不高,其实nginx其实负载均衡的必要性没有这么高。