瞎掰负载:基本原理和冗余 keepalived

网上对负载的文章很多,理论还是实践配置,这里只粗粗谈一谈自己的理解。没有创新,只有总结。先看一下产品总列:

 

一 软件负载

 

四层负载:

LVS (Linux Virtual Server)
HAProxy (High Availability Proxy)
Nginx

七层负载:

HAProxy
Nginx

 

二 硬件负载

 

F5
Netscaler

 

三 软件负载的高可用

 

Keepalived + LVS/HAProxy/Nginx

 

四 网关负载

 

api 层级网关负载:

spring cloud gateway

zuul

 

五  VRRP  负载的冗余

 

Keepalived 负责什么,高可用!路由规则分动态路由协议和静态路由配置,动态路由协议有广为人知的RIP/OSPF,VRRP出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied具有服务器状态检测和故障隔离功能。VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务。在虚拟路由器内部,同一时间只有一台物理路由器在对外提供服务,这台物理路由器被称为主路由器(MASTER),一般而言MASTER通过选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能。而其他物理路由器不拥有对外的虚拟IP,仅仅接收MASTER的VRRP状态通告信息,这部分路由器叫做备份路由器。当主路由器失效的时候,备份路由器重新进行选举,产生一个新的路由器成为MASTER。MASTER一个职责是响应VIP的arp包,将VIP和mac地址映射关系告诉局域网内其他主机,同时,它还会以多播的形式(目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级。网络中的所有BACKUP节点只负责处理MASTER发出的多播包,当发现MASTER的优先级没自己高,或者没收到MASTER的VRRP通告时,BACKUP将自己切换到MASTER状态,然后做MASTER该做的事:1.响应arp包,2.发送VRRP通告。MASTER还负责ICMP报的重定向和IP包的转发。

 

两个概念

物理路由器:真实被冗余的对象,即LVS/Nginx/HAProxy。

虚拟路由器:虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个 一样,可以理解为在一个组中: 主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的IP地址和MAC地址。主机将虚拟路由器当作默认网关。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址

 

两种认证

simple:简单字符认证。发送VRRP 报文的路由器将认证字填入到VRRP 报文中,而收到VRRP 报文的路由器会将收到的VRRP 报文中的认证字和本地配置的认证字进行比较。如果认证字相同,则认为接收到的报文是真实、合法的VRRP 报文;否则认为接收到的报文是一个非法报文。

md5:MD5 认证。发送VRRP 报文的路由器利用认证字和MD5 算法对VRRP 报文进行摘要运算,运算结果保存在Authentication Header(认证头)中。收到VRRP 报文的路由器会利用认证字和MD5 算法进行同样的运算,并将运算结果与认证头的内容进行比较。如果相同,则认为接收到的报文是真实、合法的VRRP 报文;否则认为接收到的报文是一个非法报文。

 

两个角色

主路由器(MASTER):虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP数据转发等。

备份路由器(BACKUP):虚拟路由器中的其他物理路由器不拥有对外的虚拟IP,也不对外提供网络功能,仅接受MASTER的VRRP状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。


三种状态

Initialize状态: 系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处理; 
Master状态; 
Backup状态;

 

三层健康检测

 
网络层(3):Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

传输层(4):Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

应用层(5):,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。


优先级选举


1.VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。 
2.比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器 
3.比较IP地址。在没有Ip地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。

 

优先级调整

 

1. 当weight > 0时,vrrp_script script脚本执行返回0(成功)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。

2. 当weight < 0时,vrrp_script script脚本执行返回非0(失败)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。

3. 当两个节点的优先级相同时,以节点发送VRRP通告的IP作为比较对象,IP较大者为MASTER。

 

体系结构

 

Scheduler I/O Multiplexer  是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求,

 Memory Mngt  是一个内存管理机制,这个框架提供了访问内存的一些通用方法       

 Control Plane  是keepalived的控制版面,可以实现对配置文件编译和解析

 Core componets  这部分主要5个部分

             Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和VRRP进程的。

             Checkers: 这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。

             VRRP Stack: 这时keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。

             IPVS wrapper: 这个是IPVS功能的一个实现,IPVS warrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。

             Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换 ,Netlink Reflector的所有请求最后都发送到内核空间层的NETLINK 模块来完成。

NETLINK  主要用于实现一些高级路由框架和一些相关参数的网络功能,完成用户空间层Netlink Reflector模块发来的各种网络请求。

 

六 瞎掰

 

四层负载,主要是对IP地址的动态修改,七层负载主要是基于内容的分发。具体的四层负载技术有对端口,IP地址,也有对MAC地址的修改,但他们分别是四层,三层和二层,所以,个人觉得四层负载最好理解成最高四层的负载技术,这个最好的实践和学习就是LVS。网关是伴随着微服务概念兴起的一种架构模式,其最核心的功能提供了反向代理同时会带有负载均衡的功能,包括带权重的流量分配,这与nginx很重合。这里讨论的一个前提,以上的产品在网络架构上是等价的,即是他们承担负载逻辑的范畴。另一个层面上,在功能上的负载逻辑与在网络拓扑上的网关角色常常会契合起来,在具体实现无论硬件,系统内核还是开源组件上面,需要对网络协议网关角色的解析和逆应用。VRRP通过选举机制决定哪台路由器承担转发任务,局域网内的主机只需将虚拟路由器配置为缺省网关以达到精简网络配置和冗余,他的作用对象是网关。上面只对负载的高可用性概念详细说了一下,对于真实的负载技术隔靴搔痒,接下来有机会希望也能对以上产品其他范畴进行总结,这对选型和具体实践工作很重要。

 

参考文章:

lvs经典: http://www.linuxvirtualserver.org/zh/lvs1.html

清晰的配置实践:https://www.cnblogs.com/arjenlee/p/9262737.html#auto_id_39

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章