📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

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_deletefalse只读允许删除块
cluster.blocks.read_onlyfalse集群只读块
cluster.routing.allocation.disk.watermark85%/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
        - 不允许写入
        - 允许删除
        - 允许删除索引

注意事项 #

  1. 动态更新:此配置为动态配置,可在线修改
  2. 全局影响:影响整个集群的所有索引
  3. 空间恢复:用于磁盘空间不足场景
  4. 手动恢复:清理空间后需要手动设置为 false
  5. 与 read_only 区别:允许删除操作,更适合清理场景
  6. 优先级:read_only 优先级高于 read_only_allow_delete