深入理解shard
2016-06-04 本文已影响2337人
jacksu在简书
索引存储的时候会分为shard,这样可以提高读写性能,并可以实现负载均衡。
索引不变性
索引一旦被创建,就不可改变。
动态索引
如何在保持不可变好处(顺序写、缓存在内存)的同时更新倒排索引,不是重写整个倒排索引,而是增加额外的索引反映最近的变化。
elasticsearch索引组成
索引组成.pngLucene引入了per-segment search,每个segment就是一个倒排索引,但是Elasticsearch下是segment的集合,当Elasticsearch搜索索引时,它发送查询请求给该索引下的所有shard,然后过滤这些结果,聚合成全局的结果。
建立索引
内存缓存区有即将提交文档的Lucene索引.png 提交后,新的段加到了提交点,缓存被清空.png- 新的文档首先写入内存区的索引缓存。
- 隔一段时间,buffer被提交:一个新的segment(一个额外的新的倒序索引)将被写到磁盘,一个新的提交点(commit point)(包含新的segment的名称)被写入磁盘。 磁盘fsync,所有在内核文件系统中的数据等待被写入到磁盘,来保障它们被物理写入。
- 新的segment被打开,使它包含的文档可以被索引。
- 内存的缓存被清除,等待接受新的文档。
近实时
上面是没有刷新的情况下,加入刷新的情况(默认1秒)如下:
缓存内容已经写到段中,但是还没提交.png
在内存中索引的文档会被写入到一个新的segment。但是现在我们将segment首先写入到内核的文件系统缓存,这个过程很轻量,然后再flush到磁盘,这个过程很耗时。但是一旦一个segment文件在内核的缓存中,它可以被打开被读取。
防丢失
Translog.png
写缓存的同时,在写translog。
提高查询性能
合并segment
合并segment.png
elaticsearch自动在后台完成segment的合并,新的segment随后flush到硬盘,写入新的提交点并删除旧的段。随后新的段打开供搜索,旧的段被删除。
也可以通过optimize API完成segment的合并。