从烟囱到融合:一次MongoDB迁移引发的架构重构深思
文章目录MongoDB原生协议兼容这个事我得展开说说然后聊到迁移具体怎么搞性能这块我得说实话SQL操作文档数据这个能力被严重低估了多集群架构这个事也值得聊聊关于融合数据库架构的一些碎碎念和文献思考回到那次迁移本身兼容是对前人努力的尊重是确保业务平稳过渡的基石然而这仅仅是故事的起点说真的我一开始根本没打算写这篇东西。上个月帮一个老朋友搞MongoDB迁移折腾了大半个月过程中把KES的MongoDB兼容版翻来覆去用了好几遍踩了不少坑也想明白了不少事。MongoDB原生协议兼容这个事我得展开说说当时我也不太信这个零代码修改的说法因为之前见过太多号称兼容实际上各种不兼容的案例。但翻完KES MongoDB兼容版的产品文档和一些社区帖子之后发现它确实是走了一条比较硬核的路——不是在应用层做适配而是在数据库协议层直接兼容。啥意思呢你的Java应用原来用MongoDB Java Driver连接MongoDB现在只要把连接地址从MongoDB服务器改成KES服务器端口设成27017KES监听这个端口来接收MongoDB协议请求其他啥都不用动。Driver发出的所有insertOne、find、update这些命令KES都能识别和处理。// 原来连MongoDBMongoClientclientMongoClients.create(mongodb://user:passmongo-host:27017/mydb);// 迁移到KES只改地址MongoClientclientMongoClients.create(mongodb://system:123456kes-host:27017/mydb);// 后续所有操作完全不变MongoCollectionDocumentcollectionclient.getDatabase(mydb).getCollection(users);// 插入文档collection.insertOne(newDocument(name,张三).append(age,28).append(tags,Arrays.asList(vip,active)));// 查询FindIterableDocumentresultscollection.find(Filters.eq(age,28));看到没就是改个连接字符串的事。Spring Data MongoDB、PyMongo这些主流框架也都能直接用因为KES兼容的是MongoDB Wire Protocol而不是简单做了个API翻译层。我当时跟朋友说你可以先用 mongosh 连上去试试感觉就跟连了个真的MongoDB一样// 用mongosh连接KES的MongoDB兼容端口mongoshmongodb://system:123456127.0.0.1:27017/mydb?directConnectiontrueauthMechanismSCRAM-SHA-256// 创建集合db.createCollection(orders)// 插入文档db.orders.insertOne({order_id:ORD20260801001,customer:{name:李四,phone:138xxxx0001},items:[{sku:SKU001,qty:2,price:99.9},{sku:SKU002,qty:1,price:199.0}],status:pending,created_at:newDate()})// 查询db.orders.find({customer.name:李四})// 聚合查询统计每个客户的订单数db.orders.aggregate([{$group:{_id:$customer.name,orderCount:{$sum:1}}},{$sort:{orderCount:-1}}])朋友试了之后说卧槽真的能用说实话我也挺惊讶的。因为KES对MongoDB常用命令的支持率非常高查询和写入类命令100%覆盖更新操作符100%覆盖聚合管道操作符98.82%。只有一些不太常用的管理类命令比如角色管理那块没完全兼容但KES本身有自己的一套权限管理机制可以通过KES的管理工具来做。然后聊到迁移具体怎么搞零代码修改是应用层的事但数据库本身的迁移还是得做点工作的。我把KES文档里提到的步骤捋了一遍大致是这么个流程。首先是初始化KES实例得指定兼容模式# 初始化KES指定兼容模式# -m 参数指定兼容模式具体模式值参考官方部署手册# -U 指定超级用户initdb-Usystem-D/data/kes_data这里插一句KES支持多种兼容模式不同模式下语法习惯和默认行为有差异。MongoDB兼容功能是在内核层面实现的通过加载插件来启用。然后改配置文件 kingbase.conf开启MongoDB协议兼容# kingbase.conf 中添加或修改以下参数 # 开启协议兼容 enable_protocol_compat on # MongoDB兼容监听端口默认就用27017 extension_protocol_port 27017 # BSON格式使用EJSON documentdb_core.bsonUseEJson on # 在shared_preload_libraries中追加以下三个模块 shared_preload_libraries kdb_cron, kdb_documentdb_core, kdb_documentdb这几个参数逐个说下。enable_protocol_compat是总开关打开后KES才能处理非SQL协议连接。extension_protocol_port指定MongoDB协议监听端口设27017是为了跟原生MongoDB一致迁移时连接串只改IP就行。bsonUseEJson控制BSON序列化方式建议开启。shared_preload_libraries里那两个模块是KES实现MongoDB兼容的核心组件必须在启动时加载。配置改完之后重启数据库然后登录进去创建插件# 用ksql连接数据库ksql-Usystem-p54321mydb-- 创建MongoDB兼容插件cascade会自动安装依赖组件CREATEEXTENSION documentdbCASCADE;-- 给system用户设置密码MongoDB客户端连接时需要ALTERUSERsystemWITHPASSWORD123456;执行完这一步KES就处于MongoDB兼容模式了。此时你可以用任何MongoDB客户端工具来连接它mongosh、MongoDB Compass、Navicat都行选择MongoDB数据源直接连。朋友问数据怎么搬。KES有配套的KDTS做存量数据迁移图形化工具配好源端MongoDB和目标端KES连接信息就行。数据量大或对停机时间有要求的话还有KFS做实时增量同步边搬边追增量最后切换只需要很短停机窗口。# KDTS命令行示例具体参数根据版本调整# 全量迁移kdts--modefull\--sourcemongodb://source-host:27017\--targetkingbase://kes-host:27017\--databasemydb# 增量同步不停机迁移用kfs--modeincremental\--sourcemongodb://source-host:27017\--targetkingbase://kes-host:27017\--databasemydb不过KDTS和KFS具体用法还是得看官方部署手册我这里只给个概念。性能这块我得说实话我知道很多人关心迁移完性能会怎样。老实说KES在纯文档操作的性能上跟原生MongoDB比是有差距的。从产品文档里给的测试数据来看1万条数据规模下INSERT操作KES是144毫秒MongoDB是100毫秒10万条数据时KES的UPDATE是543毫秒MongoDB是328毫秒。到了百万级数据差距更明显一些UPDATE操作KES 6413毫秒MongoDB 3083毫秒。数据量1万条 操作 MongoDB KES INSERT 100ms 144ms UPDATE 35ms 52ms SELECT(全表) 24ms 38ms SELECT(标量) 4ms 6ms 数据量100万条 操作 MongoDB KES INSERT 2275ms 3498ms UPDATE 3083ms 6413ms SELECT(全表) 2087ms 3320ms SELECT(标量) 174ms 270ms差距是客观存在的。但这里面有个核心问题——你是拿KES跟MongoDB单独比文档操作性能可KES的真正价值在于融合。三套系统的总成本——硬件、授权费、运维人力、数据同步开销——跟一套KES比哪个高我朋友算过一笔账光运维人力一年省两个人就够覆盖性能差距带来的硬件投入了。再说安全这块MongoDB默认认证弱、传输加密要手动配、没有透明数据加密、审计得靠第三方插件。信创和等保2.0背景下这些是硬伤。KES有细粒度RBAC、国密SM2/SM3双向认证、SSL/TLS、TDE透明数据加密、内建审计这套纵深防御体系是MongoDB给不了的。还有一点KES的文档操作性能虽然慢一些但完全够用。标量查询百万级数据270毫秒对绝大多数业务可接受。而且KES还有SQL接口操作文档数据有些复杂分析用SQL写比MongoDB聚合管道方便太多。SQL操作文档数据这个能力被严重低估了说到SQL操作文档数据我觉得这个功能被很多人忽略了。KES除了支持MongoDB原生协议访问文档数据之外还支持直接用SQL来查。这意味着什么意味着你可以在一个SQL语句里同时操作关系型数据和文档数据。举个例子你有个用户表关系型和一个订单集合文档型原来分属MySQL和MongoDB两个库想要关联查询得写ETL先同步数据再跑分析。现在都在KES一个库里了-- users是关系表orders是文档集合对应的表-- 用SQL直接做关联查询SELECTu.username,u.phone,o.order_infoFROMusers uJOINorders oONu.user_ido.order_info-user_id::intWHEREo.order_info-statuspendingANDu.register_time2026-01-01;-- 也可以直接用SQL插入文档数据INSERTINTOorders(order_info)VALUES({order_id: ORD001, customer: 张三, amount: 299.0});-- JSONB字段上的查询操作SELECTorder_info-customerAScustomer_name,(order_info-amount)::numericASamountFROMordersWHEREorder_info {status: completed}ORDERBYamountDESCLIMIT10;// 同样的查询用MongoDB语法也能做db.orders.find({status:completed}).sort({amount:-1}).limit(10)你看同一份数据你可以用MongoDB驱动访问也可以用SQL访问取决于你的场景需要。开发新功能的时候用SQL多方便啊JDBC直接连上就能写不用学MongoDB的查询语法。老代码不动继续用MongoDB驱动跑。这种灵活性是真的香。你团队里那些只会写SQL的后端以前碰MongoDB的数据就抓瞎现在一条SQL就能搞定跨数据模型的关联查询。多集群架构这个事也值得聊聊KES的融合架构里还有一个概念叫集中分布一体化说白了就是它支持多种部署模式——单机、主备、分布式集群可以根据你的可用性需求和成本预算来选。朋友原来MongoDB用Replica Set三节点MySQL主从一备Redis三主三从cluster。三套高可用方案、三套故障切换逻辑出故障时排障顺序都能搞晕人。KES的多集群架构思路是同一套数据库先单机做开发测试再切主备上生产业务量上来扩到分布式集群。底层的数据模型和SQL语法都不变只是部署形态变了。单机模式开发测试用 ↓ 主备模式小规模生产满足基本高可用 ↓ 分布式集群大规模生产水平扩展高可用而且KES分布式集群用MPP架构数据分片存在不同节点上查询时各节点并行处理。后面要做跨业务数据分析不需要额外搭数据仓库直接在KES上跑就行。朋友听完这些之后说了一句话让我印象很深他说早知道有这种融合方案我当初就不该搞那么多套数据库了。说实话我也是这种感觉很多时候技术选型上的分别部署不是有意为之而是业务发展过程中一步步加出来的等问题积累了才发现收不了场。关于融合数据库架构的一些碎碎念和文献思考聊到这块我想多说几句。数据库融合架构这个概念其实不是KES首创的但不同厂商走的技术路线差异很大理解这些差异对你做技术选型挺重要的。你去看早期做多模数据库的尝试大概2015年前后吧当时业界讨论的热点是NewSQL能不能取代NoSQL。一批人认为关系型数据库通过扩展JSON类型就能覆盖文档数据库的场景另一批人觉得NoSQL的灵活schema和水平扩展能力是关系型数据库无法替代的。这个争论持续了好几年最后的结果是两边都没完全取代对方反而催生了一种新的思路——在关系型内核上原生支持多种数据模型。不过我也得说句公道话KES的多模融合方案目前也不是完全没有短板。比如在超大规模向量检索场景下十亿级以上向量专业向量数据库的检索性能还是更有优势的。再比如文档模型那边一些MongoDB的高级特性像查询计划缓存、角色管理命令这些还没完全兼容。这些gap是否影响你的业务得自己评估。我个人觉得融合数据库架构这条路方向是对的。与其追求单一场景的极致性能然后忍受多系统的运维痛苦不如在够用的性能水平上把技术栈收敛了。尤其对于信创背景下的国产化替代来说你本来就要换数据库了与其一个MongoDB换成另一个MongoDB、一个MySQL换成另一个MySQL不如一步到位选个能融合的把长期的技术债一起清了。回到那次迁移本身最后说说我朋友那边的结果吧。经过大半个月的折腾最终方案是核心交易数据保持在KES的关系型存储里MongoDB里的用户画像和商品动态数据迁移到了KES的文档存储Redis缓存暂时保留但后续也计划迁移到KESKES本身也有缓存能力。GIS相关的业务直接用了KES内置的KGIS组件。迁移之后最直观的感受是数据一致性问题彻底解决了。因为所有数据都在一个库里跨表事务由ACID保证再也不用依赖ETL和补偿逻辑了。运维那边反馈说监控面板从一个铺满四个屏幕的大屏变成了一块屏看监控的时候终于不用来回转头了这是原话我笑了半天。应用代码那边MongoDB相关的代码几乎没改就是连接字符串换了一下。倒是有些原来用ETL做跨库分析的任务现在直接改成了SQL关联查询代码量少了一大截。朋友说光把ETL相关的代码删掉就删了两千多行删的时候特别爽。当然了过程中也有踩坑的地方。比如MongoDB的一些聚合管道操作符KES虽然支持但行为细节有差异$lookup在处理大数据量的时候内存占用比原生MongoDB高一些需要调整work_mem参数。还有mongosh连接的时候认证机制要指定SCRAM-SHA-256不指定的话有些版本会默认用SCRAM-SHA-1导致认证失败。

相关新闻

FLUX 3多模态AI模型实战:从原理到代码,统一处理图像、视频与3D生成

FLUX 3多模态AI模型实战:从原理到代码,统一处理图像、视频与3D生成

如果你最近关注AI生成领域,可能会发现一个有趣的现象:从文生图、图生文到视频生成,每个模态似乎都有一套独立的“王者”模型。但当你真正想做一个融合多模态内容的应用时,这种割裂感就成了最大的痛点:你需要分别调用不…

2026/8/8 2:08:33 阅读更多 →
LVLM对抗攻击与防御:从对抗样本到鲁棒性构建

LVLM对抗攻击与防御:从对抗样本到鲁棒性构建

1. 项目概述:当视觉大模型遭遇“投毒”攻击最近在跟进多模态大模型(特别是大型视觉语言模型,LVLM)的安全前沿,发现一个既让人兴奋又令人警惕的趋势:针对这些“看图说话”巨人的攻击与防御研究,正…

2026/8/8 2:08:33 阅读更多 →
盖洛普优势测评实战指南:从解读报告到职场落地

盖洛普优势测评实战指南:从解读报告到职场落地

1. 盖洛普优势测评:从“知道”到“做到”的深度解析上次聊完几个基础的自我认知工具后,很多朋友后台留言,说对盖洛普优势测评特别感兴趣,但感觉市面上介绍要么太学术,要么太营销,看完还是不知道怎么用。今天…

2026/8/8 2:08:33 阅读更多 →

最新新闻

Web认证机制:Cookie、Session与Token技术解析

Web认证机制:Cookie、Session与Token技术解析

1. 认证机制基础概念解析 在Web开发领域,认证机制是保障系统安全的第一道防线。每次你在网站上点击"记住我"复选框时,背后都是认证机制在发挥作用。目前主流的三种认证方式各有特点: Cookie像是服务员给你的会员卡 - 存放在你的钱…

2026/8/8 3:09:08 阅读更多 →
从零构建Python Web Fuzzer:实现灵活高效的自动化安全测试

从零构建Python Web Fuzzer:实现灵活高效的自动化安全测试

1. 项目概述:为什么我们需要自己的Web Fuzzer? 如果你做过Web安全测试或者渗透测试,Burp Suite的Intruder模块肯定是你工具箱里的常客。它功能强大,界面直观,点几下鼠标就能发起海量请求,对参数进行暴力猜解…

2026/8/8 3:09:08 阅读更多 →
Linux生产消费模型实战:从线程同步到性能优化

Linux生产消费模型实战:从线程同步到性能优化

1. 生产消费模型的核心价值与挑战在Linux系统编程中,生产消费模型堪称并发编程的"Hello World",但它的实际价值远不止教学示例那么简单。这个经典模型本质上解决的是有限资源池场景下的任务调度问题——想象一下快递仓库的分拣流水线&#xff…

2026/8/8 3:09:08 阅读更多 →
Anaconda环境管理与Python开发:从虚拟环境到项目部署全攻略

Anaconda环境管理与Python开发:从虚拟环境到项目部署全攻略

1. 为什么你需要Anaconda,而不仅仅是Python?如果你刚开始接触Python,或者已经写了一些脚本,可能会觉得直接去Python官网下载一个安装包就万事大吉了。但很快,你就会遇到一些让人头疼的“环境问题”。比如,项…

2026/8/8 3:09:08 阅读更多 →
计算机毕业设计之基于Spring Boot的绕绕音乐播放器设计与实现

计算机毕业设计之基于Spring Boot的绕绕音乐播放器设计与实现

如今,在科学技术飞速发展的情况下,信息化的时代也已因为计算机的出现而来临,信息化也已经影响到了社会上的各个方面。它可以为人们提供许多便利之处,可以大大提高人们的工作效率。随着计算机技术的发展的普及,各个领域…

2026/8/8 3:09:08 阅读更多 →
PowerShell入门指南:从执行策略到自动化实战

PowerShell入门指南:从执行策略到自动化实战

1. 从“黑窗口”到“瑞士军刀”:为什么你需要重新认识PowerShell如果你对Windows操作系统的印象还停留在那个黑底白字的“命令提示符”(CMD),觉得它只能敲几个dir、copy、ping的命令,那今天这篇内容可能会彻底改变你的…

2026/8/8 3:08:08 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →