1:集群会任意挑选一个节点,就做协调节点,协调节点会hash数据,计算出当前数据的对应shard
2:协调节点会将数据路由到该shard的primary shard ,写入数据
3:primary shard 会同步数据到该shard的replica shard
4:全部写完,协调节点会通知客户端,写入完成
详细流程:
1:写入内存buffer中,同时写入translog日志(保证节点所在机器宕机,当前进程的数据不会丢失)
2:如果buffer快满了,或者到一定的时间,就会将buffer中的数据refresh到一个磁盘中的os cache中,每隔1秒,把buffer中的数据refresh到磁盘中的os cache中。
只要数据refresh到os cache,那么客户端就可以查询到数据。
只要数据被refresh到os cache中,buffer中的数据就会被清空。
3:ES一直重复写入数据,buffer会每隔一秒清空,但是translog日志是一直增加,逐渐增大的,到一定程度,就会执行commit操作。
commit操作的步骤: 1:写commit point (用于标识当前commit对应的多个segment file)
2:将os cache数据fsync强刷到磁盘中去(一个一个的segment file文件中)
3:清空translog日志文件
commit执行条件: 1:每隔30分钟
2:手动commit
问题1:ES为什么是准实时的?
ES数据是每隔一秒把数据从buffer中refresh到segment file中(首先会先进入os cache中),默认一秒,所以是准实时的,当然也可以自己手动refresh。
问题2:translog日志的作用?
因为os cache 和 buffer都是内存文件,一旦存储当前数据的节点所在机器宕机,那么数据就会丢失,translog日志是持久化到机器上,可以用于后面的数据恢复。
问题3:ES会存在5秒的数据丢失,为什么?
因为数据被写入translog日志并不是直接写入translog日志,而是先写入os cache中,然后每隔5秒刷到磁盘中。中间有5秒的数据是存在内存中的。