知识卡片

用小集群优先查询、大集群兜底:进一步降低大集群访问压力的分层策略

普通读书筆记卡

内容

在按时间维度把集群切分成周级、两月级、全量级三种不同规模之后,百姓网进一步利用这个分层结构设计了一套查询优先级策略:查询优先访问规模较小、时效性较强的集群(比如两月内的集群),只有当这个小集群返回的数据量不满足查询需求时,才会继续向下查询规模更大的全量集群——这样绝大多数能被时效性较强的小集群满足的查询,根本不需要触达压力最大的全量集群,进一步降低了大集群的访问压力。这个策略还处理了一个细节问题:如果查询命中了较小的集群、又需要精确的总数统计(Total Count),系统默认只会给出一个”小集群命中数乘以某个倍数(比如10倍)”的估算值,而不是真实精确的总数;如果业务确实需要精确的Total Count,可以再单独用Count API(设置size为0)去查询全量集群获取精确统计——这个设计承认了”大多数场景不需要精确总数、只需要一个大致范围”和”少数场景确实需要精确总数”这两类需求的差异,用近似估算满足前者的性能诉求,用一次额外的精确查询满足后者的准确性诉求,而不是让所有查询都被迫为了追求精确总数而承受全量查询的代价。这个案例给出了一条应对”数据规模分层、但用户真实需求分布不均”这类场景的通用思路:当一部分数据(近期数据)能够满足大部分真实查询需求时,应当主动设计一条”优先访问小而快的子集,不够再兜底到大而慢的全集”的查询路径,而不是让每一次查询都不加区分地直接命中最大、最慢的那个数据集合——这个思路的关键在于准确识别出真实查询分布的偏斜特征(大部分需求确实只需要近期数据就能满足),并针对这个偏斜特征设计出对应的分层降级路径。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.3 百姓网Elasticsearch2.x升级之路"节,"6.3.4 百姓之道"(源文件:_epub-src/OEBPS/Text/Chapter6_3_5.xhtml) - 结论依据:原文说明"使用时间划分集群后,还有一个好处,我们可以用二月的信息的集群来作为较小集群,让查询优先访问这个集群,当数据满足条件后,就不需要查询Full集群;数据不足则继续查询Full集群……若查询了较小集群,并且需要准确的Total Count(默认提供一个Mini集群10倍的数字),可以进一步使用Count API(设置size:0)去访问Full集群",直接支撑本卡片结论。 - 原始内容:使用时间划分集群后,还有一个好处,我们可以用二月的信息的集群来作为较小集群,让查询优先访问这个集群,当数据满足条件后,就不需要查询Full集群;数据不足则继续查询Full集群,进一步降低大集群的访问压力。