这段文档是关于 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
操作),防止误操作导致数据丢失。
需要我帮你写一个安全的状态切换脚本吗?😊