Elasticsearch分片本质与集群的故障转移

分片简介

primary shard:主分片,提升系统存储容量,通过主分片将数据分布在所有节点上,主分片可以将一个索引的数据分散在多个数据节点上,从而实现数据存储的水平扩展。主分片数在索引创建的时候指定,后续不能修改,如果需要修改则需要重建索引

replica shard:副本分片,提高数据可用性,一旦主分片丢失,副本分片可以晋升成为主分片。副本分片可以动态调整。如果不设置副本分片,一旦节点出现故障就可能会导致数据丢失。副本分片一定程度上也可以提升读取的吞吐量

分片本质

分片是Elasticsearch中的最小工作单元,本质上是一个Lucene Index。在Lucene中,单个倒排索引文件被称为Segment,Segment是自包含且不可变更的,多个Segment汇总在一起称为Lucene Index

当有新文档生成时,会生成新的Segment,查询时会同时查询所有Segment,并且对结果汇总,Lucene中有一个文件用来记录所有Segments信息,叫做Commit Point,删除的文档信息,保存在.del文件中
在这里插入图片描述
Refresh

将数据从Index Buffer写入Segment,默认1s执行1次(可以通过index.refresh_interval配置),refresh后数据才能被检索。如果系统有大量的数据写入,则会产生很多Segment。Index Buffer被占满时也会触发refresh操作,默认是JVM的10%

在这里插入图片描述
Transaction Log

Segment写入磁盘的过程相对耗时,借助文件系统缓存,refresh时先将Segment写入缓存以开放查询。同时为了保证数据不会丢失,在Index Document时,同时写Transaction Log,高版本开始Transaction Log默认落盘。每个分片有一个Transaction Log,在refresh时,Index Buffer被清空,Transaction Log不会被清空

在这里插入图片描述
Flush

Elasticsearch Flush & Lucene Commit:调用refresh,将Index Buffer清空,调用fsync,将缓存中的Segment写入磁盘,清空Transaction Log。默认30分钟一次。Transaction Log占满时也会触发,默认512MB

Merge

定期合并Segment,删除已删除的文档,ES会自动执行,也可以手动使用API执行(POST my_index/_focemerge)

分片设定

主分片数过小,如果该索引增长很快,集群无法通过增加节点实现对这个索引的数据扩展;主分片数设置过大,导致单个Shard容量很小,引发一个节点上有过多分片,影响性能;副本分片数设置过多会降低集群整体的写入性能

案例:设置number_of_shards:3;number_of_replicas:1
在这里插入图片描述

故障转移

节点1是Master,节点出现故障后集群重新选举Master节点,Node3上的R0提升为P0,集群变黄,R0和R1分配,集群变绿
在这里插入图片描述

补充

倒排索引的不可变性:倒排索引采用Immutable Design,一旦生成就不可改变。
优势:

  • 无需考虑并发写文件的问题,避免了锁机制带来的性能问题
  • 一旦读入内核的文件系统缓存,便停留在那里,只要文件系统有足够的空间,大部分请求会直接请求内存,不会命中磁盘,提升性能,且缓存容易生成和维护,数据可以被压缩

弊端:

  • 如果需要让一个新的文档被搜索,需要重建整个索引
发布了18 篇原创文章 · 获赞 15 · 访问量 365

猜你喜欢

转载自blog.csdn.net/momo57l/article/details/104325028