Centos7搭建LVS-DR
LVS-DR
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。DR模式是互联网使用比较多的一种模式。
LVS-DR原理图
DR模式特点:
1、各RIP 必须与 DIP 在同一个网络中(相同的广播域);
2、RS 的 RIP 可以使用私有地址,也可以使用公网地址,以方便配置;不支持支持端口映射;
3、RS可以使用必须为uninx操作系统(OS);且RS需要仰制arp,需要在loopback配置vip;
4、Director 仅负责处理入站请求,响应报文由 Realserver 直接发往客户端;Realserver 不能将网关指向 DIP,而直接使用前端网关响应请求报文;
优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为 超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。使用VS-DR方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个 Virtual Server能达到1G的吞吐量。甚至更高;
不足:但是,这种方式需要所有的DIR和RIP都在同一广播域;不支持异地容灾。
总结:LVS-DR是三种模式中性能最高的一种模式,比LVS-NAT模式下负载的RS serve更多,通常在100台左右,对网络环境要求更高,也是日常应用的最多的一种工作模式。
ipvsadm选项参数
-A 添加虚拟服务器
-t 设置群集地址(VIP,Virtual IP)
-s 用来指定负载调度算法——rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接)
-a 添加真实服务器
-d 删除真实服务器
-r 指定真实服务器(Real Server)的地址
-m 使用NAT模式
-g 指定此LVS的工作模式为-g
-i 使用TUN模式
-w 为节点服务器设置权重,默认为1
负载均衡调度算法
1)RR 轮询
Round Robin :新的连接请求被轮流分配至各RealServer,优点是该算法无需记录当前所有连接的状态,效率高;但缺点是在RealServer当中如果有性能不均等的情况下,性能差的主机将负载比较大。该算法容易倒致服务器之间负载不均衡;
2)WRR 加权轮询
Weighted RR :优点与RR一样,无需记录所有连接状态;通过设定一定的权重值来分配连接请求;
3)SH 源地址哈希
Source Hashing :通过一个散列函数将去往同一个目的IP的请求映射到一台服务器或链路上。
4)DH 目标地址哈希
Destination Hashing : 通过一个散列函数将来自同一个源IP的请求映射到一台服务器或链路上
5)LC 最少连接数
Least Connection :根据当前各服务器的连接数来估计服务器的负载情况,把新的连接分配给连接数最小的服务器;负载率=active*256+inactive,值小的优先分配请求;
6)WLC 加权最少连接数
Weighted LC :与LC类似,根据当前各服务器的连接数来估计服务器的负载情况,把新的连接分配给连接数最小的服务器;负载率=(active*256+inactive)/weight,值小的优先分配请求;
7)SED 最短期望延迟
Shortest Expect Delay : 这个算法主要是优化LC的,在服务均在请求少的时候避免负载到一台服务器上做的优化;负载率=(active+1)*256/weight,值小的优先分配请求;
8)NQ 永不排队
Nerver Queue :在负载低时,请求直接分配到空闲服务器上,不会产生请求等待;当服务器都很忙时,将轮询;
9)LBLC 基于本地最少连接
Locality-Based Least Connection:根据请求的目标IP地址找出该目标IP地址最近使用的RealServer,若该Real Server是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
10)LBLCR 带复制的基于本地最少连接
Replicated and Locality-BasedLeast Connection :该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器
LVS-DR环境搭建介绍
客户机一台 IP:10.10.10.168
LVS负载调度器 ens33:10.10.10.12 虚拟网卡ens33:0 :10.10.10.100
真实服务器1 ens33:10.10.10.13 虚拟网卡lo:0 :10.10.10.100
真实服务器2 ens33:10.10.10.14 虚拟网卡lo:0 :10.10.10.100
负载均衡调度器
1、关闭网卡守护进程
systemctl stop NetworkManager
systemctl disable NetworkManager
2、开户子接口
[root@LVS2 ~]# cd /etc/sysconfig/network-scripts/
[root@LVS2 network-scripts]# cp -a ifcfg-lo ifcfg-lo:0
[root@LVS2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=10.10.10.100
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
3、启用子接口
[root@WEB1 network-scripts]# ifup ifcfg-lo:0
4、修改内核参数
[root@LVS2 ~]# vim /etc/sysctl.conf
# LVS-DR 网卡重定向
net.ipv4.conf.all.send_redirects = 0 #禁止转发重定向报文
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
[root@LVS2 ~]# sysctl -p
sysctl: setting key "net.ipv4.conf.all.send_redirects": Invalid argument
net.ipv4.conf.all.send_redirects = 0 #禁止转发重定向报文
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
5、安装ipvsadm管理工具
[root@LVS2 ~]# yum -y install ipvsadm
[root@LVS2 ~]# ipvsadm -v #查看ipvsadm版本信息
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
6、配置集群
[root@LVS2 ~]# ipvsadm -A -t 10.10.10.100:80 -s wrr
[root@LVS2 ~]# ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.14 -g -w 1
[root@LVS2 ~]# ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13 -g -w 2
[root@LVS2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.10.100:80 wrr
-> 10.10.10.13:80 Route 2 0 0
-> 10.10.10.14:80 Route 1 0 0
7、保存ipvsadm文件
[root@LVS2 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@LVS2 ~]# ipvsadm -C #清除集群规则
[root@LVS2 ~]# ipvsadm-restore < /etc/sysconfig/ipvsadm #重新加载集群规则
8、开机自动加载集群规则
[root@LVS2 ~]# echo "ipvsadm-restore < /etc/sysconfig/ipvsadm" >> /etc/rc.local
[root@LVS2 ~]# chmod +x /etc/rc.d/rc.local
[root@LVS2 ~]# tcp -nn port 80 tcp抓包
真实服务器1
1、关闭网卡守护进程
systemctl stop NetworkManager
systemctl disable NetworkManager
2、配置回环子接口
[root@WEB1 ~]# cd /etc/sysconfig/network-scripts/
[root@WEB1 network-scripts]# cp -a ifcfg-lo ifcfg-lo:0
[root@WEB1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=10.10.10.100
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
[root@WEB1 network-scripts]# ifup ifcfg-lo:0
[root@WEB1 network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.10.13 netmask 255.255.255.0 broadcast 10.10.10.255
inet6 fe80::a2d:9ece:c698:b051 prefixlen 64 scopeid 0x20<link>
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 10.10.10.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
3、修改内核参数
[root@WEB1 ~]# vim /etc/sysctl.conf
#LVS-DR ARP通信行为控制
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@WEB1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
4、添加路由
[root@WEB1 ~]# route add -host 10.10.10.100 dev lo:0
[root@WEB2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.10.1 0.0.0.0 UG 0 0 0 ens33
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
10.10.10.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
5、将路由添加到开机自启动
[root@WEB1 ~]# echo "lvs-dr路由记录" >> /etc/rc.local
[root@WEB1 ~]# echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
6、启用httpd服务
[root@WEB1 ~]# yum -y install httpd
[root@WEB1 ~]# echo "This is RS1" >> /var/www/html/index.html
[root@WEB1 ~]# systemctl start httpd
[root@WEB1 ~]# systemctl disable httpd
[root@WEB1 ~]# curl 127.0.0.1
This is RS1
真实服务器2
1、关闭网卡守护进程
systemctl stop NetworkManager
systemctl disable NetworkManager
2、配置回环子接口
[root@WEB2 ~]# cd /etc/sysconfig/network-scripts/
[root@WEB2 network-scripts]# cp -a ifcfg-lo ifcfg-lo:0
[root@WEB2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=10.10.10.100
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
[root@WEB2 network-scripts]# ifup ifcfg-lo:0
[root@WEB2 network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.10.14 netmask 255.255.255.0 broadcast 10.10.10.255
inet6 fe80::a2d:9ece:c698:b051 prefixlen 64 scopeid 0x20<link>
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 10.10.10.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
3、修改内核参数
[root@WEB2 ~]# vim /etc/sysctl.conf
#LVS-DR ARP通信行为控制
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@WEB2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
4、添加路由
[root@WEB2 ~]# route add -host 10.10.10.100 dev lo:0
5、将路由添加到开机自启动
[root@WEB2 ~]# echo "lvs-dr路由记录" >> /etc/rc.local
[root@WEB2 ~]# echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
6、启用httpd服务
[root@WEB2 ~]# yum -y install httpd
[root@WEB2 ~]# echo "This is RS2" >> /var/www/html/index.html
[root@WEB2 ~]# systemctl start httpd
[root@WEB2 ~]# systemctl disable httpd
[root@WEB2 ~]# curl 127.0.0.1
This is RS2
测试:
[root@LVS1 ~]# curl 10.10.10.100
This is RS1
[root@LVS1 ~]# clear
[root@LVS1 ~]# curl 10.10.10.100
This is RS1
[root@LVS1 ~]# curl 10.10.10.100
This is RS2
[root@LVS1 ~]# curl 10.10.10.100
This is RS1
[root@LVS1 ~]# curl 10.10.10.100
This is RS1
[root@LVS1 ~]# curl 10.10.10.100
This is RS2