这段文档是关于 Apache Ignite 集群状态(Cluster States) 的核心机制说明。这是 Ignite 中非常关键的运维和安全控制功能,尤其在生产环境中至关重要。
我们来一步步深入、清晰地理解这段内容的含义。
🧩 一、Ignite 集群的三种状态
Ignite 集群可以处于以下三种状态之一:
| 状态 | 英文 | 含义 | 能做什么? | 不能做什么? | 
|---|---|---|---|---|
| 1. INACTIVE | 未激活 | 集群刚启动,尚未启用 | ❌ 什么都不能做 | ✅ 可设置状态、配置元数据 | 
| 2. ACTIVE | 活跃 | 正常运行模式 | ✅ 读写、建缓存、执行任务 | --- | 
| 3. ACTIVE_READ_ONLY | 活跃(只读) | 只允许读操作 | ✅ 查询数据、获取指标 | ❌ 写入、修改、建缓存 | 
🔍 二、每种状态详解
1. INACTIVE(未激活状态)
- 
✅ 首次启动时的默认状态:
- 如果你启用了 持久化数据区(Persistent Data Regions) ,集群默认进入 
INACTIVE状态。 - 这是为了防止自动启动后立即对外服务,造成数据不一致或误操作。
 
 - 如果你启用了 持久化数据区(Persistent Data Regions) ,集群默认进入 
 - 
❌ 所有操作被禁止:
- 不能读写缓存
 - 不能创建新缓存
 - 不能执行任务
 - 所有 API 调用都会抛出异常
 
 - 
⚠️ 切换为 INACTIVE(即"停用集群")会:
- 释放所有内存资源(包括缓存数据)
 - 关闭公共 API 接口
 - 丢失非持久化的内存数据!
 
 
📌 重点提醒:
如果你的缓存是纯内存型(没有开启持久化),执行
set state INACTIVE就等于 清空整个集群数据,且无法恢复!
2. ACTIVE(活跃状态)
- ✅ 正常工作模式
 - 允许所有操作:
- 读写缓存
 - 创建/删除缓存
 - 执行 SQL 查询(DML/DDL)
 - 分布式计算任务
 
 - 这是你希望集群运行时所处的状态。
 
3. ACTIVE_READ_ONLY(只读模式)
- 
✅ 允许的操作:
GET,GET_ALL缓存- SQL 查询(
SELECT) - 获取监控指标
 
 - 
❌ 禁止的操作:
PUT,REMOVE等写操作- 创建/销毁缓存
 - 执行 
INSERT,UPDATE,DELETE,CREATE TABLE等 SQL 语句 
 - 
如果尝试修改数据,会抛出异常:
javaIgniteClusterReadOnlyException: Cluster is in read-only mode. 
🎯 使用场景:
- 升级前临时保护数据
 - 数据迁移时防止写入
 - 安全审计期间锁定集群
 
🚦 三、集群初始状态为什么不同?
| 集群类型 | 初始状态 | 原因 | 
|---|---|---|
| 纯内存集群(无持久化) | ACTIVE | 
启动即可用,无需额外激活 | 
| 启用持久化的集群 | INACTIVE | 
防止自动启动后数据混乱,需人工确认激活 | 
📌 类比:就像飞机起飞前必须由飞行员手动解除"停机刹车"一样,持久化集群也需要你手动执行 set state ACTIVE 来"启动"。
🛠️ 四、如何切换集群状态?(四种方式)
你可以通过以下任意一种方式立即改变集群状态:
✅ 方式 1:控制脚本(control.sh)
        
            
            
              bash
              
              
            
          
          # 设置为只读
./bin/control.sh --set-state ACTIVE_READ_ONLY
# 激活集群
./bin/control.sh --set-state ACTIVE
# 停用集群(危险!会丢数据)
./bin/control.sh --set-state INACTIVE
        💡 适用于运维脚本、命令行操作。
✅ 方式 2:REST API
            
            
              http
              
              
            
          
          http://<host>:8080/ignite?cmd=setstate&state=ACTIVE_READ_ONLY
        示例:
            
            
              bash
              
              
            
          
          curl 'http://localhost:8080/ignite?cmd=setstate&state=ACTIVE'
        💡 适用于自动化系统、Web 工具集成。
✅ 方式 3:编程方式(Java API)
            
            
              java
              
              
            
          
          Ignite ignite = Ignition.start();
// 获取当前状态
ClusterState currentState = ignite.cluster().state();
System.out.println("Current state: " + currentState);
// 修改状态
ignite.cluster().state(ClusterState.ACTIVE_READ_ONLY);
        💡 适用于嵌入式管理、自定义控制台。
✅ 方式 4:JMX 管理
- 
MBean 名称:
group="Kernal",name=IgniteKernal - 
可用操作:
clusterState()→ 获取当前状态clusterState("ACTIVE")→ 设置新状态
 
使用工具如
jconsole或VisualVM远程调用。
⚠️ 五、重要注意事项
| 注意事项 | 说明 | 
|---|---|
| 🔐 权限控制 | 生产环境应限制谁能执行状态切换(可通过 REST 认证、JMX 安全策略实现) | 
| 💾 数据安全 | INACTIVE 会释放内存 → 非持久化数据永久丢失 | 
| 🔄 状态同步 | 状态变更会广播到所有节点,全集群统一生效 | 
| 📊 监控建议 | 在 Grafana 中显示当前集群状态,避免误操作 | 
🧠 六、典型使用场景
| 场景 | 推荐操作 | 
|---|---|
| 首次部署持久化集群 | 启动 → 检查数据 → set state ACTIVE | 
| 系统升级维护 | set state ACTIVE_READ_ONLY → 升级 → set state ACTIVE | 
| 紧急故障处理 | set state INACTIVE 停止所有访问 | 
| 数据迁移期间 | 设为只读,防止写入冲突 | 
| 备份前准备 | 进入只读模式,保证备份一致性 | 
✅ 总结:一句话理解
Ignite 集群有三种状态:
INACTIVE(关闭)、ACTIVE(正常)、ACTIVE_READ_ONLY(只读)。状态切换是全局、立即生效的操作,可用于控制集群的可用性和安全性,但需谨慎使用,尤其是INACTIVE会导致内存数据丢失。
📌 类比记忆:
| 类比对象 | INACTIVE | ACTIVE | ACTIVE_READ_ONLY | 
|---|---|---|---|
| 汽车 | 熄火停车 | 正常行驶 | 踩刹车但不熄火 | 
| 数据库 | OFFLINE | READ_WRITE | READ_ONLY | 
| 服务器 | 关机 | 运行中 | 维护模式 | 
如果你正在设计一个 Ignite 运维平台,建议将"集群状态"作为一个醒目的开关按钮,并加上二次确认弹窗(尤其是对 INACTIVE 操作),防止误操作导致数据丢失。
需要我帮你写一个安全的状态切换脚本吗?😊