@lsmn
2015-07-23T09:42:13.000000Z
字数 2537
阅读 4521
Algolia
架构
高可用
API
在本系列的上一篇文章中,Algolia联合创始人兼首席技术官Julien Lemoine介绍了他们构建高可用基础设施的前3个步骤。近日,本系列的第二篇文章发表,主要介绍自2013年9月API正式推出至2014年12月18个月间的情况以及所有意料之外的问题,其中包括第一次停机。
在本系列的上一篇文章中,Algolia联合创始人兼首席技术官Julien Lemoine介绍了他们构建高可用基础设施的前3个步骤。近日,本系列的第二篇文章发表,主要介绍自2013年9月API正式推出至2014年12月18个月间的情况以及所有意料之外的问题,其中包括第一次停机。
步骤4:2014年1月——部署会危及高可用性
在这个阶段,他们主要关注如何实现敏捷开发而又不以牺牲稳定性为代价。为此,他们开发了一个测试套件,其中包含6000多个单元测试和200多个非回归测试。但还是不够,即使一项新特性通过了所有的测试,仍然可能在生产环境中引入Bug,比如,曾有个Bug导致了8分钟的索引操作中断。多亏他们在设计架构时实现了搜索查询与索引操作的分离,前者才没有受到影响。不过,这个问题让他们确定了其高可用设置中的一些问题:
现在,当有新特性需要测试时,他们会选择一个集群组用于测试,并按照下面的步骤部署:
通过这种方法,他们可以在几个小时内检测到几乎不可能通过单元测试发现的Bug。
步骤5:2014年3月——处理高负载的写操作
他们开始解决一个新问题:延迟。他们位于亚洲的集群延迟过高。为了测试市场反应,他们决定将机器部署在AWS上。他们并不愿意这样做,因为即使使用AWS提供的最好的CPU,搜索查询的性能仍然比使用E5-2687W CPU低大约15%。不过,为了缩短测试推出时间,他们这样做了。但是,他们尽量确保不引入对AWS的依赖,以便后续可以迁移到其它提供商。
同时,欧洲的客户开始抱怨搜索查询延迟增加。他们很快就发现,那与索引操作大幅飙升有关。这初看起来有些不可思议,因为他们在设计时实现了索引操作和搜索查询的分离,但调查之后他们发现,确保集群间一致性的一致性算法在处理写操作时存在瓶颈。当瓶颈出现时,它会阻塞HTTP服务器线程,导致搜索查询等待。为了修复这一问题,他们在一致性操作之前实现了一个队列,由它接收写操作,然后将它们批量发送给一致性操作算法。这样,写操作就不会冻结HTTP服务器线程了。此后,他们再也没有遇到集群冻结的情况。
步骤6:2014年4月——网络高可用几乎不可能在一个数据中心里实现
2014年4月初,他们开始收到用户的抱怨。这些用户来自美国东部,但使用加拿大东部的集群,而美国西部的用户则没有受到影响。原来是一场车祸导致了加拿大和美国东部之间的网络路由路径发生了变化,而新路径的带宽不够,不可避免地出现了数据丢失。他们早先没有考虑这种情况,因此,当这种情况出现时,他们只能联系用户并说明情况。
他们认识到,需要基于多提供商、多数据中心和多网络提供商改进高可用性,实现一种真正的分布式基础设施。
步骤7:2014年7月——首次部署到两个数据中心
他们从最大的客户开始将机器部署到不同的数据中心(相距超过100公里)。这两个数据中心为同一个提供商所有。同时,根据先前的经验,他们将硬件进行了升级。虽然E5-2687W的CPU使用率就未到过100%,但他们还是升级到了使用下一代CPU的Xeon E5-1650v2。结果,他们的服务性能提高了将近15%。
步骤8:2014年8月——在美国部署服务!
2014年8月,他们在美国东部(弗吉尼亚州)和美国西部(加利福尼亚)通过一个新的提供商推出了服务。根据先前的经验,他们使用了同一提供商(不同的网络设备和电源装置)提供的不同的可用区域,并借助更低的延迟和更高的带宽改进了搜索体验。
步骤9:2014年10月——通过Chef实现自动化
随着机器数量不断增加,他们将管理工具改成了Chef。与使用Shell脚本相比,这会节省大量的时间。在配置数以百计的机器时,Chef非常有用,但也有缺点。他们曾经因为cookbook的输入错误而导致部分生产环境的服务器宕机。为了防止这类问题再次出现,他们决定将生产环境使用的cookbook分成两个版本:
当修改cookbook时,他们首先会将修改应用到生产版本。经过几天的测试后,他们才会将修改应用到稳定版本。
步骤10:2014年12月——DNS是架构中的一个SPoF
随着时间推移,越来越多的用户抱怨他们的服务时断时续,尤其是在亚洲。通过调查他们发现,使用.io TLD是问题的原因所在。事实证明,同其它顶级域名(.net、.com和.org)相比,.io TLD选播网络中的可选地址更少,导致DNS服务器过载。用户有时候会在DNS解析时遭遇超时。于是,他们将.io TLD换成了.net TLD,并换了一个允许他们在algolia.io和algolia.net之间同步的DNS提供商,这使他们很容易保持向后兼容。迁移完成后,他们进行了广泛的测试,发现了几个对部分客户有影响的问题。DNS比他们想象的复杂,他们的测试并不全面。
这个问题让他们认识到,唯一的DNS提供商是一个SPoF(单点故障点),而他们的迁移行为实际上是非常危险的。因此,他们开始着手制定计划,消除架构中的SPoF。
至此,Julien已经介绍了他们构建高可用基础设施的前10个步骤(总共15个)。接下来,他将重点讨论他们引以为豪的DNS以及如何提升高可用性。