跳到主内容

v0.29.0 版本说明

EnerOS v0.29.0 版本说明

发布日期:2025-12-07 版本代号:Distributed Git Tag:v0.29.0 支持状态:稳定(Stable) Crate 总数:78(新增 4 个) 测试用例数:10000+(新增 500+)

概述

EnerOS v0.29.0「Distributed」是分布式部署专项版本,使 EnerOS 能够跨多节点运行。省级调度中心的电网规模可达数万节点,单机无法承载完整的拓扑、潮流、时序负载。v0.29.0 将 EnerOS 从单机系统升级为分布式系统,通过节点发现、数据分片、分布式事务、一致性保证四大能力,实现水平扩展。

本版本引入了五大核心能力:分布式部署(Distributed Deployment)、节点发现(Node Discovery)、数据分片(Data Sharding)、分布式事务(Distributed Transaction)、一致性保证(Consistency Guarantee)。集群可从 3 节点扩展至 64 节点,支撑 10 万级电网节点的实时运行。

设计哲学上,v0.29.0 坚持「分区容忍优先」——在网络分区时优先保证可用性(AP),关键操作通过 quorum 保证一致性;「数据本地性」——按电气拓扑分片,使大部分计算在本地完成;「透明扩展」——应用层 API 不变,分布式细节由内核处理。

关键数据

指标数值说明
最大集群规模64 节点水平扩展
节点发现延迟< 2s新节点加入
分片迁移时间< 30s单分片
分布式事务延迟15ms2PC
数据本地性92%本地访问率
新增 Crate4分布式相关

新特性

1. 分布式部署

引入 eneros-distributed Crate,提供分布式集群管理。多节点组成集群,共享拓扑、潮流、时序数据。

集群创建

use eneros_distributed::{Cluster, ClusterConfig, NodeRole};

let cluster = Cluster::new("dispatch-cluster")
    .config(ClusterConfig {
        seed_nodes: vec!["node-1:7946", "node-2:7946"],
        data_dir: "/var/lib/eneros",
        replication_factor: 3,
        shard_count: 32,
    })
    .join("node-1:7946").await?;

// 查看集群状态
let status = cluster.status().await?;
println!("节点数: {}", status.node_count);
println!("分片数: {}", status.shard_count);
println!("健康节点: {}", status.healthy_nodes);

节点角色

角色职责数量说明
Coordinator协调事务3-5通过选举
DataNode存储分片全部承载数据
ComputeNode计算节点全部执行计算
Gateway入口网关2+负载均衡

2. 节点发现

引入 eneros-distributed-discovery Crate,提供节点自动发现与成员管理。基于 SWIM 协议(Gossip 改进),实现高效的成员关系维护。

节点加入

use eneros_distributed_discovery::{Discovery, NodeInfo};

let discovery = Discovery::new(&cluster)
    .gossip_interval(Duration::milliseconds(200))
    .probe_timeout(Duration::milliseconds(500));

// 新节点加入
let node = NodeInfo::new("node-5")
    .address("10.0.1.5:7946")
    .roles(vec![NodeRole::DataNode, NodeRole::ComputeNode])
    .capacity(Capacity {
        cpu: 32,
        memory_gb: 128,
        disk_gb: 2000,
    });

discovery.join(node).await?;
// 自动广播至全集群,2s 内所有节点感知

故障检测

// SWIM 协议故障检测
discovery.on_node_failure(|node| async move {
    log::warn!("节点 {} 失联", node.id);

    // 自动触发分片迁移
    cluster.rebalance_on_failure(node).await?;

    // 通知智能体重编排
    swarm.on_node_failure(node).await?;
});

发现协议对比

协议检测延迟网络开销适用规模
心跳3-15sO(n)< 10 节点
Gossip1-5sO(log n)< 100 节点
SWIM1-3sO(log n)< 1000 节点

3. 数据分片

引入 eneros-distributed-sharding Crate,提供数据分片能力。按电气拓扑分片,使大部分计算在本地完成。

分片策略

use eneros_distributed_sharding::{ShardManager, ShardStrategy};

let sharding = ShardManager::new(&cluster)
    .strategy(ShardStrategy::TopologyBased)
    .shard_count(32);

// 按电气区域分片
sharding.assign(&network).await?;
// 区域 A 的设备 → 分片 0-7
// 区域 B 的设备 → 分片 8-15
// ...

// 查询分片位置
let location = sharding.locate(BusId::from(42))?;
println!("母线 42 在分片 {} (节点 {})", location.shard, location.node);

分片迁移

// 节点故障时自动迁移分片
sharding.migrate(
    from: "node-3",
    to: "node-5",
    shards: vec![8, 9, 10],
).await?;

// 在线迁移,不中断服务

分片策略对比

策略数据本地性迁移频率适用场景
哈希分片50%通用
范围分片70%时序
拓扑分片92%电网
一致性哈希60%弹性

4. 分布式事务

引入 eneros-distributed-tx Crate,提供跨节点事务保证。支持 2PC(两阶段提交)与 Saga 两种模式。

2PC 事务

use eneros_distributed_tx::{Transaction, TxCoordinator};

let coordinator = TxCoordinator::new(&cluster);

// 跨节点事务:同时操作多个分片
let mut tx = Transaction::new();
tx.add(Operation::UpdateBus(42, voltage: 1.02));  // 分片 3
tx.add(Operation::OpenSwitch(15));                  // 分片 7
tx.add(Operation::AdjustGen(1, mw: 200.0));        // 分片 2

match coordinator.commit_2pc(tx).await {
    Ok(_) => println!("事务提交成功"),
    Err(TxError::ParticipantAbort { node, reason }) => {
        println!("节点 {} 拒绝: {}", node, reason);
        // 自动回滚
    }
}

Saga 模式

// 长事务:Saga 模式(补偿事务)
let saga = Saga::new("fault-recovery")
    .step(Step::new("isolate")
        .action(|ctx| isolate_fault(ctx))
        .compensation(|ctx| restore_isolated(ctx)))
    .step(Step::new("transfer")
        .action(|ctx| transfer_load(ctx))
        .compensation(|ctx| restore_load(ctx)))
    .step(Step::new("restore")
        .action(|ctx| restore_power(ctx))
        .compensation(|ctx| cut_power(ctx)));

saga.execute().await?;

事务特性

模式一致性延迟可用性适用场景
2PC15ms关键操作
Saga最终5ms长流程
TCC8ms资源预留

5. 一致性保证

引入 eneros-distributed-consistency Crate,提供多级一致性保证。不同数据类型采用不同一致性级别。

一致性级别

use eneros_distributed_consistency::{Consistency, ReadOptions};

// 强一致性读(总是读最新值)
let bus = cluster.read(BusId::from(42), ReadOptions {
    consistency: Consistency::Strong,
}).await?;

// 因果一致性读(读到因果上最新的值)
let event = cluster.read_event(event_id, ReadOptions {
    consistency: Consistency::Causal,
}).await?;

// 最终一致性读(读任意副本)
let metric = cluster.read_metric("load", ReadOptions {
    consistency: Consistency::Eventual,
}).await?;

复制策略

// 数据复制
let replication = Replication::new()
    .factor(3)  // 3 副本
    .mode(ReplicationMode::Sync)  // 同步复制
    .placement(PlacementPolicy::rack_aware());  // 跨机架

cluster.set_replication(replication).await?;

一致性矩阵

数据类型一致性复制写入延迟适用场景
拓扑数据同步 3 副本15ms开关状态
潮流结果同步 3 副本15ms计算结果
时序数据最终异步 3 副本1ms遥测数据
审计日志同步 3 副本15ms合规要求
缓存最终单副本0.1ms性能优先

改进

  • 网络层:从 TCP 切换至 QUIC,多路复用降低连接建立延迟 60%
  • 序列化:从 JSON 切换至 MessagePack,序列化体积减少 50%
  • 压缩:时序数据传输启用 Zstandard 压缩,带宽占用减少 70%
  • 负载均衡:新增自适应负载均衡器,根据节点负载动态调整分片

Bug 修复

  • 修复 eneros-distributed-discovery 在网络分区时的脑裂问题(#2908)
  • 修复 eneros-distributed-sharding 分片迁移时的数据丢失风险(#2913)
  • 修复 eneros-distributed-tx 2PC 协调者故障时的事务悬挂问题(#2918)
  • 修复 eneros-distributed-consistency 同步复制在慢节点下的超时问题(#2923)

破坏性变更

  • Cluster::new:新增 ClusterConfig 参数,需提供分片与副本配置
  • read/write API:新增 ReadOptions/WriteOptions 参数,指定一致性级别

升级指南

  1. 执行 cargo update -p eneros-distributed
  2. Cluster::new 提供 ClusterConfig
  3. 为读写操作添加一致性级别参数
  4. 参考 docs/migration/v0.29.0.md 获取详细迁移步骤