1.集群的类型
1.1、LB: 负载均衡集群(Load Balancing)
-
组成部分
- 负载均衡器
- 调度器
- 分发器
- 后端主机
- “真”服务器
- 负载均衡器
1.2、HA: 高可用集群(High avaliability)
-
组成部分
活动服务器(active)
-
备用服务器(passive)
可用性(Availability)=平均无故障时间/平均无故障时间+平均修复时间 可用性衡量术语: 99%, 99.9%, 99.99%, 99.999% MTBF=平均无故障时间 MTTR=平均修复时间
1.3、HP: 高性能计算集群(high performance)
将多个CPU通过总线连接起来,共同进行计算,以达到计算效率。
1.4、DS: 分布式系统(distributed system)
分布式存储系统是最常见的, 例如hadoop。
1.5、集群的实现方式
1.5.1、LB集群的实现方式
-
硬件
- F5 : BIG-IP
- Citric Netscaler
- A10 A10
- Array
- Redware
-
软件
- lvs:Linux Virtual Server
- haproxy
- nginx
- ats(apache traffice server)
- perlbal
1.5.2、HA集群的实现
-
软件方式的实现方式
- KeepAlived : 通过实现vrrp协议, 来实现地址漂移
- AIS
- hearbeat
- man+rgmanager(红帽的实现方式,RHCS)
- corosync + pacemaker
2、LVS
2.1、LVS简介
LVS是Linux Virtual Server的简写,也就是Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国最早出现的自由软件项目之一。
2.2、LVS工作原理
这里所谈的工作原理主要是介绍ipvs的工作机制,以及用户管理。
LVS分为两个部件:ipvs和ipvsadm
ipvs:工作于内核空间,主要用于使用户定义的策略生效;
ipvsadm:工作于用户空间,主要用于用户定义和管理集群服务的工具;
上图所示,ipvs工作于内核空间的INPUT链上,当收到用户请求某集群服务时,经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。
2.3、LVS的集群术语
- VS : virtual server,称之为Director
- RS : real server, 后端提供真正服务的服务器
- CIP : 客户端IP
- DIP : Director IP, LVS负载均衡器的后端IP
- VIP : Director IP , LVS负载均衡器的前端IP
- RIP : 后端真正提供服务的服务器IP
2.4、LVS的工作模型
LVS-nat
LVS-dr(director routing)
LVS-tun(ip tunneling)
-
LVS-fullnat(同时改变请求报文的源IP地址和目标IP地址)
注意:前三种为标准类型,fullnat为后来添加的类型,内核默认可能不支持,需要重新编译内核。
2.4.1、LVS-nat
多目标的DNAT,通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发。
此模型中,DR只需要将VIP配置到DR上,它的工作机制是,将收到的集群服务请求报文目标地址转换成经调度算法计算得出的后端主机IP地址,然后端主机将响应报文发送至DR,再由DR将源地址转换成VIP的地址;此机制与iptables中的DNAT类似。
- 特性
- 支持端口映射;
- RS应该使用私网地址;
- RS的网关应该指向DIP;
- RIP和DIP必须在同一网段内;
- VS必须为Linux,RS可以是任意的OS,只要能提供相同的服务即可;
- 请求和响应的报文都得经过Director,在高负载场景中,Director很可能成为系统性能瓶颈;
2.4.2、LVS-dr
Director将接收到的请求报文源IP和目标IP都不做修改,而是将源MAC设定自己的MAC,目标MAC设定目标RS的MAC,而通过交换机发送给RS server,当RS server拆解后发现源目标IP不是自己,此时要在RS上配置VIP,即RS服务器有RIP和VIP
-
难点
- 1.由于vip需要在每台主机中配置,如何保证ARP请求报文和响应不会被交换机或其它网络设备知道?
- 2.由于RS只有一个网络接口,而linux内核默认情况下包封装时是从哪个网口出去那个网口就是源地址,如何确保RS转发出来的报文源IP是VIP,而不是RIP?
- 3.因为DR与RS都配置有相同的VIP,如何避免各主机VIP广播,造成无法通信?
-
解决方法
- Linux内核有两个关于ARP对待请回报文与通告报文的参数(arp_announce/arp_ignore),可以设定相应的级别来规避上述问题中的第1点;
- 对于问题2,我们可以在数据报封装后指定路由经lo别名上的接口发送出去然后再通过eth0网卡转发出去;
- 对于问题3,我们只需要设定vip的广播地址为它自己即可;
2.4.3、LVS-tun
在数据包必须传递到另一个网络或因特网上时,可以使用ip隧道,ip隧道能够将数据包从一个子网或虚拟局域网(VLAN)转发到另一个子网或虚拟局域网(VLAN),建立ip隧道是Linux内核功能的一部分,LVS-TUN转发方法允许你将集群节点放在与Director不同的网络上。
Director收到报文后,原IP和目标IP不动, 再封装一个源IP和目标IP,源IP为DIP,目标IP为RIP,确保每个RIP要有一个VIP,RS主机接收到报文后,回应时源IP为VIP,目标IP为CIP。
-
特性
- RIP,DIP,VIP全是公网地址,DIP可以为私网地址;
- RS的网关不能也不可能指向DIP;
- 请求报文经由Director调度,但响应报文直接发送给CIP;
- 不支持端口映射;
- RS的OS必须支持IP隧道功能;
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。封装两个IP报文首部会有问题: MTU大小为1500的大小,而再加一个IP报文首部会超出MTU的大小,导致路由器拒收(因为传输之前已经被切片传输的大小为1500字节)。
2.5、LVS计算活动连接和非活动连接的方式
- nat fullnat模型: 请求和回应的报文都会经过director, 因此director可以准确的判断出活动的连接和非活动的连接
- dr tun模型: 请求只经过director,响应不经由director,但在tcp断开的时候, fin报文和最后一次的ack都会被director收到, 由此报文判断连接是否活动或断开
2.6、负载均衡构建需要考虑的问题
-
会话的保持
在Web服务通信中,HTTP本身是无状态协议,不能标识用户来源,此时出现了一个问题,当用户在一个网站浏览了A网页并跳转到B网页,此时服务器就认为B网页是一个新的用户请求,你之前的登陆的信息就都丢失了。在LVS中,持久连接是为了用来保证当来自同一个用户的请求时能够定位到同一台服务器。-
Session sticky:通过负载均衡器追踪用户的请求, 始终将同一IP的会话发送至相同的real server。
- 缺点: 如果一直访问的real server档机, 将引起部分用户考多少正常访问。
-
Session Cluster: 将session做成一个集群,进行多服务器同步session。
- 缺点: 会话大的情况下, 服务器会大量的同步session,将浪费大量的资源,只适合会话比较小的规模。
-
Session server : 将存储session的时候,使用网络存储,多服务器调用。
- 缺点: 网络存储session的服务,将会有网络瓶颈, 或者session的存储档机。
-
Session sticky:通过负载均衡器追踪用户的请求, 始终将同一IP的会话发送至相同的real server。
-
文件存储
-
共享存储
- NAS : network attached storage(文件级别存储服务器)
- SAN : Storage Area Network(块级别存储)
- DS : Distributed Storage(分布式文件级别存储)
-
数据同步
- Rsync
-
共享存储
2.7、LVS的调度方法
2.7.1、静态方法
根据算法本身进行调度,不考虑后端服务器的运行状态,负载的效果有限
-
RR: round robin, 轮调,轮询,轮叫机制
- 缺点: 性能好的服务器比较空闲,而性能差的服务器会很繁忙
-
WRR : weighted rr, 加权轮询,权重大的负载多
- 缺点: 有的情况下,当性能好的服务器分配了更多的长连接,而性能差的分配的大多数都是短连接,此时会造成性能好的服务器处理列多的连接,压力比较大,而性能差的服务器,还处于空间状态,造成假负载
-
SH : source ip hash, 源地址哈希,能始终将同一个IP引导到同一台RS服务器.(在Director服务器上维护一个hash表,其是KV格式,键就是源IP地址,值就是RS的地址,每次都会查找hash表,如果能查询到前一次的连接记录,就直接发送到RS服务器,如果没有,就使用算法进行调度)
- 缺点:随着时间推移,旧的IP地址会很多,这样会让固定的RS服务器压力大
-
DH : Destination ip hash, 目标地址哈希(用于内部负载,正向代理 ),客户端的请求,只要是同一个目标地址, 将始终通过同一个网关进行发送。
- 缺点: 如果另一个客户端也请求同一个目标地址, 它也会将这个请求使用同一个网关进行发送, 如果对同一目标地址请求比较大, 这样会造成同一网关的负载压力,会损坏负载的效果。
2.7.2、动态方法
根据算法及各RS的当前的负载状态进行评估,如果负载较小的会负载下一个请求,其根据overhead值来分配请求。
-
LC : least connection(最少连接),如果RS的连接数都一样,会进行轮循,overhead值小的将会接收下一次请求。
- overhead计算公式: active(活动连接数)*256+inactive(非活动连接数)
- 缺点: 不能根据服务器的性能进行分发请求
-
WLC : weighted LC ,overhead小的将接收下一次请求
- overhead计算公式: active*256+inactive/weight
- 缺点: 当两台活动连接都为0,将进行轮循,如果正好轮循到了权重小的响应,这样是不理想的,SED算法就是解决这个问题的。
-
SED : shortest expction delay, 最短期望延迟,是WLC算法的改进
- overhead计算公式:(active+1)*256/weight
- 缺点: 如果权重差别很大的情况下, 权重小的就空闲了
-
NQ : Nerver Queue
- 它是SED算法的改进,当用户请求进来的时候, 服务器事先根据用户的请求,依照权重大小依次分配,随后再根据SED算法分配。
-
LBLC : Locality-based LC
- 它是一个动态的DH算法,客户端请求一个目标地址时,当没有目标地址的连接记录,将挑选一个负载小的网关发送, 其也是正向代理时使用的算法。
-
LBLCR : LBLCR with replication, 带复制的LBLC
- 当有一个目标地址被一个缓存服务器大量缓存, 而用户又大师的请求此目标地址,此时另一台缓存服务器就过于空闲,此时LBLCR算法就会通过将压力大的缓存服务器内容复制一份到空闲的缓存服务器。
3、ipvsadm/ipvs
LVS分为两个部件:ipvs和ipvsadm
- ipvs:工作于内核空间,工作在netfilter INPUT钩子之上的程序代码,其集群功能依赖于Ipvsadm工具定义规则, 一个ipvs主机至少应该有一个RS,其也可以同时定义多个cluster service。
- ipvsadm:工作于用户空间,用户空间的命令行工具, 用于管理集群服务,及集群服务上的RS等,其实是一个CLI工具。
确认内核是否支持IPVS功能
- grep -i -C 2 "ip_?vs" /boot/config-3.10.0-327.el7.x86_64
3.1、ipvsadm命令的使用
-
管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout] ipvsadm -D | -t | u | f service-address -A : 添加 -E : 修改 -D : 删除 -t : tcp, vip:port -u : udp, vip:port -f : 防火墙标记,MARK -s : 调度算法,默认为WLC -p : 持久连接模式
-
管理集群服务上的RS
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 -a : 添加一个RS主机 -e : 修改一个RS主机 -d : 删除一个RS主机 -g : LVS的GATAWAY模式 -m : masqueread, LVS的nat模式 -i : IPIP,LVS的tunel模式 -w : weight
-
查看IPVS信息
ipvsadm -L | l [options] -n : numberic ,数字格式显示地址和端口 -c : connection,显示ipvs的连接 --stas : 统计数据 --rate : 速率 --exact : 精确值
-
清空规则
ipvsadmin -C
-
保存和重载
ipvsadm -S > /PATH/TO/SHOME_RULE_FILE ipvsadm_restore < /PATH/TO/SOME_RULE_FILE
-
计数器清零
ipvsadm -Z [-t | u | f server-address]