知识卡片

集群按多维度组合切分:routing、时间、业务、是否需要全文索引

普通读书笔记卡

内容

百姓网的Elasticsearch集群并不是从一开始就是单一集群,而是随着数据量增长、单集群查询延迟从毫秒级劣化到几百毫秒(无法接受)之后,逐步按多个维度组合切分出来的。第一个维度是routing:按业务访问特征把查询导向不同的集群,比如带有用户ID的查询指向uid集群,查询某个城市下二手手机这类”城市+二级类目”的查询指向对应的city+second_category集群,这样设计的依据是团队观察到自己业务的一级类目相对固定,可以按这个稳定的维度做切分。第二个维度是时间:按信息的新鲜度切出不同规模的集群(比如一周内的信息对应百万级规模的集群、两个月内对应千万级规模、全量对应亿级规模),依据是团队发现很大一部分业务场景对信息新鲜度敏感,只需要查询最近一段时间内的信息就能满足需求,不需要每次都去查询体量最大的全量集群,这样能大幅降低对大集群的访问压力。第三个维度是业务:针对特定业务场景(比如二手大类目下的二级类目”手机”)单独切出专属集群,判断依据是这类查询的访问量是否足够大、是否值得为它单独付出一个集群的运维成本。第四个维度是是否需要全文索引:团队发现自己的信息描述内容较长、需要做全文索引,但全文索引查询在整体查询量里占比其实很低,如果每个按前三个维度切出来的集群都各自包含完整的全文索引描述内容,索引体积会普遍偏大、成本和维护难度都随之上升;于是团队专门用一个大集群统一承接全部的全文索引查询,让其余集群不再索引”信息描述内容”这个体积最大的字段,从而大幅缩小了其余集群各自的索引规模。这四个维度组合起来给出的启示是:单一维度的集群切分往往不足以充分应对复杂业务的真实查询特征,真正贴合业务的切分策略需要综合考察多个正交的维度(访问特征、时效性要求、业务重要度、内容体积特征),并针对每个维度背后真实存在的业务规律(一级类目固定、新鲜度敏感场景占比高、全文索引查询占比低)分别设计对应的切分逻辑。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.3 百姓网Elasticsearch2.x升级之路"节,"6.3.4 百姓之道"及"6.3.7 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter6_3_5.xhtml、Chapter6_3_8.xhtml) - 结论依据:原文详细说明routing切分("用户访问(带有uid)将指向到uid集群……查询一个城市的二手手机将会指向到city+second_category集群")、时间切分("week(N百万级),2month(N千万级),full(N亿级)")、业务切分("这个集群只包含了特定数据的集群……主要看相关查询量是否很大")、全文索引隔离("一个大的集群可以提供全部全文索引查询,那么另外的集群就不需要索引'信息描述内容'"),直接支撑本卡片结论。 - 原始内容:routing:uid,first_category,city+second_category……fulltext&&normal Cluster……我们根据业务特点划分了不同的集群,如果每个集群都包含了信息描述内容,索引都会很大……Time:week(N百万级),2month(N千万级),full(N亿级)。