--- title: "同主机分片分配限制配置" date: 2026-01-05 lastmod: 2026-01-05 description: "控制同主机分片分配限制的配置项说明" tags: ["集群配置", "分片分配", "高可用性"] summary: "配置项作用 # cluster.routing.allocation.same_shard.host 配置项控制是否允许同一分片的不同副本分配到同一主机的不同节点上。启用此配置后,系统会根据主机名或主机地址检查,防止同一分片的主分片和副本分片部署在同一物理主机上。 配置项类型 # 该配置项为动态配置,可以在运行时通过集群设置 API 进行修改。 默认值 # false(不检查,允许同主机分配) 是否必需 # 可选配置项(有默认值) 取值范围 # true 或 false 配置格式 # # 默认配置(不限制同主机分配) cluster.routing.allocation.same_shard.host: false # 启用同主机限制(推荐) cluster.routing.allocation.same_shard.host: true 相关配置项 # 配置项 默认值 说明 cluster.routing.allocation.same_shard.host false 同主机分配限制 cluster.routing.allocation.enable all 分片分配开关 cluster.routing.allocation.awareness.attributes - 感知属性 工作原理 # 同主机检测机制: ┌─────────────────────────────────────────────────────────────────┐ │ 同主机分片分配检测 │ └─────────────────────────────────────────────────────────────────┘ 分片分配请求 │ ▼ 检查 same_shard." --- ## 配置项作用 `cluster.routing.allocation.same_shard.host` 配置项控制是否允许同一分片的不同副本分配到同一主机的不同节点上。启用此配置后,系统会根据主机名或主机地址检查,防止同一分片的主分片和副本分片部署在同一物理主机上。 ## 配置项类型 该配置项为**动态配置**,可以在运行时通过集群设置 API 进行修改。 ## 默认值 ``` false(不检查,允许同主机分配) ``` ## 是否必需 **可选配置项**(有默认值) ## 取值范围 ``` true 或 false ``` ## 配置格式 ```yaml # 默认配置(不限制同主机分配) cluster.routing.allocation.same_shard.host: false # 启用同主机限制(推荐) cluster.routing.allocation.same_shard.host: true ``` ## 相关配置项 | 配置项 | 默认值 | 说明 | |-------|-------|------| | `cluster.routing.allocation.same_shard.host` | false | 同主机分配限制 | | `cluster.routing.allocation.enable` | all | 分片分配开关 | | `cluster.routing.allocation.awareness.attributes` | - | 感知属性 | ## 工作原理 同主机检测机制: ``` ┌─────────────────────────────────────────────────────────────────┐ │ 同主机分片分配检测 │ └─────────────────────────────────────────────────────────────────┘ 分片分配请求 │ ▼ 检查 same_shard.host 配置 │ ├── false(默认) │ │ │ └── 允许分配到任何节点 │ (包括同主机的不同节点) │ └── true │ ├── 检查已分配分片所在节点 │ ├── 获取节点主机信息 │ ├── 主机地址(IP) │ └── 主机名 │ ├── 比较主机信息 │ ├── 同主机地址? │ └── 同主机名? │ ├── 发现同主机已有副本 │ │ │ └── 拒绝分配 │ └── 无同主机副本 │ └── 允许分配 ``` ## 使用场景 ### 1. 默认配置 ```yaml cluster.routing.allocation.same_shard.host: false ``` **适用场景:** - 每个节点部署在不同主机 - 虚拟化环境且保证隔离 - 开发测试环境 - 资源受限场景 ### 2. 同主机部署(推荐启用) ```yaml cluster.routing.allocation.same_shard.host: true ``` **适用场景:** - 单机多节点部署 - 容器化部署(同一宿主机) - 需要提高数据可靠性 - 物理机多实例部署 ## 部署架构示例 ``` 物理主机 A (192.168.1.10): ├── Node-1 (容器/进程) └── Node-2 (容器/进程) 物理主机 B (192.168.1.11): ├── Node-3 (容器/进程) └── Node-4 (容器/进程) 索引分片分配: Shard-1 (主分片) → Node-1 @ 192.168.1.10 Shard-1 (副本1) → Node-3 @ 192.168.1.11 ✓ (不同主机) Shard-1 (副本2) → Node-2 @ 192.168.1.10 ✗ (同主机被拒绝) 启用 same_shard.host: true 后: - 副本1 允许分配(不同主机) - 副本2 拒绝分配(同主机) ``` ## 推荐设置建议 | 部署环境 | 推荐值 | 说明 | |---------|-------|------| | 单主机多节点 | true | 必须启用 | | 容器化部署 | true | 建议启用 | | 多物理主机 | false | 可选启用 | | 开发测试 | false | 按需启用 | | 生产环境 | true | 推荐启用 | ## 主机检测机制 ```bash # 节点通过以下方式识别主机: 1. 主机地址(Host Address)- IP 地址 - 优先使用,更精确 - 例如: 192.168.1.10 2. 主机名(Host Name)- DNS 名称 - 地址不可用时使用 - 例如: server1.example.com # 检测逻辑: if (节点A.hostAddress == 节点B.hostAddress) { return 同主机 } else if (节点A.hostName == 节点B.hostName) { return 同主机 } else { return 不同主机 } ``` ## 动态配置示例 ```bash # 启用同主机限制 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.same_shard.host": true } } # 禁用同主机限制 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.same_shard.host": false } } ``` ## 监控建议 ```bash # 查看当前配置 GET /_cluster/settings?filter_path=*.cluster.routing.allocation.same_shard.host # 查看分片分配状态 GET /_cat/shards?v&h=index,shard,prirep,state,node,ip # 查看节点主机信息 GET /_cat/nodes?v&h=name,ip,host,hostname # 查看分配失败原因 GET /_cluster/allocation/explain ``` ## 故障排查 ``` 问题: 分片无法分配 检查步骤: 1. 查看分配解释 GET /_cluster/allocation/explain 2. 查看错误信息 "a copy of this shard is already allocated to host address [192.168.1.10]" 3. 确认节点分布 GET /_cat/nodes?v&h=name,ip 4. 解决方案 - 添加更多不同主机的节点 - 或临时禁用此限制(不推荐) ``` ## 注意事项 1. **动态更新**:此配置为动态配置,可在线修改 2. **默认禁用**:默认不检查,适合多物理主机部署 3. **容器部署**:容器化部署时应启用此配置 4. **高可用性**:启用可提高数据可用性 5. **主机识别**:基于 IP 地址或主机名判断 6. **性能影响**:启用后会有额外的检查开销