负载均衡:
是建立在现有的网络之上,它提供了一种廉价、有效、透明的方法来扩大网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,以及提高网络的灵活性和可用性。通过负载均衡器,可以实现N台廉价的Linux服务器并行处理,从面达到小型机或大型机的计算能力。单台负载均衡器位于网站的最前端,它起着分流客户请求的作用,相当于整个网站或系统的入口。由于IPv4中IP地址日益紧张以及出于安全方面的才虑,很多网络使用保留IP地址(如10.0.0.0/255.0.0.0、172.16.0.0/255.128.0.0、和192.168.0.0/255.255.0.0).这些不在Internet上使用,而是专门为内部网络预留的。当内部网络中的主机要访问Internet或被Internet访问时,就需要进行网络地址转换(Network Address Translation,NAT),NAT方法就是交不同IP地址的并行网络服务变成一个在同一IP地址上的虚拟服务。
以LVS(Linux Virtual Server)作为负载均衡器:
LVS类型:
NAT-->(DNAT)
DR
TUN
FULLNAT
VS/NAT的体系结构比较简单:在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的,这些服务器提供相同的网络服务、相同的服务内容,即不管请求被发送到哪一台服务器,执行结果都是一样的。服务的内容可以复制到每一台服务器的本地硬盘上,可能通过网络文件系统共享,也可以通过一个分布式文件系统来提供。
LVS NAT的特性:
1、RS应该使用私有地址;
2、RS的网关的必须指向DIP;
3、RIP和DIP必须在同一网段内;
4、请求和响应的报文都得经过Director;在高负载场景中,Director很可能成为系统性能瓶颈;
5、支持端口映射;
6、RS可以使用任意支持集群服务的OS;
VS/DR或VS/TUN应用的一种模型中(所有机器都在同一个物理网络),所有机器(包括Director和RealServer)都使用了一个额外的IP地址,即VIP。当一个客户端向VIP发出一个连接请求时,此请求必须要连接至Director的VIP,而不能是RealServer的。因为,LVS的主要目标就是要Director负责调度这些连接请求至RealServer的。
因此,在Client发出至VIP的连接请求后,只能由Director将其MAC地址响应给客户端(也可能是直接与Director连接的路由设备),而Director则会相应的更新其ipvsadm table以追踪此连接,而后将其转发至后端的RealServer之一。
如果Client在请求建立至VIP的连接时由某RealServer响应了其请求,则Client会在其MAC table中建立起一个VIP至RealServer的对就关系,并以至进行后面的通信。此时,在Client看来只有一个RealServer而无法意识到其它服务器的存在。
为了解决此问题,可以通过在路由器上设置其转发规则来实现。当然,如果没有权限访问路由器并做出相应的设置,则只能通过传统的本地方式来解决此问题了。这些方法包括:
1、禁止RealServer响应对VIP的ARP请求;
2、在RealServer上隐藏VIP,以使得它们无法获知网络上的ARP请求;
3、基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;
4、禁止ARP请求发往RealServers;
LVS DR类型的特性:
1、RS可以使用私有地址;但也可以使用公网地址,此时可以直接通过互联网连入RS以实现配置、监控等;
2、RS的网关一定不能指向DIP;
3、RS跟Dirctory要在同一物理网络内(不能由路由器分隔);
4、请求报文经过Directory,但响应报文一定不经过Director
5、不支持端口映射;
6、RS可以使用大多数的操作系统;
LVS TUN类型:IP隧道
1、RIP、DIP、VIP都得是公网地址;
2、RS的网关不会指向也不可能指向DIP;
3、请求报文经过Directory,但响应报文一定不经过Director;
4、不支持端口映射;
5、RS的OS必须得支持隧道功能;
LVS Scheduling Method LVS的调度方法: 1.Fixed Scheduling Method 静态调服方法 (1).RR 轮询 (2).WRR 加权轮询 (3).DH 目标地址hash (4).SH 源地址hash 2.Dynamic Scheduling Method 动态调服方法 (1).LC 最少连接 (2).WLC 加权最少连接 (3).SED 最少期望延迟 (4).NQ 从不排队调度方法 (5).LBLC 基于本地的最少连接 (6).LBLCR 带复制的基于本地的最少连接 ipvsadm组件定义规则的格式: 1.定义集群服务格式: (1).添加集群服务: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] -A: 表示添加一个新的集群服务 -E: 编辑一个集群服务 -t: 表示tcp协议 -u: 表示udp协议 -f: 表示firewall-Mark,防火墙标记 service-address: 集群服务的IP地址,即VIP -s 指定调度算法 -p 持久连接时长,如#ipvsadm -Lcn ,查看持久连接状态 -M 定义掩码 ipvsadm -D -t|u|f service-address 删除一个集群服务 ipvsadm -C 清空所有的规则 ipvsadm -R 重新载入规则 ipvsadm -S [-n] 保存规则 2.向集群服务添加RealServer规则: (1).添加RealServer规则 ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] -a 添加一个新的realserver规则 -e 编辑realserver规则 -t tcp协议 -u udp协议 -f firewall-Mark,防火墙标记 service-address realserver的IP地址 -g 表示定义为LVS-DR模型 -i 表示定义为LVS-TUN模型 -m 表示定义为LVS-NAT模型 -w 定义权重,后面跟具体的权值 ipvsadm -d -t|u|f service-address -r server-address --删除一个realserver ipvsadm -L|l [options] --查看定义的规则 如:#ipvsadm -L -n ipvsadm -Z [-t|u|f service-address] --清空计数器 LVS-NAT 模型实例
打开路由间转发功能
[root@mgm-net0 ~]# sysctl -a | grep net.ipv4.ip_forward
sysctl: reading key "net.ipv6.conf.all.stable_secret"
net.ipv4.ip_forward = 1
若为0,设置为1:
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p //立即生效
查看ipvs支持功能
[root@mgm-net0 ~]# grep -E -i "ipvs|IP_VS" /boot/config-3.10.0-862.11.6.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
# IPVS transport protocol load balancing support
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
# IPVS scheduler
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
# IPVS SH scheduler
CONFIG_IP_VS_SH_TAB_BITS=8
# IPVS application helper
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m
lbaas-lvs实现机制:namespace lvs-xxx下
底层代码实现:
class LvsDriver(agent_device_driver.AgentDeviceDriver):
[root@node0 ~]# ipvsadm -C
[root@node0 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
[root@node0 ~]# ipvsadm -A -u 10.33.46.64:9999 -s sh -p 120
[root@node0 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
UDP 10.33.46.64:9999 0 0 0 0 0
[root@node0 ~]# ipvsadm -a -u 10.33.46.64:9999 -r 10.33.46.68:9999 -m -w 1
[root@node0 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
UDP 10.33.46.64:9999 0 0 0 0 0
-> 10.33.46.68:9999 0 0 0 0 0
[root@node0 ~]# arping -c 1 10.33.46.68
ARPING 10.33.46.68 from 10.33.46.64 tap85d707e7-35
Unicast reply from 10.33.46.68 [FA:16:3E:0D:A6:AB] 1.310ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
[root@node0 ~]# netcat -uvz -w 1 10.33.46.68 9999
[root@node0 ~]# netcat -uvz -w 1 10.33.46.64 9999
Warning: Host 10.33.46.64 isn't authoritative! (direct lookup mismatch)
10.33.46.64 -> mgm-net0 BUT mgm-net0 -> 172.30.65.2
[root@node0 ~]# netcat -uvz -w 1 10.33.46.68 9990
[root@node0 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
UDP 10.33.46.64:9999 2 2 0 64 0
-> 10.33.46.68:9999 2 2 0 64 0
[root@node0 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
UDP 10.33.46.64:9999 2 3 0 111 0
-> 10.33.46.68:9999 2 3 0 111 0
[root@node0 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
UDP 10.33.46.64:9999 2 4 0 142 0
-> 10.33.46.68:9999 2 4 0 142 0
测试:
负载均衡器的成员虚机上,server监听端口
[root@host-10-33-46-68 ~]# nc -ul 10.33.46.68 9999
[root@node0 ~]# ipvsadm -Z ====清空统计数据
[root@node0 ~]# ipvsadm -ln --stats ==查看统计
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
UDP 10.33.46.64:9999 0 0 0 0 0
-> 10.33.46.68:9999 0 0 0 0 0
client发包
[root@node2 ~]# echo "hello word"|nc -nuv 10.33.46.64 9999
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.33.46.64:9999.
Ncat: 11 bytes sent, 0 bytes received in 0.02 seconds.
server端收到数据
[root@host-10-33-46-68 ~]# nc -ul 10.33.46.68 9999
hello word
[root@node0 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
UDP 10.33.46.64:9999 1 1 0 39 0
-> 10.33.46.68:9999 1 1 0 39 0