有个人长的像洋葱,走着走着就哭了…….

ES写数据过程及宕机是否会产生数据丢失的疑问

Elasticsearch | 作者 wangxinrong | 发布于2020年10月23日 | 阅读数:4216

写数据的过程是不是这样:
1.用户请求任意一台ES节点(coordinating node)。
2.该节点做routing把请求分发到对应主分片的机器上。
3.主分片写入数据到buffer(同时记录translog)。并且同步到副本(写入buffer和记录translog)。
4.当主和副本都完成上述写入后,返回结果给那台coordinating node,然后这个节点返回给用户,用户认为写入成功。
5.在refresh之后,buffer中的数据进入新segment,存储在OS cache中,此时变得可查。
6.flush之后,OS cache中的所有segment进行合并,生成的新segment会写入磁盘,同时translog被清空。
7.如果是bulk写入,要在所有相关分片都完成主副本成功写入后,才会返回给用户成功。
 
如果上面描述的过程正确,是不是可以得到以下结论:
1.在translog为默认同步的设置下,即使不开副本,在任何时候也不会丢失数据,节点宕机重新启动后,数据都可以从translog中恢复
2.在不开副本,并且translog为异步的设置下,假如sync_interval为60s,那么节点宕机,最多会丢失60s的写入的数据。
3.在开启副本的情况下,不管translog是不是异步,在任何时候也不会丢失数据,因为返回给用户成功时,主和副本都已经同步了请求写入的数据,即使主分片宕机,副本也有完整数据。
4.由于各节点各分片的refresh操作是独立的,假设是30s,那么在写入成功后立即查询,有可能是先在主分片上能查到,也有可能是先在副本分片上查到,最长要在30s之后,才能一定在主、副本分片上都查到。
5.如果是bulk写入,某一台节点磁盘性能很差,会因为一台机器影响到整个索引的数据写入。
 
不知道我上面的理解是不是正确,如果有地方不对还请指正。
已邀请:

JiangJibo - 喊我雷锋

赞同来自:

写过程的第5步,也会触发segment merge 

Charele - Cisco4321

赞同来自:

楼主分析得很不错!学习了。
 
我一只有一个疑问,比如
一个索引("index.refresh_interval" = -1),就是禁止它refresh
然后我插入一条数据,然后再flush一下,
请问我现在可以search到这个数据吗?
 

zqc0512 - andy zhou

赞同来自:

1.translog 这玩意有时间限制的。也不要开过大。
2.副本和分片是为了安全与 查询的命中问题。
3.为了性能 副本同步 有个异步机制(sync),主写完了就返回 这可能会丢数据的,会从主同步
 

zqc0512 - andy zhou

赞同来自:

默认是同步,大数据量的时候影响性能,
"index.translog.durability" : "async"

要回复问题请先登录注册