赞
踩
第一步:客户端发起请求到node4的1分片
第二步:node 4 通过文档id在路由表中的映射信息确定当前数据的位置为分片0,分片0的主分片位于node 5,将数据妆发到node5
第三步:数据在node 5写入,写入成功后数据的同步请求转发到副本所在的node 4和node 6
第四步:等待所有副本数据写入完成后,node5 返回结果给node4,node4 将结果返回给客户的
node 4 转到node 5 的依据是通过如下算法来完成的:
shard_num = hash(_routing)% num_primary_shards
ES的写入优化和其他数据库存储类似,就是避免直接对磁盘进行操作,通过加缓存的方式,如果加一层缓存不行,那么久多加一层缓存,通过backup文件追加写的方式来做crash-safe。大体思路就是如此,流程如下
ES是用java实现的,在写入的时候为写入实现提供了一个缓冲区 Memory Buffer,数据显写入缓冲区,缓冲区固定大小
Memory Buffer 有空间阈值 10% JVM heap,时间阈值 1s钟,当任意一个满足的时候,ES会对MemoryBuffer 进行Refresh,将缓存中数据写入Segment
MemoryBuffer 写入Segment文件并没有落盘,而是生成了一个临时的Segment索引这部分数据存储在文件系统缓存中,此时就能查询到新写入的数据
因为缓存数据可能丢失,为了做crash-safe,es从Memory Buffer到生成Segment索引缓存同时会通过追加写的方式 写入translog
Es会定期进行flush ,将缓存中的Segment写入到磁盘,写完后,会讲Segment索引标记为可用,所以写入到查询有1s延迟
第一点:多Merge的限制:
生产经常面临的写入可以分为两种情况:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。