--- title: "集群只读允许删除块配置" date: 2026-02-12 lastmod: 2026-02-12 description: "控制集群只读允许删除块状态的配置项说明" tags: ["集群配置", "访问控制", "数据管理"] summary: "配置项作用 # cluster.blocks.read_only_allow_delete 配置项控制集群的"只读但允许删除"状态。与 cluster.blocks.read_only 不同,此配置在禁止写入操作的同时,允许删除操作。这通常用于磁盘空间不足场景,允许用户删除数据以释放空间。 配置项类型 # 该配置项为动态配置,可以在运行时通过集群设置 API 进行修改。 默认值 # false(不启用只读允许删除块) 是否必需 # 可选配置项(有默认值) 取值范围 # true - 启用只读允许删除块 false - 禁用只读允许删除块 配置格式 # # 默认配置(正常读写) cluster.blocks.read_only_allow_delete: false # 启用只读允许删除模式 cluster.blocks.read_only_allow_delete: true # 恢复正常读写 cluster.blocks.read_only_allow_delete: false 相关配置项 # 配置项 默认值 说明 cluster.blocks.read_only_allow_delete false 只读允许删除块 cluster.blocks.read_only false 集群只读块 cluster.routing.allocation.disk.watermark 85%/90%/95% 磁盘水位线 工作原理 # 只读允许删除块机制:" --- ## 配置项作用 `cluster.blocks.read_only_allow_delete` 配置项控制集群的"只读但允许删除"状态。与 `cluster.blocks.read_only` 不同,此配置在禁止写入操作的同时,允许删除操作。这通常用于磁盘空间不足场景,允许用户删除数据以释放空间。 ## 配置项类型 该配置项为**动态配置**,可以在运行时通过集群设置 API 进行修改。 ## 默认值 ``` false(不启用只读允许删除块) ``` ## 是否必需 **可选配置项**(有默认值) ## 取值范围 ``` true - 启用只读允许删除块 false - 禁用只读允许删除块 ``` ## 配置格式 ```yaml # 默认配置(正常读写) cluster.blocks.read_only_allow_delete: false # 启用只读允许删除模式 cluster.blocks.read_only_allow_delete: true # 恢复正常读写 cluster.blocks.read_only_allow_delete: false ``` ## 相关配置项 | 配置项 | 默认值 | 说明 | |-------|-------|------| | `cluster.blocks.read_only_allow_delete` | false | 只读允许删除块 | | `cluster.blocks.read_only` | false | 集群只读块 | | `cluster.routing.allocation.disk.watermark` | 85%/90%/95% | 磁盘水位线 | ## 工作原理 只读允许删除块机制: ``` ┌─────────────────────────────────────────────────────────────────┐ │ 只读允许删除块控制 │ └─────────────────────────────────────────────────────────────────┘ 请求到达 │ ▼ 检查 read_only_allow_delete 状态 │ ├── false(正常模式) │ │ │ └── 允许所有操作 │ └── true(只读允许删除模式) │ ├── 允许的操作 │ - 读取操作 ✓ │ - 查询请求 ✓ │ - 删除操作 ✓ │ - 删除索引 ✓ │ - 删除文档 ✓ │ └── 拒绝的操作 - 写入操作 ✗ - 索引操作 ✗ - 更新操作 ✗ - 元数据创建 ✗ │ └── 返回 FORBIDDEN 错误 ``` ## 两种只读模式对比 ``` cluster.blocks.read_only: 拒绝: ✗ 写入文档 ✗ 更新文档 ✗ 删除文档 ✗ 删除索引 ✗ 创建索引 ✗ 修改元数据 允许: ✓ 读取文档 ✓ 查询操作 cluster.blocks.read_only_allow_delete: 拒绝: ✗ 写入文档 ✗ 更新文档 ✗ 创建索引 ✗ 修改元数据 允许: ✓ 读取文档 ✓ 查询操作 ✓ 删除文档 ✓ 删除索引 ``` ## 使用场景 ### 1. 默认配置(正常模式) ```yaml cluster.blocks.read_only_allow_delete: false ``` **适用场景:** - 所有正常运行的集群 - 需要读写操作 ### 2. 磁盘空间不足(推荐) ```yaml cluster.blocks.read_only_allow_delete: true ``` **适用场景:** - 磁盘空间不足 - 需要删除数据释放空间 - 允许清理操作 ### 3. 数据保护 ```yaml cluster.blocks.read_only: true ``` **适用场景:** - 完全只读保护 - 不允许任何修改 - 维护模式 ## 推荐设置建议 | 场景 | 推荐配置 | 说明 | |-----|---------|------| | 正常运行 | 两个都为 false | 允许所有操作 | | 磁盘空间不足 | read_only_allow_delete: true | 允许删除数据 | | 完全只读保护 | read_only: true | 禁止所有写入 | | 维护模式 | read_only: true | 保护数据 | ## 磁盘空间不足处理流程 ``` 磁盘空间不足处理步骤: 1. 系统检测到磁盘空间不足 ↓ 2. 自动设置 read_only_allow_delete = true ↓ 3. 集群进入只读允许删除模式 ↓ 4. 管理员收到告警 ↓ 5. 执行数据清理操作 - 删除旧索引 - 删除旧日志 - 清理过期数据 ↓ 6. 磁盘空间释放 ↓ 7. 手动设置 read_only_allow_delete = false ↓ 8. 集群恢复正常模式 ``` ## 操作流程示例 ```bash # 1. 磁盘空间不足,启用只读允许删除模式 PUT /_cluster/settings { "persistent": { "cluster.blocks.read_only_allow_delete": true } } # 2. 查看当前状态 GET /_cluster/health # 3. 删除不需要的索引以释放空间 DELETE /old_logs_2023_01 DELETE /old_metrics_2023_01 # 4. 删除特定文档 POST /test_index/_delete_by_query { "query": { "range": { "timestamp": { "lt": "now-90d" } } } } # 5. 磁盘空间恢复后,手动恢复正常模式 PUT /_cluster/settings { "persistent": { "cluster.blocks.read_only_allow_delete": false } } ``` ## 动态配置示例 ```bash # 启用只读允许删除模式 PUT /_cluster/settings { "persistent": { "cluster.blocks.read_only_allow_delete": true } } # 恢复正常模式 PUT /_cluster/settings { "persistent": { "cluster.blocks.read_only_allow_delete": false } } # 同时设置两个只读模式(更严格) PUT /_cluster/settings { "persistent": { "cluster.blocks.read_only": true } } ``` ## 监控建议 ```bash # 查看当前块状态 GET /_cluster/settings?filter_path=*.cluster.blocks* # 查看集群块信息 GET /_cluster/state/blocks # 查看磁盘使用情况 GET /_cat/allocation?v&h=node,disk.used_percent,disk.total,disk.available # 查看集群健康状态 GET /_cluster/health # 查看节点统计 GET /_nodes/stats/fs ``` ## 磁盘空间清理建议 ``` 清理磁盘空间的方法: 1. 删除旧索引 DELETE /old_index_* 2. 删除旧数据 POST /index/_delete_by_query { "query": { "range": { "@timestamp": { "lt": "now-90d" } } } } 3. 强力合并索引 POST /index/_forcemerge?max_num_segments=1 4. 清理已删除文档 POST /index/_forcemerge 5. 缩小索引 POST /index/_shrink/shrinked_index ``` ## 错误处理 ``` 错误信息示例: cluster_block_exception: blocked by: [FORBIDDEN/13/cluster read-only / allow delete (api)]; 如果写入操作被拒绝: 1. 检查块状态 GET /_cluster/settings?filter_path=*.cluster.blocks* 2. 如果需要写入,先删除数据释放空间 DELETE /old_logs* 3. 磁盘空间足够后,恢复正常模式 PUT /_cluster/settings { "persistent": { "cluster.blocks.read_only_allow_delete": false } } ``` ## 配置选择决策树 ``` 需要限制集群写入? ├── 是,完全禁止修改 │ └── 使用 cluster.blocks.read_only = true │ - 不允许写入 │ - 不允许删除 │ - 不允许元数据修改 │ └── 是,但需要清理数据 └── 使用 cluster.blocks.read_only_allow_delete = true - 不允许写入 - 允许删除 - 允许删除索引 ``` ## 注意事项 1. **动态更新**:此配置为动态配置,可在线修改 2. **全局影响**:影响整个集群的所有索引 3. **空间恢复**:用于磁盘空间不足场景 4. **手动恢复**:清理空间后需要手动设置为 false 5. **与 read_only 区别**:允许删除操作,更适合清理场景 6. **优先级**:read_only 优先级高于 read_only_allow_delete