您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
技术晨读-搭建LVS负载均衡的DR模式
发布时间:2019-05-02 18:18:14编辑:雪饮阅读()
之前曾说过lvs负载均衡的NAT模式,接下来说说lvs的DR模式
lvs-dr拓扑图如:
(1)准备两个后端服务器
要求:
这两个后端服务器需要vip,因为lvs-dr架构的目的就是仅仅请求让director负责处理,而响应则让某个后端服务器来响应,而对于客户端来说人家并没有请求你某个后端服务器,所以每个后端服务器要配置一个vip
这两个后端服务器要和前端服务器以及vip在同一个网段
因为前端服务器、两个后端服务器都有vip,那么当用户访问到前端的vip时候这3个服务器谁优先给用户响应则用户就收到了谁的响应内容,这显然不符合lvs-dr的标准,都来响应那么岂不是白白浪费了资源。
那么我们就需要让每个后端服务器禁止arp广播回应,这样以来就仅仅director响应请求了。
linux上有个规则,报文从什么接口出去,则尽可能用该接口上的地址,如果该接口的地址和出口网关不在同一个网段,则使用该接口的别名的地址。
个人建议:配置后端服务器ip时候尽量用静态
那么我们要做的是:
1-1:为每个后端服务器配置一个与vip和dip在同一个网段的ip
1-2:为每个后端服务器禁止arp广播回应
这里涉及到对内核参数arp_announce和arp_ignore的修改,并且要修改all接口和eth0接口。
这里就给介绍下这两个参数
arp_ignore:定义接收到arp请求时的响应级别:
0:只要本地配置的有相应地址就给予响应(默认)
1:仅在请求的目标地址请求到达对应接口上的时候才给予响应
arp_announce:定义将自己的地址主动向外通知的通知级别:
0:将本地任何接口上的任何地址向外通知(默认)
1:试图仅向目标网络通知与其网络匹配的地址
2:仅向与本地接口上地址匹配的网络进行通知
那么我们可以用如下命令:
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_ignore=1
这个步骤经常会出错,所以确认其值可以用如下命令
cat /proc/sys/net/ipv4/conf/eth0/arp_announce
cat /proc/sys/net/ipv4/conf/all/arp_announce
cat /proc/sys/net/ipv4/conf/eth0/arp_ignore
cat /proc/sys/net/ipv4/conf/all/arp_ignore
也可以修改/etc/sysctl.conf文件,然后sysctl -p刷新到内存。(推荐的一种方式)
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.eth0.arp_announce=2
1-3:为每个后端服务器配置vip
然后上面的内核参数设置完成后重新启动网络服务接着就该配置vip了。
这里我们要将vip配置在lo接口上,因为eth0是各个后端服务器的真实ip
配置vip可用如下命令:
ifconfig lo:0 192.168.2.139 broadcast 192.168.2.139 netmask 255.255.255.255 up
route add -host 192.168.2.139 dev lo:0
(2)前端服务器配置
配置vip,前端服务器配置vip就直接配置到eth0上就行
ifconfig eth0:0 192.168.2.139 up
route add -host 192.168.2.139 dev eth0:0
使用vipsadm添加前端服务器节点并添加该节点下的服务器集群
ipvsadm -A -t 192.168.2.139:80 -s wlc
ipvsadm -a -t 192.168.2.139:80 -r 192.168.2.104 -g -w 2
ipvsadm -a -t 192.168.2.139:80 -r 192.168.2.167 -g -w 1
(3)重难点分析
为什么每个后端服务器都要配置vip?
答:
(1)用户才不管你后端有几个服务器,几个ip,用户只管访问你的服务。那么首先我们要将vip配置到lvs上,让lvs按照算法计算出具体要给用户提供响应的集群元素,然后lvs通过arp找到某集群元素的mac地址,并将数据包其它部分都不动仅再封装一个帧首部,用于向该集群元素发送lvs本次接收到的数据包。
(2)集群元素为什么要接收lvs发来的数据包?只有接收到的数据包中目标ip在当前集群元素中有配置,并且mac地址是当前集群元素的mac地址,那么当前集群元素才会接收该数据包。所以每个集群元素都需要配置vip,而集群元素和lvs是同网段,同网段是依靠mac地址进行转发的,该数据包的目标mac地址已经在lvs处通过arp寻址后进行封帧了的。
另外由于集群元素的eth0已经配置自己的真实ip,所以vip就得通过lo:0来配置。
为什么每个后端服务器还要再单独route一条记录?
答:
linux有个行为,当数据包响应时所用的网卡接口地址会被当做数据包的sip,这种行为最典型的例子如:
有两个网段:1段、2段,两个设备:a,b
a设备有两个网卡,a网卡连接1段,b网卡连接2段
b设备只有一个网卡且连接1段
但是现在b设备可以访问a设备的b网卡的2段ip地址
其实这个场景中b设备得到的响应内容是来自a设备2网段的,但响应数据包中的sip却是a网卡1段的地址。
那么回到我们的lvs,对于用户请求的vip在集群元素的lo:0上配置的,但是响应数据包的sip却是集群元素的真实ip地址,这种情况肯定是要不得的,所以每个集群元素都要单独route添加一条记录
关键字词:lvs,dr,负载均衡