--- title: "自适应副本选择配置" date: 2026-02-28 lastmod: 2026-02-28 description: "cluster.routing.use_adaptive_replica_selection 配置项用于启用自适应副本选择功能,智能选择最优副本处理查询请求。" tags: ["路由", "副本选择", "负载均衡", "查询性能"] summary: "配置项作用 # 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(最优性能) ↓ 执行查询 统计指标 # 系统持续收集每个副本节点的以下指标:" --- ## 配置项作用 `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. 确保其他节点也有机会获得请求 ``` ## 配置建议 ## 生产环境(推荐) ```yaml cluster.routing.use_adaptive_replica_selection: true ``` **建议**: 保持默认值 `true`。自适应副本选择可以: - 自动选择性能最优的副本 - 动态适应负载变化 - 提高整体查询性能 - 无需手动配置 ## 小型集群 ```yaml cluster.routing.use_adaptive_replica_selection: false ``` **建议**: 关闭。当集群只有 1-2 个节点且性能一致时,随机选择足够。 ## 严格轮询需求 ```yaml cluster.routing.use_adaptive_replica_selection: false ``` **建议**: 关闭。当需要严格的轮询负载均衡策略时使用。 ## 代码示例 ## easysearch.yml 配置 ```yaml cluster: routing: use_adaptive_replica_selection: true # 默认值 ``` ## 关闭自适应选择 ```yaml cluster: routing: use_adaptive_replica_selection: false # 使用随机选择 ``` ## 动态更新 ```bash # 启用自适应副本选择 PUT _cluster/settings { "transient": { "cluster.routing.use_adaptive_replica_selection": true } } # 禁用自适应副本选择 PUT _cluster/settings { "transient": { "cluster.routing.use_adaptive_replica_selection": false } } ``` ## 查看自适应选择统计 ```bash GET _nodes/stats/adaptive_selection ``` 响应示例: ```json { "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 ## 查看节点选择统计 ```bash GET _nodes/stats/adaptive_selection ``` ## 查看搜索偏好设置 可以在搜索请求中覆盖全局设置: ```json GET /my_index/_search?preference=_local { "query": { "match_all": {} } } ``` ## 注意事项 1. **默认启用**: 从 Easysearch 7.x 开始,此配置默认为 `true`。 2. **动态更新**: 可以在运行时动态切换,无需重启节点。 3. **统计信息**: 启用后会持续收集性能统计,占用少量内存。 4. **学习周期**: ARS 需要一定时间收集统计信息后才能做出最优决策。 5. **与其他设置的交互**: 搜索 `preference` 参数会覆盖 ARS 的选择逻辑。 6. **监控建议**: 定期检查 `adaptive_selection` 统计信息,验证系统是否正确选择副本。