金仓多模数据库:一库替代传统五库的技术方案与落地路径
多中大型企业现在都跑着一套经典组合:Oracle 做主交易,Redis 做缓存、MongoDB 存文档、ES 负责检索,再配上时序库或者图数据库做监控、风控图谱,业内一般叫它五库架构。 这套组合够用,但麻烦也很实在:多套引擎、多套运维,跨库同步依赖中间件,一致性很难稳住,开发和 DBA 都要掌握好几套语法。金仓 KingbaseES 多模版本给出的路线,是在内核层面把多种数据模型融合,用一套库承接原来五套库的全部场景,同时做到对 Oracle 高度兼容。
一、传统五库各自定位,以及金仓多模的本质区别
先简单理清传统五库的分工。
- 关系库(Oracle/MySQL):核心交易、结构化业务,跑复杂 SQL、PL/SQL 存储过程,对事务强一致性要求最高。
- 键值库(Redis):热点缓存、分布式锁、计数器,追求超高吞吐和低延迟。
- 文档库(MongoDB):半结构化、嵌套 JSON 数据,客户档案、业务协议这类 Schema 经常变动的数据适合放这里。
- 检索库(Elasticsearch):全文检索、日志模糊查询、多字段检索分析。
- 时序 / 图二选一:时序库(InfluxDB/TDengine)承接设备指标、监控打点高频写入;图库(Neo4j/Nebula)做实体关联、资金链路、风控图谱遍历。
市面上不少多模产品,只是把几个独立引擎打包在一起,对外统一入口,属于拼接式方案。金仓多模不是这个路子。 它是同一个内核、同一套存储、同一套元数据体系,原生内置关系、KV、文档、检索、时序、图模型。所有模型跑在同一个实例,共享缓存、IO、内存资源。数据不用跨引擎拷贝,天然支持跨模型 ACID 事务。 同时它对 Oracle 做到高兼容,SQL、PL/SQL、数据类型、驱动、工具链都可以直接复用,原有 Oracle 业务不用大规模改写。
-- 可直接在金仓执行,和Oracle语法保持一致
CREATE OR REPLACE PROCEDURE transfer(p_from IN VARCHAR2, p_to IN VARCHAR2, p_amt IN NUMBER) IS
BEGIN
UPDATE account SET balance = balance - p_amt WHERE acc_no = p_from;
UPDATE account SET balance = balance + p_amt WHERE acc_no = p_to;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE_APPLICATION_ERROR(-20001, '转账失败:' || SQLERRM);
END transfer;
/
CALL transfer('622208','622209',1000);
二、底层靠四大统一,解决老架构的核心痛点
能不能真正替代五库,关键看底层能不能打通,核心就是四点统一。
2.1 统一存储与计算
行存、列存、混合存储都由金仓存储引擎统一管理。交易类关系表用行存保证事务响应,时序指标用列存提升聚合性能,不用分开部署不同存储组件。
-- 交易账户表,行存,适配Oracle迁移业务
CREATE TABLE account (
acc_no VARCHAR2(20) PRIMARY KEY,
balance NUMBER(18,2),
create_time DATE
) WITH (STORAGE_TYPE = HEAP);
-- 设备时序监控表,列存+按天分区
CREATE TIMESERIES TABLE monitor (
device VARCHAR2(50),
cpu FLOAT,
mem FLOAT,
ts TIMESTAMP PRIMARY KEY
) WITH (STORAGE_TYPE = COLUMN, TIME_PARTITION = DAY);
2.2 统一元数据与跨模型事务
所有表、时序对象、图节点、KV 空间,都登记在同一套元数据字典里。 这也是和传统多库最大的差别:一笔事务里面,可以同时修改关系表、写入时序指标、更新 KV 缓存,要么全部成功,要么全部回滚,不再只能依靠最终一致性。
BEGIN
UPDATE trade SET amount = 1000 WHERE trade_id = '123';
INSERT INTO trade_ts (ts, trade_id, amount) VALUES (NOW(), '123', 1000);
SELECT kv_set('trade:123', '1000');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('事务失败:' || SQLERRM);
END;
2.3 统一访问入口,兼容原有协议
应用改造压力是落地重点。金仓一方面支持标准 SQL、兼容 Oracle 驱动与 PL/SQL 工具;另一方面原生兼容 Redis、MongoDB 协议、ES 的 RESTful 接口。 原来操作 Redis、Mongo、ES 的客户端,只改连接地址就能对接,业务代码改动量很小。
# 原有Redis客户端直接操作金仓KV引擎
SET account:622208 5000
GET account:622208
POST /customer/_search
{
"query": {
"match": {
"profile.name": "张三"
}
}
}
2.4 统一运维治理
权限、备份、监控、容灾一套体系覆盖全部模型。一次备份就能把交易数据、缓存、文档、时序、图谱数据全部落盘;一套权限语句,同时管控关系表、KV 空间、时序表。不用维护五套备份策略、五套监控大盘。
-- 一次性授权,覆盖多种模型对象
GRANT SELECT, INSERT, UPDATE ON account TO user1;
GRANT SELECT, INSERT ON monitor TO user1;
GRANT KV_ALL ON kv_space TO user1;
-- 全库统一备份
BACKUP DATABASE TO '/backup/kingbase_full.bak' FULL;
三、分模型替代方案:逐个承接原有业务场景
不是简单支持语法,而是针对每一类场景做内核优化:
- 关系模型:承接 Oracle 核心交易,兼容 PL/SQL、分区、物化视图、同义词,原有 Oracle 业务优先迁移。
- KV 模型:替代 Redis,支持持久化,KV 和关系表可以放在同一个事务里同步,规避缓存不一致。
SELECT kv_set('key','val'); SELECT kv_get('key'); - 文档模型:替代 MongoDB,原生 JSON/BSON 支持,支持嵌套路径查询、GIN 索引。
SELECT * FROM customer WHERE profile->'$.address.city' = '朝阳'; - 检索模型:替代 ES,内置倒排索引、中文分词,支持 DSL,也能用 SQL 的 MATCH 做检索。
SELECT * FROM logs WHERE MATCH(content, '登录失败 密码错误'); - 时序 / 图模型:时序支持 InfluxQL;图引擎支持 Cypher,做资金链路、风控网络遍历。
MATCH (u:User)-[:拥有]->(a:Account) RETURN a.no;
一个很有价值的能力,就是跨模型联查。传统方案需要 ETL、中间件把多库数据拉到一起,金仓内部直接关联关系、图、时序数据。
SELECT
u.id AS user_id,
a.acc_no AS account_no,
t.trade_id,
t.amount,
m.cpu,
m.mem
FROM
"user" u
JOIN account a ON u.id = a.user_id
JOIN GRAPH_TABLE(
MATCH (a:Account{no:a.acc_no})-[:交易]->(t:Trade)
RETURN t.trade_id AS trade_id
) g ON t.trade_id = g.trade_id
JOIN monitor m ON m.device = 'server01'
AND m.ts > NOW() - INTERVAL '1 hour'
WHERE
u.id = 'U001';
四、落地迁移六步法,优先保障核心交易稳定
落地思路是先迁 Oracle 核心,再逐步接入其他四类库,灰度割接、不停业务。
- 现状梳理与场景映射 盘点 Oracle 侧表、存储过程、触发器,梳理 Redis、Mongo、ES、时序 / 图库的数据流向,标记哪些缓存对应哪张交易表,把业务场景映射到金仓对应模型。
SELECT table_name, storage_type FROM user_tables;
SELECT object_name, object_type FROM user_objects WHERE object_type IN ('PROCEDURE','FUNCTION');
- 环境部署与多模开关配置 部署 V8R6 及以上版本,打开 Oracle 兼容开关,按需启用 Redis、Mongo、ES 协议端口。
ALTER SYSTEM SET ORACLE_COMPATIBLE = ON;
ALTER SYSTEM SET redis_protocol_enable = ON;
ALTER SYSTEM SET mongodb_protocol_enable = ON;
ALTER SYSTEM SET es_api_enable = ON;
- Oracle 业务迁移验证 使用 KMT 迁移工具,全量 + 增量迁移表、索引、PL/SQL。迁移完成后核对行数、执行存储过程、验证索引触发器。
SELECT COUNT(*) FROM account;
CALL transfer('622208','622209',1000);
- 其他四库分批迁移 按业务优先级,把时序、文档、KV、检索数据依次导入。原有客户端直接对接对应协议端口,不用大规模改业务逻辑。
- 跨模型整合与性能调优 拆掉原来的同步中间件,建立多模专用索引,配置资源组隔离,保证核心交易资源优先。
CREATE INDEX idx_customer_address ON customer USING GIN (profile->'$.address');
CREATE RESOURCE GROUP rel_group WITH CPU_RATIO = 70;
ALTER SYSTEM SET multimode_optimizer = ON;
- 灰度上线、全量割接 先把监控、日志这类低风险业务切过去,持续观测延迟、报错、一致性;稳定后再切换交易相关的缓存、文档数据;最后下线原有五套数据库。
五、可靠性保障体系,匹配金融等强监管场景
- Oracle 深度兼容:支持 CONNECT BY、ROWNUM、NVL、同义词、序列等 Oracle 特有语法,DBA 学习成本低。
- 多模性能可控:关系 TP 性能对标 Oracle;时序高吞吐写入;KV 支持十万级 QPS;图引擎适合亿级节点关联查询。
- 跨模型事务原子性:同一事务内多种数据模型一起提交或回滚,解决缓存、主表、监控数据不同步这个高频痛点。
- 企业级高可用与安全:支持主备流复制、RAC 集群、TDE 加密、行级安全、操作审计,满足等保要求。
ALTER TABLE account MODIFY (balance ENCRYPT);
CREATE POLICY account_policy ON account USING (user_id = SESSION_USER);
AUDIT INSERT, UPDATE, DELETE ON account BY ALL;
六、金融行业落地示例
某银行原来的架构:Oracle 承载账户交易,Redis 缓存、Mongo 放客户画像、Neo4j 风控图谱、InfluxDB 采集交易监控指标。 痛点很集中:五套组件、多组运维人力;跨库风控查询依赖 ETL,延迟高;缓存和主表一致性很难管控。 迁移到金仓 MPP 集群之后,全部数据收敛到一套库。风控查询直接在库内完成关系、文档、图谱、时序的联合检索,不需要外部中间件。
SELECT
t.trade_id,
t.acc_no,
t.amount,
c.profile->'$.tags' AS user_tags,
g.risk_level,
m.cpu AS server_cpu
FROM
trade t
JOIN customer c ON t.cust_id = c.cust_id
JOIN GRAPH_TABLE(
MATCH (a:Account{no:t.acc_no})-[:关联]->(r:RiskNode)
RETURN a.no AS acc_no, r.risk_level AS risk_level
) g ON t.acc_no = g.acc_no
JOIN monitor m ON m.ts = t.trade_time
WHERE
c.profile->'$.tags' @> '["VIP"]'::JSONB
AND t.amount > 100000
AND g.risk_level = '高'
AND m.cpu > 80
AND t.trade_time > NOW() - INTERVAL '5 seconds';
落地收益:架构简化,运维人力大幅缩减;硬件资源利用率提升;跨模型查询从分钟级延迟降到毫秒;应用改造比例控制在很低水平。
七、总结
金仓这套 “一库替代五库” 方案,核心不是简单减少数据库数量,而是用原生多模内核解决分散架构的固有问题。 它的落地前提是 Oracle 高兼容,保护企业已有的业务资产;技术核心是存储、计算、元数据、事务四层统一,区别于外挂引擎拼接的伪多模;稳妥落地方式一定是分批迁移,先稳住核心交易,再逐步收拢缓存、文档、检索、时序图谱场景。 对企业来说,收益体现在三个地方:降低开发和运维的人力成本、减少多组件带来的故障点;解决跨库数据一致性难题;让原本分散在不同数据库的数据,可以直接在内层做关联分析,释放数据价值。
所属版权:JSON工具 JSON工具
原文路径:
转载声明:转载时必须以链接形式注明原始出处及本声明。