📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

cluster.routing.use_adaptive_replica_selection 配置项用于控制是否启用**自适应副本选择(Adaptive Replica Selection, ARS)**功能。

自适应副本选择是一种智能查询路由策略,它会根据各副本节点的实时性能统计信息,动态选择最优的副本来处理查询请求。

配置项属性 #

  • 配置路径: cluster.routing.use_adaptive_replica_selection
  • 数据类型: boolean
  • 默认值: true
  • 是否可选: 是
  • 是否动态: 是(支持动态更新)

配置项详解 #

工作机制 #

传统随机选择 #

查询请求
    ↓
随机选择一个副本
    ↓
┌─────┬─────┬─────┬─────┐
│ 副本1 │ 副本2 │ 副本3 │ 副本4 │
└─────┴─────┴─────┴─────┘
    ↓
选中副本2(随机)
    ↓
执行查询

自适应副本选择(ARS) #

查询请求
    ↓
收集各副本性能统计
    ↓
┌─────────────────────────────┐
│ 副本1: 队列=5, 响应=50ms    │
│ 副本2: 队列=1, 响应=20ms ←── │ 最优
│ 副本3: 队列=8, 响应=80ms    │
│ 副本4: 队列=2, 响应=25ms    │
└─────────────────────────────┘
    ↓
选择副本2(最优性能)
    ↓
执行查询

统计指标 #

系统持续收集每个副本节点的以下指标:

指标说明
队列大小当前未完成的请求数量
响应时间从请求到响应的总时间
服务时间实际处理请求的时间

排名算法 #

基于 C3 论文(USENIX NSDI 2015)的排名公式:

排名 = 响应时间 - (1 / 服务时间) + (队列调整因子^3 / 服务时间)

其中:
- 队列调整因子 = 1 + 并发补偿 + 队列大小EWMA
- 并发补偿 = 未完成请求数 × 客户端数量
- EWMA = 指数加权移动平均

排名越低 = 性能越好

负载均衡机制 #

为防止某个节点持续获得所有请求,系统会执行"赢家调整":

1. 选择排名最高的节点(最优节点)
2. 将其他节点的统计信息调整为:
   最优节点和其他节点的平均值
3. 确保其他节点也有机会获得请求

配置建议 #

生产环境(推荐) #

cluster.routing.use_adaptive_replica_selection: true

建议: 保持默认值 true。自适应副本选择可以:

  • 自动选择性能最优的副本
  • 动态适应负载变化
  • 提高整体查询性能
  • 无需手动配置

小型集群 #

cluster.routing.use_adaptive_replica_selection: false

建议: 关闭。当集群只有 1-2 个节点且性能一致时,随机选择足够。

严格轮询需求 #

cluster.routing.use_adaptive_replica_selection: false

建议: 关闭。当需要严格的轮询负载均衡策略时使用。

代码示例 #

easysearch.yml 配置 #

cluster:
  routing:
    use_adaptive_replica_selection: true  # 默认值

关闭自适应选择 #

cluster:
  routing:
    use_adaptive_replica_selection: false  # 使用随机选择

动态更新 #

# 启用自适应副本选择
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.use_adaptive_replica_selection": true
  }
}

# 禁用自适应副本选择
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.use_adaptive_replica_selection": false
  }
}

查看自适应选择统计 #

GET _nodes/stats/adaptive_selection

响应示例:

{
  "nodes": {
    "node1": {
      "name": "node-1",
      "stats": {
        "adaptive_selection": {
          "indices": {
            "my_index": {
              "shards": {
                "0": {
                  "replicas": {
                    "node2": {
                      "outstanding_requests": 2,
                      "queue_size": 5.3,
                      "response_time": 45000000,
                      "service_time": 35000000
                    },
                    "node3": {
                      "outstanding_requests": 1,
                      "queue_size": 2.1,
                      "response_time": 25000000,
                      "service_time": 20000000
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

行为对比 #

特性ARS 启用 (true)ARS 禁用 (false)
副本选择策略基于性能排名随机选择
负载均衡智能动态均衡简单随机
性能感知是,考虑队列和响应时间
配置复杂度低(自动适应)低(无需配置)
适用场景大多数生产环境小型/同构集群

性能影响 #

ARS 状态优点缺点
启用自动选择最优副本,提高查询性能需要收集统计信息,轻微内存开销
禁用无统计信息开销,简单轮询可能选择性能较差的副本

使用场景 #

推荐启用 ARS #

  • 异构集群: 节点性能不一致
  • 跨地域部署: 不同地域节点延迟不同
  • 高并发场景: 需要动态负载均衡
  • 混合工作负载: 节点承担不同类型的任务

推荐禁用 ARS #

  • 小型集群: 1-2 个节点的简单部署
  • 同构集群: 所有节点性能完全一致
  • 严格轮询: 需要严格的轮询策略

相关 API #

查看节点选择统计 #

GET _nodes/stats/adaptive_selection

查看搜索偏好设置 #

可以在搜索请求中覆盖全局设置:

GET /my_index/_search?preference=_local
{
  "query": {
    "match_all": {}
  }
}

注意事项 #

  1. 默认启用: 从 Easysearch 7.x 开始,此配置默认为 true

  2. 动态更新: 可以在运行时动态切换,无需重启节点。

  3. 统计信息: 启用后会持续收集性能统计,占用少量内存。

  4. 学习周期: ARS 需要一定时间收集统计信息后才能做出最优决策。

  5. 与其他设置的交互: 搜索 preference 参数会覆盖 ARS 的选择逻辑。

  6. 监控建议: 定期检查 adaptive_selection 统计信息,验证系统是否正确选择副本。