集群概述
集群的介绍及优势
- 集群:将多台服务器通过硬件或软件的方式组合起来,完成特定的任务,而这些服务器对外表现为一个整体。
- 集群的优势
- 高可靠性:利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现不间断服务。
- 高性能:即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域。
- 负载均衡:即把负载压力根据算法合理分配到集群中的每一台计算机上,以减轻单台服务器的压力,降低对单台服务器的硬件和软件要求。
- 可伸缩性:当服务器负载压力增长的时候,集群能够灵活扩展来满足需求,不降低服务质量。
集群分类及特点
计算机集群架构按照功能和结构一般分成以下几类:
-
负载均衡集群
负载均衡集群(Load balancing clusters)简称 LBC,负载均衡集群为企业提供了更为实用,性价比更高的系统架构解决方案。
负载均衡集群是一种将很多客户集中访问的请求负载压力尽可能平均的分摊到计算机集群中的各个节点处理,以降低单台服务器压力,更好的向客户端提供服务的一种方式。
负载均衡集群的作用:提供一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载带宽、增加吞吐量,加强网络数据处理能力、提高网络的灵活性和可用性。简单来说,也就是:
- 把单台计算机无法承受的大规模的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间,提升用户体验。
- 7*24 小时的服务保证,任意一个或多个设备节点设备宕机,不影响到业务。在负载均衡集群中,所有计算机节点都提供相同的服务,集群负载均衡获取所有对该服务的入站请求。
-
高可用集群
高可用性集群(High availability clusters)简称 HAC,当集群中的任意一个节点失效的情况下,节点上的所有任务自动转移到其他正常的节点上,并且此过程不影响整个集群的运行,不影响业务的提供。
-
高性能集群
高性能计算集群(High perfomance clusters)简称 HPC,高性能计算集群采用将计算任务分配到集群的不同计算节点儿提高计算能力,因而主要应用在科学计算领域。
接入层技术演进
常用名词释义
- 可用性:任何一台机器挂了,服务受不受影响
- 扩展性:能否通过增加机器,扩充系统的性能
- 反向代理+负载均衡:请求是否均匀分摊到后端的操作单元执行
- nginx:一个高性能的 web-server 和实施反向代理的软件
- lvs:Linux Virtual Server,使用集群技术,实现在 linux 操作系统层面的一个高性能、高可用、负载均衡服务器
- keepalived:一款用来检测服务状态存活性的软件,常用来做高可用
- f5:一个高性能、高可用、负载均衡的硬件设备
- DNS轮询:通过在 DNS-server 上对一个域名设置多个 ip 解析,来扩充 web-server 性能及实施负载均衡的技术
裸奔时代(0)单机架构
裸奔时代的架构图如上:
1)浏览器通过 DNS-server,域名解析到 ip
2)浏览器通过 ip 访问 web-server
缺点:
1)非高可用,web-server 挂了整个系统就挂了
2)扩展性差,当吞吐量达到 web-server 上限时,无法扩容
注:单机不涉及负载均衡的问题
简易扩容方案(1)DNS轮询
假设 tomcat 的吞吐量是 1000 次每秒,当系统总吞吐量达到 3000 时,如何扩容是首先要解决的问题,DNS 轮询是一个很容易想到的方案:
- 多部署几份 web-server,1个 tomcat 抗 1000,部署 3 个 tomcat 就能抗 3000
- 在 DNS-server 层面,域名每次解析到不同的 ip
优点:
- 零成本:在 DNS-server 上多配几个 ip 即可,功能也不收费
- 部署简单:多部署几个 web-server 即可,原系统架构不需要做任何改造
- 负载均衡:变成了多机,但负载基本是均衡的
缺点:
- 非高可用:DNS-server 只负责域名解析 ip,这个 ip 对应的服务是否可用,DNS-server 是不保证的,假设有一个 web-server 挂了,部分服务会受到影响
- 扩容非实时:DNS 解析有一个生效周期
- 暴露了太多的外网 ip
简易扩容方案(2)nginx
tomcat 的性能较差,但 nginx 作为反向代理的性能就强多了,假设线上跑到 1w,就比 tomcat 高了10倍,可以利用这个特性来做扩容:
- 站点层与浏览器层之间加入了一个反向代理层,利用高性能的 nginx 来做反向代理
- nginx 将 http 请求分发给后端多个 web-server
优点:
- DNS-server 不需要动
- 负载均衡:通过 nginx 来保证
- 只暴露一个外网 ip,nginx -> tomcat 之间使用内网访问
- 扩容实时:nginx 内部可控,随时增加 web-server 随时实时扩容
- 能够保证站点层的可用性:任何一台 tomcat 挂了,nginx 可以将流量迁移到其他 tomcat
缺点:
- 时延增加 + 架构更复杂了:中间多加了一个反向代理层
- 反向代理层成了单点,非高可用:tomcat 挂了不影响服务,nginx 挂了则整个系统瘫痪
高可用方案(3)keepalived
- 做两台 nginx 组成一个集群,分别部署上 keepalived,设置成相同的虚 IP,保证 nginx 的高可用
- 当一台 nginx 挂了,keepalived 能够探测到,并将流量自动迁移到另一台 nginx 上,整个过程对调用方透明
优点:
- 解决了高可用的问题
缺点:
- 资源利用率只有 50%
- nginx 仍然是接入单点,如果接入吞吐量超过的 nginx 的性能上限,例如 qps 达到了50000,高并发会存在问题
scale up 扩容方案(4)lvs / f5
nginx 毕竟是软件,性能比 tomcat 好,但总有个上限,超出了上限,还是扛不住。
lvs 则是实施在操作系统层面;f5 的性能又更好了,它实施在硬件层面;它们性能比 nginx 好很多,例如每秒可以抗 10w,这样可以利用他们来扩容,常见的架构图如下:
- 如同 nginx 可以扩展多个 tomcat 一样,可以通过 lvs 来扩展多个 nginx
- 通过 keepalived + VIP 的方案可以保证可用性
- 99.9999% 的公司到这一步基本就能解决接入层高可用、扩展性、负载均衡的问题。
但是不管是使用 lvs 还是 f5,这些都是 scale up 的方案,根本上,lvs/f5 还是会有性能上限,假设每秒能处理 10w 的请求,一天也只能处理 80 亿的请求(10w 秒吞吐量 * 8w秒),那万一系统的日 PV 超过 80 亿怎么办呢?(当然没几个公司要考虑这个问题)
scale out 扩容方案(5)DNS 轮询
如上所述,水平扩展,才是解决性能问题的根本方案,能够通过加机器扩充性能的方案才具备最好的扩展性。
facebook,google,baidu 的 PV 是不是超过 80 亿呢,它们的域名对应不止一个 ip,终点又是起点,还是得通过 DNS 轮询来进行扩容:
- 通过 DNS 轮询来线性扩展入口 lvs 层的性能
- 通过 keepalived 来保证高可用
- 通过 lvs 来扩展多个 nginx
- 通过 nginx 来做负载均衡,业务七层路由
总结
- 接入层架构要考虑的问题域为:高可用、扩展性、反向代理+扩展均衡
- nginx、keepalived、lvs、f5 可以很好的解决高可用、扩展性、反向代理 + 扩展均衡的问题
- 水平扩展 scale out 是解决扩展性问题的根本方案,DNS 轮询是不能完全被 nginx/lvs/f5 所替代的