集群和分布式
系统性能拓展方式:
- Scale UP:垂直拓展,提高单个服务器的性能,如增加CPU、内存等,单台服务器的性能是有上限的,不可能无限制垂直拓展。
- Scale Out:水平拓展,增加设备,并行的运行多个服务。即Cluster集群
集群
Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统
三种类型
LB
Load Balancing,负载均衡,由多个主机组成,每个主机只承担一部分访问请求。
产品分类
软件负载均衡
LVS:四层路由,根据用户请求的IP和端口号,实现将用户的请求分发至不同的主机
HAProxy:支持七层调度,主要针对http协议实现负载均衡
Nginx:支持七层调度,主要针对http、smtp、pop3、imap等协议实现负载均衡,只负责解析有限的七层协议
硬件负载均衡
F5 BIG-IP
Citrix Netscaler
A10
HA
High Availiablity,高可用,以提升服务的始终在线能力为目标,不会因为宕机而导致服务不可用
衡量可用性:在线时间/(在线时间+故障时间)
1年 = 365天 = 8760小时
99% 即一年内有 8760 * 1% = 87.6小时故障
99.9% 即一年内有 8760 * 0.1% = 8.76小时故障
99.99% 即一年内有 8760 * 0.01% = 52.6分钟故障
99.999% 即一年内有 8760 * 0.001% = 5.26分钟故障
99.9999% 即一年内有 8760 * 0.0001% = 31秒故障
产品
Keepalived
HPC
High—performance computing,高性能计算集群,计算海量数据,解决复杂问题。
分布式
分布式存储:Ceph,GlusterFS,FastDFS,MogileFS
分布式计算:hadoop,Spark
分布式常见应用:
- 分布式应用服务按照功能拆分,使用微服务
- 分布式静态资源.静态资源放在不同的存储集群上
- 分布式数据和存储--使用key-value缓存系统
- 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
对比
集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
LVS
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是集成到内核中的,工作在INPUT链的位置,将发往INPUT的流量进行处理。
相关术语:
VS:Virtual Server,负责调度
RS:Real Server,真正提供服务的服务器
CIP:Client IP
VIP:Virtual Server IP,VS主机的外网IP
DIP:Director IP,VS主机的内网IP
RIP:Real Server IP
工作模式
一、LVS-NAT 地址转换模式
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某个挑出的RS的RIP和Port实现转发
工作原理
- 客户端发送请求到LVS(负载均衡器),请求报文源地址是CIP(客户端IP),目标地址是VIP(LVS外网IP)
- LVS收到请求报文后,发现请求的是规则中存在的地址,它将把VIP修改为RIP(真实服务器IP)并依据调度算法将报文发送至RS
- RS收到请求报文将响应该请求,会把响应报文返回至LVS
- LVS将响应报文的源IP修改为本机的VIP并发送至客户端
注意
- RIP和DIP应在同一个网络,且应使用私网IP;
- RIP的网关必须指向lVS的DIP,否则响应报文无法送达客户端。
- 请求报文和响应报文都必须经过Director转发,Director容易成为系统瓶颈
- 支持端口映射,可修改请求报文的目标端口
- VS必须是Linux系统,RS可以是任意系统
二、LVS-DR 直接路由模式
Direct Routing,直接路由,LVS默认模式,应用最广泛。通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在接口的MAC,目标MAC是某个挑选出来的RS的RIP所在接口的MAC地址。源IP/Port、目标IP/Port都保持不变
工作原理
- 客户端发送请求到LVS,请求报文源地址是CIP,目标地址是VIP
- LVS收到请求报文后,发现请求的是规则中存在的地址,它将把源MAC地址修改为自己DIP的MAC地址,目标MAC地址修改为RIP的MAC地址,并依据调度算法将报文发送至RS
- RS收到并处理请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端
注意
- Direct和各RS都配置有VIP
- 确保前端路由器将目标IP为VIP的请求报文发送至Direct
- 在前端网关做静态绑定VIP和Direct的MAC地址
- 在RS上使用arptables工具
- arptables -A IN -d $VIP -j DROP
- arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
- 在RS上修改内核参数限制arp通告及应答级别
- /proc/sys/net/ipv4/conf/all/arp_ignore
- 0 默认值,表示可以用本地任意接口上配置的任意地址进行响应
- 1 仅在请求的目标IP配置在本地主机中接收到请求报文的接口时才响应
- /proc/sys/net/ipv4/conf/all/arp_announce
- 0 默认值,把本机所有接口调度所有信息向每个接口的网络进行通告
- 1 尽量避免将接口信息向非直连网络进行通告
- 2 必须避免将接口信息向非本网络进行通过
- /proc/sys/net/ipv4/conf/all/arp_ignore
- RS的RIP可用私网地址/公网地址;RIP与DIP在同一网络;RIP网关不能指向DIP,以确保响应报文不会经过Direct
- RS和Direct要在同个物理网络
- 请求报文要经过Direct,但响应报文不经过Direct,而是直接发往Client
- 不支持端口映射(端口不能修改)
- 无需开启ip_forward
- RS可用大多数系统
三、LVS-TUNIP 隧道模式
不修改请求报文的IP首部(源IP是CIP,目标IP是VIP),而是在原IP报文外再封装一个IP首部(源IP为DIP,目标IP为RIP),将报文发给选出的RS,RS直接响应客户端(源IP是VIP,目标IP是CIP)
工作原理
- 客户端发送请求到LVS,请求报文源地址是CIP,目标地址是VIP
- LVS收到请求报文后,发现请求的是规则中存在的地址,它将在客户端请求报文的首部再封装一层IP报文,将源IP改为DIP,将目标IP改为RIP,并将包发送给RS
- RS收到请求报文后,拆开第一层封装发现里面还有一层IP首部的目标地址是自己lo接口的VIP,会再次处理请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端
注意
- RIP与DIP可以不处于同一个物理网络,RS的网关一般不能指向DIP,且RIP可以和公网通信。也就是说集群节点可以跨互联网实现。DIP、VIP、RIP可以是公网地址
- RS的tun接口需配置VIP地址,以便接收direct发过来的数据包,以及作为响应报文的源IP
- Direct转发给RS时需要借助隧道,隧道外层的IP头部源IP是DIP,目标IP是RIP,而RS响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP
- 请求报文要经过Direct,但响应不经过Direct,响应由RS自己完成
- 不支持端口映射
- RS的系统必须支持隧道功能
四、LVS-FULLNAT
通过同时修改请求报文的源IP和目标IP进行地址转发。
CIP > DIP VIP > RIP
解决的是LVS和RS跨VLAN的问题,而跨VLAN问题解决后,LVS和RS不再存在VLAN上的从属关系,可做到多个LVS对应多个RS,解决水平扩容问题
注意:
- VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此RIP的网关一般不指向DIP
- RS收到的请求报文源地址是DIP,因此只需响应给DIP;但Direct还需将其发给Client
- 请求和响应报文都经过Direct
- 相对NAT模式,可更好实现LVS和RS间跨VLAN通讯
- 支持端口映射
各个工作模式总结比较
NAT | TUN | DR | |
RS服务器系统 | 任意 | 支持隧道 | 支持Non-arp |
RS服务器网络 | 私有网络 | 局域网/广域网 | 局域网 |
RS服务器数量 | 10-20 | 100 | 100 |
RS服务器网关 | 负载均衡器 | 自身的路由 | 自身路由 |
优点 | 端口转换 | 广域网 | 性能最好 |
缺点 | Direct易成为瓶颈 | 支持隧道 | 不支持跨网段 |
效率 | 一般 | 高 | 最高 |
调试算法
根据其调度时是否考虑各个RS当前的负载状态分为两种:静态方法和动态方法
静态算法
仅根据算法本身进行调度
- RR:roundrobin,轮询
- WRR:Weighted RR,加权轮询
- SH:Source Hashing,实现session sticky,源IP地址hash;将来自同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
- DH:Destination Hashing;目标地址hash,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发给第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如Web缓存
动态算法
主要根据每个RS当前的负载状态以及调度算法进行调度Overhead=value,较小的RS将被调度
- LC:least connections,适用于长链接应用
- Overhead=activeconns*256+inactiveconns
- WLC:Weight LC,默认调度方法
- Overhead=(activeconns*256+inactiveconns)/weight
- SED:Shortest Exception Delay,初始连接权重高优先,只检查活动连接,而不考虑非活动连接
- Overhead=(activeconns+1)*256/weight
- NQ:Never Queue,第一轮均匀分配,后续SED
- LBLC:Locality—Based LC,动态DH算法,使用场景:根据负载状态实现正向代理,实现Web Cache等
- LBLCR:LBLC with Replications,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,实现Web Cache等
内核版本4.15后新增调度算法
FO (Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还
未过载(未设置IP_ _VS_ DEST_ F_ OVERLOAD标志)的且权重最高的真实服务器,进行调度
OVF (Overflow-connection) 调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一-个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。
一个可用的真实服务器需要同时满足以下条件:
- 未过载(未设置IP_ VS_ DEST_ F_ OVERLOAD标志)
- 真实服务器当前的活动连接数量小于其权重值
- 其权重值不为零
相关软件
程序包:ipvsadm
Unit File: ipvsadm.service
主程序: /usr/sbin/ipvsadm
规则保存工具: /usr/sbin/ipvsadm-save
规则重载工具: /usr/sbin/ipvsadm-restore
配置文件: /etc/sysconfig/ipvsadm-config
ipvs调度规则文件: /etc/sysconfig/ipvsadm
ipvsadm命令
管理集群服务
增加、修改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A:添加一个集群服务
-E:编辑一个集群服务
-t:TCP协议端口,VIP:TCP_Port
-u:UDP协议端口,VIP:UDP_Port
-f:firewalld Mark,标记,一个数字
-s scheduler:指定集群的调度算法,默认为WLC
-p:设置超时时间,开启后表示在指定时间内,来自同一个IP的请求都会转发到后端同一台真实服务器
删除
ipvsadm -D -t|u|f service-address
管理集群上的RS
增加、修改
ipvsadm -a|e -t|u|f service-address -r service-address [-g|i|m] [-w weight]
-a:添加一个真实服务器
-e:编辑一个真实服务器
-g:gateway,dr类型,默认
-i:ipip,tun类型
-m:masquerade,nat类型
-w:weight,权重
删除
ipvsadm -d -t|u|f service-address -r service-address
清空定义的所有内容
ipvsadm -C
清空计数器
ipvsadm -Z [-t|u|f service-address]
查看
ipvsadm -L|l [options]
options:
--numeric,-n:以数字形式输出地址和端口
--exact:拓展信息
--connection,-c:当前IPVS连接输出
--state:统计信息
--rate:输出速率信息
ipvs规则
/proc/net/ip_vs
ipvs连接
/proc/net/ip_vs_conn
保存:建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save > 路径
ipvsadm -S > 路径
systemctl stop ipvsadm.service #会自动保存规则到/etc/sysconfig/ipvsadm
重载
ipvsadm-restore < 路径
systemctl start ipvsadm.service #会自动加载/etc/sysconfig/ipvsadm的规则
#查看内核支持LVS信息
[root@wenzi ~]#grep -i -C 10 ipvs /boot/config-4.18.0-193.el8.x86_64
...
# 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_FO=m
CONFIG_IP_VS_OVF=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
# CONFIG_IP_VS_MH is not set
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m# IPVS SH scheduler
CONFIG_IP_VS_SH_TAB_BITS=8# IPVS MH scheduler
CONFIG_IP_VS_MH_TAB_INDEX=12
...
NAT实验
主机名 | IP | GW |
Client | 192.168.10.11/24 | 无 |
LVS | 192.168.10.12/24 192.168.20.1/24 | 无 |
RS1 | 192.168.20.21/24 | 192.168.20.1 |
RS2 | 192.168.20.22/24 | 192.168.20.1 |
RS1和RS2安装httpd,作为测试LVS效果
LVS安装ipvsadm
#LVS主机安装ipvsadm
yum -y install ipvsadm
#查看是否开启ipv4转发功能,0是没有开启,1是开启
sysctl net.ipv4.ip_forward
#开启ipv4转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
#使配置生效
sysctl -p#配置LVS负载均衡策略
# -A指定VIP,-t指定TCP,-s指定调度算法rr
ipvsadm -A -t 192.168.10.12:80 -s rr
# -a指定真实服务器,-t指定TCP,-m指nat模式
ipvsadm -a -t 192.168.10.12:80 -r 192.168.20.21:80 -m
ipvsadm -a -t 192.168.10.12:80 -r 192.168.20.22:80 -m
#查看已配置的策略
ipvsadm -Ln
从Client主机访问LVS
DR实验
主机名 | IP | GW |
Client | 192.168.10.11/24 | 192.168.10.1 |
Router | 192.168.10.1/24 192.168.29.141/24 | |
LVS | lo:VIP:192.168.29.100/32 192.168.29.142/24 | 192.168.29.141/24 |
RS1 | lo:VIP:192.168.29.100/32 192.168.29.143/24 | 192.168.29.141/24 |
RS2 | lo:VIP:192.168.29.100/32 192.168.29.149/24 | 192.168.29.141/24 |
路由器Router
#开启ipv4路由转发功能
[root@wenzi ~]#echo "net.ipv4.ip_forward" >> /etc/sysctl.conf
RS1
[root@RS1 ~]#yum -y install httpd
[root@RS1 ~]#echo "web1" > /var/www/html/index.html
[root@RS1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce#在lo口配置VIP
[root@RS1 ~]#ifconfig lo:1 192.168.29.100/32
[root@RS1 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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.29.100/0 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:05:13:8b brd ff:ff:ff:ff:ff:ff
inet 192.168.29.143/24 brd 192.168.29.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::5433:5ac9:62bb:cf34/64 scope link noprefixroute
valid_lft forever preferred_lft forever
RS2
[root@RS1 ~]#yum -y install httpd
[root@RS1 ~]#echo "web2" > /var/www/html/index.html
[root@RS1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce#在lo口配置VIP
[root@RS1 ~]#ifconfig lo:1 192.168.29.100/32[root@RS2 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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.29.100/0 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:2b:af:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.29.149/24 brd 192.168.29.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::10a:4a5a:dfca:7a85/64 scope link noprefixroute
valid_lft forever preferred_lft forever
LVS
#在lo口配置VIP
[root@LVS ~]#ifconfig lo:1 192.168.29.100/32
[root@LVS ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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.29.100/0 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:ea:07:84 brd ff:ff:ff:ff:ff:ff
inet 192.168.29.142/24 brd 192.168.29.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::9648:92b:c378:fddf/64 scope link noprefixroute
valid_lft forever preferred_lft forever[root@LVS ~]#ipvsadm -A -t 192.168.29.100:80 -s rr
[root@LVS ~]#ipvsadm -a -t 192.168.29.100:80 -r 192.168.29.143 -g
[root@LVS ~]#ipvsadm -a -t 192.168.29.100:80 -r 192.168.29.149 -g[root@LVS ~]#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.29.100:80 rr
-> 192.168.29.143:80 Route 1 0 0
-> 192.168.29.149:80 Route 1 0 0
客户端测试
LVS高可用实现
LVS不可用时
Director不可用时,整个系统将不可用;
解决方案:
高可用,Keepalived、heartbeat/corosync
RS不可用时
某个RS不可用时,Director依然会调度请求至此RS
解决方案:
由Director对各个RS健康状态进行检查,失败时禁用,成功时启用。
Keepalived、heartbeat/corosync、Idirectord。
检测方式:icmp(网络层)、端口检测(传输层)、请求某关键资源(应用层)