云就像一艘正在高速航行的时代巨轮,此时此刻,它也在不断地发展和进化着。在行业领先的云平台上,每年会发布多达数千项的服务和更新。这对于我们个人来讲,既是学习上的挑战,更应该视为发展的机遇。需要注意,在不同的时代、不同的话题背景和场合下,云原生其实会指代或延伸出不同的含义。常见的一种狭义的云原生定义,特指的是容器化、容器编排和微服务架构。云计算已经成为一个无所不包的信息技术服务平台,它抽象了多个大型数据中心内的海量计算存储资源,对外提供了从基础设施到托管平台不同层次、不同粒度的在线服务和组件,同时也是各个领域最新前沿技术和架构理念的最佳载体。
云上架构最需要注意什么呢?就像我在标题所描述的那样,云端架构一方面需要处理和应对可能出现的故障,保证架构和服务的可用性;另一方面则是需要充分利用好云端的弹性,要能够根据负载进行灵活的伸缩。故障,是IT业界的永恒话题。故障的原因多种多样,无论是由于硬件的自然寿命造成的,还是数据中心的极端天气捣鬼,或是人工运维操作上的失误,不论我们多么讨厌它,故障似乎总是不可避免。SLA的可用性等级可能是99.9%,也可能是99.99%,它能够表明某项云服务在一段时间内,正常工作的时间不低于这个比例,也代表了厂商对于某项服务的信心。不过你要知道,再好的服务,即便是SLA里有再多的9,也不可能达到理论上的100%。第一种故障是在宿主机的级别,这也是从概率上来说最常见的一种故障。当宿主机出现硬件故障等问题后,毫无疑问将影响位于同一宿主机上的多个虚拟机。为了避免产生这样的影响,当我们承载重要业务时,就需要创建多台虚拟机组成的集群,共同来进行支撑。这样,当一台虚拟机出现故障时,还有其他几台机器能够保证在线。
这里需要注意的是,我们需要保证多个虚拟机不在同一台宿主机上,甚至不处于同一个机架上,以免这些虚拟机一起受到局部事故的影响。那么,要怎么做到这一点呢?
虚拟机的排布看似是一个黑盒,但其实在公有云上是有办法来对虚拟机的物理分配施加干预,让它们实现分散分布,隔开一段距离的。这一特性,在AWS称为置放群组(Placement Group),Azure称为可用性集(Availability Set),阿里云对应的服务则是部署集。比如说,我们对阿里云同一个可用区内的虚拟机,在创建时选择同一个部署集,就可以保证相当程度的物理分散部署,从而最大限度地保证它们不同时出现故障了。
第二种规模更大的故障,是在数据中心,也就是可用区的层面。比如火灾、雷击等意外,就可能会导致数据中心级别的全部或者部分服务类型的停摆。有时一些施工导致的物理破坏,也会挖断光纤,影响可用区的骨干网络。要应对这类故障,我们就需要多可用区的实例部署,这也是云抽象出可用区概念的意义所在。你的实例需要分散在多个可用区中,这样,可用区之间既可以互为主备,也可以同时对外服务,分担压力。另外,虚拟私有网络可以跨越可用区,这会大大方便我们多可用区架构的搭建。
第三种更严重的故障,就是整个区域级别的事故了。当然这种一般非常少见,只有地震等不可抗力因素,或者人为过失引发出的一系列连锁反应,才有可能造成这么大的影响。
区域级别的事故一般都难免会对业务造成影响了。这时能够进行补救的,主要看多区域架构层面是否有相关的预案。如果是互联网类的服务,这时最佳的做法,就是在DNS层面进行导流,把域名解析到另外的一个区域的备用服务上,底层的数据则需要我们日常进行着跨区域的实时同步。再更进一步的万全之策,就需要考虑多云了,也就是同时选用多家云厂商的公有云,一起来服务业务。虽然集成多个异构的云会带来额外的成本,但这能够最大限度地降低服务风险,因为两家云厂商同时出问题的概率实在是太低了。更何况,多云还能带来避免厂商锁定的好处,现在其实也越来越多见了。
综上所述,不论是哪种级别的故障,我们应对的基本思想其实没有变化,都是化单点为多点,形成不同层面、不同粒度的冗余。当故障发生时,要能迅速地发现和切换,平滑地过渡到备用的服务和算力上。
当然,盲目地追求可用性也不可取。根据业务需求,在成本投入与可用性之间获得一个最佳的平衡,才是你应该追求的目标。试想一下,构建一个个人博客网站,和建立一个金融级系统,两者在可用性架构方面的要求显然天差地别,所以我们最后的架构选择也会大相径庭。
随机应变,弹性伸缩
弹性伸缩,这是云上架构的另一个原则,也是云端的重要优势。
由于云的本质是租用,而且它便捷的操作界面、丰富的SDK和自动控制选项,使得云上“租用”和“退租”的成本很低,可以是一个很高频的操作,这就为弹性伸缩在云上的出现和兴起提供了土壤。在妥善应用之下,弹性伸缩既可以提高工作负载洪峰来临时的吞吐和消化能力,提高业务稳定性,又能够在低谷期帮我们显著地节约成本。
在IaaS端,能够弹性伸缩的最实用的产品形态,莫过于虚拟机编组了,也就是功能相同的多个虚拟机的集合。把它们作为一个单位来创建、管理和伸缩,是一种普遍应用的最佳实践。AWS中相关的产品命名是 EC2自动伸缩(Auto Scaling),Azure中是虚拟机规模集(VM Scale Set),阿里云则叫做弹性伸缩。
我们把多个虚拟机以弹性伸缩组的方式进行统一管理,能够极大地提高效率,减轻负担。因为弹性伸缩服务,会帮我们动态地创建和销毁虚拟机实例,自动根据我们指定的数量和扩缩容规则,来协调虚拟机的生命周期。我们只需要从高层进行指挥就可以了。
弹性伸缩服务,在云端还有一个最佳拍档,就是负载均衡器。它特别适合将流量均匀地,或者按照一定权重或规则,分发到多台虚拟机上,正好可以和提供计算资源的弹性伸缩服务形成配合。当负载增大、虚拟机增加时,负载均衡也能够自动动态识别,将流量分发到新创建的虚拟机上。
所以,你可以尝试使用弹性伸缩服务来实现云端弹性架构,用它来管理一组虚拟机,并与负载均衡一起配合。这特别适合处理无状态类的计算需求,因为它会为你代劳底层计算资源的管理。
网友评论