支撑百度搜索引擎99.995%可靠名字服务架构设计

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 百度搜索引擎是全球最大的中文搜索引擎,致力于向人们提供"简单,可依赖"的信息获取方式。百度网页搜索部架构师郑然为我们分享支撑百度搜索引擎的可靠名字服务架构设计。

_

内容来源:2016年12月16日,郑然在“GIAC 全球互联网架构大会”进行《支撑百度搜索引擎99.995%可靠名字服务架构设计》演讲分享。IT大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。
阅读字数:2783 | 4分钟阅读

点击观看嘉宾演讲视频

搜索引擎的挑战

机器数量多,服务数量大:我们有数万台服务器,数十万个服务,分布在多个IDC。

服务变更多,变更数据大:每天几十万次变更,每周10P量级的文件更新,千余人并行开发上百个模块。

检索流量大,稳定性要高:每秒数万次请求,满足99.995%的可用性,极短时间的故障都可能引发大量的拒绝。

服务发现的原理

什么是服务发现

服务上游如何找到下游;服务上游如何负载均衡;下游挂了上游如何感知。

客户端服务发现

所有服务下游自行向服务注册表中进行注册,同时服务上游集成注册表的客户端,查询注册表以获取服务下游列表。服务上游集成负载均衡器,实施负载均衡。

服务端服务发现

服务端服务发现和客户端服务发现的区别就在于,服务端服务发现所有服务上游的请求都是通过网关去查询。

服务发现组件

服务发现主要由服务注册表、注册表客户端和负载均衡组成。

服务注册表是分布式的存储,持久化服务地址和自定义属性,服务名字全局唯一。

注册表客户端支持对注册表的增删改查,支持高并发高吞吐,对延迟的要求不太高,读多写少。

负载均衡对于整个服务系统来说是一个不可或缺的组件。它根据负载选择某个服务,剔除和探活故障服务。

关键技术与实践难点

Eden架构蓝图

1

Eden是百度网页搜索部自行研发的基于百度matrix集群操作系统的PaaS平台。它主要负责服务的部署、扩缩容、故障恢复等一系列服务治理的相关工作。底层是基础设施层,包括监控、故障检测以及matrix集群操作系统。

Eden由三部分组成,第一部分是总控服务,分为InstanceMgr和NamingService。底层有多个agent来执行总控下发的命令。所有的源数据保存在zookeeper上,并提供了命令行、web之类的接口来使用。还有一个机器维修仲裁的组件,根据故障类型、服务状态来决策机器的维修,同时提供了日志的收集分析,和一个仿真的测试平台。

在这之上是job engine层,提供了封装日常服务变更的操作,包括升级、数据的变更、服务扩容、故障实例的迁移等,在这层上做了抽象。

最上面是一些托管的服务,有网页图片搜索服务、度秘服务、和信息流。

服务发现组件

2

对于一个IDC来说,我们会部署一套NamingService,agent复用的是Eden的agent。

服务发现不可避免的是要支持跨机房的服务发现机制,必须要有跨机房查询的功能,我们就做了一套远程的跨机房查询,上层提供了SDK接口把这些过程封装起来。

为了支持跨机房一定要APP的ID或者名字必须要全局唯一。

技术难点

我觉得一个真正能够在线上稳定运行的服务发现系统必须要解决以下六个问题:

调用时机:谁来向服务注册表注册和注销服务?

健康检查:上游如何感知下游的健康情况?

无损升级:如何无损的进行服务升级?

变更分级:连接关系变更如何分级?

感知变化:上游服务如何感知下游服务列表的变化?

避免单点:如何避免服务注册表局部故障?

调用时机

第一种方式是服务自己,在启动或停止的时候注册或注销自己。这种方式服务的启停对注册表有很强的依赖,服务需要植入SDK,会产生植入成本,容易干扰运维的可预期性,影响过载保护策略。

第二种方式就是采用第三方组件,有一个代理模块去实施服务的注册和注销。我们使用这种方法的时候是利用agent通过SDK去操作。它的优点就是只需在服务添加删除时修改注册表,不用植入SDK,对注册表的依赖很弱,更容易进行运维效果监控,降低注册表的负载。

健康检查

健康检查有服务端健康检查和客户端健康检查两种做法。

服务端健康检查是服务自己做健康检查,把健康结果反馈给服务注册表。但这种方式对注册表的依赖性很强,而且它自己的健康不一定是上游看到的健康,所以结果未必准确,感知周期也很长。

客户端健康检查则是客户端和服务端建立心跳和探活机制。它的优点是对注册表的依赖性弱,感知周期短,准确性更高了。

无损升级

升级就意味着同时重启的数量要比平时更多。对于上游来说,不可访问的服务也比日常要多,这就意味着失败概率会变大。

重试虽然可以在一定程度上解决问题,但重试的副作用大,通常重试的次数会被严格限制。

而健康检查虽然可以探测到不可用的下游服务,但是健康检测存在周期性。

后来我们又有了一个更好的做法::我们采取的方法是下游服务退出过程中,先不会关闭服务读写端口,而仅仅关闭心跳端口,使服务处于"跛脚鸭"状态,等上游检测到下游心跳异常之后,将流量调度到其他服务实例,然后下游服务实例再关闭读写端口退出,从而实现完全可控的无损服务升级。

变更分级

基于分布式锁的个数,控制上游变更的服务,但上游分级方式具有随机性,出错情况损失偏大。

给下游实例打tag,标记是否被上游可见。

其实这种分级方式并不是很好,因为变更连接关系高危变更,一旦错误,损失很大。更好的方法是通过权重来控制下游服务的流量比例。

感知变化

我们在实践中发现zookeeper的通知机制不可靠,对注册表依赖过重,发生局部故障,影响服务可用性。

而轮询是一种比较可靠的机制。由agent周期性轮询服务注册表,引入版本节点,只有版本变化时,才获取全量数据,增强了运维的可预期性。

避免单点

对于IDC来说,它不希望由于服务发现系统局部故障而影响服务。

历史上我们发生过多次zookeeper的局部故障,比如网络抖动导致大量session超时所引起的通知机制。

把这些“不可靠”作为设计思路,我们把上游持久化缓存下游服务列表,作为容灾手段。采用的是轮询机制。

健康检查是通过上游服务探测下游服务健康状态。

应用范围

目前的服务发现系统应用到了万级的服务数量,支持了十万级的服务实例数量,覆盖了百度搜索引擎规模最大的indexer服务,数千个实例扩缩容的索引分布调整,分钟级完成连接变更。

应用案例

3

相关对策

原有方案无论是ssdb、proxy还是master,都大量应用了对于zk通知的机制,同时还依赖zk的session机制做探活。

这个方案在实际应用中很容易出现网络抖动session超时的故障,zk通知机制也容易丢消息,zk故障会导致服务整体不可用,平均1~2个月就会发生故障。

所以我们把它迁移到了NamingService,以解决上述问题。

总结和思考

4

总结

使用第三方组件进行注册和注销;

上游探测下游服务健康状态;

通过服务分组实现无损升级;

连接关系变更一定要有分级机制;

使用轮询而不使用通知;

以服务注册不可靠作为假设条件。

思考

我们打算引入类似k8s的endpoint机制;通过控制流量比例更好的实现分级;提升易用性,成为通用的中间件。

以上就是我今天的分享,谢谢大家!

相关推荐

Mars在移动网络的探索和实践
京东小程序的三生三世

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
3月前
|
运维 Cloud Native 安全
云原生技术:重塑现代IT架构的引擎
在当今数字化时代,企业正面临着前所未有的挑战与机遇。随着云计算技术的不断发展,云原生技术作为其核心驱动力之一,正在彻底改变企业的IT架构和运营模式。本文将深入探讨云原生技术的内涵、特点及其对企业数字化转型的影响,揭示其在现代IT架构中的核心地位和作用。同时,我们还将分析云原生技术面临的安全挑战,并展望未来的发展趋势,为企业在云原生领域的实践提供有益的参考。
|
2月前
|
分布式计算 大数据 Serverless
云栖实录 | 开源大数据全面升级:Native 核心引擎、Serverless 化、湖仓架构引领云上大数据发展
在2024云栖大会开源大数据专场上,阿里云宣布推出实时计算Flink产品的新一代向量化流计算引擎Flash,该引擎100%兼容Apache Flink标准,性能提升5-10倍,助力企业降本增效。此外,EMR Serverless Spark产品启动商业化,提供全托管Serverless服务,性能提升300%,并支持弹性伸缩与按量付费。七猫免费小说也分享了其在云上数据仓库治理的成功实践。其次 Flink Forward Asia 2024 将于11月在上海举行,欢迎报名参加。
220 6
云栖实录 | 开源大数据全面升级:Native 核心引擎、Serverless 化、湖仓架构引领云上大数据发展
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
6月前
|
存储 Cloud Native 持续交付
云原生架构:未来软件开发的引擎
【6月更文挑战第13天】随着企业数字化转型的加速,云原生技术已成为推动现代软件交付和运维的关键力量。本文将深入探讨云原生架构的核心概念、优势以及它如何重塑软件开发流程,为企业带来前所未有的敏捷性、可扩展性和成本效率。
208 1
|
2月前
|
运维 Cloud Native 安全
云原生架构:企业数字化转型的新引擎##
【10月更文挑战第2天】 在当今数字化浪潮中,云原生架构以其独特的优势成为企业实现高效、灵活和创新的核心驱动力。本文深入探讨了云原生的概念、核心技术如容器化、微服务和DevOps等,并分析了这些技术如何共同作用,推动企业在云平台上实现快速迭代、弹性扩展和资源优化。同时,文章还阐述了云原生在实际应用中面临的挑战及相应的解决策略,为企业的数字化转型提供全面而深入的指导。 ##
54 17
|
2月前
|
运维 Cloud Native 持续交付
探索云原生架构:企业数字化转型的新引擎
在当今数字化浪潮中,云原生架构以其独特的优势成为企业转型的关键。它通过容器化、微服务、DevOps和持续交付等技术,使企业能够快速响应市场变化,实现应用的高效开发、部署和运维。本文将深入探讨云原生的概念、核心技术及其在现代IT环境中的重要性。
|
2月前
|
Kubernetes 监控 Cloud Native
探索云原生架构:企业数字化转型的新引擎
【10月更文挑战第5天】 在当今数字化浪潮中,云原生架构以其独特的优势成为企业实现高效、灵活和可扩展的关键。本文将深入探讨云原生的核心概念、关键技术以及实际应用案例,揭示其在推动企业数字化转型中的重要作用。
42 6
|
2月前
|
运维 Kubernetes Cloud Native
探索云原生架构:企业数字化转型的新引擎
【10月更文挑战第9天】 在当今数字化浪潮中,云原生架构以其独特的优势成为企业实现高效运营和快速创新的关键。本文将深入探讨云原生的核心概念、关键技术以及实际应用案例,揭示其如何助力企业加速数字化转型步伐。通过对云原生技术的剖析,我们将看到这一新兴架构是如何重新定义软件开发、部署和运维模式的,进而推动企业在激烈的市场竞争中脱颖而出。
|
2月前
|
存储 安全 开发工具
百度公共IM系统的Andriod端IM SDK组件架构设计与技术实现
本文主要介绍了百度公共IM系统的Andriod端IM SDK的建设背景、IM SDK主要结构和工作流程以及建设过程遇到的问题和解决方案。
57 3
|
2月前
|
监控 Cloud Native 持续交付
云原生架构:企业数字化转型的新引擎##
在当今数字化浪潮中,云原生架构正成为推动企业创新和竞争力的关键因素。本文探讨了云原生的核心概念、技术优势以及在现代业务场景中的应用实践,揭示了其如何助力企业实现高效运营、灵活扩展与持续集成。通过对云原生技术的深入剖析,我们将看到它不仅是一种技术趋势,更是企业数字化转型的战略选择。 ##
41 5