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

配置项作用 #

cluster.blocks.read_only 配置项控制整个集群的只读状态。当启用此配置后,集群中的所有索引将禁止写入操作和元数据修改操作,仅允许读取操作。此配置通常用于磁盘空间不足时自动保护数据,或手动设置以防止数据修改。

配置项类型 #

该配置项为动态配置,可以在运行时通过集群设置 API 进行修改。

默认值 #

false(不启用只读块)

是否必需 #

可选配置项(有默认值)

取值范围 #

true  - 启用集群只读块
false - 禁用集群只读块

配置格式 #

# 默认配置(正常读写)
cluster.blocks.read_only: false

# 启用只读模式
cluster.blocks.read_only: true

# 恢复正常读写
cluster.blocks.read_only: false

相关配置项 #

配置项默认值说明
cluster.blocks.read_onlyfalse集群只读块
cluster.blocks.read_only_allow_deletefalse只读允许删除块
cluster.routing.allocation.disk.watermark85%/90%/95%磁盘水位线

工作原理 #

集群只读块机制:

┌─────────────────────────────────────────────────────────────────┐
│                    集群只读块控制                                 │
└─────────────────────────────────────────────────────────────────┘

请求到达
    │
    ▼
检查 read_only 状态
    │
    ├── false(正常模式)
    │   │
    │   ├── 允许所有操作
    │   │   - 读取操作 ✓
    │   │   - 写入操作 ✓
    │   │   - 删除操作 ✓
    │   │   - 元数据修改 ✓
    │   │
    │   └── 正常处理
    │
    └── true(只读模式)
        │
        ├── 允许的操作
        │   - 读取操作 ✓
        │   - 查询请求 ✓
        │
        └── 拒绝的操作
            - 写入操作 ✗
            - 删除操作 ✗
            - 索引创建 ✗
            - 元数据修改 ✗
            │
            └── 返回 FORBIDDEN 错误

触发场景 #

自动触发场景:

1. 磁盘水位线触发
   - 磁盘使用率超过 flood_stage 水位线
   - 默认 95%
   - 自动设置 read_only = true
   - 防止磁盘填满导致数据损坏

2. 磁盘空间恢复
   - 磁盘使用率低于高水位线
   - 默认 90%
   - 需要手动设置 read_only = false

手动设置场景:

1. 维护模式
   - 防止数据修改
   - 执行只读查询

2. 数据迁移
   - 保护源数据
   - 防止意外写入

3. 安全保护
   - 临时禁用写入
   - 保护关键数据

使用场景 #

1. 默认配置(正常模式) #

cluster.blocks.read_only: false

适用场景:

  • 所有正常运行的集群
  • 需要读写操作

2. 只读模式 #

cluster.blocks.read_only: true

适用场景:

  • 磁盘空间不足自动触发
  • 手动设置维护模式
  • 数据保护场景

3. 恢复正常模式 #

cluster.blocks.read_only: false

适用场景:

  • 磁盘空间清理后
  • 维护完成
  • 需要恢复写入

推荐设置建议 #

场景推荐值说明
正常运行false允许读写
磁盘空间不足true(自动)自动触发
维护模式true(手动)临时保护
数据迁移true(手动)保护数据

磁盘水位线与只读块 #

磁盘水位线配置:

cluster.routing.allocation.disk.watermark.low: 85%
    - 新分片不再分配到此节点
    - 集群仍可写入

cluster.routing.allocation.disk.watermark.high: 90%
    - 尝试将分片移到其他节点
    - 集群仍可写入

cluster.routing.allocation.disk.watermark.flood_stage: 95%
    - 自动设置 read_only = true
    - 集群进入只读模式
    - 需要手动恢复

操作流程示例 #

# 1. 手动启用只读模式
PUT /_cluster/settings
{
  "persistent": {
    "cluster.blocks.read_only": true
  }
}

# 2. 查看当前状态
GET /_cluster/health

# 3. 尝试写入(会被拒绝)
POST /test_index/_doc/1
{
  "message": "test"
}
# 返回: cluster_block_exception

# 4. 磁盘空间清理后,手动恢复
PUT /_cluster/settings
{
  "persistent": {
    "cluster.blocks.read_only": false
  }
}

动态配置示例 #

# 启用只读模式(临时)
PUT /_cluster/settings
{
  "transient": {
    "cluster.blocks.read_only": true
  }
}

# 启用只读模式(永久)
PUT /_cluster/settings
{
  "persistent": {
    "cluster.blocks.read_only": true
  }
}

# 恢复正常模式
PUT /_cluster/settings
{
  "persistent": {
    "cluster.blocks.read_only": false
  }
}

监控建议 #

# 查看当前只读状态
GET /_cluster/settings?filter_path=*.cluster.blocks.read_only

# 查看集群块信息
GET /_cluster/state/blocks

# 查看磁盘使用情况
GET /_cat/allocation?v&h=node,disk.used_percent

# 查看集群健康状态
GET /_cluster/health

错误处理 #

错误信息示例:

cluster_block_exception:
    blocked by: [FORBIDDEN/12/cluster read-only (api)];

解决步骤:

1. 检查磁盘使用情况
   GET /_cat/allocation?v

2. 清理磁盘空间
   - 删除不需要的索引
   - 清理旧日志
   - 扩容磁盘

3. 磁盘空间足够后,手动恢复
   PUT /_cluster/settings
   {
     "persistent": {
       "cluster.blocks.read_only": false
     }
   }

与其他配置的配合 #

只读模式相关配置:

1. cluster.blocks.read_only
   - 完全只读,不允许任何写入

2. cluster.blocks.read_only_allow_delete
   - 只读但允许删除
   - 可用于清理数据

3. index.blocks.read_only
   - 单个索引级别的只读

4. index.blocks.write
   - 禁止写入但允许删除

选择建议:
- 集群级别保护: 使用 cluster.blocks.read_only
- 需要清理数据: 使用 cluster.blocks.read_only_allow_delete
- 单个索引保护: 使用 index.blocks.read_only

注意事项 #

  1. 动态更新:此配置为动态配置,可在线修改
  2. 全局影响:影响整个集群的所有索引
  3. 自动触发:磁盘水位线达到 flood_stage 时自动触发
  4. 手动恢复:磁盘空间恢复后需要手动设置为 false
  5. 写入保护:保护数据不被意外修改
  6. 查询可用:只读模式下查询仍可正常执行