1 节点负载均衡
elasticSearch的配置文件中有两个参数:node.master和node.data
组合一:node.master:false node.data:true
该node服务器只作为一个数据节点,只用于存储索引数据。使该node服务器功能单一,只用于数据存储和数据查询,降低其资源消耗率。
组合二:node.master:true node.data:false
该node服务器只作为一个主节点,但不存储任何索引数据。该node服务器将使用自身空闲的资源,来协调各种创建索引请求或者查询请求,讲这些请求合理分发到相关的node服务器上。
组合三:node.master:false node.data:false
该node服务器即不会被选作主节点,也不会存储任何索引数据(协调节点)。该服务器主要用于查询负载均衡,处理路由请求,处理搜索,分发索引操作等。在查询的时候,通常会涉及到从多个node服务器上查询数据,并请求分发到多个指定的node服务器,并对各个node服务器返回的结果进行一个汇总处理, 最终返回给客户端。
独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
组合四:node.master:true node.data:true
这种组合表示这个节点即有成为主节点的资格,又存储数据,这个时候如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。
ES默认每个节点都是这样的配置,在节点数较少的场景下,可以如此分配,但当节点的较多时,需分配好各自角色,单独划分部分节点为master节点。
目前大部分局点的节点较少,都为此模式。
2 读请求负载均衡
- 客户端发送请求到任意一个 node(协调节点)
- 协调节点将搜索请求转发到所有的 shard 对应的 primary shard 或 replica shard其中一个,用 round-robin随机轮询算法,让检索请求负载均衡
- 每个 shard 将自己的搜索结果(doc id)返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出doc id list
- coordinate node 对 doc id 进行哈希路由,将请求转发到对应的 node,此时会使用 round-robin随机轮询算法,在primary shard和所有replica中随机选择一个,让读请求负载均衡
- 接收请求的node返回 document 给 coordinate node,由其返回 document 给客户端
3 数据均衡
3.1 触发条件
- 新索引的建立
- 索引的删除
- 新增副本分片
- 节点增减引发的数据均衡
3.2 分配机制
Shard allocation分片分配就是把一个分片分配到集群中某个节点的过程, ES通过两个基础组件来完成分片分配这个过程的: allocator 和 deciders
3.2.1 JAVA策略
allocator 类,用于寻找最优的节点来分配分片
- PrimaryShardAllocator 找到拥有某 Shard 最新数据(主分片)的节点;
- ReplicaShardAllocator 找到磁盘上拥有这个 Shard 数据(副本分片)的节点;
- BalancedShardsAllocator 找到拥有最少 Shard 个数的节点;