学会这个ES数据建模指南,还需要啥MySQL?( 三 )


比如微博信息来源字段有手机App或者网页等 , 别的业务索引如果没有 , 独立建模就可以 。
类似这些建模信息可以统一Excel存储 , 统一git多人协作管理 。
多索引管理一般优先推荐使用模板(template)和别名(alias)结合的方式 。 模板的特点:相同前缀名称的索引可以归结为一大类 , 一次创建 , N多索引共享 , 非常方便 。 别名的特点:多个索引可以映射到一个别名 , 方便多索引以相同的名称统一对外提供服务 。
学会这个ES数据建模指南,还需要啥MySQL?
文章图片
2、基于数据量角度建模
如本文前面所述 , 我是吃过单索引激增的亏 , 所以对于时序性数据(日志数据、大数据类数据)等 , 我强烈建议你基于时间切分索引 , 具体如下图所示 。
学会这个ES数据建模指南,还需要啥MySQL?
文章图片
当然 , 其他可用的方案非常多 , 这里我列举如下 , 供你选型参考 。
学会这个ES数据建模指南,还需要啥MySQL?
文章图片
由此可见 , 时序管理数据的优点非常明显 。 其一是灵活 。 基于时间切分索引非常方便 , 删除数据属于物理删除 。 其二则是快速 。 特定业务数据配合冷热集群架构 , 确保高配机器对应热数据 , 提升检索效率和用户体验 。
3、基于Setting层面建模
Setting层面又分为静态Setting和动态Setting两种 。
一种是静态Settings , 一旦设置后 , 后续不可修改 。 如number_of_shards 。
另一种是动态Setting , 索引创建后 , 后面随时可以更新 。 如number_of_replicas,max_result_window,refresh_interval 。
仅就建模阶段最核心的问题 , 拆解如下 。
问题一:索引设置多少个分片?多少个副本?
这里有个认知前提 , 就是主分片数一旦设置后就不可以修改 , 副本分片数可以灵活动态调整 。
主分片设计一般会考量总体数据量、集群节点规模 , 这点在集群规划层面会着重强调 。 一般主分片数要考虑集群未来动态扩展 , 通常设置为数据节点的1倍或者1~3倍之间的值 。
副本分片是保证集群的高可用性 , 普通业务场景建议至少设置一个副本 。
问题二:refresh_interval一般设置多大?
默认值1s , 这意味着在写入阶段 , 每秒都会生成一个分段 。
refresh_interval的目的是:数据由indexbuffer的堆内存缓存区刷新到堆外内存区域 , 形成segment , 以使得搜索可见 。
在实际业务场景里 , 如果写入的数据不需要近实时搜索可见 , 可以适当地在模板、索引层面调大这个值 , 当然也可以动态调整 , 比如调整为30s或者60s 。
问题三:max_result_window要不要修改默认值?
这里同样有个认知前提 , 就是对于深度翻页的from+size实现 , 越往后翻页越慢 。 其实你对比看主流搜索引擎 , 比如Google、百度、360、Bing均不支持一下跳转到最后一页 , 这就是最大翻页上限限制 。
其实在基本业务层面也很好理解 , 按照相关度返回结果 , 前面几页是最相关的 , 越往后相关度越低 。 比如默认值10000 , 也就是说如果每页显示10条数据 , 可以翻1000页 。 基本业务场景已经足够了 。 因此不建议调大该值 。
如果需要向后翻页查询 , 推荐search_after查询方式 。 如果需要全量遍历或者全量导出数据 , 推荐scroll查询方式 。
问题四:管道预处理怎么用?
管道预处理的好处很多 , 虽然5.X版本就有了这个功能 , 但实战环境用起来还不多 。
管道ingestpipeline就相当于大数据的ETL抽取、转换、加载的环节 , 或者类似logstashfilter处理环节 。 一些数据打标签、字段类型切分、加默认字段、加默认值等的预处理操作都可以借助ingestpipelie实现 。