Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统
同一个业务系统部署在多台服务器上。集群中每一台服务器实现的功能没有差别,数据和代码都是一样的
一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每 一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完 整的业务
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提 升效率
LVS:Linux Virtual Server,负载调度器,内核集成, 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现, LVS 是全球最流行的四层负载均衡开源软件,可以实现LINUX平台下的负载均衡
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是内核 级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”
#查看内核编译配置选项是否支持lvs
egrep -i ipvs /boot/config-`uname -r`
#直接查看lvs模块
modinfo ip_vs
ipvsadm
#保存规则
#方法1
[root@ubuntu2204 ~]#service ipvsadm save
* Saving IPVS configuration... [ OK ]
[root@ubuntu2204 ~]#cat /etc/ipvsadm.rules
# ipvsadm.rules
-A -t 192.168.10.100:80 -s wlc
-a -t 192.168.10.100:80 -r 10.0.0.7:80 -g -w 1
-a -t 192.168.10.100:80 -r 10.0.0.17:80 -g -w 1
#方法2
[root@ubuntu2004 ~]#ipvsadm-save -n > /etc/ipvsadm.rules
#开机自启
[root@ubuntu2004 ~]#vim /etc/default/ipvsadm
AUTO="true"
#保存规则
[root@rocky8 ~]#ipvsadm-save -n > /etc/sysconfig/ipvsadm
#开机自启
[root@rocky8 ~]#systemctl enable ipvsadm.service
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] #增加修改
ipvsadm -D -t|u|f service-address #删除
-A 添加 -E 修改 -D 删除
-t tcp 集群服务使用tcp端口,TCP协议的端口,VIP:TCP_PORT 如: -t 10.0.0.100:80
-u udp UDP协议的端口,VIP:UDP_PORT
-f firewall MARK,标记,一个数字
[-s scheduler]:指定集群的调度算法,默认为wlc
比如:
添加
ipvsadm -A -t 10.0.0.100:80 -s wrr #创建一个集群,集群对外ip和监听tcp端口是10.0.0.100 端口80 使用wrr调度算法
删除
ipvsadm -D -t 10.0.0.100:80 -s wrr
修改
ipvsadm -E -t 10.0.0.100:80 -s rr
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] #增加和修改
ipvsadm -D -t|u|f service-address #删除
server-address:
rip[:port] 如省略port,不作端口映射
选项:
lvs类型:
-g: gateway, dr类型,默认
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重
比如:
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:8080 -m -w 3
ipvsadm -L|l [options]
--numeric, -n:以数字形式输出地址和端口号
--exact:扩展信息,精确值
--connection,-c:当前IPVS连接输出
--stats:统计信息
--rate :输出速率信息
ipvsadm -Ln #常用选项
清空定义的所有内容:
ipvsadm -C
清空计数器:
ipvsadm -Z [-t|u|f service-address]
保存规则
ipvsadm-save > /PATH/TO/IPVSADM_FILE
重载规则
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
建议保存至 /etc/sysconfig/ipvsadm #因为这个文件是默认规则保存和加载的文件
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态 分为两种:静态方法和动态方法
仅根据算法本身进行调度
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
1、最少连接算法LC:least connections 适用于长连接应用
Overhead=activeconns*256+inactiveconns
2、加权最少连接算法WLC:Weighted LC,默认调度方法,较常用
Overhead=(activeconns*256+inactiveconns)/weight
3、最短期望延迟算法SED:Shortest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接
Overhead=(activeconns+1)*256/weight
最少队列算法NQ:Never Queue,第一轮均匀分配,后续SED
基于局部的最少连接算法LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现 正向代理,实现Web Cache等
带复制的基于局部的最少连接算法LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC 负载不均衡问题,从负载重的复制到负载轻的RS,,实现Web Cache等
lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
具体配置
注意:lvs服务器需要打开ip_forward 内核参数
net.ipv4.ip_forward = 1
且ss -nutl 看不到lvs机器上的相关端口打开,因为lvs是内核功能,ss 只能看到应用程序打开的端口
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部 进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
** DR模式的特点:**
具体配置
lvs rs 服务器在一个网段内,中间没有路由器
lvs 服务器
lo 网卡上绑定一个地址vip,10.0.0.2
ifconfig lo:1 10.0.0.2/32
另一个出口网卡绑定另一个地址 10.0.0.3
gw 指向路由器
rs服务器配置
lo 网卡上绑定vip 10.0.0.2
另一个网卡绑定其他地址 10.0.0.4
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:1 10.0.0.2/32
注意
1.lvs 服务除了配置vip,一定要配另一个本网段的地址
2.lvs 服务器GW一定要配置,可以随便指向,因为没有网关,如果不是本网段的数据包,会被Linux丢弃,哪怕用不到GW
3.lo网卡上配置地址,子网掩码写/32 不要写/24, 因为lo网卡特性,/24 会认为这个网段的所有地址都是lo可用地址
4.一定要关闭rs 上 lo网卡的arp响应和免费arp,将vip 私自保留
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
TUN模式特点:
应用场景: 一般来说,TUN模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近 折返给客户端。在请求对象不在Cache服务器本地命中的情况下,Cache服务器要向源服务器发送请求,将结 果取回,最后将结果返回给用户。 LAN环境一般多采用DR模式,WAN环境虽然可以用TUN模式,但是一般在WAN环境下,请求转发更多的被 haproxy/nginx/DNS等实现。因此,TUN模式实际应用的很少,跨机房的应用一般专线光纤连接或DNS调度
配置方法
lvs服务器
#开启tunnel网卡并配置VIP
ifconfig tunl0 10.0.0.100 netmask 255.255.255.255 up
如果rs不在同一个网段,另外一个ip可以不用配置,否则需要在物理网卡上配置另一个IP
Rs服务器配置
#开启tunnel网卡并配置VIP
ifconfig tunl0 10.0.0.100 netmask 255.255.255.255 up
#修改内核参数 (rs私自保留vip)
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP –> DIP VIP –> RIP
fullnat模式特点:
NAT 多目标的DNAT,四层,支持端口修改,请求报文和响应报文都要经过LVS
DR 默认模式,二层,只修改MAC,不支持端口修改,性能好,LVS负载比小,LVS和RS并在同一网段,请求报文经过LVS,响应报文不经过LVS
TUNNEL 三层,添加一个新的IP头,支持LVS和RS并在不在同一网段,不支持端口修改,请求报文经过LVS,响应报文不经过LVS
FULLNAT 多目标的SNAT+DNAT,四层,支持端口修改,请求报文和响应报文都要经过LVS
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务 进行调度
在Director主机打标记:
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
iptables -t mangle -A PREROUTING -d 172.16.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
在Director主机基于标记定义集群服务:
ipvsadm -A -f NUMBER [options]
ipvsadm -A -f 10 -s rr