elasticsearch 读写原理
读过程(各节点间各分片间负载均衡)
1.客户端发送get请求到任意一个node节点,然后这个节点就称为协调节点,
2.协调节点对document进行路由,将请求转发到对应的node,此时会使用随机轮询算法,在primary shard 和replica shard中随机选择一个,让读取请求负载均衡,
3.接收请求的node返回document给协调节点,
4.协调节点,返回document给到客户端
搜索过程
1.客户端发送请求到协调节点,
2.协调节点将请求大宋到所有的shard对应的primary shard或replica shard ;
3.每个shard将自己搜索到的结果返回给协调节点,返回的结果是dou.id或者自己自定义id,然后协调节点对数据进行合并排序操作,最终得到结果。
4.最后协调节点根据id到个shard上拉取实际 的document数据,左后返回给客户端。
写过程
1.客户端通过hash选择一个node发送请求,这个node被称做coordinating node(协调节点),
2.协调节点对docmount进行路由,将请求转发给到对应的primary shard
3.primary shard 处理请求,将数据同步到所有的replica shard
4.此时协调节点,发现primary shard 和所有的replica shard都处理完之后,就反馈给客户端。
写原理:

除了图中的步骤,还有一个 commit 操作(这个过程叫 flush ):
(默认每30分钟执行一次)
1.执行refresh
2.强制刷盘,fsync
3.创建提交点,记录提交id和多个 segment 文件的关系,写入 commit point 文件
4.清空 translog
由于segment file文件1s产生一个,因为文件个数很多,所以es 会自动 merge 操作将多个 segment 文件合并为一个文件
如果是删除操作,commit操作的时候就会生成一个.del文件,将这个document标识为deleted状态,在搜索的搜索的时候就不会被搜索到了。
如果是更新操作,就是将原来的document标识为deleted状态,然后新写入一条数据