草庐IT

ES负载均衡策略

weixin_42458519 2023-04-03 原文

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

有关ES负载均衡策略的更多相关文章

  1. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  2. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  3. ruby-on-rails - 覆盖 Controller 中的 protect_from_forgery 策略 - 2

    我想使用两种不同的protect_from_forgery策略构建一个Rails应用程序:一种用于Web应用程序,一种用于API。在我的应用程序Controller中,我有这行代码:protect_from_forgerywith::exception为了防止CSRF攻击,它工作得很好。在我的API命名空间中,我创建了一个继承self的应用程序Controller的api_controller,它是API命名空间中所有其他Controller的父类,我将上面的代码更改为:protect_from_forgery:null_session.遗憾的是,我在尝试发出POST请求时遇到错误:“

  4. ruby-on-rails - EC2 实例在负载均衡器中停止服务 - 2

    我有一个EC2实例正在运行。我有一个负载均衡器,它与EC2实例相关联。PingTarget:HTTP:3001/healthCheckTimeout:5secondsInterval:24secondsUnhealthythreshold:2Healthythreshold:10现在该实例显示为OutofService。我什至尝试更改监听端口等等。一切正常,直到重新启动我的EC2实例。任何帮助将不胜感激。仅供引用:我有一个在端口3001上运行的Rails应用程序,我有一个用于HTTP:80(loadbalancer)到HTTP:3001的监听器。我还在终端中通过ssh检查了正在运行的应

  5. ruby-on-rails - 负载测试期间 Unicorn CPU 使用率激增,优化方法 - 2

    我对为我的RubyonRails3.1.3应用优化我的Unicorn设置的方法很感兴趣。我目前正在高CPU超大实例上生成14个工作进程,因为我的应用程序在负载测试期间似乎受CPU限制。在模拟负载测试中,每秒大约20个请求重放请求,我的实例上的所有8个内核都达到峰值,盒子负载飙升至7-8个。每个unicorn实例使用大约56-60%的CPU。我很好奇可以通过哪些方式对其进行优化?我希望能够每秒将更多请求汇集到这种大小的实例上。内存和所有其他I/O一样完全正常。在我的测试过程中,CPU越来越低。 最佳答案 如果您受CPU限制,您希望使用

  6. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  7. ruby - 使用 Ruby Net 实现重新连接策略 - 2

    我正在开发一个将XML发布到某些网络服务的小型应用程序。这是使用Net::HTTP::Post::Post完成的。但是,服务提供商建议使用重新连接。类似于:第一个请求失败->2秒后重试第二个请求失败->5秒后重试第三次请求失败->10秒后重试...这样做的好方法是什么?简单地在循环中运行以下代码,捕获异常并在一定时间后再次运行?或者还有其他聪明的方法吗?也许Net包甚至有一些我不知道的内置功能?url=URI.parse("http://some.host")request=Net::HTTP::Post.new(url.path)request.body=xmlrequest.con

  8. 关于ES集群信息的一些查看 - 2

    文章目录查看ES信息查看节点信息查看分片信息实际场景下ES分片及副本数量应该怎么分关于ES的灵活使用查看ES信息查看版本kibana:GET/查看节点信息GET/_cat/nodes?v解释:ip:集群中节点的ip地址;heap.percent:堆内存的占用百分比;ram.percent:总内存的占用百分比,其实这个不是很准确,因为buff/cache和available也被当作使用内存;cpu:cpu占用百分比;load_1m:1分钟内cpu负载;load_5m:5分钟内cpu负载;load_15m:15分钟内cpu负载;node.role:上图的dilmrt代表全部权限master:*代表

  9. linux查看es节点使用情况,elasticsearch(es) 如何查看当前集群中哪个节点是主节点(master) - 2

    elasticsearch查看当前集群中的master节点是哪个需要使用_cat监控命令,具体如下。查看方法es主节点确定命令,以kibana上查看示例如下:GET_cat/nodesv返回结果示例如下:ipheap.percentram.percentcpuload_1mload_5mload_15mnode.rolemastername172.16.16.188529952.591.701.45mdi-elastic3172.16.16.187329950.990.991.19mdi-elastic2172.16.16.231699940.871.001.03mdi-elastic4172

  10. ruby - 解释这个原始文本 - 一种策略? - 2

    我有这个原始文本:________________________________________________________________________________________________________________________________PosCarCompetitor/TeamDriverVehicleCapCLLapsRace.TimeFastest...Lap16JasonClementsJasonClementsBMWM33200109:48.571030:57.3228*242DavidSkillenderDavidSkillenderHo

随机推荐