写点什么

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

  • 2015-07-30
  • 本文字数:2194 字

    阅读完需:约 7 分钟

在本系列的第一第二篇文章中,Algolia 联合创始人兼首席技术官Julien Lemoine 分别介绍了他们构建高可用基础设施的前3 个步骤和自2013 年9 月API 正式推出至2014 年12 月18 个月间的情况以及所有意料之外的问题(其中包括第一次停机)。近日,本系列的第三篇文章发表,主要介绍他们如何从一个“初创企业”的架构转变成一个可以满足大型上市公司需求的架构。

步骤11:2015 年2 月——全球同步的基础设施

这个月,他们实现了自2014 年4 月开始就一直为之努力的目标,“将服务扩展到全球,更好地服务于用户”。他们的网络包含12 个不同的地点:美国东部(弗吉尼亚)、美国西部(加利福尼亚)、澳大利亚、巴西、加拿大、法国、德国、香港、印度、日本、俄罗斯和新加坡。最重要的是,他们推出了“分布式搜索”特性。借助这个特性,用户只需几次点击就可以在他们的网络中选定需要自动复制数据的地点。用户使用的API 保持不变,而查询请求会自动路由到最近的地点。这不仅降低了延迟,还提高了搜索基础设施的可用性。

据Julien 介绍,他们的“分布式搜索网络(Distributed Search Network,DSN)”与CDN(内容分发网络)完全不同。他们不是在每个边缘地点缓存常用查询,而是存储一个包含所有数据的完整副本。边缘地点本身都可以响应任何查询。就是说,如果用户选择了三个接入点(美国东部、德国、新加坡),那么位于德国的接入点会响应欧洲用户的查询,位于新加坡的接入点会响应亚洲用户的查询,而位于美国东部的接入点则会响应美国用户的查询。

为了支持这种变化,他们修改了API 客户端的重试逻辑。客户端会首先指向主机名 APPID-dsn.algolia.net ,后者会使用 DNS 将客户端请求路由到最近的地点。如果最近的主机不可用,那么为了能够返回下一个最近的地点,DNS 记录会在 1 分钟内删除那台主机。这就是他们将每条记录的 TTL 设为 1 分钟的原因。如果遇到这种故障,那么他们的官方 API 客户端会通过在 APPID-1.algolia.net APPID-2.algolia.net APPID-3.algolia.net 上重试将流量重定向到“主区域(main region)”。他们认为,这种方法可以实现高性能与高可用性的最佳平衡。

步骤 12:2015 年 3 月——提高单个地点的高可用性

对于搜索和国际用户而言,分布式搜索网络极大的提高了可用性。而为了提高主区域的可用性,他们将美国的集群分布在两个完全独立的提供商那里:

  • 两个位置相近的、不同的数据中心;
  • 三台不同的机器——同以前一样,两台位于一个数据中心的不同的可用区域中,一台位于另一个数据中心;
  • 两个不同的自治系统。

这样,他们可以选择将流量路由到另一个提供商。他们在提高单个地点的可用性方面迈进了很大一步。

步骤 13:2015 年 4 月——随机出现的文件损坏问题

这个月,他们开始注意到生产环境中随机出现的文件损坏问题,这是由部分 SSD 的 TRIM 实现中存在 Bug 导致的(具体原因参见这里)。这是个棘手的问题,他们花了一个月的时间来跟踪和定位。所幸,他们没有丢失任何客户数据,这主要得益于以下两个方面:

  • 他们存储了数据的三个副本;
  • 更重要的是,他们没有复制索引操作的结果,而是在每台机器上重复了用户的操作。这有效避免了问题向其它机器传播。

他们没有预见到这种问题,但使用独立的机器是他们能够将问题影响最小化的原因。因此,Julien 强烈建议,任何需要高可用性的系统都要采用这种独立性。

步骤 14:2015 年 5 月——引入多个 DNS 提供商

他们选择 NSONE 作为一个 DNS 提供商,因为该提供商提供了很棒的 DNS API,允许他们通过 API 针对每个用户配置查询的路由方式,并且支持 edns-client-subnets ,可以提供更准确的地理位置路由。

这里的挑战在于,他们需要引入第二家 DNS 提供商,而又不损失 NSONE 提供的强大功能。他们决定通过修改 API 客户端重试策略的方式引入。所有的 API 客户端都会首先连接 APPID-dsn.algolia.net ,如果有问题,它们会在另一个提供商提供的顶级域名上重试。他们选择将 AWS Route 53 作为第二家提供商。如果有任何问题,API 客户端将从 APPID-1.algolianet.com APPID-2.algolianet.com APPID-3.algolianet.com 中随机选择一个重试。这样,他们就在 algolia.net 域上保留了 NSONE 所有的地理位置路由特性,同时引入了第二个提供商在 algolianet.com 域上提供了更高的可用性。

步骤 15:2015 年 7 月——每个集群跨三个完全独立的提供商

虽然经过了一系列的扩展,但他们的基础设施并不能完全应对所有问题,这主要是因为 Link/Router 丢失数据包和路由泄露。在上个步骤中,他们改进了在美国的部署,构建了跨多个数据中心、多个自治系统和多个上游提供商的集群。不过,索引操作需要三台机器中的两台运行正常方可进行。当使用两个提供商时,如果其中一个宕掉,他们就会无法提供索引服务,但搜索服务仍然可用。正是因为这个原因,他们决定实现跨三个完全独立的提供商的集群。这让他们的基础设施超级冗余,但却同时提供了高可用的搜索和索引服务。

总之,构建高可用的架构是需要时间的。所以,作为初创企业,不用在开始的时候就担心基础设施不够完美。但是,应该尽早考虑如何扩展基础设施,Julien 甚至建议在 Beta 测试之前就开始。


感谢徐川对本文的审校。

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

2015-07-30 08:221964
用户头像

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

关注

评论

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

一文快速掌握华为云IPv6基础知识及使用指南

华为云开发者联盟

物联网中台 物联网 网络 华为云

腾讯面了五轮,面委挂了,挂的原因让大家唏嘘...

程序员生活志

腾讯 面试

如何做一次完美的 ABTest?

vivo互联网技术

数据分析 AB testing实战

探索无限潜能,英特尔神经拟态计算除了有“嗅觉”还能有“触觉”

最新动态

第六期总结

GAC·DU

架构师训练营week06 作业

GunShotPanda

前端杂记-回调地狱

阡陌r

JavaScript 回调地狱

有趣的条漫版 HashMap,25岁大爷都能看懂

古时的风筝

hashmap

技术科普丨服务发现和负载均衡的来龙去脉

华为云开发者联盟

负载均衡 微服务 开发者工具 服务端 服务

信创舆情一线--十五部门印发指导意见进一步促进服务型制造发展

统小信uos

第六期作业

GAC·DU

Java8——Stream流

Java旅途

如何帮助技术员工高效成长?这几家企业的做法值得借鉴

极客时间企业版

研发管理 研发团队培训

知乎,挣钱?果然有长尾效应

非著名程序员

程序员 副业 副业赚钱 知乎 好物推荐

计算机网络基础(四)---网络层-ARP协议与RARP协议

书旅

laravel 计算机网络 网络协议 计算机基础 网络层

变性手术后,产品总监和当当网打起了官司

赵新龙

法律 判决书 案例

解决方案|智能消防预警系统突破高层楼房限制

华为云开发者联盟

AI 物联网 边缘计算 华为云

数据分析师完整的指标体系构建 (干货)

博文视点Broadview

数据挖掘 读书笔记 数据分析 数据 求职

猿灯塔:spring Boot Starter开发及源码刨析(七)

猿灯塔

重读vue2.0风格指南,我整理了这些关键规则

前端有的玩

Java Vue 代码规范

Java HashMap 的那么多为什么

多选参数

Java Java源码

GitHub Actions和mp-ci助力微信小程序持续集成

neo

微信小程序 taro GitHub CI/CD

数十家技术社区联名推荐的GeekOnline来了!

Geek_116789

架构师训练营week06 学习总结

GunShotPanda

简单的了解一下K8S,并搭建自己的集群

leonsh

Kubernetes 微服务

优傲机器人以人机协作助力中国“智能制造”落地

Geek_116789

我从LongAdder中窥探到了高并发的秘籍,上面只写了两个字...

why技术

jdk 高并发 LongAdder

API接口管理平台YAPI的搭建

Man

DevOps APi设计 YAPI

linux上强大的字符串匹配工具详解-grep

X先生

Shell grep

小白如何学习操作系统?

苹果看辽宁体育

操作系统

有了“质量墙”,程序员再也没有秃头的烦恼

华为云开发者联盟

程序员 软件 代码审查 项目 代码

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