目录
一、LVS-DR数据包流向分析
为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-4
1、客户端发送请求到 Director Server(负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
2、Director Server 和 Real Server 在同一网络中,数据通过二层数据链路层来传输。
3、内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)对比数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC地址为 Director Server 的MAC地址,修改目标MAC地址为 Real Server 的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server。
4、到达 Real Server 的请求报文的MAC地址是自身的MAC地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过 lo 接口传送给物理网卡然后向外发出。
5、Real Server 直接将响应报文传送到客户端。
二、DR模式的特点
1、Director Server 和Real Server 必须在同一个物理网络中。
2、Real Server 可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问。
3、Director Server 作为群集的访问入口,但不作为网关使用。
4、所有的请求报文经由 Director Server ,但回复响应报文不能经过 Director Server。
5、Real Server 的网关不允许指向 Director Server IP,即 Real Server 发送的数据包不允许经过 Director Server。
6、Real Server 上的 lo 接口配置 VIP的IP地址。
三、LVS-DR中的ARP问题
1、在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
只有前端的负载均衡器进行相应,其他的节点服务器不应该响应ARP广播
2、对节点服务器进行处理,使其不响应针对VIP的ARP请求
使用虚接口 lo:0承载VIP地址
设置内核参数arp_ignore=1;系统只响应目的IP为本机IP的ARP请求
3、Real Server 返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址
发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包的源IP地址,而不使用发送接口的IP地址
源IP:VIP、源MAC:Real Server的MAC、目的IP:路由器的IP、目的MAC:?
4、路由表收到ARP请求后,将更新ARP表项
原有的VIP对应Director的MAC地址会被更新为VIP对应Real Server 的MAC地址
5、路由表根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
解决方法:对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
6、解决ARP的两个问题的设置方法
修改/etc/sysctl.conf文件
net.ipv4.conf.lo.arp_ignore = 1 //防止网关路由器发送ARP广播时调度器和节点服务器都进行响应导致ARP缓存表紊乱,不对非本地物理网卡IP的ARP请求进行响应因为VIP是承载在lo:0 net.ipv4.conf.lo.arp_announce = 2 //系统不使用响应数据包的源IP地址(VIP)来作为本机进行ARP请求报文的源IP地址而使用发送报文的物理网卡IP地址作为ARP请求报文的源IP地址,这样可以防止网关路由器接收到源IP地址为VIP的ARP请求报文后又更新ARP缓存表导致外网再发送请求时,数据包到达不了调度器 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
四、DR模式LVS负载均衡群集部署
DR服务器:192.168.80.10
Web服务器1:192.168.80.12
Web服务器2:192.168.80.13
vip:192.168.80.188
客户端:192.168.80.200
1、配置负载调度器(192.168.80.10)
systemctl stop firewalld.service setenforve 0 modprobe ip_vs cat /proc/net/ip_vs yum -y install ipvsadm
(1)配置虚拟IP地址(VIP:192.168.80.188)
cd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-ens33:0 //若隧道模式,复制为ifcfg-tun10 vim ifcfg-ens33:0 DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.80.188 NETMASK=255.255.255.255 ifup ens33:0 ifconfig ens33:0
(2)调整proc响应参数
//由于LVS负载调度器和个节点需要共用VIP地址,需要关闭icmp的重定向,不充当路由器 vim /etc/sysctl.conf net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 0 sysctl -p
(3)配置负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm systemctl start ipvsadm ipvsadm -C ipvsadm -A -t 192.168.80.188:80 -s rr ipvsadm -a -t 192.168.80.188:80 -r 192.168.80.12:80 -g //若隧道模式,-g替换为-i ipvsadm -a -t 192.168.80.188:80 -r 192.168.80.13:80 -g ipvsadm ipvsadm -ln //查看节点状态,Route代表DR模式
2、部署共享存储(NFS服务器:192.168.80.13)
systemctl stop firewalld.service setenforce 0 yum -y install nfs-utils rpcbind mkdir /opt/kgc /opt/benet chmod 777 /opt/kgc /opt/benet vim /etc/exports /usr/share *(ro,sync) /opt/kgc 192.168.80.0/24(rw,sync) /opt/benet 192.168.80.0/24(rw,sync) systemctl start nfs.service systemctl start rpcbind.service
3、配置节点服务器(192.168.80.100、192.168.80.101)
systemctl stop firewalld.service setenforce 0
(1)配置虚拟IP地址(VIP:192.168.80.188)
//此地址仅用作发送Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。因此使用虚接口 lo:0来承载VIP地址,并为本机添加一条路由记录,将访问VIP的数据限制在本地,以避免通信紊乱 cd /etc/sysconfig/network-scripts/ cp ifcfg-lo ifcfg-lo:0 vim ifcfg-lo:0 DEVICE=lo:0 ONBOOT=yes IPADDR=192.168.80.188 NETMASK=255.255.255.255 //注意:子网掩码必须全为1 ifup lo:0 ifconfig lo:0 route add -host 192.168.80.188 dev lo:0 vim /etc/rc.local /sbin/route add -host 192.168.80.188 dev lo:0 chmod +x /etc/rc.d/rc.local
(2)调整内核的ARP响应参数以阻止更新VIP的MAC地址,避免发生冲突
vim /etc/sysctl.conf ...... net.ipv4.conf.lo.arp_ignore = 1 //系统只响应目的IP为本地IP的ARP请求 net.ipv4.conf.lo.arp_announce = 2 //系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 sysctl -p //or echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p yum -y install nfs-utils rpcbind httpd systemctl start rpcbind systemctl start httpd //----192.168.80.100 mount.nfs 192.168.80.13:/opt/kgc /var/www/html echo ‘this is kgc web!‘ > /var/www/html/index.html //----192.168.80.101 mount.nfs 192.168.80.13:/opt/benet /var/www/html echo ‘this is benet web!‘ > /var/www/html/index.html
4、测试LVS群集
在客户端使用浏览器访问http://192.168.80.188/
五、补充
1、LVS三种工作模式的区别
NAT:通过网络地址转换实现的虚拟服务器,大并发访问时,调度器的性能成为瓶颈
DR:使用路由技术实现虚拟服务器,节点服务器需要配置VIP,注意MAC地址广播
2、LVS调度算法
轮询(Round Robin);加权轮询(Weighted Round Robin);最少连接(Least Connections);加权最少连接(Weighted Least Connections);源地址哈希值(source hash)
3、LVS调度器常见算法(均衡策略)
LVS调度器用的调度方法基本分为两类:
固定调度算法:rr、wrr、dh、sh
rr:轮询算法,将请求依次分配给不同的rs节点,即rs节点中均摊分配。适合于rs所有节点处理性能接近的情况。
wrr:加权轮询调度,依据不同rs的权值分配任务。权值较高的rs将优先获得任务,并且分配到的连接数将比权值低的rs更多。相同权值的rs得到相同数目连接数。
dh:目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得所需rs。
sh:源地址哈希调度,以源地址为关键字查找一个静态hash表来获得所需rs。
动态调度算法:wlc、lc、lblc
wlc:加权最小连接数调度,假设各台rs权值依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的rs作为下一个分配的rs。
lc:最小连接数调度,IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的rs。
lblc:基于地址的最小连接数调度,将来自同一个目的地址的请求分配给同一台rs,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的rs,并以它作为下一次分配的首先考虑。
4、LVS的工作模式及其工作过程
LVS有三种负载均衡的模式,分别是VS/NAT(nat模式)、VS/DR(路由模式)、VS/TUN(隧道模式)
VS/NAT(nat模式)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真是服务器(rs)。然后负载均衡器就把客户端发送的请求数据包的目标IP地址及端口改成后端真是服务器的IP地址(RIP)。真实服务器响应完请求后,查看默认路由,把响应后的数据包发送给负载均衡器,负载均衡器在接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
优点:集群中的服务器可以使用任何支持TCP/IP的操作系统,只要负载均衡器有一个合法的IP地址。
缺点:扩展性有限,当服务器节点增长过多时,由于所有的请求和应答都需要经过负载均衡器,因此负载均衡器将成为整个系统的瓶颈。
VS/DR(路由模式)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(rs)。然后负载均衡器就把客服端发送的请求数据包的目标MAC地址改成后端真实服务器的MAC地址(R-MAC)。真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均衡器。
优点:负载均衡器只负责将请求包分发给后端节点服务器,而rs将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
缺点:需要负载均衡器与真实服务器都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
VS/TUN(隧道模式)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的rs。然后负载均衡器就把客户端发送的请求报文封装一层IP隧道(T-IP)转发到rs。rs响应完请求后,查看默认路由,把响应后的数据包直接发送给客服端,不需要经过负载均衡器。
优点:负载均衡器只负载将请求包分发给后端节点服务器,而rs将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
缺点:隧道模式的rs节点需要合法IP,这种方式需要所有的服务器支持“IP Tunneling”。