疲劳是最舒适的枕头,努力工作吧。

es的数据写入,主分片和副本分片数据一致性问题

Elasticsearch | 作者 jianjianhe | 发布于2018年05月31日 | 阅读数:13557

这个问题我一直有个疑问,我用的es2.x版本,官网的文档也是基于2.x的版本,文档的原文这样写的:
Node 3 executes the request on the primary shard. If it is successful, it forwards the request in parallel to the replica shards on Node 1 and Node 2. Once all of the replica shards report success, Node 3 reports success to the coordinating node, which reports success to the client.
简单来说就是主分片写完,在同步到副本分片上,等待所有的分片写完才返回成功(Once all of the replica shards report success),即数据写入,主副本之间采用的是同步写入。
第一个疑问:
这个操作时对一批写入数据而言,还是一条数据而言,个人理解应该是该次写入请求的写入数据量,那么如果我一次写入数据很大,要等主分片和副本分片写完,再返回响应,这个等待时间是否太久;
第二个疑问:
因为es有个translog,就是为了保证数据写入安全,在hbase中,只要数据写入并在WAL日志(类似translog保证数据写入安全的日志文件)记录,即返回数据成功,并没有像es文档所说的等待所有分片写成功再返回;
第三个疑问:
es通过consistency参数控制数据的一致性,说白了就是在什么样情况下允许写入,在5.x中可以看到
"index.write.wait_for_active_shards"默认值为1
/**
* The number of active shard copies to check for before proceeding with a write operation.
*/
public static final Setting<ActiveShardCount> SETTING_WAIT_FOR_ACTIVE_SHARDS =
new Setting<>("index.write.wait_for_active_shards",
"1",
ActiveShardCount::parseString,
Setting.Property.Dynamic,
Setting.Property.IndexScope);
论坛上看到@yayg2008提供的es文档上,说明要写入到in-sync copies 的列表里的分片,直到列表所有分片响应成功,才响应client。这样无法就是改变了能否写入的条件(即主分片处于活跃状态写入就可以),但是数据的主副本一致性仍然采用的是同步方式,这样是不是效率仍然没有提高?
已邀请:

jianjianhe

赞同来自: forestlee

刚刚得到@yayg2008的回复,这里就把博主的回复拷贝过来:
index.write.wait_for_active_shards参数是控制写的前提条件。in-sync 关注的是写的过程。5.0开始都是同步写所有分片,官方说这样是为了保证读的一致性。所以副本越多,写入越慢,而且如果有一个shard非常慢,就会拖累其他节点。
感谢@yayg2008

forestlee - KD

赞同来自:

请问是哪个参数保证同步数据到所有分片成功(一致性)?@yayg2008

要回复问题请先登录注册