配置项作用 #
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% | 磁盘水位线 |
工作原理 #
只读允许删除块机制:
┌─────────────────────────────────────────────────────────────────┐
│ 只读允许删除块控制 │
└─────────────────────────────────────────────────────────────────┘
请求到达
│
▼
检查 read_only_allow_delete 状态
│
├── false(正常模式)
│ │
│ └── 允许所有操作
│
└── true(只读允许删除模式)
│
├── 允许的操作
│ - 读取操作 ✓
│ - 查询请求 ✓
│ - 删除操作 ✓
│ - 删除索引 ✓
│ - 删除文档 ✓
│
└── 拒绝的操作
- 写入操作 ✗
- 索引操作 ✗
- 更新操作 ✗
- 元数据创建 ✗
│
└── 返回 FORBIDDEN 错误
两种只读模式对比 #
cluster.blocks.read_only:
拒绝:
✗ 写入文档
✗ 更新文档
✗ 删除文档
✗ 删除索引
✗ 创建索引
✗ 修改元数据
允许:
✓ 读取文档
✓ 查询操作
cluster.blocks.read_only_allow_delete:
拒绝:
✗ 写入文档
✗ 更新文档
✗ 创建索引
✗ 修改元数据
允许:
✓ 读取文档
✓ 查询操作
✓ 删除文档
✓ 删除索引
使用场景 #
1. 默认配置(正常模式) #
cluster.blocks.read_only_allow_delete: false
适用场景:
- 所有正常运行的集群
- 需要读写操作
2. 磁盘空间不足(推荐) #
cluster.blocks.read_only_allow_delete: true
适用场景:
- 磁盘空间不足
- 需要删除数据释放空间
- 允许清理操作
3. 数据保护 #
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. 集群恢复正常模式
操作流程示例 #
# 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
}
}
动态配置示例 #
# 启用只读允许删除模式
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
}
}
监控建议 #
# 查看当前块状态
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
- 不允许写入
- 允许删除
- 允许删除索引
注意事项 #
- 动态更新:此配置为动态配置,可在线修改
- 全局影响:影响整个集群的所有索引
- 空间恢复:用于磁盘空间不足场景
- 手动恢复:清理空间后需要手动设置为 false
- 与 read_only 区别:允许删除操作,更适合清理场景
- 优先级:read_only 优先级高于 read_only_allow_delete





