简介:面向需要将Nacos配置中心接入达梦数据库的开发和运维人员,这套适配方案同时提供Windows与Linux环境下可直接运行的已编译版本,以及可供自行修改的源码。压缩包共92个文件,约297.51MB,主要包含达梦数据库初始化SQL脚本、启动停止Shell脚本、YAML与Properties格式的配置文件、可执行JAR包,以及日志、清单、元数据等运行状态记录文件。其中SQL脚本需手动导入达梦数据库,配置文件中已预设数据源连接参数,整体使用门槛不高。源码目录支持导入集成开发环境后自行编译调整,可按照业务需要修改Nacos行为。已编译好的服务位于发行版目录结构中,直接拷贝即可使用。目前已有889人学习下载,适合正在做信创国产化改造或需要将配置中心从默认数据库迁移到达梦的团队参考,能够帮助团队快速完成适配验证与生产部署。 我先说结论:Nacos用达梦数据库做数据源,是能跑通的,而且不需要改Nacos源码,只需要把官方MySQL脚本嫁接到达梦的MySQL兼容模式上,再替换JDBC驱动、改几个配置参数就行。但这个过程有几个暗坑,比如驱动类名、表名大小写、SQL方言差异,踩中任何一个都会让你怀疑人生。
这篇博文就围绕“nacos适配达梦数据源”这个实操场景,把从达梦实例准备、驱动替换、配置修改、SQL迁移到集群部署和问题排查的完整链路讲透。适合正在做国产化数据库替换的Java开发、运维,或者被分配了“把Nacos存储从MySQL换成达梦”这种任务的兄弟参考。
1. 为什么要把Nacos的数据源换成达梦
1.1 一个很现实的需求场景
Nacos默认的内置存储是Derby,生产环境官方推荐用MySQL,绝大多数公司也是这么用的。但这两年国产数据库替代节奏很快,很多项目的数据库选型直接变成达梦,而Nacos作为注册中心和配置中心,是整个微服务架构的“神经中枢”,它的数据源自然也得跟着换。
这个需求一旦落到你头上,麻烦就来了:Nacos官方文档从来没写过支持达梦,网上参考资料也少,翻半天论坛可能只看到一句“我试过可以”,但具体怎么配的没人说。所以这篇文章里写的内容,不是官方文档翻译,而是我实打实操作过的方案和踩坑记录。
1.2 Nacos和达梦能搭吗?先理清原理
很多人卡在第一步:Nacos默认只认MySQL,达梦又不是MySQL,怎么连?
要破解这个问题,得先分清楚Nacos对数据源的依赖分哪几层:
- 第一层是JDBC驱动,Nacos通过JDBC访问数据库,只要是标准JDBC驱动,理论上任何数据库都能连;
- 第二层是连接池,Nacos内部用Druid做连接池,Druid本身支持达梦,所以这层也没问题;
- 第三层是SQL方言,Nacos内置的数据源管理逻辑在
spring.datasource.platform=mysql时,会把所有表操作语句按MySQL语法拼接,这里才是最大的卡点。
所以最巧妙的做法不是去改Nacos源码,而是让达梦“伪装”成MySQL来工作。达梦本身就提供了MySQL兼容模式,开启之后,MySQL的建表语句、插入语句、ON DUPLICATE KEY UPDATE这类MySQL特有语法基本都能跑,Nacos发过来的MySQL方言SQL,达梦能照单全收。这就是整个适配方案的核心思路:驱动换成达梦的,连接串指向达梦,但platform保持mysql,让Nacos认为自己在和MySQL说话。
2. 适配前的准备工作
2.1 达梦实例与兼容模式
如果你是从零开始安装达梦,建议在初始化实例的时候就勾选MySQL兼容模式。已经装好的实例也别慌,达梦支持动态修改兼容性参数,执行系统过程:
SP_SET_PARA_VALUE(2, 'COMPATIBLE_MODE', 2);参数值2代表兼容MySQL,修改后需要重启达梦服务才能生效。确认方式:
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'COMPATIBLE_MODE';另外,达梦的字符集建议在初始化时选择UTF-8,否则Nacos表里存中文配置内容时大概率会出现乱码,这个坑后面排查起来特别难受。数据库编码选PG_UTF8或UTF8,具体看安装版本的初始化选项。
2.2 JDBC驱动与Nacos版本确认
达梦8的JDBC驱动是DmJdbcDriver18.jar,JDK8及以上环境用这个。驱动下载可以在达梦安装目录的drivers/jdbc下找,或者从达梦官网下载对应的JDBC驱动包,也可以用Maven仓库里的com.dameng:DmJdbcDriver18,版本选择与你数据库版本匹配的即可。
Nacos版本建议用2.x的较新版本,比如2.3.x或者2.5.x,版本太老的话可能对JDBC URL参数、连接池配置的支持不够好。我用的是Nacos 2.3.x,整体没有问题。,还会有一个坑,就是Nacos目录lib`下自带的MySQL驱动不要删,因为Nacos有些内置功能可能还会引用到它,但你需要确认达梦驱动能被正确加载,后面我会说怎么保证这一点。
2.3 数据库、用户与权限
在达梦里创建Nacos专用的业务用户和库,这里建议单独建用户,不要直接用默认SYSDBA跑Nacos,避免权限过大带来的安全风险和误操作风险。
CREATE USER NACOS IDENTIFIED BY "Nacos@123"; GRANT DBA TO NACOS;注意达梦的用户和模式是绑定的,创建用户NACOS后会自动生成同名模式NACOS,后续Nacos的表会建在这个模式下。权限直接给DBA是最省事的,生产环境可以按最小权限去细化,但实际项目中绝大部分都是给DBA角色,否则建表、改表、删除数据等操作会冒出各种权限不足的报错。
3. 核心改造:配置文件和驱动替换
3.1 修改application.properties的关键参数
Nacos配置文件在conf/application.properties,默认内容里MySQL的配置是注释掉的。适配达梦时,把MySQL相关的配置替换成下面这样:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:dm://127.0.0.1:5236/NACOS?compatibleMode=mysql&characterEncoding=utf-8 db.user.0=NACOS db.password.0=Nacos@123 db.pool.config.connectionTimeout=3000 db.pool.config.validationTimeout=1000 db.pool.config.maximumPoolSize=20 db.pool.config.minimumIdle=2这里有两个关键点:
spring.datasource.platform必须保持mysql,不能改成dm,因为Nacos内置的SQL语句构建器只认得mysql、derby这些枚举值,写成dm会导致Nacos不知道怎么生成SQL,启动直接失败;- JDBC URL里的
compatibleMode=mysql参数很重要,相当于在连接层面上再次声明当前会话要按MySQL兼容模式工作,双保险。
连接池参数方面,Nacos默认的db.pool.config.*可以保留MySQL场景下的值,达梦在Druid连接池下表现稳定,不需要特殊调优。唯一要注意的是maximumPoolSize不要配太大,Nacos控制台和客户端连接数有限,给个20以内足够。
3.2 驱动jar替换与启动验证
驱动替换具体分两步:
第一步,把DmJdbcDriver18.jar复制到Nacos的lib目录下。Nacos启动脚本会扫描lib下的所有jar包加入classpath,所以不用去改启动脚本。
第二步,检查conf/application.properties里有没有显式指定驱动类名。默认配置里只有URL、用户名、密码,没有driver-class-name,Druid会根据URL自动识别驱动类,但如果你的Nacos版本比较老,可能需要在连接池参数里手动指定:
db.pool.config.driverClassName=dm.jdbc.driver.DmDriver改完配置后,直接启动:
sh bin/startup.sh -m standalone然后看日志logs/start.out,如果出现Nacos started successfully就说明启动成功。接着打开控制台,如果能正常显示登录页并进入首页,说明数据源连接已经通了。
4. SQL脚本迁移实录
4.1 官方nacos-mysql.sql能直接用吗
Nacos官方提供了MySQL版本的初始化脚本,在conf/nacos-mysql.sql。这个脚本能直接拿到达梦上执行吗?答案是:不能100%直接跑,但改造量很小。
原因是官方脚本里混入了MySQL特有的语法,比如ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci、ON DUPLICATE KEY UPDATE、LOCK TABLES等。达梦的MySQL兼容模式可以处理一部分,但有些地方还是会报错。
我的做法是把nacos-mysql.sql逐条在达梦管理工具里执行,遇到报错单独处理。实际操作中,出现较多问题的是ON DUPLICATE KEY UPDATE,达梦兼容模式下支持不够稳定,需要改写为分步插入。
4.2 常见语法改造点
这里把我实际遇到的改造点整理出来,直接对照处理:
| 问题SQL | 处理方式 |
|---|---|
INSERT INTO ... ON DUPLICATE KEY UPDATE | 改写成先UPDATE再INSERT,或者用达梦的MERGE INTO |
| 表名、列名带反引号 | 去掉反引号,达梦兼容模式支持但偶尔会解析出错 |
COMMENT='xxx' | 直接删掉或者改用COMMENT ON语句 |
BIGINT(20) | 改成BIGINT,达梦不支持括号内位数 |
创建索引时USING BTREE | 删掉USING BTREE,达梦默认就建立B树索引 |
DROP TABLE IF EXISTS | 达梦兼容模式支持,但如果报错就改成分步判断删除 |
建议不要手动敲这些SQL,直接在管理工具里执行官方脚本,报错信息会指向具体行和原因,按表格逐个改就行。改完后再执行一遍,直到没有报错为止。
表建好之后,还要验证一下关键表是否存在:
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME IN ('CONFIG_INFO','USERS','ROLES','PERMISSIONS');如果表都查得到,就说明SQL迁移这步完成了。
5. 集群部署与数据源影响范围
5.1 三节点Nacos共享达梦库
Nacos集群模式下,每个节点都需要访问同一个数据库来保证配置数据和服务实例数据的一致性。适配达梦的集群部署方式和MySQL版本完全一致:每个节点上的application.properties都指向同一个达梦库,db.num=1,IP端口换成达梦的地址。
集群节点数建议奇数个,至少三个,这样Nacos内部的消息同步和节点选举才能正常工作。每个节点的lib下都要放上达梦驱动jar,这一点很容易漏:如果只在该节点操作,忘记复制jar到其他节点,其他节点启动时会报驱动找不到,表现就是部分节点一直处于Down状态。
集群启动顺序上,建议先启动第一个节点,确认它注册成功并且控制台可访问后,再启动后续节点。如果一上来三个节点同时启动,日志里会刷一堆选举异常,看着吓人,等一会儿通常会自愈,但如果长时间不恢复,就要检查数据库连接是否正常。
5.2 适配后哪些能力会受影响
达梦替换MySQL后,Nacos的核心功能不会变,但有几块需要格外注意:
- 配置中心热更新:Nacos的配置发布、监听、动态刷新依赖数据库表,达梦的行锁机制和事务隔离级别和MySQL略有差异,高并发配置发布场景下需要关注是否有锁等待;
- 注册中心的持久化服务:Nacos 2.x中临时实例主要存在内存和Distro协议里,但持久化实例(
ephemeral=false)会写入数据库,这类服务在达梦数据源下也能正常工作,不过要注意表nacos_service_instance等结构是否完整; - 控制台用户权限:历史版本默认的
nacos/nacos账号对应users表,如果SQL迁移时用户表数据没插进去,控制台会登录失败,需要手动插入初始账号; - 健康检查与告警:Nacos的数据库健康检查依赖连接池探活,达梦驱动对
validationQuery的支持没有问题,但连接池配置里的testWhileIdle等参数要保持默认,不要轻易改。
整体来说,适配达梦后,Nacos作为注册中心和配置中心的角色能力是不打折扣的,差别主要在底层数据库的运维习惯上:备份恢复要用达梦的dexp/dimp工具,监控要看达梦的V$DM_INI等视图,这一点对DBA团队来说是个新的工作内容。
6. 常见问题与排查速查表
6.1 启动阶段直接报驱动类找不到
启动日志出现Cannot load driver class: dm.jdbc.driver.DmDriver或者java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver,几乎可以断定是驱动jar没被加载到classpath。
排查顺序:先确认lib目录下有没有DmJdbcDriver18.jar;再确认jar包权限,Nacos启动用户是否有读取权限;最后确认Nacos版本,如果是低版本比如1.x,可能不会自动扫描lib下所有jar,那就得手动在bin/startup.sh里加-Djava.ext.dirs或者把驱动放到JDK的ext目录。这个情况在新版本里很少见了。
6.2 表或列不存在的诡异报错
启动后控制台可访问,但打开配置列表时报ORA-00942: table or view does not exist或者是达梦的“无效的表名”错误,十有八九是表名大小写问题。
达梦默认会把不带引号的标识符转成大写存储,而Nacos的SQL里用的是小写表名,两边对不上就会报错。解决办法是建表时让表名带双引号且使用小写,或者更稳妥的做法:初始化达梦时把大小写敏感参数配置为不敏感。
如果实例已经初始化完成,可以通过参数调整:
SP_SET_PARA_VALUE(2, 'CASE_SENSITIVE', 0);改完同样要重启服务。这个参数在初始化实例时就该想清楚,后面再改涉及已有对象,风险比较大。
6.3 配置发布失败或保存后不生效
配置发布时控制台提示“发布失败”,通常和CONFIG_INFO表的写入语句有关。去达梦后台开SQL日志,看Nacos实际发过来的SQL是什么,如果卡在ON DUPLICATE KEY UPDATE,就需要把这条语句替换为达梦兼容的写法。
还有一个场景是发布成功但客户端感知不到更新,这时要查CONFIG_INFO表里的GMT_MODIFIED时间有没有变化,如果更新了但客户端没收到推送,检查Nacos节点的网络和客户端版本,这种现象和数据源适配无关,属于Nacos本身的运行机制问题。
6.4 集群模式下出现登录会话频繁失效
集群部署后,用户登录状态在重启节点时会丢失,这属于Nacos集群的已知行为,不是达梦的问题。但如果你重启其中一个节点,发现其他节点报数据库连接异常,就要检查达梦的最大连接数限制。
默认情况下达梦的连接数配置可能比较保守,Nacos每个节点都会起一个Druid连接池,三节点集群至少会占用几十个连接,加上其他业务应用,很容易打满达梦的连接数。处理方式是调大达梦实例的最大连接数参数:
SP_SET_PARA_VALUE(2, 'MAX_SESSIONS', 500);再配合连接池的maximumPoolSize控制,一般就没问题了。
7. 最后再分享几个实操心得
整个适配下来,我最大的感受是:Nacos适配达梦数据源这个事,难点不在“能不能做”,而在“怎么把细节处理干净”。
第一,尽量使用较新的Nacos版本,老版本对连接池、SQL构建器的抽象不够完善,适配过程中会遇到更多SQL兼容问题。新版的Nacos在内核层面对数据源的隔离做得更好,改起来省心很多。
第二,如果团队里有人熟悉达梦的MERGE INTO语法,建议提前把nacos-mysql.sql里所有ON DUPLICATE KEY UPDATE语句统一改写,不要指望达梦的MySQL兼容模式百分之百替你兜底。数据库方言这种东西,实测永远是唯一标准。
第三,也是最重要的一点,改造前一定要先把nacos-mysql.sql备份好,把达梦库里已经建好的表和数据也定期用dexp工具做备份。Nacos的数据直接关系着所有服务的注册发现和配置管理,一旦数据丢了,整个微服务架构都会受影响,这个风险怎么强调都不为过。
如果你正准备做Nacos的达梦适配,或者已经在适配路上被各种报错折磨,希望这篇实操记录能帮你跳过我踩过的坑。照着上面的步骤走,半天时间基本能跑通;跑通之后再回头看看这些坑,其实每个都讲得通。
本文还有配套的精品资源,点击获取