基于keepalived高可用的应用实战
背景
现阶段高可用系统对数据完整性要求较高,要求服务不中断,该如何实现?
在业务系统用户数和访问量非常小时,一般情况下我们直接采用一台物理机或者虚拟机进行服务的搭建,就可满足为用户提供应用访问的需求。
图 单台服务器提供服务
随着业务的扩展,用户越来越多,访问量越来越大,单台服务器已经无法满足业务的需求,于是我们借助nginx实现负载均衡,扩大用户的支撑量。
图 Nginx实现多台服务器的负载均衡
使用Nginx负载均衡后,系统能够承担更多的用户、更大的流量,但是此时nginx是单点的,如果nginx出现宕机,那么服务依旧会出现不可用的情况。
因此,我们需要采用一种新的架构,保证业务能够在一个Nginx节点出现故障的时候能够进行故障转移,满足另一个Nginx节点依旧可用,保证业务服务的高可用。
图 Master节点正常时
图 Master节点故障时
图 Master节点恢复后
实现
高可用集群的英文全称是High Availability Cluster,简称HA Cluster, 高可用的含义是最大限度的可以使用,实现的功能是保障用户的应用程序持久、不间断的提供服务。
当应用程序出现故障,或者系统硬件、网络出现故障时,应用可以自动、快速从一个节点切换到另一个节点,从而保证应用持续、不间断的对外提供服务,这就是高可用集群实现的功能。
调研之后,发现keepalived是一个免费、简单、纯软的能够满足业务需要的软件。
Keepalived顾名思义,就是保活,保证应用、服务活着,Keepalived是一款轻量级的软件,常被用作保证应用高可用解决方案。它通过运用虚拟路由冗余协议,来实现软件、服务、应用高可用。
它主要的核心功能有两个,第一个核心功能是健康检查,检查服务器承载的应用、服务、端口是否正常,同时提供了脚本监测的功能,支撑用户的自定义检查。
第二个核心功能是故障切换,多台操作器一般采用主从的方式,一台机器做主,多台机器做从,当一台机器出现故障时,能够将服务自动切换到另外一台机器,从而解决系统的单点故障问题,满足系统的容错,保证了系统的稳定性。同能能够在故障节点的服务恢复后,系统服务能够自动切换回来,整个切换的过程无需人为干预和操作,只需要对Keepalived做简单的配置即可,整个过程简单便捷。
在日常使用服务器时,服务器需要绑定静态IP并配置默认网关来实现主机间的通信,如果某一机器发生故障,就会导致机器上运行的服务直接宕机。在这种传统方式下,由于机器故障并不能导致服务的自动切换,所以就产生了单点故障。
为了解决单点故障问题,引入了VRRP协议,该协议全称为虚拟路由冗余协议。该协议可以保障在机器发生故障时,能够进行机器服务的切换,保障主机服务的切换:
1. VRRP协议通过选举算法,在某一时刻保证只有一台服务器能够绑定到虚拟IP,被绑定的服务对外提供各种网络服务、应用服务。
2. 当该服务器挂掉时,会通过选举算法重新选取出新的服务器,对外提供网络服务、应用服务。
3. 当故障的主节点完成服务修复后,keepalived可以做到把服务自动又重新切换回主服务器,只需要用户配置好主备服务器、优先级以及监测脚本,主备切换的过程就全由keepalived实现了,用户只需要管理机器运行的应用服务是否正常即可。
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准。VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及即使在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。
在VRRP协议中,有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。VRRP路由器是指运行VRRP的路由器,是物理实体;虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。该虚拟路由器对外表现为一个具有唯一固定的IP地址和MAC地址的逻辑路由器。处于同一个VRRP组中的路由器具有两种互斥的角色:主控路由器和备份路由器,一个VRRP组中有且只有一台处于主控角色的路由器,可以有一个或者多个处于备份角色的路由器VRRP协议从路由器组中选出一台作为主控路由器,负责ARP解析和转发IP数据包,组中的其他路由器作为备份的角色并处于待命状态,当由于某种原因主控路由器发生故障时,其中的一台备份路由器能在瞬间的时延后升级为主控路由器,由于此切换非常迅速而且不用改变IP地址和MAC地址,故对终端使用者系统是透明的。
VRRP使用选举机制来确定路由器的状态(Master或Backup)。运行VRRP的一组路由器对外组成了一个虚拟路由器,其中一台路由器处于Master状态,其他的处于Backup状态。
运行VRRP的路由器都会发送和接收VRRP通告消息,在通告消息中包含了自身的VRRP优先级信息。VRRP通过比较路由器的优先级进行选举,优先级高的路由器将成为主路由器,其他路由器都为备份路由器。
虚拟路由器和VRRP路由器都有自己的lP地址(虚拟路由器的lP地址可以和VRRP备份组内的某个路由器的接口地址相同)。如果VRRP组中存在lP地址拥有者,即虚拟地址与某台VRRP路由器的地址相同时,IP地址拥有者将成为主路由器,并且拥有最高优先级255。如果VRRP组中不存在IP地址拥有者。VRRP路由器将通过比较优先级来确定主路由器。路由器可配置的优先级范围为1~254,默认情况下VRRP路由器的优先级为100。当优先级相同时,VRRP将通过比较IP地址来进行选举,lP地址大的路由器将成为主路由器。
keepalived工作在TCP/IP参考模型的第三、四和第五层,也就是网络层、传输层个和应用层
• 网络层:通过ICMP协议向集群每个节点发送一个ICMP数据包(类似于ping功能),如果某个节点没有返回响应数据包,那么认定此节点发生了故障,Keepalived将报告此节点失效,并从集群中剔除故障节点
• 传输层:通过TCP协议的端口连接和扫描技术来判断集群节点是否正常,keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口所对应的节点发生故障,从集群中剔除故障节点
• 应用层:用户可以通过编写程序脚本来运行keepalived,keepalived根据脚本来检测各种程序或者服务是否正常,如果检测到有故障,则把对应的服务从服务器中删除
图片来自https://keepalived.org/documentation.html
我们将整个体系结构分层用户层和内核层。
内核层分为4部分:
• Scheduler I/O Multiplexer
I/O复用分发调用器,负责安排Keepalived所有的内部的任务请求
• Memory Management
内存管理机制,提供了访问内存的一下通用方法Keepalived
• Control Plane
控制面板,实现对配置文件的编译和解析,Keepalived的配置文件解析比较特殊,它并不是一次解析所有模块的配置,而是只有在用到某模块时才解析相应的配置
• Core components
Keepalived的核心组件,包含了一系列功能模块,主要有watch dog、Checkers、VRRP Stack、IPVS wrapper、Netlink Reflector
| watch dog: 一个极为简单又非常有效的检测工具,针对被监视目标设置一个计数器和阈值, watch dog会自己增加此计数值,然后等待被监视目标周期性的重置该数值, 一旦被监控目标发生错误,就无法重置该数值, watch dog就会检测到。Keepalived是通过它来监控Checkers和VRRP进程 Checkers: 实现对服务器运行状态检测和故障隔离 VRRP Stack: 实现HA集群中失败切换功能,通过VRRP功能再结合LVS负载均衡软件即可部署一个高性能的负载均衡集群 IPVS wrapper: 实现IPVS功能,该模块可以将设置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现负载均衡功能 Netlink Reflector 实现VIP的设置和切换 |
|---|
部署验证
本次测试使用CentOS 7,一共需要2台服务器,3个IP。
服务器一和服务器二分别绑定了192.168.128.133、192.168.128.134,同时提供一个额外的虚拟IP 192.168.128.135,为用户提供一个统一的访问入口。虚拟IP在某一时刻只能绑定一台机器,用户不需要知道192.168.128.135服务背后有多少台服务器在提供服务,Keepalived会做到在192.168.128.133服务宕机时切换到192.168.128.134的服务。。
图Nginx + Keepalived架构图
yum install -y keepalived
systemctl start keepalived
yum install -y nginx
systemctl start nginx
$ cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id master
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.128.135
}
}
server {
listen 8080;
server_name localhost;
location /test1 {
root /usr/share/nginx/html;
try_files $uri $uri/ /master/index.html;
}
}
yum install -y keepalived
systemctl start keepalived
yum install -y nginx
systemctl start nginx
$ cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id backup
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.128.135
}
}
server {
listen 8080;
server_name localhost;
location /test1 {
root /usr/share/nginx/html;
try_files $uri $uri/ /back/index.html;
}
}
主要实验四次,分别验证每次的页面展示效果和ip绑定效果。
冗余(机器、ip、服务)-> 成本高
复杂度(部署、裂脑、运维(升级、部署、脚本检测、启动顺序))-> 成本高
分布式(数据高可用、中间件高可用、服务高可用)-> 成本高