Cluster集群
MTBF:Mean Time Between Failure 平均无故障时间
MTTR:Mean Time To Restoration( repair)平均恢复前时间
A=MTBF/(MTBF+MTTR) (0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%
HPC:High-performance computing,高性能
LVS
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。lvs集群类型中的术语:
VS:Virtual Server,Director Server(DS)Dispatcher(调度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx)
backend server(haproxy)
CIP:Client IP
VIP: Virtual serve IP VS外网的IP
DIP: Director IP VS内网的IP
RIP: Real server IP
调度算法
静态算法:仅根据算法本身进行调度
1、轮询(Round Robin)
调度器通过”轮询”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
2、加权轮询(Weighted Round Robin)
调度器通过”加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3、源地址散列(Source Hashing)
”源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
4、目标地址散列(Destination Hashing)
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
动态算法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
1、最少链接(Least Connections)
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
2、加权最少链接(Weighted Least Connections)默认算法
在集群系统中的服务器性能差异较大的情况下,调度器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3、SED:Shortest Expection Delay,初始连接高权重优先
Overhead=(activeconns+1)*256/weight
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、基于局部性的最少链接(Locality-Based Least Connections)
“基于局部性的最少链接” 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用”最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
6、带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按”最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
LVS集群的分类
lvs-nat:修改请求报文的目标IP,多目标IP的DNATlvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP,系统默认不支持,需要编译内核实现
VS/NAT | VS/TUN | VS/DRVS/DR | |
Server | any | Tunneling | Non-arp device |
server network | private | LAN/WAN | LAN |
server number | low (10~20) | High (100) | High (100) |
server gateway | load balancer | own router | own router |
lvs-nat:RIP的网关要指向DIP。lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信。
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发,lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信 。
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
ipvsadm 命令用于管理集群服务 LVS
语法:ipvsadm 行为 协议 lvs服务器地址[:端口] [选项] [参数]
行为:
集群服务: 管理RS:
-A:增加新的集群服务 -a:增加新的RS-E:修改已有的集群服务 -e:修改新的RS
-D:删除旧的集群服务 -d:删除新的RS
-C:清空定义的所有内容
-Z:清空计数器
-L:查看当前 ipvs 规则
--numeric, -n:以数字形式输出地址和端口号
--exact:扩展信息,精确值
--connection,-c:当前IPVS连接输出
--stats:统计信息
--rate :输出速率信息
协议:
-t: TCP协议的端口
-u: UDP协议的端口
-f:firewall MARK,标记,一个数字
选项:
-s:指定集群的调度算法,默认为wlc
-g: gateway, dr类型,默认
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重
需要保存 ipvs 规则,可以保存至 /etc/sysconfig/ipvsadm,当然不是必须保存至此路径
ipvsadm -S > 规则文件路径
systemctl stop ipvsadm.service,centos7在停止服务时会自动保存规则
重新加载已保存的规则时,ipvsadm -R < /PATH/FROM/IPVSADM_FILEsystemctl restart ipvsadm.service,centos7开启服务时会自动读取规则文件
LVS-nat
Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的流量经过转换器。
(1)当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(2) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
(3) IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ,在这个过程完成了目标IP的转换。
(4) POSTROUTING链通过选路,将数据包发送给Real Server。
(5) Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 。
(6) Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
注意
(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP
(2) LVS要打开核心转发功能
在 Real Server 上调整默认路由
[root@CentOS75 ~]# route add default gw 192.168.30.74
[root@CentOS75 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.30.74 0.0.0.0 UG 0 0 0 ens33
192.168.30.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
在 LVS 上开启路由转发,并配置 LVS-nat 模式
[root@CentOS74 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@CentOS74 ~]# sysctl -p
[root@CentOS74 ~]# ipvsadm -A -t 172.20.116.3:8080 -s rr #增加集群服务
[root@CentOS74 ~]# ipvsadm -a -t 172.20.116.3:8080 -r 192.168.30.174:80 -m #增加RS,并且转发端口
[root@CentOS74 ~]# ipvsadm -a -t 172.20.116.3:8080 -r 192.168.30.75:80 -m
[root@CentOS74 ~]# ipvsadm -Ln #查看配置
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.20.116.3:8080 rr
-> 192.168.30.75:80 Masq 1 0 0
-> 192.168.30.174:80 Masq 1 0 0
测试 LVS-nat 带端口转发的轮询模式
[root@CentOS69 ~]# curl 172.20.116.3:8080
RS1
[root@CentOS69 ~]# curl 172.20.116.3:8080
RS2
[root@CentOS69 ~]# curl 172.20.116.3:8080
RS1
[root@CentOS69 ~]# curl 172.20.116.3:8080
RS2
LVS-DR
Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。直接路由模式比较特别,很难说和什么方面相似,前种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。
DR和REAL SERVER都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有REAL SERVER对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REAL SERVER。这时REAL SERVER收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于DR要对二层包头进行改换,所以DR和REAL SERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1) 在前端网关做静态绑定(2) 在各RS使用arptables
(3) 在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
单网络DR模型的LVS
LVS 不需要开启路由转发,配置LVS-DR
[root@CentOS74 ~]# ipvsadm -A -t 192.168.30.100:80 -s rr
[root@CentOS74 ~]# ipvsadm -a -t 192.168.30.100:80 -r 192.168.30.174 -g
[root@CentOS74 ~]# ipvsadm -a -t 192.168.30.100:80 -r 192.168.30.75 -g
[root@CentOS74 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.30.100:80 rr
-> 192.168.30.75:80 Route 1 0 0
-> 192.168.30.174:80 Route 1 0 0
RS 上需要在回环网卡上创建网卡别名,也可以使用物理网卡,但是使用回环网卡能够节约成本,建议使用
[root@CentOS174 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.30.100 #使用VIP
NETMASK=255.255.255.255 #子网掩码为32
BOOTPROTO=none
[root@CentOS174 ~]# ip addr show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.30.100/32 brd 192.168.30.100 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
将 RS 上的 APR 广播与应答关闭,避免地址冲突
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
在客户端测试 LVS-DR
[root@CentOS7 ~]# curl 192.168.30.100
RS174
[root@CentOS7 ~]# curl 192.168.30.100
RS75
[root@CentOS7 ~]# curl 192.168.30.100
RS174
[root@CentOS7 ~]# curl 192.168.30.100
RS75
多网络DR模型的LVS
与上面单网络的网络拓扑大致相似,所以修改基本的网络拓扑后,配置 LVS
[root@CentOS74 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33:1
DEVICE=ens33:1
BOOTPROTO=none
IPADDR=10.0.0.74
NETMASK=255.255.255.255
[root@CentOS74 ~]# ipvsadm -A -t 10.0.0.74:80 -s wrr #加权轮询
[root@CentOS74 ~]# ipvsadm -a -t 10.0.0.74:80 -r 192.168.30.174 -g -w 3 #权值为3
[root@CentOS74 ~]# ipvsadm -a -t 10.0.0.74:80 -r 192.168.30.75 -g -w 1 #权值为1
[root@CentOS74 ~]# 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.74:80 wrr
-> 192.168.30.75:80 Route 1 0 0
-> 192.168.30.174:80 Route 3 0 0
配置 RS,在回环网卡上添加 VIP,并指定默认路由
[root@CentOS174 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.74
NETMASK=255.255.255.255
BOOTPROTO=none
[root@CentOS174 ~]# route add default gw 192.168.30.69
[root@CentOS174 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.30.69 0.0.0.0 UG 0 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33
192.168.30.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
在客户端上测试 加权的 LVS-DR
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS75
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS174
[root@CentOS7 ~]# curl 10.0.0.74
RS75