nginx高可用选型-keepalived

简介: Keepalived 是一个用 C 语言编写的路由软件。该项目的主要目标是为 Linux 系统和基于 Linux 的基础架构提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于众所周知且广泛使用的LVS (IPVS) 内核模块,提供第 4 层负载平衡。

一、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,可以在主机的下一跳设备出现故障时,及时将业务切换到备份设备,从而保障网络通信的连续性和可靠性。


e9a7e38f6db94efb906e144449b97db1.png



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的漂移。从而保证了应用的高可用。


三、测试展示



这里先做个构建完成后的展示:


c865bf4aca5f48dd8c06b6de33fae84b.gif


1.直接关闭nginx


在主机上关闭nginx查看效果,预期效果是主备并不会从新分配,主机还是主机,因为我们检测脚本里有nginx服务异常重启的命令。

ba92eb9319ff4597b252ad49d04f3bd7.gif


从上图可以看出我们访问的还是node1,还是主机上的nginx,所以脚本重启nginx是有效的。


2.异常关闭nginx


这里通过更改nginx的配置文件名称,然后再停掉nginx,这样nginx就不会重启,预期master的keepalived会被停掉然后发生ip的漂移,访问192.168.150.172展示的应该是原备机的nginx初始页信息:

77c8d9afafad41d1a3990ef5c35765a1.gif


可以看到此时访问nginx发现页面已经是node2了,说明ip已经发生了漂移。


3.直接关闭keepalived


这个结果会直接导致ip的漂移,因为ip漂移就是根据keepalived是否存活来做的,其实上面通过更改nginx配置文件,然后杀死nginx就是为了能正常关闭keepalived。和这里其实是一样的。这里就不重复贴图了。


四、总结



keepalived免费开源,性能经过这么多年的实践也无需担心,中小企业做高可用,完全可以选择它,若是需要增加负载均衡的考虑,可以再搭配下LVS或者HAproxy来实现这些,不过中小企业应为日活量并不高,其实nginx其实负载均衡的必要性没有这么高。


相关文章
|
3月前
|
负载均衡 应用服务中间件 Linux
高可用系列文章之三 - NGINX 高可用实施方案
高可用系列文章之三 - NGINX 高可用实施方案
|
1月前
|
运维 应用服务中间件 Linux
keepalived详解(三)——keepalived与Nginx配合实战
keepalived详解(三)——keepalived与Nginx配合实战
31 1
|
2天前
|
存储 运维 负载均衡
Heartbeat+Nginx实现高可用集群
通过Heartbeat与Nginx的结合,您可以建立一个高可用性的负载均衡集群,确保在服务器故障时仍能提供无中断的服务。这种配置需要仔细的计划和测试,以确保系统在故障情况下能够正确运行。
9 2
|
12天前
|
负载均衡 网络协议 应用服务中间件
【亮剑】在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。
【4月更文挑战第30天】本文介绍了在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。HAProxy是一个高性能的开源TCP和HTTP负载均衡器,适合处理大量并发连接;Nginx是一个多功能Web服务器和反向代理,支持HTTP、HTTPS和TCP负载均衡,同时提供缓存和SSL功能;Keepalived用于监控和故障切换,通过VRRP实现IP热备份,保证服务连续性。文中详细阐述了如何配置这三个工具实现负载均衡,包括安装、配置文件修改和启动服务,为构建可靠的负载均衡系统提供了指导。
|
28天前
|
Kubernetes 搜索推荐 应用服务中间件
通过keepalived+nginx实现 k8s apiserver节点高可用
通过keepalived+nginx实现 k8s apiserver节点高可用
39 16
|
5月前
|
负载均衡 前端开发 应用服务中间件
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
159 1
|
6月前
|
应用服务中间件 Shell nginx
Nginx + keepalived 实现高可用 + 防盗链 + 动静分离(二)
Nginx + keepalived 实现高可用 + 防盗链 + 动静分离
|
6月前
|
负载均衡 NoSQL 应用服务中间件
Nginx + keepalived 实现高可用 + 防盗链 + 动静分离(一)
Nginx + keepalived 实现高可用 + 防盗链 + 动静分离
|
6月前
|
Kubernetes 应用服务中间件 Linux
suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用
suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用
60 0
|
应用服务中间件 nginx