keepalived(1)- keepalived集群概述
1. 高可用集群概述
高可用技术主要用于解决SPOF(single Point Of failure,单点故障)问题,其主要作用是使集群的整体服务尽可能可用,如果高可用集群中的主节点发生了故障,那么将由次节点代替它。次节点通常是主节点的镜像,与主节点保持完全一致。
高可用集群的重要参数如下:
-
MTBF:Mean Time Between Failure 平均无故障时间
-
MTTR:Mean Time To Restoration( repair)平均恢复时间,故障时间
高可用判断系数(以年为单位)
-
A=MTBF/(MTBF+MTTR) 取值范围:(0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%
假设系统一直能够提供服务,我们说系统的可用性是100%。
如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。
很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。
常用的高可用技术主要有:
- keepalived
- ais:应用接口规范
- heartbeat
- cman+rgmanager(RHCS)
- coresync_pacemaker
keepalived和heartbeat/coresync的比较:
Keepalived是Linux下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。
Keepalived与HeartBeat都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供HA软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,与HeartBeat相比,Keepalived主要是通过虚拟路由冗余vrrp技术来实现地址转移功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。
Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync,根本不是同一类型的。Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。
所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。
而Heartbeat或Corosync是实现服务的高可用,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 实现Web服务器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 实现MySQL服务器的高可用。
Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而Heartbeat(或Corosync)一般用于服务的高可用,且需要共享存储,一般用于多节点的高可用。
2. keepalived概述
2.1 keepalived介绍
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
2.2 keepalived体系架构
-
SchedulerI/OMultiplexer是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求;
-
Memory Mngt是一个内存管理机制,这个框架提供了访问内存的一些通用方法;
-
Control Plane 是keepalived的控制版面,可以实现对配置文件编译和解析;
-
Core componets 这部分主要包含了5个部分;
- Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,通常为硬件,Keepalived正是通过它监控Checkers和VRRP进程的。
- Checkers:这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
- VRRP Stack:这是keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。负责负载均衡器之间的失败切换FailOver;
- IPVS wrapper:这个是IPVS功能的一个实现,IPVSwarrper模块将可以设置好的IPVS规则发送到内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
- Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换,
keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp
-
core:负责主进程的启动,维护和全局配置文件的加载;
-
check:负责健康检查
-
vrrp:用来实现vrrp协议
2.3 keepalived实现原理
keepalived主要的两个功能为检测后端服务器状态和高可用故障转移,两个功能实现的原理如下:
-
Keepalived对服务器运行状态和故障隔离的工作原理:
Keepalived可以工作在TCP/IP模型的三层、四层、五层:
-
网络层(3):Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包,如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
-
传输层(4):Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
-
应用层(5):,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户设定的参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
-
-
Keepalived高可用故障切换转移原理
Keepalived高可用故障切换,是通过VRRP协议来实现的。
在Keepalived服务正常工作时,Master节点会不断以组播形式地向备节点发送心跳消息,组播地址为224.0.0.18,用以告诉Backup节点自己还活着,当Master节点发生故障时,就无法发送心跳消息,备节点无法检测到来自主Master节点心跳了,于是调用自身的接管程序,接管Master节点的IP资源及服务。而当Master节点恢复时,备Backup节点会根据是否配置抢占决定是否释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
两台运行VRRP的设备会根据vrrp组号形成虚拟IP和虚拟MAC地址,其他设备都使用该VIP和VMAC与keepalived设备进行通信,MASTER和BACKUP节点都正常的情况下VIP和VMAC都存在于MASTER节点上,由MASTER节点处理用户请求,(注意:虽然VRRP会产生VMAC,但是其他节点的ARP表中记录的VIP对用的MAC并不是VMAC,而是MASTER节点的真实MAC地址)当MASTER节点故障时,VIP和VMAC都会迁移到BACKUP节点上,BACKUP节点会发送免费ARP报文让其他节点重新学习自己的MAC地址,让终端的ARP表中记录的VIP切换成BACKUP的真实MAC地址,完成VRRP主备切换。
当MASTER节点恢复时,若MASTER没有配置抢占,则vrrp主备不会发生切换,若配置了抢占,则vrrp会再次发生主备切换,VIP会迁移到MASTER节点上。
其中VRRP的节点中,配置的优先级最高的设备会称为MASTER设备。
2.4 keepalived配置准备工作
-
各节点时间必须同步;
ntp, chrony
-
确保iptables及selinux不会成为阻碍;
-
各节点之间可通过主机名互相通信(对keepalived并非必须);
建议使用/etc/hosts文件实现;
- 确保各节点的用于集群服务的接口支持MULTICAST通信;
D类:224-239;
ip link set multicast on eth1用于开启接口组播功能,默认开启
ip link set multicast off eth1用于关闭接口组播功能
可通过ifoncfig命令查看:
[root@nginx-lb01 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.123 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::4809:4d0d:96a:b68e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:33:71:c6 txqueuelen 1000 (Ethernet)
RX packets 7609 bytes 8962242 (8.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3194 bytes 195272 (190.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0