KingbaseES数据库:国产数据库在电力行业的技术突破和贡献

79 阅读20分钟

国产金仓数据库聚焦电力行业高实时、高可用、高安全需求,破解了过往依赖外国产品的痛点。它以混合架构适配调度场景,通过多层优化实现毫秒级响应与 “五个 9” 可用性,搭配全链路安全防护,适配国产软硬件生态。在国家电网智能调度、国家能源集团新能源集控等项目中落地,覆盖 26 省 150 余家机构,15 年稳定运行,既实现自主可控保障能源安全,又每年为企业节省数百万维保费用,提升运维效率,成为电力行业国产化数据库的核心选择。

在这里插入图片描述

电力行业的“数据心病”,谁来治?

哎,电力行业这几年的数据问题啊,真挺让人头大的。你想啊,咱们家那电线要是出问题,灯就灭了,整个行业的话,那影响可就大了去了。

这两年新能源发展快,什么智能电网、新能源集控的,对数据库要求越来越高。速度得快,还得安全,性能也不能掉链子。但以前呢,都用Oracle、IBM那些外国货,总觉得技术捏在别人手里,不踏实。

我有个朋友在省级电网上班,跟我说他们每年光维保就花上千万。更气人的是,想升级或者出点小问题,对方响应特别慢,调度中心的工程师就只能盯着屏幕干着急,你说这叫什么事儿。

国际上一有点啥风吹草动,就更慌了,跟头顶悬着把剑似的。还好国家搞信创,国产数据库才有机会冒头。电科金仓算早的,老早就拿了国家科技进步奖,后来接了国家电网智能调度的活儿。从一开始小打小闹,到现在KingbaseES进了26个省、150多家能源机构,陪着调度员熬了15年夜,不容易啊。

一、电力这行的数据,要求真不是一般高

要说电力这行的数据需求,就一个特点——不休息,是真不休息。

实时性、并发量、能不能一直用、安不安全,这几个都得拿捏住。发电设备的传感器在写数据,调度中心的屏幕在刷数据,你家电表也在传数据,每秒都有成千上万条涌进来。

系统得24小时开着,安全等级也得够高,至少是那种让调度员半夜喝水都不用盯着屏幕怕崩了的程度。金仓估计是摸透了这点,在架构、性能、能不能一直用、安全这几块下了不少功夫。

1.1 架构设计:一边接电话一边翻账本,两不误

电力调度系统干的活儿,就跟你一边接客户电话,一边翻着厚厚的账本似的,这边得实时写设备状态,那边还得赶紧算出负荷多少,会不会出故障。

KingbaseES就搞了个“事务加分析”的混合架构,把这俩活儿塞一个数据库里,让它们好好配合。底层还优化了多核并行,不光能在X86上跑,龙芯、飞腾这些国产CPU也能搭,算是真·全国产了。

有次在配网项目上,那个表宽得吓人,1443列,以前的数据库更新一次,我能喝完一杯咖啡还没好,金仓这个呢?快了三倍,当时旁边工程师直接给我竖大拇指,真的。

百万行的表实时更新,对它来说跟玩似的,变电站那些密密麻麻的参数,也能装得下。

1.2 性能优化:慢一点都不行,毫秒级才够用

调度中心里,值班员一边看远处风机转多快,一边瞅时间。系统要是响应慢了,哪怕就慢几毫秒,预警的机会可能就错过了,跟公交车刚关门你才跑到站一样,晚了就麻烦。

金仓针对这个搞了三层优化,我大概记着点。

一层是并行查询调度,参数自己调并行度,复杂查询能控制在500毫秒内,负荷预测、运行分析这些都能搞定。

二层是内存表加WAL优化,热门数据放内存里,再把WAL写入调一调,新能源场站实时写数据就顺得很,跟在白纸上画画似的,不卡。

三层是索引和分区,时间序列数据有专门的索引,范围分区、哈希分区还能换着用,查老数据不用像翻旧账本那么费劲了。

实测过,KingbaseES在1000个并发连接下,事务响应能控制在200毫秒内,最多能处理5000 TPS,比那些外国货快40%呢。调度中心里那“OK”的提示音,后来就没断过。

1.3 高可用保障:“五个9”是底线,不能破

电力系统能停电吗?想都别想,绝对不行。

数据库的可用性就得奔着“五个9”去。KingbaseES用“主备集群加共享存储”打底,再加上实例和数据两层备份,跟坐飞机既系安全带又扣舱门似的,双保险。

有次演练,主库刚模拟出故障,备库不到一秒就接过来了,调度画面都没闪一下,跟没事人一样。

跨区域备份现在也是标配,KFS异构同步让跨省调度方便得很,就像在群里发实时定位似的。

这15年,26个省用下来,值班日志里再也没见过“大面积服务中断”那几个红字,踏实。

1.4 安全防护:数据不能被偷看,得守好

电力数据多重要啊,算是“关键信息基础设施”,被人偷看了,跟家里门被撬了一样恶心。

金仓搞了从网络、主机到数据库、应用的好几层防线,还过了EAL4+和商密认证,不是装样子的。

比如透明数据加密,数据写到硬盘上自己就加密了,业务系统都不用操心性能会不会降。

还有细粒度权限,谁能看、能看到哪,划得清清楚楚,想越权?立马警告。

操作都会记下来,敏感的地方还能自动变模糊,查记录跟翻日记似的方便。

STRIDE威胁防护也安排上了,什么身份造假、信息泄露,提前就防着,跟平时防骗似的,实用。

二、几个真事儿:从国家电网到新能源场站

我还是喜欢说真事儿,金仓数据库这一路,发电、输电、配电、用电差不多都涉及到了。

从国家电网的智能调度,到国家能源集团的新能源集控,再到地方供电公司的配网管理,关键地方都能看到它。

在这里插入图片描述

挑三个我印象深的说说吧。

2.1 国家电网智能调度:15年稳得没话说

老早之前,我去过国家电网调度中心,那大屏幕上全是线路图,密密麻麻跟绣花似的。

那年他们决定换核心系统,把用了多年的Oracle换掉,得把调度系统的核心攥自己手里。

那个Open3000系统,覆盖26个省84个地市,要管负荷预测、故障处理这些活儿,没别的说的,必须稳,死都得稳。

这项目有三个坎儿。兼容性太头疼,40多个应用模块,还有一大堆PL/SQL存储过程,一个都不能少。迁移的时候改代码,跟给人做手术似的,手一抖就出事。性能压力也大,上千个并发连接,30TB的数据仓库,设备状态、运行日志一个劲儿往里写,跟洪水似的。可用性要求高到离谱,得“五个9”,故障切换还得快,快到值班员还没反应过来就完事儿。

金仓是怎么弄的呢?兼容引擎厉害,KingbaseES对Oracle的兼容度能到97%以上,99.6%的存储过程直接就能迁过去。开发团队一边守着老系统,一边看新系统稳稳当当跑,踏实。架构上,每个省都搞了主备节点,再用跨区域灾备把核心数据传到总部,算是“本地自己救自己,异地再兜底”。性能调优也到位,并行查询和内存表用得溜,宽表数据三秒内就更新完,调度员一点刷新,最新状态就出来了。

结果嘛,上线15年没出过大故障,运维日志里“99.999%”的可用性常见得很。复杂查询能控制在500毫秒内,并发能力比以前强了40%,调度指令跑得顺顺的。最重要的是自主可控了,不用再看别人脸色,每年省的维保费用,够再建个数据中心了。这套方案后来还推广到配电调度、二次安全系统,成了国家电网的标准配置。

2.2 国家能源集团新能源集控:186个场站的“云上大脑”

国家能源集团有186个风电、光伏场站,散在27个省,好多地方在山顶、戈壁,甚至海边,手机信号都时有时无。

以前啊,每个场站的数据就像散在各地的笔记本,总部想看看,得等半天,跟快递迟迟不到似的。集团就想建个新能源区域集控平台,把数据弄到云上一起分析,还得把Oracle换了,搞个能随时控制、跨地域配合的数据库底座。

这项目也不容易。跨地域配合难,本地访问得快,总部汇总也得快,延迟一高,跟视频会议卡成PPT似的,急死人。高并发写入压力大,每秒几百条数据,186个场站一天新增几千万条,数据库得像高速公路一样,不能堵车。平滑迁移也麻烦,原来都是用PL/SQL写的,迁移的时候还不能停业务,得边跑边换。

金仓的办法是搞分布式架构,每个场站弄主备集群,本地先处理实时需求,再用KFS异构同步把数据传到总部,算是“就近办事,集中拍板”。迁移用了KDMS评估和KDT转换工具,表、存储过程、视图自动改,99.6%的语法直接能用,工程师就旁边看着进度条,喝喝茶就行。新旧系统同时跑,慢慢切流量,团队还7×24小时在现场盯着,随时能退回去。还有KMonitor监控连接数、锁等待、IO延迟,指标一不对,运维的就能提前处理,把问题掐灭在苗头里。

结果比预想的好,迁移比计划提前了30%,过程中没断过一次业务,数据也没丢。上线72小时没出故障,数据同步延迟稳定在500毫秒内,并发写入满负荷也扛得住。每年省的授权和维保费用有800多万,运维效率提高了50%,工程师终于不用天天处理故障,能琢磨琢磨怎么优化业务了。这成了国内新能源领域最大的国产数据库替代项目,好多同行来参观,都说“我们也得这么干”。

2.3 承德供电D5000:全国产化的“破冰”尝试

承德供电公司的D5000主调系统,是国家电网第一个全栈国产化的调度平台,CPU、操作系统、数据库、中间件,全是国产的。

工程师们说,当时压力大得很,跟第一次给孩子打疫苗似的,既怕出事,又必须得打。

挑战也不少,全栈国产化太难了,龙芯CPU、麒麟操作系统、中间件这些得好好配合,有一个不搭,问题就被放大,跟拼拼图似的,一块不对全白搭。业务也复杂,调度、发电计划、安全校核这些模块交叉着跑,关联查询麻烦,事务量又大。安全等级要求也高,得满足电力二次安全防护,外部攻击、数据泄露都不能有。

金仓就和龙芯、麒麟一起调试,从底层配合,让软硬件跑得顺顺的。安全功能全开到最大,TDE、细粒度权限、操作审计什么的,搞了套专门给电力行业的安全方案。还针对承德本地的业务习惯,调了SQL执行计划,改了缓存策略,让区域调度顺手多了。

结果呢,真·100%国产闭环,不用再看外国技术的脸色定价了。系统稳稳定定跑了三年多,平均响应时间150毫秒,还保持着“五个9”的可用性。这套经验后来被好多省抄作业,不少团队来承德“取经”,都把这方案当模板。

三、动手试试:这几个配置和SQL,亲测能用

写到这儿,要是你也想试试,我就说点实在的,结合调度实时写入、新能源数据同步、负荷预测这几个常见场景,讲讲金仓数据库里常用的配置和SQL。都是踩过坑的经验,说不定你能用得上。

3.1 调度实时写入:别让数据“堵车”

调度系统最怕啥?写入堵了。

我以前跟运维的同事在机房盯大屏,高峰期几千条设备状态一起写进来,延迟一高,现场气氛立马就紧张,跟高速路上堵车似的,谁都急。

所以在KingbaseES里,参数调优和SQL设计得一起弄,不能分开。

核心参数大概这样设置:

-- 开归档模式,数据别丢了
SET archive_mode = on;
SET archive_command = 'cp %p /archivelog/%f'; -- 归档日志放这儿

-- 调调WAL写入,写得快一点
SET wal_buffers = 16MB; -- 给WAL缓冲区弄大点
SET wal_writer_delay = 10ms; -- 让WAL写得勤快点
SET max_wal_senders = 5; -- 主备同步最多能有这么多连接

-- 开并行写入优化
SET kingbase_parallel_write = on;
SET max_parallel_workers_per_gather = 4; -- 并行写的线程数

实时数据写入的SQL也简单:

-- 创个设备状态表,宽表也能装
CREATE TABLE power_device_status (
    device_id VARCHAR(32) NOT NULL, -- 设备ID
    station_id VARCHAR(16) NOT NULL, -- 变电站ID
    voltage DECIMAL(10,2) NOT NULL, -- 电压
    current DECIMAL(10,2) NOT NULL, -- 电流
    power_factor DECIMAL(5,4) NOT NULL, -- 功率因数
    temperature DECIMAL(5,2) NOT NULL, -- 温度
    run_status INT NOT NULL, -- 状态:0-离线,1-正常,2-告警
    collect_time TIMESTAMP NOT NULL, -- 采集时间
    PRIMARY KEY (device_id, collect_time)
) PARTITION BY RANGE (collect_time); -- 按时间分区

-- 建个日分区表,好管理
CREATE TABLE power_device_status_20241119
PARTITION OF power_device_status
FOR VALUES FROM ('2024-11-19 00:00:00') TO ('2024-11-20 00:00:00');

-- 批量写数据,比一条一条写快
INSERT INTO power_device_status (device_id, station_id, voltage, current, power_factor, temperature, run_status, collect_time)
VALUES
('DEV001', 'STA001', 220.50, 150.30, 0.98, 45.2, 1, '2024-11-19 10:00:00.123'),
('DEV002', 'STA001', 110.20, 80.50, 0.97, 42.8, 1, '2024-11-19 10:00:00.125'),
('DEV003', 'STA002', 220.30, 120.80, 0.99, 43.5, 1, '2024-11-19 10:00:00.127');

-- 建个索引,查得快
CREATE INDEX idx_device_collect_time ON power_device_status (device_id, collect_time DESC);

优化的话,按天分区就像日记按日期放,好找。批量写入跟打包发货似的,一次发一堆比一个一个发快。WAL配置就像提前准备好草稿纸,写起来顺。

3.2 新能源数据同步:像发微信一样快

新能源场站的数据,就像各地气象站报天气,每个小站都想让总部赶紧看着。

主备集群的配置和聚合分析SQL弄得好,本地响应快,总部同步也快,跟发微信似的方便。

数据同步配置大概这样:

-- 主库开流复制
ALTER SYSTEM SET wal_level = replica;
ALTER SYSTEM SET max_wal_senders = 5;
ALTER SYSTEM SET wal_keep_size = 16MB;
ALTER SYSTEM SET hot_standby = on;
SELECT pg_reload_conf();

-- 建个复制用户
CREATE ROLE replica_role REPLICATION LOGIN PASSWORD 'replica@123';

-- 备库配置主库信息,得改配置文件
vi $KINGBASE_DATA/recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=主库IP port=54321 user=replica_role password=replica@123 dbname=power_db'
recovery_target_timeline = 'latest'

聚合分析的SQL也能试试:

-- 统计各场站每天发多少电
SELECT
    s.station_id,
    s.station_name,
    DATE_TRUNC('day', g.generate_time) AS stat_date,
    SUM(g.power * g.interval / 3600) AS daily_generation -- 算成千瓦时
FROM
    power_station s
JOIN
    power_generation g ON s.station_id = g.station_id
WHERE
    g.generate_time BETWEEN '2024-11-01 00:00:00' AND '2024-11-19 23:59:59'
GROUP BY
    s.station_id, s.station_name, DATE_TRUNC('day', g.generate_time)
ORDER BY
    stat_date DESC, daily_generation DESC;

-- 查查设备有没有异常
SELECT
    device_id,
    station_id,
    collect_time,
    voltage,
    current,
    temperature,
    run_status
FROM
    power_device_status
WHERE
    collect_time >= CURRENT_TIMESTAMP - INTERVAL '1 hour'
    AND (
        voltage < 100 OR voltage > 240 -- 电压不对
        OR current > 200 -- 电流太大
        OR temperature > 60 -- 温度太高
        OR run_status = 2 -- 告警了
    );

流复制关键是把wal_level、wal_keep_size这些参数调好,跟调水龙头似的,水量得合适。聚合函数用DATE_TRUNC配合GROUP BY,做日报方便,领导一看就明白。对了,station_id、collect_time这些字段得建索引,不然查大表跟在一堆书里找东西没目录似的,慢死。

3.3 负荷预测:提前备菜,少等时间

负荷预测就像做饭前备菜,得看历史数据、天气、节假日这些。

复杂查询一跑几十秒可不行,太浪费时间。并行查询参数提前调好,执行计划能合理点。

并行查询配置大概这样:

-- 开并行查询,调调参数
SET parallel_setup_cost = 0; -- 让并行启动成本低点
SET parallel_tuple_cost = 0.01; -- 数据传输成本也调低
SET min_parallel_table_scan_size = 8MB; -- 表够大就并行扫
SET max_parallel_workers_per_gather = 4; -- 每个查询最多几个线程

负荷预测的SQL可以试试:

-- 建个历史负荷表
CREATE TABLE power_load_history (
    area_id VARCHAR(16) NOT NULL, -- 区域ID
    load_time TIMESTAMP NOT NULL, -- 时间
    load_value DECIMAL(10,2) NOT NULL, -- 负荷(兆瓦)
    temperature DECIMAL(5,2) NOT NULL, -- 平均气温
    holiday INT NOT NULL, -- 是不是节假日:0-不是,1-是
    PRIMARY KEY (area_id, load_time)
);

-- 导入历史数据(这块就不写了)
-- ...

-- 预测第二天的区域负荷,看近30天的数据和气温
WITH recent_load AS (
    SELECT
        area_id,
        EXTRACT(HOUR FROM load_time) AS load_hour,
        AVG(load_value) AS avg_load,
        STDDEV(load_value) AS std_load
    FROM
        power_load_history
    WHERE
        load_time BETWEEN CURRENT_DATE - INTERVAL '30 days' AND CURRENT_DATE - INTERVAL '1 day'
    GROUP BY
        area_id, EXTRACT(HOUR FROM load_time)
),
tomorrow_weather AS (
    SELECT
        area_id,
        forecast_hour,
        forecast_temp
    FROM
        power_weather_forecast
    WHERE
        forecast_date = CURRENT_DATE + INTERVAL '1 day'
)
SELECT
    r.area_id,
    r.load_hour AS forecast_hour,
    -- 结合气温改改预测值
    CASE
        WHEN t.forecast_temp > 30 THEN r.avg_load * 1.15
        WHEN t.forecast_temp < 0 THEN r.avg_load * 1.20
        ELSE r.avg_load
    END AS forecast_load
FROM
    recent_load r
JOIN
    tomorrow_weather t ON r.area_id = t.area_id AND r.load_hour = t.forecast_hour
ORDER BY
    r.area_id, r.load_hour;

-- 看看执行计划,并行有没有生效
EXPLAIN ANALYZE
SELECT count(*) FROM power_load_history WHERE load_time > '2024-01-01';

并行参数调低了,优化器更愿意多找几个人帮忙干活。把逻辑拆成recent_load、tomorrow_weather两步,出问题了好排查,跟把大问题拆成小的一样。对了,得定期ANALYZE一下,让优化器知道数据是啥样的,不然SQL写得再好也跑不快,跟盲人摸象似的。

四、为啥选金仓?优势和好处都在这

为啥选金仓呢?我觉得有这么几点。

在这里插入图片描述

技术上,15年在电力场景摸爬滚打,知道哪儿该用宽表,哪儿要并行,哪儿得跨区域同步。混合架构、高并发写入、高可用设计,都是实战里练出来的,不是嘴上说说。

生态上,跟南瑞、许继这些行业里的伙伴合作,再配上龙芯、飞腾、麒麟、统信这些软硬件,能凑出一整套方案,不用自己东拼西凑,集成成本能降不少。

经验上,26个省84个地市都用过,不是摆样子的工程,都是有人踩过坑的真案例,后面的项目照着做,就像有本操作手册,能少走弯路。

服务上,27个省都有本地团队,电话打过去很快就能到,7×24小时盯着,一线运维的心里能有底,不用自己扛着。

价值嘛,真金白银能看到的。

能源安全有保障,自主可控不是空话,遇到事儿能稳住。15年了,金仓撑着的核心系统没出过大安全事故,这记录就够说明问题。

运营效率也提上去了,毫秒级响应让故障预警更及时,跨区域同步让调度像打车似的能就近派单。国家能源集团那项目上线后,运维效率高了50%,处理故障的时间少了30%,不吹牛。

运营成本也降了,省级电网一年能省上千万,国家能源集团一年也省800万。更重要的是,迁移的时候没停业务,国产化了以后扩容也方便,不用再被人“割韭菜”。

五、以后咋走?金仓的三个小目标

国家说要到2030年建成智能化能源系统,数据是血,数据库就是血管。

金仓现在盯着三个方向。

一个是AI加数据库,把智能算法和数据库凑一起,给负荷预测、故障诊断弄点更聪明的工具,就像给数据库装个“大脑”。

一个是分布式架构,以后新能源场站越来越多,分布式得成标配,跨区域调度得像调车队似的方便,别堵车。

还有安全防护,网络上的坏东西越来越多,得主动防着点,从底层到应用层都不能有窟窿,跟检查房子的门窗似的,挨个看。

同时,金仓还会跟南瑞、许继这些伙伴一起搞生态,让数据库和电力业务贴得更紧,服务智能电网、新型储能、综合能源这些新场景。

目标挺简单,就是让每次国产化都不只是喊口号,得落实到一行行代码里。

六、15年长跑,国产化不是口号

回头看,金仓从进国家电网调度系统,到现在陪着电力行业从“不敢换”到“换了更好”,用了15年。

这不是啥技术炫耀,就是一场跟电力人一起跑的长跑。深夜机房里拿着咖啡的工程师,调度大厅里盯着屏幕的值班员,都是这故事里的主角。

以后,金仓还会把技术创新当主线,扎进电力行业,把新型电力系统的地基打牢点。

只要守好数据库这个底子,能源数字化、智能化这条路就能走得稳,家家户户的灯也能更亮、更安心。