配置项作用 #
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": {}
}
}
注意事项 #
默认启用: 从 Easysearch 7.x 开始,此配置默认为
true。动态更新: 可以在运行时动态切换,无需重启节点。
统计信息: 启用后会持续收集性能统计,占用少量内存。
学习周期: ARS 需要一定时间收集统计信息后才能做出最优决策。
与其他设置的交互: 搜索
preference参数会覆盖 ARS 的选择逻辑。监控建议: 定期检查
adaptive_selection统计信息,验证系统是否正确选择副本。





