前言
负载均衡器(Load Balancer,简称 LB)是一种硬件或者软件设备,它可以将客户端访问流量根据转发策略分发到多个服务器或者设备上,以确保系统的负载均衡,通过负载均衡可以有效避免单点故障,提高系统的可靠性和稳定性。LB是所有流量的入口,LB的高可用架构以及可扩展性对于业务的重要性不言而喻。本文全面剖析LB的架构和底层实现原理,以点带面,详细介绍LB的构成组件和实现技术、LB的后端网络拓扑以及LB集群的高可用性。
LB的组成
图1 LB的构成组件
用户每创建一个LB集群,都至少生产两个负载均衡器节点(LB node),它的承载实体可以是虚拟机也可以是容器,容器具有轻量和高性能特性。LB的构成包含三部分,分别如下:
1.负载均衡器
负载均衡器主要接收client的传入流量,并按照负载均衡算法,将流量分发给LB node。
2.监听器
用户可以向负载均衡器添加一个或者多个监听器,监听器主要用来配置协议和端口,根据检查客户端的流量连接请求,按照定义的转发策略将请求的映射端口流量分发到后端真正承载业务的后端服务器和端口。
3.后端服务器
后端服务器就是业务的流量承载实体,可以是虚拟机、裸金属和容器。监听器会对后端服务器进行定期健康检查,如果后端服务器有问题,将会从监听器中摘掉异常服务器,如果后端服务器恢复正常,监听器会自动添加该服务器继续为业务提供服务器。负载均衡器按照用户设置的负载均衡算法(轮询/最少链接/源地址),将流量分发到后端服务器。
负载均衡器高可用集群
图2 LB集群
负载均衡器作为用户的网络服务入口,一旦发生故障将影响业务的整体可用性,所以负载均衡器集群的目的就是提供高可用的负载均衡器服务。负载均衡器集群中包含多个单独工作的LB node,这些节点保持一致的负载均衡配置,并且具备相同的服务IP地址,提供统一的对外服务。 LB对外服务的ip地址称之虚拟ip(一般称vip),负载均衡器集群会自动将vip映射到某个LB nodeIP地址。如图2所示,每个LB集群的LB node包括Keepalive、LVS和Haproxy服务,其中LB集群会选择两个LB node 组成一个Keepalive集群,一个作为master,一个作为slave,其中master 节点为vip所在节点,是client访问业务的入口ip。Keepalive集群是一个高可用集群,它通过VRRP协议来防止单点故障。如果master节点有问题,slave节点将转为master节点,对外提供服务。lb-node0作为Keepalive集群的master节点,上面的LVS服务通过默认的加权轮训算法,将入口流量分发到LB集群的3个node节点,而作为Keepalive slave的lb-node1上的LVS服务会将流量按照加权轮训算法分发到 lb-node1和lb-node2上。HAProxy作为监听器的载体,在其配置中为监听器添加后端服务器。
LB后端网络拓扑
图1 LB的构成组件
用户每创建一个LB集群,都至少生产两个负载均衡器节点(LB node),它的承载实体可以是虚拟机也可以是容器,容器具有轻量和高性能特性。LB的构成包含三部分,分别如下:
1.负载均衡器
负载均衡器主要接收client的传入流量,并按照负载均衡算法,将流量分发给LB node。
2.监听器
用户可以向负载均衡器添加一个或者多个监听器,监听器主要用来配置协议和端口,根据检查客户端的流量连接请求,按照定义的转发策略将请求的映射端口流量分发到后端真正承载业务的后端服务器和端口。
3.后端服务器
后端服务器就是业务的流量承载实体,可以是虚拟机、裸金属和容器。监听器会对后端服务器进行定期健康检查,如果后端服务器有问题,将会从监听器中摘掉异常服务器,如果后端服务器恢复正常,监听器会自动添加该服务器继续为业务提供服务器。负载均衡器按照用户设置的负载均衡算法(轮询/最少链接/源地址),将流量分发到后端服务器。
图3 LB后端网络拓扑
每个LB node包括两个网卡,分别为eth0和eth1。其中eth0为私有网络地址,用于和后端服务通信,eth1为基础网络地址,用于接收client数据。Haproxy作为eth0和eth1数据通信的桥梁。根据图3所示,LB后端网络拓扑详细介绍了客户端流量如何通过负载均衡集群,转发流量到后端服务器,然后后端服务器将响应数据如何返回至client。
首先client 通过访问vip(1.2.3.252)到lb-node0,此时流量通过eth1网卡进入iptables规则,通过 PREROUTING 表的LUSTER_DIVERT 链上的规则,打上 fwmark。fwmark 的值是根据监听器的端口来分配,具体以 iptables 规则中的 fwmark 值为准,一般从 0x2710 (即10000) 开始分配,和keepalive中virtual_server_group中的值一致。
然后流量到达lvs后,lvs根据fwmark配置,按照lvs配置算法,选择一个LB node(1.2.3.9)接受流量,如图3所示lvs对应的配置。此时haproxy 已经开启端口监听,流量进入haproxy 的应用程序,按照RR算法,选择一个合适的后端服务器进行流量转发。
此时,通过查看LB node所在物理机hyper-1的arp信息和宿主机路由,流量到达br_vg_out网桥,按照bridge fdb流表配置,通过vxlan隧道,将请求数据发送至后端服务(1.2.3.6)所在的物理机hyper-3。hyper-3的内核对vxlan解包后,数据流入到sxxx网桥,然后根据bridge fdb信息,将数据交付给最终的后端服务器。此时需要注意是在hyper-1上后端服务1.2.3.6的mac地址(图中标红色)并不是其真正的mac地址,而是其所在物理服务器上网桥的一个网口pair的mac地址,它是封包流量的统一入口,最后会将流量转发到最终后端服务。
在hyper-3上的后端服务处理完client的请求后,响应数据是如何返回至client的呢?从LB-node0过来的数据包,进入hyper-3的iptables规则后,会对其打上fwmark,响应数据通过查找hyper-3上的策略路由的fwmark值进行路由匹配,然后将数据发送至hyper-3的br_vg_out网桥,通过vxlan隧道发送至LB-node0,此时数据不再经过lvs服务(lvs采用DR工作模式),而是直接将响应数据发送至client。
LB集群健康检查
1.LB node健康检查
每个计算节点上都有lxc-monitor守护进程,它监控着物理机上以LXC形式运行的LB node,当LB node 由于某些原因出现stop情况后,lxc-monitor会接收到lxc对应的停止消息,并将该消息发送至lxc-event-handler,lxc-event-handler发送release指令给compute_server, compute_server 服务将会重建该LB node。同理,当整个hyper意外宕机后,其pair-hyper探测到hyper网络中断后(hyper和pair-hyper 相互探活彼此),将会触发重建hyper上面所有的LB node,保障LB node正常工作。
2.Listener健康检查
Keepalive 的master节点配置misc_check,会对LB node里面 haproxy 启动的监听器的监听端口进行健康检查,探测流量走VBC网络,即eth1网卡。通过使用nc -vz命令定期对ip和端口进行探测,如果不通,则将它从lvs 后端摘掉,这样业务流量就不会转发到有问题监听器上了。
3.Haproxy对后端服务检查
开启健康检测后,负载均衡器会根据对应配置定期检查后端服务的运行状态,当某个后端服务出现异常时,会自动隔离该后端服务,并将请求转发给其他健康的后端服务,实现高可用性。
- 健康检查方式:
- TCP:通过向后端服务器发送 TCP 包来检测后端服务。
- HTTP:通过向后端服务器发送 HTTP 请求来检测后端服务,你可以指定需要检测的 URI。负载均衡器会通过 HTTP 返回值是否为200来判断服务是否正常。
- ICMP:通过向后端服务器发送 ICMP Echo Request 请求(即 ping)来检查后端网络是否可达。
- UDP:UDP 方式会 结合 ICMP Echo Request 和 UDP port probe 两种方式来检查。
- 健康检查选项:
- 检查间隔:连续两次健康检查之间的时间间隔,单位为秒,范围为 2-60s。
- 超时时间:等待健康检查请求返回的超时时间,检查超时将会被判定为一次检查失败,单位为秒,范围为 5 - 300s。
- 不健康阈值:多少次连续检查失败之后,可以将后端服务屏蔽,范围为 2-10次。
- 健康阈值:多少次连续检查成功之后,可以将后端服务恢复,范围为 2-10次。
结束语
本文介绍了LB的组成原理、高可用架构、网络流量模型分析和健康检查机制。只有全面深入了解负载均衡器的工作原理,才能快速定位业务在LB碰到的各种问题。LB可以为用户提供强大的功能和灵活配置,便于用户扩展和管理应用程序的基础架构,并且提高了服务的可用性和稳定性,为系统的构建和性能延伸提供了强有力的支持。