ElasticSearch 常见问题

ElasticSearch 常见问题
1、说说 es 的一些调优手段 。仅索引层面调优手段:1.1、设计阶段调优(1)根据业务增量需求 , 采取基于日期模板创建索引 , 通过 roll over API 滚动索引;(2)使用别名进行索引管理;(3)每天凌晨定时对索引做 force_merge 操作 , 以释放空间;(4)采取冷热分离机制 , 热数据存储到 SSD , 提高检索效率;冷数据定期进行 shrink操作 , 以缩减存储;(5)采取 curator 进行索引的生命周期管理;(6)仅针对需要分词的字段 , 合理的设置分词器;(7)Mapping 阶段充分结合各个字段的属性 , 是否需要检索、是否需要存储等 。1.2、写入调优(1)写入前副本数设置为 0;(2)写入前关闭 refresh_interval 设置为-1 , 禁用刷新机制;(3)写入过程中:采取 bulk 批量写入;(4)写入后恢复副本数和刷新间隔;(5)尽量使用自动生成的 id 。1.3、查询调优(1)禁用 wildcard;(2)禁用批量 terms(成百上千的场景);(3)充分利用倒排索引机制 , 能 keyword 类型尽量 keyword;(4)数据量大时候 , 可以先基于时间敲定索引再检索;(5)设置合理的路由机制 。1.4、其他调优部署调优 , 业务调优等 。2、什么是 ES 倒排索引?通俗解释:
传统的我们的检索是通过文章 , 逐个遍历找到对应关键词的位置 。而倒排索引 , 是通过分词策略 , 形成了词和文章的映射关系表 , 这种词典+映射表即为倒排索引 。有了倒排索引 , 就能实现 O(1)时间复杂度的效率检索文章了 , 极大的提高了检索效率 。

ElasticSearch 常见问题

文章插图
学术解释:
倒排索引 , 相反于一篇文章包含了哪些词 , 它从词出发 , 记载了这个词在哪些文档中出现过 , 由两部分组成——词典和倒排表 。倒排索引的底层实现是基于:FST(Finite State Transducer)数据结构 。lucene 从 4+版本后开始大量使用的数据结构是 FST 。FST 有两个优点:(1)空间占用小 。通过对词典中单词前缀和后缀的重复利用 , 压缩了存储空间;(2)查询速度快 。O(len(str))的查询时间复杂度 。 
ElasticSearch 常见问题

文章插图
3、ES 索引数据多了怎么办?如何调优、部署?索引数据的规划 , 应在前期做好规划 , 正所谓“设计先行 , 编码在后” , 这样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他业务受到影响 。如何调优 , 正如问题 1 所说 。3.1 动态索引层面基于模板+时间+rollover api 滚动创建索引 。举例:设计阶段定义:blog 索引的模板格式为:blog_index_时间戳的形式 , 每天递增数据 。这样做的好处:不至于数据量激增导致单个索引数据量非常大 , 接近于上线 2 的32 次幂-1 , 索引存储达到了 TB+甚至更大 。一旦单个索引很大 , 存储等各种风险也随之而来 , 所以要提前考虑+及早避免 。3.2 存储层面冷热数据分离存储 , 热数据(比如最近 3 天或者一周的数据) , 其余为冷数据 。对于冷数据不会再写入新数据 , 可以考虑定期 force_merge 加 shrink 压缩操作 , 节省存储空间和检索效率 。3.3 部署层面一旦之前没有规划 , 这里就属于应急策略 。结合 ES 自身的支持动态扩展的特点 , 动态新增机器的方式可以缓解集群压力 , 注意:如果之前主节点等规划合理 , 不需要重启集群也能完成动态新增的 。4、elasticsearch 是如何实现 master 选举的?前置前提:(1)只有候选主节点(master:true)的节点才能成为主节点 。(2)最小主节点数(min_master_nodes)的目的是防止脑裂 。核对了一下代码 , 核心入口为 findMaster , 选择主节点成功返回对应 Master , 否则返回 null 。选举流程大致描述如下:第一步:确认候选主节点数达标 , elasticsearch.yml 设置的值 discovery.zen.minimum_master_nodes;第二步:比较 , 先判定是否具备 master 资格 , 具备候选主节点资格的优先返回;若两节点都为候选主节点 , 则 id 小的值会主节点 。注意这里的 id 为 string 类型 。1 GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name 2 ip port heapPercent heapMax id name

经验总结扩展阅读