赞
踩
Elasticsearch引入分片的概念,一个索引被分成多个分片,每个分片可以有一个主分片和多个副本分片,每个分片副本都是一个具有完整功能的lucene实例。
refresh操作的时间间隔由refresh_interval参数控制,默认为1s, 当然还可以在写入请求中带上refresh表示写入后立即refresh,根据refresh从内存刷新到内存缓存区segment上。
任何节点都可以接受写入请求。根据_routing字段(不指定时默认id字段进行shard_num = id hash(\routing) % num_primary_shards)找到对应的主分片,后将请求转发给primary shard, 主分片完成写入后,将写入并发发送给各副本, 副本执行写入操作后返回给主, 主再将请求返回给协调节点(接受请求节点)。大致流程如下图:
1:接受bulk请求,接受请求节点根据请求按照routing按照shard分开,同一个shard上的请求聚合到一起,构建BulkShardRequest
2:把请求路由到primary shard所在节点
3:主分片所在节点根据请求方式,mapping进行字段解析写入,先写入内存缓存区再写入translog
4:达到translog时间进行落盘,默认1S。对数据可靠性和数据实时性要求不高可以提高参数,也能大幅提高写入性能
5:主分片写入完成后转发请求到副本所在节点进行写入
6:主副本都写入完成,协调节点返回结果给客户端
7:达到refresh时间将内存缓冲区数据刷到一个新的segment file中此时可被查询到。主分片写入完成
1)客户端发送请求到任意一个node(没有协调节点时任一数据节点),成为coordinate node(协调节点)
2)协调节点将请求转发到对应的node,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的 优先队列。此时会使用随机轮询算法,在primary shard(主分片)以及其所有replica中随机选择一个,让读请求负载均衡
3)接收请求的node返回一个轻量级的结果列表到协调节点,它仅包含文档 ID 集合以及任何排序需要用到的值,例如 _score给协调节点,协调节点进行数据的合并、排序、分页等操作,产出最终结果id
4)接着由协调节点,根据最终doc id去发送请求给同样处理查询阶段的分片副本。拉取实际的document数据,最终返回给客户端
4)建议不要使用深度翻页,基本10页以后不会去使用,返回更少的数据可提高查询性能,必须返回大量数据可以使用scroll查询
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。