集群Cluster

Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统


集群的分类

LB:LoadBalancing(负载均衡)由多个主机组成,每个主机只承担一部分访问
HA:High Availiablity(高可用)SPOF(single Point Of failure)
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%
SLA:Service level agreement(服务等级协议)是在一定开销下为保障服务的性能和可用 性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的 主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水 平的时候,就会有一 些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。 停机 时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划 外停机时间
HPC:High-performance computing(高性能计算,国家战略资源,不在课程范围内)


lvs集群体系结构

工作原理: VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来                       挑选RS

LVS(Linux Virtual Server)

核心功能是通过IP负载均衡技术将客户端请求分发至服务器 集群,实现服务的可伸缩性与透明性,支持及持久连接

LVS:Linux Virtual Server,负载调度器,是一种基于Linux操作系统 内核的高性能、高可用网络服         务负载均衡解决方案。
       创始人:章文嵩,阿里的四层SLB(Server LoadBalance)是基于LVS+keepalived实现
LVS 官网: http://www.linuxvirtualserver.org/
LVS 相关术语 :Virtual Server,负责调度   
                           RS:RealServer,负责真正提供服务
                           CIP:Client IP (客户端主机的ip)
                           VIP: Virtual serve IP VS外网的IP (对外开放的让客户访问的ip)
                           DIP: Director IP VS内网的IP (调度器负责访问内网的ip)
                           RIP: Real server IP (真实业务主机IP)
访问流程:CIP <--> VIP == DIP <--> RIP

lvs集群的类型
lvs-nat模式

修改请求报文的目标IP,多目标IP的DNAT

  • 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
  • RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
  • 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
  • 支持端口映射,可修改请求报文的目标PORT
  • VS必须是Linux系统,RS可以是任意OS系统
nat模式数据逻辑

1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口
(9000port)
2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口
(9000port)
4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
5.VS服务器把修改过报文的响应数据包回传给客户端
6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞


nat模式数据传输过程

  • 客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作nat转发
  • 因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。
lvs-dr模式

 操纵封装新的MAC地址
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首           部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口             的 MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变

在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs上都要有vip

DR模式数据传输过程

1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端           IP+客户端的MAC+VIP+RS1的MAC
3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户     端IP的MAC

DR模式特点

    1.Director和各RS都配置有VIP
    2.确保前端路由器将目标IP为VIP的请求报文发往Director
    3.在前端网关做静态绑定VIP和Director的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
    /proc/sys/net/ipv4/conf/all/arp_announce

    4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;

    5.RIP的网关不能指向DIP,以确保响应报文不会经由Director

    6.RS和Director要在同一个物理网络

    7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client

    8.不支持端口映射(端口不能修败)

    9.RS可使用大多数OS系统

TUN模式

在原请求IP报文之外新加一个IP首部
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
 

TUN模式传输过程

1.客户端发送请求数据包,包内有源IP+vip+dport
2.到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含
   TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
3.RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP)+port,响应数据包通过网络直接回传给client


TUN模式特点


1.DIP, VIP, RIP都应该是公网地址
2.RS的网关一般不能指向DIP
3.请求报文要经由Director,但响应不能经由Director
4.不支持端口映射
5.RS的OS须支持隧道功能
lvs-fullnat模式
 

fullnat模型

fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
             CIP --> DIP
             VIP --> RIP
1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指     向DIP
2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director
4.支持端口映射

总结
NAT模式 TUN模式 DR模式
RS操作系统 不限 支持隧道 禁用arp
调度器和服务器网络 可跨网络 可跨网络 不可跨网络
调度服务器数量
RS服务器网关 指向到调度器DIP 指向到路由 指向到路由
  • lvs-nat与lvs-fullnat:请求和响应报文都经由Director
  • lvs-nat:RIP的网关要指向DIP
  • lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
  • lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
  • lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
     

Lvs调度算法

算法类型
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法


静态方法

仅根据算法本身进行调度,不考虑RS的负载情况
1、RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
2、WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始          终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地        址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,              如:宽带运营商


动态方法

主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1、LC:least connections(最少链接发)
           适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns           (非活动链接数)
2、WLC:Weighted LC(权重最少链接)
      默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
3、SED:Shortest Expection Delay,
     初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
     但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重        的复制到负载轻的RS


4.15版本内核以后新增调度算法

1.FO(Weighted Fai Over)调度算法:常用作灰度发布
   在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F
   OVERLOAD标志)的且权重最高的真实服务器,进行调度
   当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主机中。
2.OVF(Overflow-connection)调度算法基于真实服务器的活动连接数量和权重值实现。将新连接调     度到权重值最高的真实服务器,直到其活动
   连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟       服务相关 联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需       要同时满足以下条件:

  • 未过载(未设置IP_VS_DEST_F OVERLOAD标志)
  • 真实服务器当前的活动连接数量小于其权重值
  • 其权重值不为零

Lvs相关命令

Lvs相关信息

  • 程序包:ipvsadm
  • Unit File: ipvsadm.service
  • 主程序:/usr/sbin/ipvsadm
  • 规则保存工具:/usr/sbin/ipvsadm-save
  • 规则重载工具:/usr/sbin/ipvsadm-restore
  • 配置文件:/etc/sysconfig/ipvsadm-config
  • ipvs调度规则文件:/etc/sysconfig/ipvsadm
idvsadm命令
  • 核心功能:
  • 集群服务管理:增、删、改
  • 集群服务的RS管理:增、删、改
  • 查看

开启监控

[root@localhost ~]# watch -n 1 ipvsadm -Ln

lvs集群中的增删改
管理集群服务中的增删改
管理集群服务
ipvsadm -A|E -t(tcp)|u(udp)|f(防护墙标签) \
service-address(集群地址) \
[-s scheduler(调度算法)] \
[-p [timeout]] \
[-M netmask] \
[--pepersistence_engine] \
[-b sched-flags]
ipvsadm -D -t|u|f service-address 删除
ipvsadm –C 清空
ipvsadm –R 重载
ipvsadm -S [-n] 保存
管理集群中的real server
ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w
weight](权重)
ipvsadm -d -t|u|f service-address -r server-address 删除RS
ipvsadm -L|l [options] 查看rs
ipvsadm -Z [-t|u|f service-address] 清楚计数器
#设定服务器vip,端口及调度算法
[root@localhost ~]# ipvsadm -A -t  172.25.254.128:80 -s rr
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.128:80 rr
 
#指定使用防火墙标记来进行轮询
[root@localhost ~]# ipvsadm -A  -f 66  -p 3000
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.128:80 rr
FWM  66 wlc persistent 3000
 
#更改权重
[root@localhost ~]# ipvsadm -E -t 172.25.254.128:80 -s wrr
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.128:80 wrr
FWM  66 wlc persistent 3000
 
#删除IP
[root@localhost ~]# ipvsadm -D -f 66
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.128:80 wrr
管理集群RealServer的增删改

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f #firewall mask 火墙标记,是一个数字
#增加
[root@localhost ~]# ipvsadm -a -t 172.25.254.128:80  -r 192.168.0.10 -m
[root@localhost ~]# ipvsadm -a -t 172.25.254.128:80  -r 192.168.0.20 -m
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.128:80 wrr
  -> 192.168.0.10:80              Masq    1      0          0         
  -> 192.168.0.20:80              Masq    1      0          0         
 
#修改
[root@localhost ~]# ipvsadm -e -t 172.25.254.128:80 -r 192.168.0.10 -w 2 -m
[root@localhost ~]# ipvsadm -e -t 172.25.254.128:80 -r 192.168.0.20 -w 5 -i
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.128:80 wrr
  -> 192.168.0.10:80              Masq    2      0          0         
  -> 192.168.0.20:80              Tunnel  5      0          0         
 
 
#删除
[root@localhost ~]# ipvsadm -d -t 172.25.254.128:80 -r 192.168.0.20
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.128:80 wrr
  -> 192.168.0.10:80              Masq    2      0          0         
 
#清空策略
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
自定义文件保存策略
[root@localhost ~]# ipvsadm -A -t 172.25.254.128:80 -s rr
[root@localhost ~]# ipvsadm -a -t 172.25.254.128:80 -r 192.168.0.10 -m
[root@localhost ~]#  ipvsadm -a -t 172.25.254.128:80 -r 192.168.0.20 -m
[root@localhost ~]#  ipvsadm-save
-A -t 172.25.254.128:http -s rr
-a -t 172.25.254.128:http -r 192.168.0.10:http -m -w 1
-a -t 172.25.254.128:http -r 192.168.0.20:http -m -w 1
 
[root@localhost ~]# ipvsadm-save   > /mnt/haha
 
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
 
[root@localhost ~]#  ipvsadm-restore < /mnt/haha
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.128:80 rr
  -> 192.168.0.10:80              Masq    1      0          0         
  -> 192.168.0.20:80              Masq    1      0          0         
开机自启动ipvs策略
[root@lvs-server ~]# ipvsadm-save  > /etc/sysconfig/ipvsadm
[root@lvs-server ~]# systemctl enable --now ipvsadm.service
 
reboot
#重启后仍然生效
[root@lvs-server ~]# 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.0.100:80 rr
  -> 192.168.0.10:80              Masq    1      0          0
  -> 192.168.0.20:80              Masq    1      0          0
lvs的多端口轮询问题解决方案
利用火墙标记解决轮询错误
#在RS1和RS2中开启https
[root@RS1+RS2 ~]# dnf install mod_ssl -y
[root@RS1+RS2 ~]# systemctl restart httpd
[root@RS1+RS2 ~]# systemctl restart httpd
在vsnode中添加https的轮询策略IPa
[root@localhost ~]# ipvsadm -A -t 192.168.0.128:80  -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.0.128:80 -r 192.168.0.10 -g
[root@localhost ~]# ipvsadm -a -t 192.168.0.128:80 -r 192.168.0.20 -g
[root@localhost ~]# ipvsadm -A -t 192.168.0.128:443  -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.0.128:443 -r 192.168.0.10:443 -g
[root@localhost ~]# ipvsadm -a -t 192.168.0.128:443 -r 192.168.0.20:443 -g
[root@localhost ~]# 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.0.128:80 rr
  -> 192.168.0.10:80              Route   1      0          0         
  -> 192.168.0.20:80              Route   1      0          0         
TCP  192.168.0.128:443 rr
  -> 192.168.0.10:443             Route   1      0          0         
  -> 192.168.0.20:443             Route   1      0          0       

错误示范

[root@client ~]# curl 192.168.0.128;curl -k https://192.168.0.128
RS2 - 192.168.0.20
RS2 - 192.168.0.20
 
#当上述设定完成后http和https是独立的service,轮询会出现重复问题

解决方案:使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载

解决方案:使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载
[root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.0.128 -p tcp -m multiport --dports 80,443 -j MARK --set-mark  6666
[root@localhost ~]# ipvsadm -A -f 6666 -s rr
[root@localhost ~]#  ipvsadm  -a -f 6666 -r 192.168.0.10 -g
[root@localhost ~]# ipvsadm  -a -f 6666 -r 192.168.0.20 -g
 
#测试:在客户端
[root@client ~]# curl  192.168.0.128;curl -k https://192.168.0.128
RS2 - 192.168.0.20
RS1 - 192.168.0.10
利用持久连接实现会话粘滞

1.设定ipvs调度策略

root@localhost ~]# ipvsadm -A -f 6666 -s rr -p 1
[root@localhost ~]# ipvsadm  -a -f 6666 -r 192.168.0.10 -g
[root@localhost ~]# ipvsadm  -a -f 6666 -r 192.168.0.20 -g
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  6666 rr persistent 1
  -> 192.168.0.10:0               Route   1      0          0         
  -> 192.168.0.20:0               Route   1      0          0         

2.测试

[root@client ~]# curl  192.168.0.128
RS1 - 192.168.0.10
[root@client ~]# curl  192.168.0.128
RS1 - 192.168.0.10

3.观察

[root@localhost ~]#  watch -n 1 ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:56  FIN_WAIT    172.25.254.99:42420 192.168.0.128:80   192.168.0.20:80
IP  00:57  ASSURED     172.25.254.99:0    0.0.26.10:0        192.168.0.20:0
TCP 01:54  FIN_WAIT    172.25.254.99:46216 192.168.0.128:80   192.168.0.20:80
TCP 01:55  FIN_WAIT    172.25.254.99:46222 192.168.0.128:80   192.168.0.20:80

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐