1 场景
场景:需要将40G数据从Mysql迁移到es,数据内容按照产品、语言进行分类,项目和语言都会不断的新增。
使用方式:同一产品多语言查询、跨产品查询关键信息、同一语言查询关键字等。
2 拆分
如何拆分主要从容量、速度、查询、入库、后续扩展、准确性等维度进行考虑。
2 .1 容量
es在按照index存储数据时,默认采用的是5个分片(官方推荐分片数=1.5~3倍的节点数),每个分片不存储超过30G数据(es推荐的最大JVM空间)。
我们目前大概拥有40G数据,即使不做拆分,5个分片容量足够用很长时间,如果不够的话,可以动态进行扩容,新建其他index解决(如按照时间划分,每年存一个index)。
如果拆分的话,一般es一次查询最多不能超过1000个分片(不建议更改),若按照产品与语言划分,他们的总数不能超过200种(即200个index)。
2 .2 速度
es的查询过程为先找到指定的index对应的所有分片,并发对每个分片请求并获得结果,最终在请求节点对每个分片的结果进行合并。
针对目前的es集群状态,即:一个8g16核的节点和一个1g1核的节点
a) 全语言查询
如果按照语言划分的话(假定30种),每次需要对150个分片的结果并发查询,然后统一进行合并,
不划分的话,每次对5个分片的结果进行查询并合并。
理论上,只要cpu负荷和内存未告警的话,由于各个分片上的查询结果是并发的,拆分查询速度更快。
b)指定语言或产品查询
拆分index可以减少查询的分片总数,提高查询效率。
2 .3 查询
es查询条件包括两个部分:head和body
body部分主要是针对具体的条件进行过滤,和index拆分没有关系。
head部分需要指定相应的index,因此,如果对index按照语言或者产品进行过滤时,查询效率更高,只是在生成index时,按照一定规则生成即可。
2 .4 入库
拆分的话,需要根据记录信息分别生成index,简单的按产品或语言拆分几乎没有影响。
2 .5 性能瓶颈扩展
不管拆分与否,新增节点都能提高搜索性能
2 .6 查询结果的准确性
主分片对不同分片评分结果汇总,是根据每条记录中词条的出现频率和权重进行计算,即限定在document层面,和分片无关,因此拆分与否,不影响查询结果的准确性
3 结论
如果单个index在查询时,可以控制在1s之内,则不拆分更简单。
如果单index查询较慢,拆分在查询单产品或语言时会提高查询速度,如果产品可能越来越多,全品类查询时,可能会超过1000分片,建议按照语言进行分类。