栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ES负载均衡策略

ES负载均衡策略

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 个数的节点;

    Decider类,负责判断并决定是否要进行分配

    负载均衡类

  • SameShardAllocationDecider: 避免主副分片分配到同一个节点;
  • AwarenessAllocationDecider: 感知分配器, 感知服务器, 机架等, 尽量分散存储 Shard;对应的配置参数有:

    cluster.routing.allocation.awareness.attributes: rack_id

    cluster.routing.allocation.awareness.attributes: zone

  • ShardsLimitAllocationDecider: 同一个节点上允许存在同一个 index 的 shard 数目

    index.routing.allocation.total_shards_per_node: 表示该索引每个节点上允许最多的 shard 数量;默认值=-1, 表示无限制;cluster.routing.allocation.total_shards_per_node: cluster 级别, 表示集群范围内每个节点上允许最多的 shard 数量, 默认值=-1, 表示无限制;index 级别会覆盖 cluster 级别

    并发控制类

  • ThrottlingAllocationDecider: recovery 阶段的限速配置, 避免过多的 recovering allocation 导致该节点的负载过高

    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: 统一配置上面两个配置项

  • ConcurrentRebalanceAllocationDecider: rebalace 并发控制, 表示集群同时允许进行 rebalance 操作的并发数量;

    cluster.routing.allocation.cluster_concurrent_rebalance, 默认值=2
    通过检查 RoutingNodes 类中维护的 reloadingShard 计数器, 看是否超过配置的并发数

  • DiskThresholdDecider: 根据节点的磁盘剩余量来决定是否分配到该节点上;

    cluster.routing.allocation.disk.threshold_enabled, 默认值=true;

    cluster.routing.allocation.disk.watermark.low: 默认值=85%, 达到这个值后, 新索引的分片不会分配到该节点上;

    cluster.routing.allocation.disk.watermark.high: 默认值=90%, 达到这个值后, 会触发已分配到该节点上的 Shard 会 rebalance 到其他节点上去;

    条件限制类

  • RebalanceOnlyWhenActiveAllocationDecider: 所有 Shard 都处于 active 状态下才可以执行 rebalance 操作
  • FilterAllocationDecider: 通过接口动态设置的过滤器; cluster 级别会覆盖 index 级别;

    require 表示必须满足, include 表示可以分配到指定节点, exclude 表示不允许分配到指定节点;

    {attribute} 还有 ES 内置的几个选择, _name, _ip, _host;

  • ReplicaAfterPrimaryActiveAllocationDecider: 保证只在主分片分配完成后(active 状态)才开始分配副本分片;
  • ClusterRebalanceAllocationDecider: 通过集群中 active 的 shard 状态来决定是否可以执行 rebalance;

    cluster.routing.allocation.allow_rebalance

    indices_all_active(默认): 当集群所有的节点分配完成, 才可以执行 rebalance 操作;

    indices_primaries_active: 只要所有主分片分配完成, 才可以执行 rebalance 操作;

    always: 任何情况下都允许 rebalance 操作;

  • MaxRetryAllocationDecider: 防止 shard 在失败次数达到上限后继续分配;

    index.allocation.max_retries: 设置分配的最大失败重试次数, 默认值=5;

    其他决策类

  • EnableAllocationDecider: 设置允许分配的分片类型; index 级别配置会覆盖 cluster 级别配置

        all(默认): 允许所有类型的分片;
    primaries: 仅允许主分片;
    new_primaries: 仅允许新建索引的主分片;
    none: 禁止分片分配操作;

  • NodeVersionAllocationDecider: 检查分片所在 Node 的版本是否高于目标 Node 的 ES 版本
  • SnapshotInProgressAllocationDecider: 决定 snapshot 期间是否允许 allocation, 因为 snapshot 只会发生在主分片上, 所以该配置只会限制主分片的 allocation

    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。此设置不影响将副本分片升级为主分片;此设置不影响之前未分配的副本分片;在整个集群重新启动后, 该延迟分配不会生效;

  • 转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/758218.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号