1 文档放在哪个分片?
根据如下算法计算出存储的分片
shard = hash(routing) % number_of_primary_shards
routing字符串,默认是(_id)。根据这个算法能我们知道为什么分片被确定后就不能再被修改了
2 主分片和复制分片如何交互。
假设有3个节点,索引有2主分片,每个分片有2个复制分片,所以总共会有6个分片。
2.1 写操作:(新建、更新、删除)必须先在主分片完成后再复制到其他分片。
即,相关于写操作,要在该数据设计到的所有分片上完成之后,才会返回给客户端。这个可以通过
replication
来设置,默认(sync)。可以设置为async,主分片完成之后就返回。
2.2 局部更新操作:
2.3 读操作:检索文档。
可以从主分片或者任意复制分片操作。
3 数据存储
es建索引写入数据,数据最先是存在内存buffer里的,然后再刷入到lucene的底层文件segment中;写入segment完毕后再执行refresh操作,refresh操作后,数据将commit到磁盘中。数据刷入到了磁盘,就可以执行查询操作了。
过程简单描述如下:内存buffer-->segment(系统缓存、可被搜索)-->refresh-->磁盘