ES(ElasticSearch)调优/倒排索引/脑裂/选举/索引过多/冷热数据分离 等知识点总结

1. ES调优

1. rollover api

  • 根据业务增长需求,采取基于日期创建索引,通过rollover api滚动索引。
(ES版本5.0以上)通过调用RollOver接口结合时间工具,实现索引的按日期动态滚动。

curl -XPOST 'localhost:9200/in_test/_rollover?pretty' -H 'Content-Type: application/json' -d'

{

  "conditions": {

  "max_age":   "30d",

  "max_docs":  1000000,

  "max_size":  "500gb",

  }

}

'

如果系统中需要按月生成新索引或者当文档数达到100万条、索引大小达到500G时生成新索引,可以采用上面的命令。

公司中根据按月生成新索引。

2. 使用别名进行索引管理

3. force_merge api

每月对ES索引做force_merge操作,以释放空间。

  1. es中默认segment最大大小为5G.
  2. 对es数据进行term等查询时,segment越多,对文件句柄、内存等消耗及浪费越大,文件寻址时间就越久,查询效率越低。
  3. 为了提高查询效率,我们会将max_num_segments尽量设置小(最好为1),然后在负载较低时间段,通过forcemerge接口,强制归并segment.
max_num_segments, 设置最大segement数量,数量越小,查询速度提高越明显,但merge耗时越长

4. shrink api

  • 一般与rollover api共同使用
  • 默认情况下,es每个索引下的shard分片数为固定的,虽然这极大减小了分布式系统的复杂度。但是在小数据量的数据存储下,我们希望将多分片的新旧数据进行合并存储,以减少cluster state容量,
从 5.0 版本开始,Elasticsearch 新提供了 shrink 接口,可以成倍数的合并分片数。

注:所谓成倍数的,就是原来有 15 个分片,可以合并缩减成 5 个或者 3 个或者 1 个分片。

5. 冷热分离

  • 采取冷热分离,将热数据(半年内数据)放到SSD,冷数据定期进行Shrink操作,以缩减存储。
    对于冷数据不会再写入新数据,可以考虑定期force_merge加shrink压缩操作,节省存储空间和索引效率。

6. curator

采取curator进行索引的声明周期管理,将两年外的数据进行备份后删除

7. 分词

  • 仅针对需要分词的字段,合理设置分词器

8.写入时

  • 采用bulk批量写入

9.查询时

  1. 充分使用倒排索引机制,能使用keyword类型尽量使用keyword类型。
  2. 数据量大时,可以先基于时间敲定索引再检索。
  3. 设置合理的路由机制。
  4. 业务调优: 标签优化

将业务经常查询的数据及词进行打标签,统一放到nested结构中,当业务再次使用时,只需查询nested对应词的标签即可,无需再进行分词查询,极大地提高了速度。

2. 倒排索引

底层: FST(Finite State Transducer)
FST优点:

  1. 空间占用小。
  1. 通过对词典中单词前缀和后缀重复利用,压缩了存储空间。
    2.查询速度快

具体不再赘述,原理较简单。

3. ES索引多了怎么办

  1. 索引的规划应在前期做好准备和规划,这样才能避免突如其来的数据激增导致处理能力不足引发的线上客户检索或其它业务受到影响。
  2. 动态索引层面
    基于模板+时间+rollover api滚动创建索引
    不至于数据量激增导致单个索引数据量非常大
  3. 存储层面
  • 采取冷热分离,将热数据(半年内数据)放到SSD,冷数据定期进行Shrink操作,以缩减存储。
  • 对于冷数据不会再写入新数据,可以考虑定期force_merge加shrink压缩操作,节省存储空间和索引效率。
  1. 部署层面
    结合ES自身支持的动态索引扩展特点,动态新增机器的方式可以缓解集群压力。
  • 注意: 若之前主节点等规划合理,不需要重启机群也能完成动态新增。

4. ES脑裂

1.什么是脑裂

  • 正常情况下,1个ES集群只有一个主节点。主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点。所以无论访问哪个节点都可以查看到集群的状态信息。而脑裂问题的出现就是因为从节点在选取主节点上出现分歧,导致一个集群出现了多个主节点,从而使集群出现分裂,使得集群处于异常状态。

2. 原因

1. 网络原因

内网一般不会出现,可以监控内网流量状态,外网出现的可能性比较大

2. 节点负载

主节点既负责管理集群又要存储数据,当访问量大时,可以导致es实例反应不过来,无法作出相应。此时其他节点在向主节点发送信息时得不到主节点的信息,会认为主节点挂了,从而重新选择主节点。

3. ES选举机制

  1. ES集群一旦建立起来,会选举出一个master,其他都为slave,但操作时,每个节点都可提供写和读操作,就是说无论往哪一个节点做写操作都会分配到集群中所有节点上。
  2. 若此时有节点挂掉
  • 1.如果为slave,则需关心数据是否会丢失,因ES开启了副本机智,所以数据不会丢失。备份数据节点会自动升格为这份分片数据的主分片。
  • 2.所谓主节点,从节点发现主节点无法连接,会自己决定再选举出一个节点作为主节点
    这里有一个脑裂问题,若有5台机器,3台在1个机房,2台在另一个机房。两个机房间断了联系后,每个机房节点会自己聚合,推举出一个主节点,此时就有2个主节点。当机房间联系恢复,就出现了数据冲突。

4. 预防脑裂

1. 分离角色

在es集群中配置2-3个主节点并且让他们只负责管理不负责存储,从节点禁用自动发现机制并为其指定主节点。

在elasteicsearch.yml中
主节点: node.master=true   node.data=false
从节点: node.master=false  node.data=true
discovery.zen.ping.multicast.enabled:false

2. 参数配置

  1. discovery.zen.ping_timeout=3

此参数指定从节点访问主节点后若3s内无回复则默认主节点挂了,可把它适当调大,以减少脑裂概率
2. discovery.zen.mininum_master_nodes:1

当具备成为主节点的从节点的个数满足这个数字且都认为主节点挂了则会进行选举产生新的主节点

如: es集群有3个从节点有资格成为主节点,这时这3个节点都认为主节点挂了,则会进行选举,此时如果这个参数值为4,则不会进行选举。可适当把这个值调大,减少出现脑裂的概率,官方给出的建议为:(n/2)+1,n为有资格成为主节点的节点数node.master=true.

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值