集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。这些服务器之间可以彼此通信,协同向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理。当用户客户机请求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器。
1. 高性能
一些国家重要的计算密集型应用(天气预报,核试验模拟等),需要计算机有很强的运算处理能力。以现在的技术水平,即使是大型机,其计算能力也是有限的,很难单独完成此任务。因为计算时间可能会相当长,也许几天,甚至几年或更久。因此,对于这类复杂的计算业务,便使用了计算机集群技术,集中几十上百台,甚至成千上万台计算机进行计算。
假如你现在有一个lnmp环境,每次只需要服务10个并发请求,那么单台服务器一定会比多个服务器集群要快,只有当并发或总请求数量超过单台服务器的承受能力时,服务器集群才会体现出优势。
2. 价格有效性
一套系统集群架构,只需要几台或者树十台服务器主机即可,与动辄价值上百万元的专用超级计算机相比便宜了很多。在达到同样性能需求的条件下,采用计算机集群架构比采用同等运算能力的大型计算机具有更高的性价比。
3. 可伸缩性
当服务负载,压力增大时,针对集群系统进行简单的扩展即可满足需求,且不会降低服务质量。
通常情况下,硬件设备若想扩展性能,不得不增加新的cpu和存储设备,如果加不上去了,就不得不增加新的cpu和存储设备,如果加不上去了,就不得不购买更高性能的服务器。如果采用集群技术,则只需要将新的单个服务器加入到现有集群架构中即可,从访问的客户角度来看,系统服务无论是连续性还是性能上都几乎没有变化,系统在不知不觉中完成了升级,加大了访问能力,轻松地实现了扩展。集群系统中的节点树木可以增长到几千乃至上万个,其伸缩性远超过单台超级计算机。
4. 高可用性
单一的计算机系统总会面临设备损毁的问题,如cpu,内存,主板,电源,硬盘等,只要一个部件坏掉,这个计算机系统就可能会宕机,无法正常提供服务,在集群系统中,尽管部分硬件和软件也还是会发生故障,但整个系统的服务可以是7*24可用的。
5. 透明性
多个独立计算机组成的集群系统构成一个虚拟服务器。用户或客户端程序访问集群系统时,就像访问一台高性能,高可用的服务器一样,集群中一部分服务器的上线,下线不会中断整个系统服务,这对用户也是透明的。
6. 可管理性
整个系统可能在物理上很大,但其实容易管理,就像管理一个单一映像系统一样,可通过ssh服务管理
7. 可编程性
在集群系统上,容易开发及修改各类应用程序
集群架构按功能和结构可以分成如下几类负载均衡集群 load balancing clusters,简称lbc或者lb高可用性集群 high-availability clusters,简称hac高性能计算集群 high-performance clusters,简称hpc网络计算 grid computing集群
1. 负载均衡集群
负载均衡群集为企业提供了更为实用,性价比更高的系统架构解决方案,负载均衡集群可以把很多客户集中的访问请求压力尽可能平均地分摊在计算机集群中处理,客户访问请求负载通常包括应用程序处理负载和网络流量负载。这样的系统非常适合使用同一组应用程序为大量用户提供服务的模式,每个节点都可以承担一定的访问请求负载压力,并且可以实现访问请求在各节点之间动态分配,以实现负载均衡。
负载均衡集群运行时,一般通过一个或多个前端负载均衡器将客户访问请求分发到后端的一组服务器上,从而达到整个系统的高性能和高可用性。一般高可用性群集和负载均衡群集会使用类似的技术,或同时具有高用性与负载均衡的特点。
2. 高可用集群
一般是指在集群中任意一个节点失效的情况下,该节点上的所有任务会自动转移到其他正常的节点上。此过程不影响整个集群的运行。
当集群中的一个节点系统发生故障时,运行着的集群服务会迅速作出反应,将该系统的服务分配到集群中其他正在工作的系统上运行。考虑到计算机硬件和软件的容错性,高可用性集群的主要目的是使整体服务尽可能可用。如果高可能性集群中的主节点发生了故障,那么这段时间内将由备节点代替它。备节点会完全接管主节点(包括ip地址及其他资源)提供服务。
3. 高性能计算集群
高性能计算集群也称并行计算。通常,高性能计算集群涉及为集群开发的并行应用程序,以解决复杂的科学问题(天气预报,石油勘探,核反应模拟等)。高性能计算集群对外就好像一个超级计算机,这种超级计算机内部由数十至上万个独立服务器组成,并且在公共消息传递层上进行通信以运行并行应用程序。
4. 网络计算集群
很少用
负载均衡集群提供了一种廉价,有效,透明的方法,来扩展网络设备和服务器的负载,带宽和吞吐量,同时加强了网络数据处理能力,提高了网络灵活性和可用性。
在负载均衡集群中,同组集群的所有计算机节点都应该提供相同的服务,集群负载均衡器会截获所有对该服务的入站请求,然后将这些请求尽可能的平均分配在所有集群节点上。
nginx仅仅是作为nginx proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,我们就称为nginx负载均衡。
lvs,其实现的功能只是对请求数据包的转发,传递,其中dr模式明显的特征是从负载均衡下面的节点服务器来看,接收到的请求还是来自访问负载均衡器的客户端的真实用户,而反向代理就不一样了,反向代理接收访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问的节点服务器的客户端用户就是反向代理服务器了,而非真实的网站访问用户。
lvs是转发,仅仅只是帮用户转发,不会替代用户请求,而nginx是接收用户的请求然后重新发起请求去请求后面的节点。
nginx的功能就是 缓存 反向代理 负载均衡,而其本身就是一个反向代理的软件。lvs是4层,nginx在1.9版本之前是7层,而1.9以上4 7层,haproxy 4 7层。
编译安装配置文件参考
yum安装的nginx配置文件修改参考
作为nginx负载的服务器配置如下,红色区域
客户端访问,即使后端服务器有宕机的,也不会影响业务,会自动剔除有故障的后端服务器,基于端口的健康检查
1. nginx upstream模块
2. upstream语法
upstream www_server_pools{ upstream是关键字必须要有,后面的www_server_pools为一个upstream集群组的名字,可以自己起名,调用时就用这个名字 server 10.0.0.1 weight=1; server关键字是固定的,后面可以接域名或ip,如果不指定端口,默认是80端口。weight代表权重,数值越大被分配的请求越多,结尾有分号。 server 10.0.0.2 weight=2; server 10.0.0.3 weight=3;}
特别注意,如果nginx代理的是cache服务,可能需要使用hash算法,此时若宕机,可通过设置down参数确保客户端确保客户端用户按照当前的hash算法访问,这一点很重要。
调度算法一般分为两类,第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如 rr,wrr,ip_hash等都属于静态调度算法
1. rr轮询,默认调度算法
接收客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器
2. wrr权重轮询
权重和用户访问成正比,权重值越大,被转发的请求也就越多,可根据服务器配置来判断权重值
server 10.0.0.1 weight=1;server 10.0.0.2 weight=2;
如果有30个请求,其中20个会向10.0.0.2访问,剩下的10个向10.0.0.1访问
3. ip_hash
每个请求按客户端ip的hash结果分配,当新的请求到达时,先将其客户端ip通过哈希算法哈希出一个值,在随后的客户端请求中,客户ip的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页的session共享问题,但有时会导致请求分配不均,即无法保证1:1的负载均衡,因为在国内大多数公司都是nat上网模式,多个客户端会对应一个外部ip,所以,这些客户端会被分配到同一个节点服务器,从而导致请求分配不均。
4. fair动态调度算法
此算法会根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配。这是更加智能的调度算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。nginx本身不支持fair调度算法,需下载nginx的相关模块upstream fair。
5. least_conn
根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发
还有2个是url_hash和一致性hash算法,后端服务为缓存服务效果显著。这里就不说了
我们发现,节点的访问日志存储的是代理服务器的ip,也就是负载均衡的机子,我们如何将用户的真实ip获取到呢,如下配置
注意,反向代理这块配好了,节点服务器上需要的访问日志要记录用户的真实ip,必须进行日志格式配置,这样才能把代理传过来的x-forwarded-for头信息记录下来
当然,默认是有的
配置文件可以通过include包含设置,这样看上去跟工整,目录需要注意下
通过nginx反向代理配置规则实现让动态和静态资源及其他业务分别由不同的服务器解析,以解决网站性能,安全,用户体验等重要问题
下面是location的配置,server标签
1. 根据客户端设备(user_ange)转发实践需求
为了让不同的客户端设备用户有更好的体验,需要在后端架设不同的服务器来满足不同的客户端访问,例如 移动客户端访问网站,就需要部署单独的移动服务器及程序,体验才能更好,而且移动端还分apple,ipad等
2. 根据客户端设备(user_ange)转发请求实践
3. 根据文件扩展名实现代理转发
除了根据url路径及user_agent转发外,还可以实现根据文件扩展名进行转发。
可以根据扩展名实现资源的动静分离,如图片视频等请求静态服务器池,php,jsp等请求动态服务器池。
可以通过zabbix等监控节点服务器的web服务状态,起到预警的作用。