VS/NAT 地址转换 基于 NAT 的负载机制实际上是通过修改数据包中的目的 IP 地址,将用户的请求转发给 Real Server 。 用户请求 VIP,请求报文通过客户端发送到 Dire
VS/NAT 地址转换
基于 NAT 的负载机制实际上是通过修改数据包中的目的 IP 地址,将用户的请求转发给 Real Server 。
- 用户请求 VIP,请求报文通过客户端发送到 Director Server;
- Director Server 根据调度算法从后端 Real Server 中选出一台,并将数据包中的目的地址(VIP)改为选定服务器的 IP 地址,并转发报文;
- Real Server 接收请求报文处理,并发送响应报文到 Director Server(因为此时的源地址为 RIP,这样会暴露Real Server 的 IP 地址,与 LVS 集群理念背道而驰);
- Director Server 接收响应报文,并修改源地址为 VIP,发送响应报文给用户;
但是在这种机制下,Director Server 即接收请求报文,同时也接收响应报文,往往会成为瓶颈的存在。
vip=192.168.0.200rip1=10.10.0.1rip2=10.10.0.2ipvsadm -E -t $vip:80 -s wrripvsadm -e -t $vip:80 -r $rip1 -m -w 3ipvsadm -e -t $vip:80 -r $rip2 -m -w 1
只需在 Director Server 使用 ipvsadm 工具配置即可
# 查看配置的 LVS 规则ipvsadm -L -n
VS/DR 直接路由
LVS 常用的负载机制,配合 keepalive 使用可以作为一个高吞吐量的集群。
- 用户请求 VIP,在 VS/DR 机制下,Director Server 和 Real Server 都配置有 VIP,通过抑制 Real Server 的 ARP 响应来使只有 Director Server 会收到来自路由的数据包;
- Director Server 根据调度算法将请求负载到 Real Server,Director Server 会修改数据帧中的目标 MAC 地址为选中的 Real Server 的 MAC 地址,并将数据帧发送出去;
- Real Server 收到源地址为 VIP 的数据包时,由于自身绑定了 VIP,于是接受并处理,接着响应一个源地址为 VIP 目标地址的数据包,此时响应请求无需经过 Director Server 修改源地址,因为源地址已经是 VIP 了,这样就无需经过 Director Server 了,直接响应给用户。
那么其中关键的一环就是让请求报文只能到达 Director Server,通常用到的方法是修改内核参数:arp_ignore、arp_announce
arp_ignore: INTEGER(整数) 定义对目标地址为本地 IP 的 ARP 询问不同的应答模式 0 - 默认:回应任何网络接口上对任何本地 IP 地址的 arp 查询请求; 1 - :只回答目标 IP 地址是来访问网络接口自身地址的 arp 查询请求(0 和 1 不同在于,假设有 eth0:192.168.0.1/24、eth1:10.10.0.1/24,那么 eth0 网卡收到 10.10.0.1 的 arp 查询,只有设置为 0 时才会回应,1 只有在查询 192.168.0.1 时才回应) 2 -:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 -: 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 4-7: 保留未使用 8 -:不回应所有(本地地址)的arp查询arp_announce:INTEGER(整数) 对网络接口上本地 IP 地址发出的 ARP 回应作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源 IP 地址发出 Arp 请求的接口 0 - (默认) 在任意网络接口上的任何本地地址 1 -尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源 IP 地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内 ip 之一.如果改来访IP 不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个 IP 数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标 IP 地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该 ARP 回应的网络接口来进行发送
通过在 Real Server 执行:
vip=192.168.0.38ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 uproute add -host $vip lo:0echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce
添加 VIP 到 lo,这样就保证了 Real Server 的 eth0 网口收到 arp 查询时不会响应,同时 vip 也绑定到 Real Server 上了。
VS/TUN:隧道
机制跟 DR 一样,只是在转发的时候,它需要重新包装IP报文。这里的real server(图中为RIP)离得都比较远。
用户请求以后,到director上的VIP上,它跟DR模型一样,每个realserver上既有RIP又有VIP,Director就挑选一个real server进行响应,但director和real server并不在同一个网络上,这时候就用到隧道了,Director进行转发的时候,一定要记得CIP和VIP不能动。
我们转发是这样的,让它的CIP和VIP不动,在它上面再加一个IP首部,再加的IP首部源地址是DIP,目标地址的RIP的IP地址。收到报文的RIP,拆掉报文以后发现了里面还有一个封装,它就知道了,这就是隧道。
其实数据转发原理和DR是一样的,不过这个我个人认为主要是位于不同位置(不同机房);LB是通过隧道进行了信息传输,虽然增加了负载,可是因为地理位置不同的优势,还是可以参考的一种方案;