其他
百度搜索中台海量数据管理的云原生和智能化实践
一、背景
1.1 背景简介
业务经过离线建库环节产出建库包,并生效到消息中间件中。 业务内容数据(比如索引数据、正排数据)按大小拆成相应的分片服务,并通过订阅分片映射的消息Topic数据,实现流式更新。 每个分片由PaaS容器承载,启动时从DFS拉取对应的存量数据,并定时将数据持久化上传到DFS中;并从数据中间件读取增量数据,从而实现有状态服务的云原生。 业务检索请求通过PaaS层面的服务发现,检索对应业务的内容数据。
存储/计算难以分离:搜索场景的高性能、低延迟要求,计算和存储难以拆开专项优化,需要本地化的存储+计算。 全扇出的并发模式:搜索场景是Query到Doc的映射,需要经过语义解析、构建检索表达式、扇出所有的分片服务、合并结果,而常规场景下的Key/Value查询,可以通过Hash关系实现精准的扇出。 最终一致性保证:副本间没有通信,通过消息队列增量更新方式,保证秒级别的最终一致性。
1.2 上代内容数据管理架构存在的问题
效率方面:偏静态模式下的容量调整,需要人工调整数据的分布、分片的大小、扇出的规则,往往需要周级别甚至是月级别才能完成,越来越高频的容量调整需求,使得上述架构无法在效率层面继续满足业务的需求。 成本方面:部分业务具有多种场景的内容数据,不同场景的数据访问频度差异是巨大的,静态的数据管理架构难以实现资源的按需分配和rebalance(再平衡)。 稳定性方面:单业务数据量级由亿级别突破至50亿级别,全扇出模式下需要扇出数百个分片服务,极大扇出带来的是可用性的急剧下降。 性能方面:关联计算(比如join操作)需要上游多次检索查询&合并,性能层面难以满足业务的延迟要求。
分区(slot):数据管理的最小单元(比如一组索引数据),进一步抽象和拆解上代架构中关于消息中间件Topic的概念。 分片(shard):承载一组slot数据的引擎服务。 副本(replica):分片中的一个实例。 套餐类型:预定义的一系列标准化的容器资源规格(比如存储类型可选用RAM/SSD/DISK等介质),满足各类检索场景对资源的匹配诉求。
分区控制单元:根据业务场景和内容数据的特征,控制建库时的分区策略,比如按某特征汇聚(实现关联计算)、某维度打散(实现冷热分离)等等。 分片控制单元:根据检索场景的数据量,控制所需要的分片规模,实现分片的容量调整。 副本控制单元:根据检索场景的资源诉求、流量、性能要求,控制分片所使用的套餐类型和副本个数,同时对接PaaS系统,实现套餐资源池的管理。 寻址控制单元:根据业务的分区策略和分片策略,结合数据slot层面的服务发现机制,实现数据层面的动态寻址能力。
2.2 核心工作流程
评估业务检索场景和内容数据的特征等,生成相关控制策略,比如分区策略、分片策略、副本策略、寻址策略。 内容建库数据通过【分区控制器】写入到数据中心。 【分片控制器】初始化分片的服务信息,比如分片的个数和要管控的数据分区等。 【副本控制器】根据副本策略和分片策略来分配实例、注册服务。 【寻址控制器】实现数据层面的服务注册和发现机制。 业务通过【寻址控制器】来访问相应的内容数据。
三、云原生化设计
针对容量调整效率低下和冷热差异大导致的成本浪费问题,我们以云原生化的思路对上代架构进行了改造,实现了数据的弹性伸缩和资源的按需分配。
3.1 弹性伸缩机制设计
垂直伸缩:调整物理硬件配置的方式,来增强系统的弹性,比如调大容器的资源配额、更换ssd等。 好处:速度快、操作简单等 缺点:容器迁移&故障恢复周期长、有瓶颈问题(天花板较低)。 水平伸缩:调整副本数来应对流量、数据量的涨幅情况。 好处:天花板足够高。 缺点:实现困难、门槛较高。
系统检测到分片服务容量达到阈值,或者人工发起容量指令,比如游戏检索数据由2分片调整为4分片。 分片控制器计算调整后的分片需求,并初始化新的数据分片所绑定的数据区间,shard1=[2,4)、shard3=[6,8) 寻址控制器通过服务发现机制,感知到分片调整&新分片服务ready后,开始更新路由规则,由2分片调整为4分片。 路由切换后,开始清除旧分片无用的数据,shard0=[0,4) -> shard0=[0,2)、shard1=[4,8) -> shard2=[4,6)。
3.2 资源按需分配机制设计
【分区控制器】根据业务的数据特征规划数据的分布,比如按冷热属性、按场景属性等,场景A分布在[0,4)、场景B分布在[4,20)。 【分片控制器】根据数据规模、拉链长度等特征确定分片规模,场景A划分1个分片,场景B划分4个分片。 【副本控制器】根据数据访问qps和延迟特征,挑选不同存储介质和副本数,场景A&B选择高性能/低延迟容器组,场景C选择大容量/低成本容器组,场景A需要5副本,其他仅需要2副本。 【寻址控制器】提供业务不同场景数据的服务发现能力。
四、进阶云原生
4.1 精准扇出数据调度策略
业务特征:检索数据均带有店铺ID标识、用户请求是按照店铺级别搜索,整体数据量级十亿级。 检索请求: 查询某个店铺的商品 … 建库请求: 某个店铺商品信息的更新 …
【分区控制器】根据业务携带的uid信息,划分数据分区并写入到数据中心,根据sliceKey=uid-123确定group0数据分区组,再根据DocID在group内再次均分数据。 【分片控制器】根据各个数据分区组的容量等情况,划分数据分片。比如分区组[0,32)容量小,只需要2个分片服务就能承载所有数据,而分区组[64,96)则需要32个分片服务承载所有数据。 【寻址控制器】根据业务携带的uid信息,确定对应的分区组group,并路由到对应的分片服务组。
4.2 本地化计算数据调度策略
业务特征:主播可以选择多个商品售卖,商品能被多个主播带货,主播量级在十万级,商品量级在亿级别。 检索请求: 查询某个主播所带货的商品列表 … 建库请求: 商品的属性变更 主播的信息变更 …
拆分两张表:主播信息表和商品信息表
主播查询商品:需要先查询主播信息表,再查商品信息表。
缺点:需要2次分布式检索,延迟较高。
只保留一张表:主播信息和商品信息进行叉乘 主播查询商品:只需要查一张表 缺点:成本浪费严重,更新困难(热门商品更新情况下,需要同步更新10W+主播,延迟不可接受)
建库侧:对于需要关联的关系数据和商品数据携带相同的特征标识,比如sliceKey=sid-1, 分区控制器:根据直播带货的关联分区策略,确保关联数据的数据分区是相同的(内聚化)。 分片控制器:相同分区的数据被规划到相同的分片服务中(索引计算服务),实现关联数据的本地化和计算的本地化。 检索侧:携带特征标识sliceKey=sid=1定位数据分区,通过寻址控制器找到对应的分片服务。
通过本地化计算,解决了直播带货场景下因分布式检索Join带来的性能下降问题,平均延迟降低50%。 提供了一种关联计算速度优化的思路。
五、总结 & 展望