Algolia借助NGINX和OpenResty实现搜索流量负载均衡

2019 年 5 月 08 日

Algolia借助NGINX和OpenResty实现搜索流量负载均衡

为了解决负载分布不均匀导致的高延迟问题,SaaS Web 搜索产品 Algolia 将其基础设施的 DNS 轮询负载均衡模型换掉了。他们引入了NGINX和 OpenResty 作为软件负载均衡器,Redis 使用自定义的 Go 程序来管理后端服务器列表。这个解决方案在 Algolia 的基础设施之上提供了一个新的抽象层。InfoQ 联系了 Algolia 站点可靠性工程师Paul Berthaux,了解更多关于这个做法的信息。


Algolia“应用”有 3 个服务器集群和分布式搜索网络(DSN)服务器,后者提供搜索查询服务。DSN 在功能上类似于内容交付网络接入点(POP),因为它们从离用户最近的地方提供数据。每个应用都有一个 DNS 记录。Algolia 的 DNS 配置使用了多个顶级域名(TLD),并且为了获得弹性使用了两个 DNS 提供商。此外,每个应用的 DNS 记录都被配置为以轮询方式返回 3 个集群服务器的 IP 地址。这是试图将负载分布到集群中的所有服务器上。搜索集群的常见用例是通过前端应用程序或移动应用程序。然而,一些客户也有访问搜索 API 的后端应用程序。后一种情况会造成负载不均,因为所有请求都将到达同一服务器,直到特定服务器的 DNS 生存时间(TTL)到期为止。


Algolia 的一个应用在黑色星期五(Black Friday)搜索量很大时,搜索速度变得很慢。这导致了查询的不均匀分布。团队瞄准了 NGINX 作为客户端应用程序和应用服务器之间的软件负载均衡器。虽然这确实解决了负载分配的一般问题,但是仍然存在使该设置具有通用性和自动化操作的问题。团队选择了OpenResty,它为 NGINX 中的请求-响应生命周期提供Lua脚本支持。使用这个模型,NGINX 可以根据客户“了解到”将请求发送到哪个后端服务器。此信息缓存在 Redis 中。一个名为 lb-helper 的自定义 Go 守护进程从内部 API 获取服务器列表。


在回答是否可以使 Redis 缓存失效的问题时,Berthaux 解释说,他们这样做是“使用了内部公开的用于维护目的的 lib -helper 中的 API 端点”。如果团队必须删除大量的后端服务器,并且不希望 LB 客户端在响应时间上有任何差异,那么就可能需要这样做。



图片来自:https://blog.algolia.com/one-year-load-balancing/,已获授权。


通过此更改,负载均衡器可能成为单点故障。Berthaux 解释了为什么现在还不用担心:


为了获得弹性,我们运行着多个LB——LB的选择是通过轮询DNS。目前,这没有问题,因为与我们的搜索API服务器相比,LB执行非常简单的任务,所以我们不需要在它们之间进行均匀的负载均衡。也就是说,我们有一些非常长期的计划,从轮询DNS转移到基于Anycast路由的东西。


lb-helper 还负责从列表中删除不健康的服务器。按照 Berthaux 的说法:


NGINX/OpenResty中嵌入了对上游故障的检测以及针对不同上游流的重试功能。我使用OpenResty中的log_by_lua指令和一些自定义的Lua代码进行失败计数,从活动Redis条目中删除失败的上游,并在连续10次失败后向lib -helper发出警告。我设置了这个故障阈值,以避免短时自解“事件(incident)”(如准时丢包)中很多不必要的事件(event)。这样,lb-helper将探测失败的上游FQDN,并在它恢复后将其放回Redis中。


通过此更改,Algolia 的搜索负载趋于平稳。他们目前正在进一步改进负载均衡算法。


查看英文原文Load Balancing Search Traffic at Algolia With NGINX and OpenResty


2019 年 5 月 08 日 08:004262
用户头像

发布了 323 篇内容, 共 140.6 次阅读, 收获喜欢 661 次。

关注

评论

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

引领云原生发展浪潮 阿里云开启云原生大规模落地元年

阿里巴巴云原生

云计算 阿里巴巴 阿里云 最佳实践 云原生

如何破解AI数据困境?京东智联云联邦学习平台有良方

京东智联云开发者

人工智能 大数据 学习

灵魂一问:数据库连接池到底该怎么配?

新世界杂货铺

golang MySQL

架构师训练营第 1 期 - 第 11 周 - 命题作业

wgl

极客大学架构师训练营

都 2021 年了,Serverless 能取代微服务吗?

Serverless Devs

Serverless 微服务 运维 云原生 后端开发

波场智能合约系统开发技术方案丨智能合约DAPP系统开发源码

系统开发咨询:I76-883I-5I52 邓森

任务发布系统软件开发|任务发布APP开发

开發I852946OIIO

系统开发

LeetCode题解:42. 接雨水,暴力法,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

Android uni-app实现音视频通话

anyRTC开发者

uni-app android 音视频 WebRTC 跨平台

现代JavaScript:ES6+ 中的 Imports,Exports,Let,Const 和 Promise

Geek_Willie

Java ES6

如何阅读别人的源码

熊斌

学习 Code Review 源码阅读 七日更

揭开阿里巴巴复杂任务资源混合调度技术面纱

阿里巴巴云原生

云计算 阿里云 性能优化 云原生 资源调度

判空使用isEmpty()方法真的可行吗?

田维常

Java

传统数仓如何转型大数据

数据社

大数据 数据仓库 七日更

你不好奇 Linux 网络发包过程吗?

小林coding

Linux 操作系统 网络

编写令人愉悦的API接口(二)

陈云轩

Java APi设计 接口规范

最有技术含量的面试

escray

面经 面试经历 101次面试 七日更 十日谈

MySQL字符集修改实战教程

Simon

MySQL 字符集 七日更

智慧旅游安全管理综合指挥平台建设解决方案

WX13823153201

深度探索Hadoop分布式文件系统(HDFS)数据读取流程

守护石论数据

hadoop hdfs 大数据技术 大数据架构 分布式文件系统

斐波那契数列

Ke

社区一体化综合平台搭建,智慧平安小区建设解决方案

t13823115967

智慧城市 智慧平安社区平台建设

SpacePX挖矿系统APP开发|SpacePX挖矿软件开发

开發I852946OIIO

系统开发

高性能MySQL

田维常

MySQL

从根上理解高性能、高并发:深入计算机底层,理解线程与线程池

程序员小毕

Java cpu 多线程 高并发 线程池

大神带你一睹为快!阿里技术官亲自码了“2000页的Spring全家桶笔记”真牛逼!

比伯

Java 编程 程序员 架构 计算机

如何在 20 分钟内给你的 K8s PaaS 上线一个新功能?

阿里巴巴云原生

阿里云 容器 运维 云原生

XRP瑞波币系统软件开发|XRP瑞波币APP开发

开發I852946OIIO

系统开发

打开数“智”化之门,一字之差带来的思考

京东智联云开发者

DevOps IoT 新基建 智能

执法监督信息化建设,公安情报指挥一体化合成作战系统开发

t13823115967

智慧公安

Serverless 是一种思想状态

Serverless Devs

Java Serverless 运维 云原生 后端开发

Algolia借助NGINX和OpenResty实现搜索流量负载均衡-InfoQ