目录
LVS是
Linux Virtual Server
的简写,意思即是Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩
博士组织成立的,是中国国内最早出现的自由软件项目之一。
LVS负载均衡调度技术是在Linux内核中实现的,因此被称为Linux虚拟服务器(Linux Virtual Server)。我们使用该软件配置LVS时候,不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理,当然,也可以用keepalived软件直接管理ipvs,这样比通过ipvsadm管理ipvs更方便。看下图:
LVS小结
1、真正实现调度的工具是IPVS,工作在Linux内核层面
2、LVS自带的IPVS命令行管理工具是ipvsadm
3、keepalived实现管理IPVS(配置文件)及负载均衡器的高可用。
4、Red Hat工具Piranha WEB管理实现调度的工具IPVS(会keepalived就行)
标题 | 地址 |
---|---|
LVS项目介绍 | http://www.linuxvirtualserver.org/zh/lvs1.html |
LVS集群的体系结构 | http://www.linuxvirtualserver.org/zh/lvs2.html |
LVS集群中的IP负载均衡技术 | http://www.linuxvirtualserver.org/zh/lvs3.html |
LVS集群的负载调度 | http://www.linuxvirtualserver.org/zh/lvs4.html |
名称 | 缩 写 | 说明 |
---|---|---|
虚拟IP地址(Virtual Ip Address) | VIP | VIP为Director用于向客户端计算机提供服务的IP地址。比如:www.rsq.com域名就要解析到VIP上提供服务。 |
真实IP地址(Real Server Ip Address) | RIP | 在集群下面节点上使用的IP地址,物理IP地址。 |
Director的IP地址(Director Ip Address) | DIP | Director用于连接内外网络的IP地址,物理网卡上的IP地址。是负载均衡器上的IP |
客户端主机IP地址(Client Ip Address) | CIP | 客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址。 |
真实服务器(Real Server) | RS | 集群节点,为LVS内部的真实服务器。 |
DR(Direct Routing)
1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP, 目的IP地址仍然是VIP。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB, 因此,并发访问量大时使用效率很高(和NAT模式比)
3、因DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(小缺点)。
4、需要注意RS节点的VIP的绑定(lo:vip/32,lo1:vip/32) 和ARP抑制问题。
5、强调下: RS节点的默认网关不需要是调度器LB的DIP, 而直接是DC机房分配的上级路由器的IP (这是RS带有外网P地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP。
6、由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(和NAT要区别)
7、当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。
8、总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万以下都可以考虑用haproxy/nginx (LVS NAT模式)
9、直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如: MySQL,存储系统RS节点,最好只用内部IP地址。
DR模式的核心特点就是更改目标MAC地址进行转发
NAT(Network Address Translation)
1、NAT技术将请求的报文(通过DNAT方式改写)和响应的报文(通过SNAT方式改写),通过调度器地址重写然后在转发给内部的服务器,报文返回时在改写成原来的用户请求的地址。
2、只需要在调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部RS节点通信。
3、每台内部RS节点的网关地址,必须要配成调度器LB的私有LAN内物理网卡地址(LDIP),这样才能确保数据报文返回时仍然经过调度器LB。
4、由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最多10-20台节点。
5、NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80, 可以通过调度器转换到RS节点的10. 0.0.2:8080 (DR 和TUN模式不具备的)
6、所有NAT内部RS节点只需配置私有LAN IP即可。
7、由于数据包来回都需要经过调度器,因此,要开启内核转发net. ipv4. ip_forward = 1,当然也包括iptables防火墙的forward功能(DR和TUN模式不需要)
TUN(Tunneling)
在进行IP数据传递的时候会在报文前增加IP包头
IN
:增加一个IP头
OUT
:NULL,不增加
LAN环境一般多采用DR模式,WAN环境可以用TUN模式,但是当前在WAN环境下,请求转发更多的被haproxy/nginx/ND调度等代理取代。因此,TUN模式在国内公司,现在基本上不用了。
FULLNAT(Full Network Address Translation)
NAT模式下报文变化
发送 接收
cip —> vip
cip —> rip ( DNAT )
rip —> cip
vip —> cip ( SNAT )FULLNAT模式下报文变化
发送 接收
cip —> vip
lip —> rip ( SNAT + DNAT )
rip —> lip
vip —> cip ( SNAT + DNAT )注释
cip为客户端的地址
vip为虚拟地址
rip为真实的服务器
lip为本地地址
SNAT为来源地址转换
DNAT为目的地址转换
算法 | 说明 |
---|---|
rr | 轮循调度(Round-Robin),它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法简单,但是只适合于RS节点处理性能相差不大的情况。 |
wrr | 加权轮循调度(Weighted Round-Robin), 它将依据不同RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数。 |
dh | 目的地址哈希调度(Destination Hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS。 |
sh | 源地址哈希调度(Source Hashing)以源地址为关键字查找一个静态hash表来获得需要的RS。 |
wlc | 加权最小连接数调度(Weighted Least-Connection)假设各台RS的权值依次为Wi(I=1..n),当前的TCP连接数依次为Ti (I=1..n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。 |
lc | 最小连接数调度(Least-Connection), IPVS表存储了所有的活动的连接。把新的连接请求发送到当前连接数最小的RS。 |
lblc | 基于地址带重复最小连接数调度(Locality-Based Least-Connection with Replication)对于某一目的地址, 对应有一个RS子集。对此地址请求,为它分配子集中连接数最小RS;如果子集中所有服务器均已满负荷,则从集群中选择一个连接数较小服务器,将它加入到此子集并分配连接;若一定时间内,未被做任何修改,则将子集中负载最大的节点从子集删除。 |
SED | 最短的期望的延迟(Shortest ExpectedDelay SchedulingSED) (SED)基于wlc算法。 |
NQ | 最少队列调度(Never Queue SchedulingNQ) (NQ)无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算 |
LVS的调度算法的生产环境选型
1、一般的网络服务,如http、mail、mysql等,常用的LVS导读算法为:
a.基本轮循调度rr算法
b.加权最小连接调度wlc
c.加权轮循调度wrr算法
2、基于局部性的最少链接LBLC和带复制的基于局部性最少链接LBLCR主要适用于Web Cache和Db Cache集群,但是我们很少这样用。一致性哈希
3、源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
4、最短预期延时调度SED和不排队调度NQ主要是对处理时间相对比较长的网络服务。
实际使用中,这些算法的适用范围不限于这些。最好参考内核中的连接调度算法的实现原理,根据具体的业务需求合理的选型。
Hostname | IP | 说明 |
---|---|---|
lb01 | 10.0.0.5 | Nginx主负载均衡器 |
lb02 | 10.0.0.6 | Nginx辅负载均衡器 |
web01 | 10.0.0.8 | web01服务器 |
web02 | 10.0.0.7 | web02服务器 |
# 安装LVS管理工具ipvsadm
yum install ipvsadm -y
rpm -qa ipvsadm
ln -s /usr/src/kernels/`uname -r`/ /usr/src/linux
# 检查内核中是否有ip_vs,若是没有需要手动执行ipvsadm或modprobe ip_vs
[root@lb01 ~]# lsmod |grep ip_vs
ip_vs 126705 0
libcrc32c 1246 1 ip_vs
ipv6 336368 265 ip_vs
# 手动创建VIP
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
[root@lb01 ~]# ifconfig eth0:0
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:F9:DF:AB
inet addr:10.0.0.3 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
# ipvsadm常用参数配置
ipvsadm --help
--clear -C 清空所有配置表
--add-service -A 添加一个虚拟Server,即VIP
--add-server -a 添加一个真实Server,即RS
--gatewaying -g 配置DR的工作模式,默认为DR。(direct routing) (default)
--ipip -i 配置Tunnel模式。ipip encapsulation (tunneling)
--masquerading -m 配置NAT模式。masquerading (NAT)
--weight -w weight RS的权重capacity of real server
--tcp-service -t service-address 设置服务地址及端口
--scheduler -s scheduler 指定一个调度算法[rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq],
--set tcp tcpfin udp 设置这三个值的连接超时时间
--list -L|-l 列出配置表
--numeric -n 数字化输出地址和端口信息
--delete-server -d 删除RS节点
# 清空所有配置
[root@lb01 ~]# ipvsadm -C
# 添加一个虚拟Server即VIP
[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr
# 添加web节点
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm --set 30 5 60
[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
# web01和web02节点配置VIP
[root@web01 ~]# ip addr add 10.0.0.3/32 dev lo label lo:0
[root@web01 ~]# ifconfig lo:0
lo:0 Link encap:Local Loopback
inet addr:10.0.0.3 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
# 添加路由,可不操作
[root@web01 ~]# route add -host 10.0.0.3 dev lo
# 抑制ARP
[root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@lb01 ~]# ipvsadm -Ln --sort
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
[root@lb01 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.0.0.3:80 3 42 0 6560 0
-> 10.0.0.7:80 1 10 0 624 0
-> 10.0.0.8:80 2 32 0 5936 0
# LVS没有健康检查的功能,ipvsadm删除节点
[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr
-> 10.0.0.7:80 Route 1 1 0
-> 10.0.0.8:80 Route 1 1 0
[root@lb01 ~]# ipvsadm -d -t 10.0.0.3:80 -r 10.0.0.8:80
[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr
-> 10.0.0.7:80 Route 1 0 0
arp_ignore - INTEGER
定义对目标地址为本地IP的ARP询问不同的应答模式
0
- (默认值):回应任何网络接口,上对任何本地IP地址的arp查询请求。
1
- 只回答目标IP地址是来访网络接口本地地址的ARP查询请求。
2
- 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
3
- 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。
4 - 7
保留未使用。
8
- 不回应所有(本地地址)的arp查询。
arp_announce - INTEGER
对网络接口上, 本地IP地址的发出的, ARP回应,作出相应级别的限制:确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0
- (默认)在任意网络接口(eth0,eth1, lo). 上的任何本地地址
1
- 尽量避免不在该网络接口子网段的本地地址做出arp回应.当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一。如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2
-对查询目标使用最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有合适的地址被发现将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送限制了使用本地的vip地址作为优先的网络接口