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 读请求负载均衡
3 数据均衡
3.1 触发条件
3.2 分配机制
Shard allocation分片分配就是把一个分片分配到集群中某个节点的过程, ES通过两个基础组件来完成分片分配这个过程的: allocator 和 deciders
3.2.1 JAVA策略
allocator 类,用于寻找最优的节点来分配分片
Decider类,负责判断并决定是否要进行分配
负载均衡类
cluster.routing.allocation.awareness.attributes: rack_id
cluster.routing.allocation.awareness.attributes: zone
index.routing.allocation.total_shards_per_node: 表示该索引每个节点上允许最多的 shard 数量;默认值=-1, 表示无限制;cluster.routing.allocation.total_shards_per_node: cluster 级别, 表示集群范围内每个节点上允许最多的 shard 数量, 默认值=-1, 表示无限制;index 级别会覆盖 cluster 级别
并发控制类
cluster.routing.allocation.node_initial_primaries_recoveries: 当前节点在进行主分片恢复时的数量, 默认值=4;
cluster.routing.allocation.node_concurrent_incoming_recoveries: 默认值=2, 通常是其他节点上的副本 shard 恢复到该节点上;
cluster.routing.allocation.node_concurrent_outgoing_recoveries: 默认值=2, 通常是当前节点上的主分片 shard 恢复副本分片到其他节点上;
cluster.routing.allocation.node_concurrent_recoveries: 统一配置上面两个配置项
cluster.routing.allocation.cluster_concurrent_rebalance, 默认值=2
通过检查 RoutingNodes 类中维护的 reloadingShard 计数器, 看是否超过配置的并发数
cluster.routing.allocation.disk.threshold_enabled, 默认值=true;
cluster.routing.allocation.disk.watermark.low: 默认值=85%, 达到这个值后, 新索引的分片不会分配到该节点上;
cluster.routing.allocation.disk.watermark.high: 默认值=90%, 达到这个值后, 会触发已分配到该节点上的 Shard 会 rebalance 到其他节点上去;
条件限制类
require 表示必须满足, include 表示可以分配到指定节点, exclude 表示不允许分配到指定节点;
{attribute} 还有 ES 内置的几个选择, _name, _ip, _host;
cluster.routing.allocation.allow_rebalance
indices_all_active(默认): 当集群所有的节点分配完成, 才可以执行 rebalance 操作;
indices_primaries_active: 只要所有主分片分配完成, 才可以执行 rebalance 操作;
always: 任何情况下都允许 rebalance 操作;
index.allocation.max_retries: 设置分配的最大失败重试次数, 默认值=5;
其他决策类
all(默认): 允许所有类型的分片;
primaries: 仅允许主分片;
new_primaries: 仅允许新建索引的主分片;
none: 禁止分片分配操作;
cluster.routing.allocation.snapshot.relocation_enabled
3.2.2 Shard allocation API
API:cluster.routing.allocation.enable
默认:all all: 允许分配所有类型的分片;primaries: 只允许分配主分片(primary shard); new_primaries: 只允许分配新索引的主分片(primary shard);none: 禁用分片分配
说明:启用或禁用针对特定类型分片的分配; 该设置不会影响重启节点时本地主分片的恢复
API:cluster.routing.allocation.node_concurrent_incoming_recoveries
默认:2
说明:一个节点允许并发的传入分片(incoming shard)数量
API:cluster.routing.allocation.node_concurrent_outgoing_recoveries
默认:2
说明:一个节点允许并发的传出分片(incoming shard)数量
API:cluster.routing.allocation.node_initial_primaries_recoveries
默认:4
说明:单个节点上同时初始化的主分片数量
API:cluster.routing.allocation.same_shard.host
默认:false
说明:是否执行检查, 以防止基于host name和host address, 在单个主机上分配同一分片的多个实例; 该设置仅用于在同一台计算机上启动多个节点的情况;
3.2.3 Shard rebalance API
控制集群之间的分片平衡
API:cluster.routing.rebalance.enable
默认:all all: 允许rebalancing所有类型的分片;primaries: 只允许rebalancing主分片;replicas: 只允许rebalancing副本分片; none: 禁用rebalancing;
说明:启用或禁用针对特定类型分片的rebalancing;
API:cluster.routing.allocation.allow_rebalance
默认:indices_all_active always: 总是允许;indices_primaries_active: 当集群中所有主分片已分配时才允许rebalancing;indices_all_active: 当集群中所有分片(包括主分片和副本分片)都已分配时才允许rebalancing;
说明:指定何时允许执行rebalancing;
API:cluster.routing.allocation.cluster_concurrent_rebalance
默认: 2
说明:指定整个集群中允许同时在节点间移动的分片数量; 该配置仅控制由于集群不平衡引起的并发分片分配数量, 对分配过滤(allocation filtering)或强制感知(forced awareness)的分片分配不做限制;
3.3 数据恢复机制
1)ES默认要求所有分片都正常启动成功以后,才可以进行数据均衡操作,否则的话,在集群重启阶段,会有不必要操作
2)ES默认可以有2个任务同时运行数据均衡。如果有节点增减且集群压力不高的情况下,通过cluster.routing.alloction.cluster_concurrent_rebalance 参数来控制
3)除了主分片恢复以外,ES默认2个任务同时运行数据恢复操作。所以,节点重启时,可以看到主分片迅速恢复完成,副本分片的恢复却很慢。除了副本分片本身数据要通过网络复制以外,并发线程本身也减少一半(默认同时有4个主分片恢复)。主分片一定是本地恢复,副本分片可能需要走网络,带宽有限。
3.4 延迟分配
设置延迟分配, 当节点离开时(来源)当某个节点由于突发原因, 比如网络中断, 人为操作重启等, 需要暂时离开集群时, 集群会立刻新建副本分片以替换丢失的副本, 然后在剩余的所有节点之间进行rebalancing, 这样导致在短时间内该突发节点又恢复过来后, 原先的副本就无法再使用, 集群会将刚才新建的副本分片再拷贝回到该节点上; 这样就会造成不必要的资源浪费, 以及节点分片rebalancing带来的波动;
可以使用 index.unassigned.node_left.delayed_timeout 动态设置来延迟由于节点离开而导致未分配的副本分片的分配问题; 该配置默认值 1m。此设置不影响将副本分片升级为主分片;此设置不影响之前未分配的副本分片;在整个集群重新启动后, 该延迟分配不会生效;



