运行单个服务器是一个好的开始,但是在现实世界中,单个服务器意味着单点故障。在服务器崩溃或流量过大而导致服务器过载的情况下,用户将无法访问站点。
这里介绍一些实现高可用站点用到的服务,如负载均衡器,弹性伸缩组等
Load Blancer 负载均衡器
负载均衡器负责将网络流量分发给下游的多个实例。
AWS负载均衡器本身也不是单个服务器,而是由跨子网(跨数据中心)部署的多个服务器组成的。AWS会根据流量自动缩放负载均衡器服务器的数量,并在单个服务器出现故障时转移流量到其他服务器,因此可以立即获得高扩展性和高可用性。
目的:高可用,如图,在两个tomcat服务器基础上创建一个负载均衡器,某个tomcat挂了(或正在升级),流量会自动转发到另外一台
为运维也带来了方便,比如我们在后台修改负载均衡器的规则,让过来的流量先走指定的,某台实例
负载均衡器分为4层代理和7层代理
- 4层代理(指网络7层模型(OSI)的传输层,TCP), 举例:Linux的LVS
- 7层代理(指网络7层模型(OSI)的应用层,HTTP), 举例:Nginx
AWS 中,Application Load Blancer 对应的就是7层代理,也是比较常用的
- 应用程序负载均衡器(ALB)
适合HTTP和HTTPS流量的负载均衡,工作在OSI模型的应用层(第7层)。 - 网络负载均衡器(NLB)
适合TCP、UDP和TLS流量的负载均衡,可以比ALB更快地响应向上或向下扩展(NLB每秒可以处理千万级请求),在OSI模型的传输层(第4层)上运行。
创建LB要绑定相关的目标组,侦听器以及转发规则
创建目标组
目标组里可以包含多个EC2实例,流量将转发这些选中的实例,每个实例要运行服务器程序,如nginx,tomcat
目标组将通过定期向每个实例发送HTTP请求,进行健康检查,并且仅当实例返回与配置的matcher值匹配的响应时,才会被认为是“健康”的
如果某个实例由于停机或过载而无法返回匹配的响应,那么它将被标记为“运行状况不佳”,目标组将自动停止向其发送流量,以避免对用户产生影响。
侦听器(listener)
侦听特定端口(如80)和协议(如HTTP)
转发规则 Rule
接受进入侦听器的请求,并将符合特定路径(如/foo和/bar)或特定主机名(如foo.example.com和bar.example.com)的请求发送到特定目标组。
比如可以配置,请求头中带有
创建成功后,AWS会为我们提供一个域名,访问此域名才会经过负载均衡,最终到达后端实例
Auto Scaling Group(ASG) 弹性伸缩组
弹性伸缩组简单理解,提前定义一个配置模板(包含实例的操作系统,磁盘,网络等参数信息),和实例数量,比如最少1台,最多3台,当流量少时,启动一台,当流量或CPU使用率激增,触发设定的阈值,比如CPU使用率1分钟超过90%,弹性伸缩组会自动创建出更多的实例。而当低于阈值时,多余的实例又会被自动关闭。
用户通过使用AWS的Auto Scaling Group(ASG)来实现自动管理
创建ASG的第一步是创建启动配置(launch configuration),启动配置将定义如何设置ASG中的每个EC2实例
placement groups 置放群组
前面讲到实现高可用,有个前提是使用多台实例,但是这多台实例在地理上如何放置的呢,是位于同一机柜?还是分散多台机柜?还是位于不同的可用区?
定义置放群组就可以精确做到。
置放群组策略分:集群,分步和分区
- 集群置放群组:为了将实例尽可能的互相靠近,以达到低延迟、高吞吐量,尽量使用同一机柜或相邻机柜,好处:低延迟,高网络传输,坏处:机柜断电或故障或影响所有实例
- 分布置放群组:将每个启动的实例放置在不同的机架上,并且每个机柜具有各自的网络和电源
- 分区置放群组:Amazon EC2 将每个群组划分为多个逻辑段(称为“分区”),分区置放群组可以在同一区域的多个可用区中具有分区。对于每个可用区,一个分区置放群组最多可具有 7 个分区。
参考
https://chaosstudygroup.github.io/bfe-book/frontend_principle/load_balance/load_balance.html