Apache Ignite 集群状态(Cluster States)
这段文档是关于 Apache Ignite 集群状态(Cluster States) 的核心机制说明。这是 Ignite 中非常关键的运维和安全控制功能,尤其在生产环境中至关重要。
我们来一步步深入、清晰地理解这段内容的含义。
🧩 一、Ignite 集群的三种状态
Ignite 集群可以处于以下三种状态之一:
🔍 二、每种状态详解
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 语句
- 如果尝试修改数据,会抛出异常:
IgniteClusterReadOnlyException: Cluster is in read-only mode.
🎯 使用场景:
- 升级前临时保护数据
- 数据迁移时防止写入
- 安全审计期间锁定集群
🚦 三、集群初始状态为什么不同?
ACTIVE
INACTIVE
📌 类比:就像飞机起飞前必须由飞行员手动解除“停机刹车”一样,持久化集群也需要你手动执行 set state ACTIVE
来“启动”。
🛠️ 四、如何切换集群状态?(四种方式)
你可以通过以下任意一种方式立即改变集群状态:
✅ 方式 1:控制脚本(control.sh
)
# 设置为只读./bin/control.sh --set-state ACTIVE_READ_ONLY# 激活集群./bin/control.sh --set-state ACTIVE# 停用集群(危险!会丢数据)./bin/control.sh --set-state INACTIVE
💡 适用于运维脚本、命令行操作。
✅ 方式 2:REST API
http://:8080/ignite?cmd=setstate&state=ACTIVE_READ_ONLY
示例:
curl \'http://localhost:8080/ignite?cmd=setstate&state=ACTIVE\'
💡 适用于自动化系统、Web 工具集成。
✅ 方式 3:编程方式(Java API)
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
远程调用。
⚠️ 五、重要注意事项
INACTIVE
会释放内存 → 非持久化数据永久丢失🧠 六、典型使用场景
set state ACTIVE
set state ACTIVE_READ_ONLY
→ 升级 → set state ACTIVE
set state INACTIVE
停止所有访问✅ 总结:一句话理解
Ignite 集群有三种状态:
INACTIVE
(关闭)、ACTIVE
(正常)、ACTIVE_READ_ONLY
(只读)。状态切换是全局、立即生效的操作,可用于控制集群的可用性和安全性,但需谨慎使用,尤其是INACTIVE
会导致内存数据丢失。
📌 类比记忆:
如果你正在设计一个 Ignite 运维平台,建议将“集群状态”作为一个醒目的开关按钮,并加上二次确认弹窗(尤其是对 INACTIVE
操作),防止误操作导致数据丢失。
需要我帮你写一个安全的状态切换脚本吗?😊