集群(Cluster)就是将多台服务器整合到一起来共同提供某服务。而集群又可以分为负载均衡集群(LB)、高可用集群(HA)和高性能集群(HP)。
我们知道任何的硬件设备都有其处理能力的上限,对于服务器而言,要实现的是能够及时迅速响应用户的请求,但是用户的请求时不确定的,有可能这一秒只有一个或一个请求都没有,但是下一秒可能就是成千上万的请求同时发送而来!
假如一台服务器的最大并发处理数量为5000,而此刻的并发请求量达到两万,那么服务器就有可能面临宕机的危险!就算服务器不会宕机,那些不能及时处理的并发请求也要去排队等待,这样就加剧了用户的等待时间,如果持续的大量的并发请求涌入,那么用户等待的时间也就会变得更长。持续下去的话网站的客户数量会损失殆尽的……那该怎样来解决这个难题呢?
为了能同时处理更多的并发请求数量,我们可以采用集群。
集群是将多台提供相同服务的主机整合到一起来同时提供服务。那么就需要一个指挥官来统一调配这些服务,将大量的并发请求通过某种机制来分发到各个主机同时响应。负载均衡集群就是将多个提供了相同能力的主机前段提供了一个调度器(director)接收用户请求,然后根据某种策略分发给后端主机(realserver)来响应。
负载均衡集群可以实现对大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间,也可以实现对单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。
负载均衡集群的实现主要依赖于调度器,也就是负载均衡设备。负载均衡设备又可分为硬件负载均衡设备、软件负载均衡设备或者本地负载均衡设备、全局负载均衡设备:
硬件负载均衡是直接在服务器和外部网络间安装负载均衡设备,硬件的设备通常的费用是比较高的,而且一般要提供两台,一台用于平时的工作,另外一台随时准备替换原设备。一般而言,硬件负载均衡在功能上、性能上都优于软件方式,不过就是成本太高;
软件负载均衡是指在一台或多台主机上安装一个或多个相关软件实现负载均衡,其配置简单,成本低廉,可满足一般的负载均衡需求;
本地负载均衡是指充分利用现有的设备来实现有效解决数据流量过大、网络负荷过重的问题。即使是再给现有服务器过冲升级,也只是简单地增加一个新的服务器到服务群中,而不需改变现有网络结构、停止现有的服务。
全局负载均衡是实现跨网络的集群服务,主要用于在一个多区域拥有自己服务器的站点,为了使全球用户只以一个IP地址或域名就能访问到离自己最近的服务器,从而获得最快的访问速度。能够实现远距离为用户提供完全的透明服务。
LVS(Linux Virtual Server)是软件负载均衡解决方案的一种,叫做Linux虚拟服务器,它工作在input链上,在请求报文经过input链时lvs会对其进行分析,如果发现请求的是一个集群服务,lvs会将报文强行扭转路径,送往postrouting链发送至其它主机。这与iptables有冲突,所有lvs和iptables不可以同时使用。
LVS的工作模式跟iptables相似,是两段式的:ipvsadm工作在用户间,用来管理集群服务,ipvs工作在内核模块提供服务。
LVS的工作模型有三种:
NET(地址转换):
各集群节点跟director必须在同一个IP网络中
RIP通常是私有地址,仅用于各集群节点之间的通信
director位于client和realserver之间,并负责处理进出的所有通信
realserver必须将网关指向DIP
支持端口映射功能
realserver可以使用任意操作系统(OS)
较大规模应用场景中,director易成为系统瓶颈
DR(直接路由):
各集群节点必须要跟director在同一个物理网络中
RIP可以不是私有地址,使用公网IP实现便捷的远程管理和监控
director仅负责处理入站请求,响应报文则由realserver直接发往客户端
realserver不能将网关指向DIP
director不支持端口映射
realserver支持大多数的操作系统
TUN(隧道):
各集群节点可以跨越互联网
RIP必须是公网地址
director仅处理入站请求响应报文则由各realserver直接发往客户端
realserver网关不能指向director
只有支持隧道功能的OS才能用于realserver
不支持端口映射
LVS要实现调度功能是要根据一定的规则来进行的,我们称为调度算法(schedule method)。调度算法又可以分为静态调度算法和动态调度算法:
静态调度也叫固定调度算法:这种算法不考虑服务器已经建立起的静态链接,按次序分配请求
rr(round-robin):轮询算法,将接收到的请求依次序一个一个的分发给realserver,不考虑realserver的性能影响
wrr(weight round-robin):加权轮询,以权重的比例进行轮询,也就是根据服务器的性能进行分发请求
sh(source hash):源地址散列,在一定的时间内只要来自同一个客户端的请求都转发到同一个realserver,主要用于实现会话绑定(session affinity)
dh(destination hashing):目标地址散列,功能跟sh近似,只不过适应场景不同。主要实现把同一个请求发送给同一个realserver,不考虑请求来源,以目标地址进行挑选
动态调度:
lc:least connection最少链接
根据公式active*256+inactive(active:活动链接数inactive:非活动链接数)计算各个realserver的结果,谁的值小就将请求分发给谁(下同)
wlc:weighted least connection加权最少链接
(active*256+inactive)/weight(weight:权重)
sed:shortest expected delay scheduling最短期望延迟
(active+1)*256/weight
nq:never queue永不排队,无论如何先给每个服务器分发一个请求,然后根据sed算法进行分发,其实也就是改进了的sed算法
lblc:Locality-Based Least-Connection基于本地的最少链接,在dh的基础上面考虑realserver的负载能力,将请求分发到负载量小的realserver上面去
lblcr:Locality-Based Least-Connection with Replication Scheduling 基于本地的带复制功能的最少链接,在lblc的基础上,假如某页面的缓存在1号realserver上,当用户第二次请求时因1号realserver的负载过重,而用户请求被分发到2号realserver上,如果用户访问的是同一个页面,2号主机可以直接到1号主机去请求缓存页面
在ipvs中的默认方法为:wlc