什么是集群?
- 多台服务器做同一件事情。
集群扩展方式:
- scale up:向上扩展,提高服务器资源配置,比如更换CPU、增加内存等。
- scale out:向外扩展,增加服务器数量共同协作完成对外服务。
集群类型:
- 负载均衡集群(LB):
- 负载均衡集群中有一个分发器或者叫调度器,称为Director,它处在多台服务器的上面。
- 分发器根据内部锁定义的规则或调度方式,从下面的服务器群中选择一个以此来响应客户端发送的请求,从而解决高并发的问题。
- 在扩展中可非常容易的使用scale out扩展,从而实现集群的伸缩性,常见开源解决方案有lvs、haprox、nginx、ats。
- 高可用集群(HA):
- 高可用集群可以提高服务的可用性,当可以防止某台服务器宕机导致业务中断问题。
- 工作模式是将一个具有故障的服务转交给一个正常工作的服务器,从而达到服务不会中断。
- 集群中工作在前端(分发器)的服务器都会对后端服务器做健康检查,若发现服务器宕机就不会对其再做转发。
- 衡量标准:可用性=在线时间/(在线时间+故障处理时间),就是通常我们说的可用性99%、99.9%、99.99%等等,常见开源解决方案有heartbeat、keepalived等。
- 高性能集群(HP):
- 高性能集群是当某一个任务量非常大的时候,可以做一个集群共同来完成这一个任务,这种处理方式称为并行处理集群。
- 并行处理集群是将大任务划分为小任务,分别进行处理的机制,常常用于大数据分析、海量资源整合,目前比较出名的就是Hadoop。
负载均衡实现方案:
- 硬件实现的调度器:F5 BIG-IP、Citrix NetScaler、A10、Array、Redware。
- 软件实现的调度器:lvs、haproxy、nginx、ats(apache+traffic+server) 、perlbal
注意事项:
- 按照调度器工作在OSI协议的哪一层,可以将实现方案进行分类:
- 传输层(内核空间,四层调度):lvs、haproxy(mode接口,tcp接口)
- 应用层(用户空间,七层调度):haproxy、nginx、ats、perlbal
概念:
- LVS:全称Linux Virtual Server,为linux虚拟服务器,是一个工作在linux服务器上的服务。
- L4:四层交换,四层路由。根据请求报文的目标IP和端口将其转发至后端主机集群中的某一台主机,其中会涉及到算法。
- 支持lvs的协议,TCP、UDP、AH、EST、AH_EST、SCTP等诸多协议。
LVS组成:
- 由ipvsadm和ipvs两个工具组成:
- ipvsadm:用户空间命令行工具,用于在Director上定义集群服务和添加集群上的Real Servers。
- ipvs:工作于内核上netfilter中INPUT钩子上的程序代码
netfilter流量过滤器的三种模式:
- 当客户端请求目标是本机时,流量状态变化为:PREROUTING ——> INPUT(本机)。
- 当客户端请求目标是后端服务器集群时,流量状态变化为:PREROUTING ——> FORWARD (数据从本机转发出去之后)——> POSTROUTING
- 当本机发出数据时,流量状态变化为:OUTPUT(本机没发数据之前) ——> POSTROUTING(由本机发出数据)。
LVS常用术语:
- 调度器,简称director、dispatcher、balancer。
- 后端服务器,简称Real Server、Backend Server、RS。
- 调度器一般配两个IP地址:
- VIP为虚拟IP,用于向外提供服务。
- DIP为真实IP,用于与后端服务器通信。
- RIP:后端服务器的的真实IP。
- CIP:客户端的真实IP。
1.在调度器主机查看系统对ipvs的支持情况,包括算法。
grep -i -A 2 'ipvs' /boot/config-4.18.0-193.el8.x86_64
2.安装ipvsadm命令提供包。
yum -y install ipvsadm
四种工作模式原理:
- lvs-nat模式:通过网络地址转换方式来实现调度。
- 调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器。
- 调度器把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器就能够接收到客户的请求数据包了。
- 真实服务器响应完请求后,查看默认路由把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
- lvs-dr模式:通过改写请求报文的目标MAC地址实现调度。
- 默认模式,也是企业中最常用的模式。
- 真实服务器响应后的处理结果直接返回给客户端用户。
- 可以极大提高集群系统的伸缩性,对真实服务器集群没有必要必须支持IP隧道协议要求,但是要求调度器与真实服务器都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
- lvs-tun模式:具备封装操作,也称隧道模式。
- 客户端将请求发往前端的负载均衡器(LB),请求报文源地址是CIP,目标地址为VIP。
- 负载均衡器在数据包的基础上在封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS
- RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理请求报文,处理完请求就会以自己的lo接口的vip地址将数据发送给客户端。
- lvs-fullnat模式:
- 客户端对VIP发起请求,Director接过请求, 发现是请求后端集群服务,Director对请求报文做FULL NAT,把源IP改为DIP,把目标IP转换为任意后端RS的RIP,随后发往后端。
- RS 接到请求后,进行响应,相应报文源IP为RIP,目标IP还是DIP,又内部路由路由到Director。
- Director 接到响应报文后,进行FULL NAT,把源地址改为VIP,目标地址改为CIP。
- 当用户请求到达调度器时,此时请求的数据报文会先到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP。
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
- IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP。
- POSTROUTING链通过选路,将数据包发送给Real Server。
- Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP。
- Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
优缺点:
- NAT模式一直在做目标地址转换工作,所以当网站访问量比较大时,LB负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点。
- 只需要在LB上配置一个公网IP地址就可以了。
- 每台内部的节点服务器的网关地址必须是调度器LB的内网地址。
- NAT模式支持对IP地址和端口进行转换,即客户端对调度器发送的请求端口与最终转发到后端服务器的请求端口可以不一致。
工作流程:
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT。
- IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
- 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
- RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP。
- 响应报文最终送达至客户端。
特点:
- lvs-dr(direct routing):lvs的默认模式,gateway。
- lvs-dr模式通过修改请求报文的目标MAC地址进行转发。
- Director:调度器要配置VIP,DIP。
- RS:所有的Real Server都要配置RIP,VIP
优缺点:
- RS的RIP可以使用私有地址,也可以使用公网地址。
- RS跟Director必须在同一物理网络中,中间不能有路由器相隔。
- 请求报文经由Director调度,但响应报文一定不能经由Director。
- 不支持端口映射,客户端对调度器发送的请求端口与最终转发到后端服务器的请求端口必须一致。
- RS可以是大多数OS。
- RS的网关不能指向DIP
- 保证前端路由器将目标IP为VIP的请求报文发送给调度器,解决方案有以下三种:
方案 | 释义 |
---|---|
静态绑定:在客户机上去绑定vip是指向dr。 | 忽略不考虑 |
arptables:改变客户机 | 忽略不考虑 |
修改RS主机内核的2个参数 | 推荐适用 |
方案三的2个参数:
参数一:arp_announce,是否接收并记录别人的通告(广播)以及是否通告自己的mac地址给别人。三个可选值,项目中使用2。
- 0(default,默认值为0):通告自己所拥有的所有地址。
- 1:尽量不通告与自己不在同一个网段的地址,比如不通告2.0网段的地址给1.0网段,不通告3.0网段的地址给1.0网段等,但是是尽量不通告,有可能还是会通告的。
- 尽量避免不在该网络接口子网段的本地地址做出arp回应。
- 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用。
- 此时会检查来访IP是否为所有接口上的子网段内ip之一.如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。
- 2:总是不通告与自己不在同一个网段的地址,比如不通告2.0网段的地址给1.0网段,不通告3.0网段的地址给1.0网段等,绝对不会通告。
- 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址。
- 首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。
- 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送。
参数二:arp_ignore:是否响应arp请求。9个可选值,项目中使用1。
- 0(default,默认值为0):回应任何网络接口上对任何本地IP地址的arp查询请求。
- 1:请求报文从哪个接口进入的且请求的目标地址就是此接口配置的地址才予以响应,否则不响应只回答目标IP地址是来访网络接口本地地址的ARP查询请求。
- 2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
- 3:不回应该网络接口的arp请求,而只对设置的唯一和连接地址做出回应。
- 4-7:保留未使用。
- 8:不回应所有(本地地址)的arp查询。
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
- IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为DIP,目标IP为RIP,然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP。
- POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP。
- RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP。
- 响应报文最终送达至客户端。
特点:
- RIP,DIP,VIP必须是公网地址.
- RS的网关不能指向DIP.
- 请求报文必须经由dr调度,但响应报文必须不能经由dr调度器.
- 不支持端口映射.
- RS的OS必须支持隧道功能
- RIP,DIP可以使用私有地址。
- RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP。
- 支持端口映射。
- RS的OS可以使用任意类型。
- 请求报文经由Director,响应报文也经由Director
算法 | 类型 |
---|---|
静态算法:仅根据算法本身进行调度 | RR:轮调。 WRR:加权的rr,根据一定的比例进行轮调,比如每次RS1给2个请求,RS2给1个请求。 SH:源地址hash,将来自于同一个IP的请求始终调度至同一RS,每个服务单独调度。 DH:目标地址hash,将对同一个目标(资源)的请求始终发往同一个RS |
动态算法:根据算法及各RS的当前负载状态进行调度, 根据指定的算法算出overhead(负载), 最终挑选出overhead值最小的则为被选中的RS。 |
LC:最少连接数,算法如下:overhead = Active * 256 + Inactive。 WLC:加权的LC,算法如下:overhead=(Active*256+Inactive)/ weight SED:最短期望延迟,算法如下:overhead = (Active + 1) * 256 / weight NQ:是SED算法的改进,根据SED算法每台主机第一次至少要均分配一次,然后再按SED算法来挑选。 LBLC:基于本地的最少连接数,即为动态的DH算法正向代理情形下的cache server调度。 LBLCR:带复制功能的LBLC算法 |
- ipvs的集群服务:支持TCP,UDP,AH,EST,AH_EST,SCTP等诸多协议。
- ipvs集群服务的特点:
- 一个ipvs主机可以同时定义多个cluster service。
- 定义时指明lvs-type(lvs的模式)以及lvs scheduler(调度器)。
- 一个cluster service上至少应该有两个real server
常用参数 |
---|
-A :添加 |
-E:修改 |
-t:tcp协议;-u:udp协议。 |
-f:防火墙的标记 |
-D:删除 |
-s scheduler:调度的算法,默认为wlc |
-p [timeout]:定义持久连接,timeout不指定时默认为300秒 |
常见的service-address:
- tcp:-t ip:port
- udp:-u ip:port
- fwm:-f mark
//常用命令格式。
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f service-address
//管理集群服务中的RS命令。
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
//lvs-type参数。
-g:gateway,dr模式。
-i:ipip,tun模式。
-m:masquerade,nat模式。
-w:设定权重,可为0到正无穷数值,设为0时不会被调度,默认为1权重值越大则表示性能越好,被调度的资源也会更多
1.清空和查看。
//清空。
ipvsadm -C
//查看.
ipvsadm -L|l [options]
options可选项:
1. -n:numeric,基于数字格式显示地址和端口
2. -c:connection,显示当前ipvs连接
3. --stats:统计数据
4. --rate:输出速率信息
5. --exact:显示精确值,不做单位换算
2.保存和重载。
/重载。
ipvsadm -R
//保存。
ipvsadm -S [-n]
3.置零计数器。
ipvsadm -Z [-t|u|f service-address]