两种负载均衡技术的实现原理与简单示例-高效开发运维 一. 概述 负载均衡作为目前服务器集群部署的一款常用设备,当一台机器性能无法满足业务的增长需求时,不是去找一款性能更好的机器,而是通过负载均衡,利用集群来满足客户增长的需求。 负载均衡技术的实现,主要分为以下几种: DNS 域名解析负载; HTTP 重定向负载; 反向代理负载; IP 负载 (NAT 负载和 IP tunnel 负载); 数据链路负载 (DR); 本篇主要讨论 IP 负载和数据链路负载 (DR) 的原理, 并且给出 NAT 负载和 DR 负载的简单代码示例, 包括基于 netfilter 钩子的定义,数据包的获取夺命邮差 ,数据包的修改,报头的设置,路由查找,数据包的发送。1.1 名词解释 Load Balance: 负载均衡机器; VIP(Virtual IP): Load Balance 面向前端客户机器的请求地址; RS(Real Server): Load Balance 进行负载的目标机器,面向客户端真实提供服务的机器;RIP(Real Server IP):RS 的真实 IP; CIP(Client IP): 客户端 IP 地址,发送请求包中的源 IP 地址; DIP(Director IP): Load Balance 与 RS 在同一局域的网卡 IP 地址 ;二. 负载均衡的实现原理 2.1 TCP/IP 的通信原理
图 1 TCP/IP 协议是当今网络世界中使用的最为广泛的协议。图 1 列出了 TCP/IP 与 OSI 分层之间的大致关系。由此可以看出,TCP/IP 与 OSI 在分层模块上有一定的区别。TCP/IP 主要分为应用层,传输层,互联网层,(网卡层) 数据链路层,硬件层。对于 IP 负载和数据链路负载更多的需要关注 IP 层和数据链路层。
图 2 图 2 通过简单例子描述 TCP/IP 协议中 IP 层及以下的通信流程。 (1) Host1 查找本机路由表,根据目的 IP(192.168.16.188) 地址,确定下一步的路由地址 R1(192.168.32.1); (2) Host1 根据路由 IP 地址 (192.168.32.1), 查找 ARP 缓存表,确定下一步 MAC 地址 (12-13-14-15-16-18); (3) 产生数据封包,如图所示,在 IP 层报头,Src: 源 IP 地址,Dst: 目的 IP 地址;ethernet 表示数据链路层,以太网报头,SMAC: 源 MAC 地址,DMAC: 目的 MAC 地址; (4) 数据包到达 R1 路由器,R1 重复 (1),(2) 两步查找路由表和 ARP 缓存表,确定下一步数据包路由信息; (5) 数据包到达 R2 路由器,R2 重复 (1),(2) 两步查找路由表和 ARP 缓存表,确定下一步数据包路由信息; (6) 数据包到达 R3 路由器,R3 重复 (1),(2) 两步查找路由表和 ARP 缓存表,确定 Host2 主机 MAC 地址,发送数据包; (7) Host2 主机接收数据包,比对 MAC 地址,IP 地址,进行数据包解析; 2.1.1 路由表和 ARP 缓存表 在整个数据包的传输中,重复的利用到两张表,路由表和 ARP 缓存表。路由分为静态路由和动态路由,静态路由通常由管理员手工完成,动态路由由管理员设置好动态路由协议,动态路由协议会自动生成路由表。路由协议大致分为两类:一类是外部网关协议 EGP,一类是内部网关协议 IGP。 EGP 使用 BGP 路由协议; IGP 使用 RIP,RIP2,OSPF 等路由协议;
图 3 ARP 缓存表的生成主要依靠 ARP 协议,Host1(ip1) 将要发送数据给 Host3(ip3)放浪息子。发送 ARP 广播“谁能告诉我,ip3 的 MAC 地址是多少啊?”。Host2 收到广播包,发现问的是 ip3 的地址,则不响应。Host3 收到数据包,发现 ip 地址与自己相符,则发回响应包,“ip3 的 MAC 地址是 **。”Host1 收到响应包,缓存到 ARP 缓存表中。 在 Linux 主机 (CentOS 6.7), 路由表和 ARP 缓存表,查询如下: 路由表: [root@TendyRonSys-01 ~]# route -nKernel IP routing tableDestinationGateway Genmask Flags Metric Ref Use Iface192.168.0.00.0.0.0 255.255.255.0 U10 0 eth00.0.0.0 192.168.0.10.0.0.0 UG 00 0 eth0 Destination 和 Genmask 分别是 network 和 netmask,合起来表示一个网络。Flags:U 表示该路由是启动的,可用;G 表示网关;ARP 缓存表: [root@TendyRonSys-01 ~]# arp -alocalhost (192.168.0.27) at 6c:62:6d:bf:25:2f [ether] on eth0localhost (192.168.0.15) at 94:65:9c:2a:29:f2 [ether] on eth0localhost (192.168.0.91) at e0:94:67:06:d9:ba [ether] on eth0localhost (192.168.0.1) at ec:6c:9f:2c:d1:08 [ether] on eth0 2.1.2 IP 层与数据链路层的关系 由图 1 可知,在 OSI 和 TCP/IP 的对比模型中,IP 层和数据链路层分别位于第二层和第三层。 数据链路层定义了通过通信媒介互连的设备之间的传输规范。而 IP 层是整个 TCP/IP 体系的核心,IP 层的作用是使数据分组发往任何网络,并使分组独立地传向目标。IP 层并不关心这些分组的传输路径,也不保证每个分组的到达顺序,甚至并不保证一定能够到达。 举个例子来说明 IP 层与数据链路层的关系。小 A 在 X 省 Y 市 Z 街道 Z1 号,通过网络订购了商家 B(商家在 U 省 V 市) 的一个产品,商家通过快递发送产品到小 A 的家中。
图 4 图 4 简要显示了整个商品的物流快递流程: 商品通过汽车走公路, 从商家到达 U 省快递转运中心; 商品通过飞机从空中, 从 U 省快递转运中心达到 X 省快递转运中心; 商品通过汽车走高速公路, 从 X 省快递转运中心到达 X 省 Y 市快递点; 商品通过电三轮走市内街道,从 X 省 Y 市快递点到达客户家 (X 省 Y 市 Z 街道 Z1 号) 在整个物流快递流程中,分为了 4 个运输区间,分别使用了公路,天空,高速公路和市内街道。 再来看下 IP 层的数据分组传输示意图:
图 5 在整个数据分组的传输过程中,分别经过了以太网,IP_VPN, 千兆以太网,ATM 等数据链路。 两张图相比是不是很相像?数据链路层其实就是利用物理层的传输媒介定义出相应互连设备的传输规则,包括数据封装,MAC 寻址,差错检测,网络拓扑,环路检测等等。其实数据链路层就是网络传输的最小单元,所以有人说过整个互联网其实就是“数据链路的集合”。 IP 层在数据链路层之上,实现了终端节点之间的端到端的通信。在上面两个图可以看出,在整个传输过程中,无论是在哪个区间,数据分组 (快递包裹) 的源地址和目的地址始终没有变化。当跨越多个数据链路层时,IP 层必不可少,通过 IP 标出了数据包的真正目的地址。从 IP 层来看,互联网是由路由器连接的网络组合而成。路由器通过动态路由协议生成的路由表,更像一种互联网中的地图,但是因为互联网的庞大,在每个路由上保存的是个局部地图。 数据分组通过 IP 标出源地址和目的地址,这就像快递包裹上也仅仅是标出了寄件地址和收件地址,并不会标出快递第一步从哪里到达哪里,第二步从哪里达到哪里…。从源地址到目的地址的整个传输路径是一步一步通过查询路由表来确定的,这就像快递的运输流程,参考图 4,先到达 U 省快递中心,再达到 X 省快递转运中心…, 在每一个运输区间内,通过特定的运输线路保证快递的运输,到达下一个站点后,由下一个运输区间来进行下一阶段的运输。在数据分组的传输过程中,也是通过目的地址,查询路由表确定每一步的区间目的地址 (并不是一次性查出,而是在每个路由器上,查询下一步的目的地址),然后数据链路层通过 ARP 缓存表将 IP 地址转为 MAC 地址,再通过数据链路层运输。打个比喻来说在整个数据分组的传输过程中,IP 层的路由表给出了地图,数据链路层提供了运输工具位面破坏神 ,物理层提供了运输的基础——道路 (比如快递运输的公路,高速公路,天空)。2.2 IP 负载和数据链路负载原理 理清了 IP 单播路由的原理,接下来我们来说 IP 负载和数据链路负载 (DR) 的原理。 IP 负载分为 NAT 负载和 IP 隧道负载 (tunnel)。 2.2.1 NAT 负载