大厂Data+Agent 秘籍:腾讯/阿里/字节解析如何提升数据分析智能。 了解详情
写点什么

Algolia 通往高可用搜索 API 的狂暴之路(系列之二)

  • 2015-07-23
  • 本文字数:2371 字

    阅读完需:约 8 分钟

在本系列的上一篇文章中,Algolia 联合创始人兼首席技术官Julien Lemoine 介绍了他们构建高可用基础设施的前3 个步骤。近日,本系列的第二篇文章发表,主要介绍自2013 年9 月API 正式推出至2014 年12 月18 个月间的情况以及所有意料之外的问题,其中包括第一次停机。

步骤4:2014 年1 月——部署会危及高可用性

在这个阶段,他们主要关注如何实现敏捷开发而又不以牺牲稳定性为代价。为此,他们开发了一个测试套件,其中包含6000 多个单元测试和200 多个非回归测试。但还是不够,即使一项新特性通过了所有的测试,仍然可能在生产环境中引入Bug,比如,曾有个Bug 导致了 8 分钟的索引操作中断。多亏他们在设计架构时实现了搜索查询与索引操作的分离,前者才没有受到影响。不过,这个问题让他们确定了其高可用设置中的一些问题:

  • 回滚要快,为此,他们实现了通过单行命令回滚;
  • 部署脚本需要执行完整性检查,如果有错误,就自动回滚;
  • 不能仅仅因为测试通过就部署到生产环境中的所有集群上,他们会按照顺序依次部署测试集群、社区集群(面向免费用户)、付费用户集群。

现在,当有新特性需要测试时,他们会选择一个集群组用于测试,并按照下面的步骤部署:

  1. 向所选集群组中所有集群的第一台机器部署;
  2. 监控 24 小时,然后向所选集群组中所有集群的第二台机器部署;
  3. 监控 24 小时,然后向所选集群组中所有集群的第三台机器部署;
  4. 几天后,向生产环境中的所有集群部署。

通过这种方法,他们可以在几个小时内检测到几乎不可能通过单元测试发现的 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 以及如何提升高可用性。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-07-23 10:062120
用户头像

发布了 1008 篇内容, 共 426.0 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

过早优化是万恶之源

非著名程序员

程序员 程序人生 提升认知

辟谣:程序员不配谈恋爱?你错的可以!真相来了

码农神说

程序员 漫画 相亲

centos7 操作

InfoQ_1c4a1f813eb1

架构师训练营第四周-总结

无心水

极客大学架构师训练营

Docker基础修炼2--Docker镜像原理及常用命令

黑马腾云

Docker Linux 容器 运维 镜像

2020年6月26日 查询性能优化

瑞克与莫迪

区块链的应用为什么这么难?出路在哪?

CECBC

比特币 区块链技术 Token 联盟共识

极客大学架构师训练营 系统架构 第7课 听课总结

John(易筋)

极客时间 系统架构 高并发 极客大学 极客大学架构师训练营

架构师训练营第三周命题作业

lwy

极客大学架构师训练营

WPF中的Data Binding调试指南

大白技术控

.net 微软 WPF

二叉树深度优先遍历

封不羁

Java 算法 二叉树

​外包公司干了不到3个月,我离职了...(防坑指南)

程序员生活志

程序员 外包 工作经历

测试阶段发现缺陷多怎么办?

洪永潮

ARTS WEEK4

紫枫

ARTS 打卡计划

架构训练营第四周 - 作业

无心水

极客大学架构师训练营

基于阿里云服务网格(ASM)的GRPC服务部署实践

韩陆

Kubernetes gRPC Service Mesh

ARTS week3

姜海天

【总结】企业级案例驱动 打造高可用、高并发、多IDC部署业务中台微服务架构

魔曦

极客大学架构师训练营

MySQL InnoDB 存储引擎 - 锁

Axe

面试官:我们来聊下锁吧

root

Java 乐观锁 悲观锁

架构师训练营第三周学习总结

lwy

抖音、腾讯、阿里、美团春招服务端开发岗位硬核面试(完结)

aoho

面试 后端 阿里

架构师第4周

上山砍柴

极客大学架构师训练营

Why Spring ???

猴哥一一 cium

Java spring 源码 Spring Boot 框架设计

新手村:Redis基础补充知识

多选参数

数据库 redis 数据库设计 redis6.0.0

区块链系列教程之:比特币中的挖矿

程序那些事

比特币 区块链 挖矿

[译]都0202年了,你还觉得go-scheduler很难理解吗?

卓丁

golang scheduler GPM goroutines Go 语言

近两年流行面试题:Spring循环依赖问题

Java小咖秀

spring 面试 ioc

创业一定要学投资

Neco.W

创业 投资

从0开始设计Flutter独立APP | 第一篇: 数据库与状态管理

渔子长

flutter 大前端 跨平台

为什么哈希表可以管理亿级数据?

八两

php redis hash rehash

Algolia通往高可用搜索API的狂暴之路(系列之二)_架构_谢丽_InfoQ精选文章