十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Nacos数据源切换为人大金仓KingbaseES完整指南

Nacos数据源切换为人大金仓KingbaseES完整指南 简介针对 Nacos 与人大金仓数据库集成场景资源包包含 15 个文件总大小约 100.32MB覆盖从环境初始化到服务启停的常见需求。包内既有服务端 jar 包与启动/停止脚本也有人大金仓、MySQL、Derby 等数据库的 SQL 初始化脚本以及 properties 配置示例和集群配置示例方便用户快速完成 Nacos 环境的搭建与数据库适配。目前已获得 926 人浏览学习说明该问题在国产数据库迁移和微服务配置管理实践中具有一定代表性。借助这些文件开发或运维人员可减少手动拼装配置与脚本的时间重点了解数据源 URL、驱动类名如 com.kingbase.jdbc.Driver、连接池及安全配置等关键点从而更稳妥地在 Nacos 控制台上注册和切换人大金仓数据源实现配置动态更新与集中管理。 最近好几个项目都在折腾同一件事把Nacos的数据源从MySQL换成人大金仓。一开始我以为只是个驱动替换真正动手才发现坑比想象中多。Nacos默认用内嵌Derby生产环境一般切MySQL但到了国产化环境数据库清单里只有人大金仓这个组合就成了绕不开的现实需求。这篇就把我这段时间实际跑通这套组合的过程完整记录下来包括版本选型、驱动处理、初始化脚本改写、SQL方言适配以及中途踩过的各种坑。适合正在做国产化改造的Java后端同学参考也适合手里只有金仓、又必须把Nacos部署起来的运维朋友。先说清楚一个概念避免有人搜“多数据源”点进来发现货不对板。这里说的数据源是指Nacos自身存储配置、权限、集群元数据的那套数据库不是让你用Nacos管理业务系统的动态多数据源。二者完全不是一回事。本文解决的是前者也就是“Nacos到底怎么把数据落到人大金仓里”。1. 动手前先搞明白Nacos落库这套机制到底卡在哪1.1 Nacos为什么非要一个外部数据库Nacos同时承担注册中心和配置中心两个角色。注册中心那一侧服务实例列表可以靠内存加节点间协议同步但配置中心这侧不一样配置数据必须持久化不然服务重启、节点切换、历史版本回溯全都无从谈起。Nacos 1.x和2.x默认会带一个内嵌Derby单机玩玩没问题一到集群环境就非常尴尬Derby本身不支持多节点共享所以生产环境几乎都会外接一个独立数据库。大多数人习惯用MySQL网上教程一抓一大把。但如果你所在的环境数据库只有人大金仓那就必须把Nacos的存储层整个切到金仓上。这个切换并不是改一个连接串那么简单Nacos内部大量SQL是按照MySQL语法写的这才是真正麻烦的地方。1.2 最大的坎不是连不上是SQL方言人大金仓KingbaseES有Oracle兼容模式和PostgreSQL兼容模式两种。Nacos要切到金仓我强烈建议用PostgreSQL兼容模式来跑因为金仓的JDBC驱动形态本身就是从PostgreSQL生态演化过来的很多行为更接近PG。但是Nacos源码里的SQL语句是MySQL风格的这就产生了方言冲突。举几个典型例子MySQL里字段自增写AUTO_INCREMENTPG体系要用BIGSERIAL或IDENTITYMySQL建表时习惯用反引号包裹表名字段名PG里反引号直接语法报错MySQL的时间字段默认值喜欢写DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPPG模式不支持ON UPDATE子句还有分页语句MySQL写LIMIT offset, sizePG必须写成LIMIT size OFFSET offset。单个看都是小问题堆在一起就成了拦路虎。所以在动手之前你得有个心理准备这不是配置一下就能完事的活SQL脚本和部分源码都得动。2. 环境准备版本怎么选、驱动怎么放、脚本怎么备2.1 版本匹配我用的Nacos 2.3.0 KingbaseES V8 R6版本这块我先给结论。Nacos我验证过2.2.x和2.3.x流程基本一致新一点的2.5.x理论上也适用但我没有在线上长时间跑过不敢乱打包票。金仓侧我用的是KingbaseES V8 R6也就是目前最常见的V8系列兼容PG模式。如果你手上是V9连接协议大概率也兼容但最好先在测试环境验证一遍。为什么不建议用太老的Nacos版本因为老版本的SQL方言问题更多而且网上能找到的适配经验少。2.3.0这个版本社区讨论量大出问题也好搜。如果你所在项目强制要求Nacos 2.5.4那也可以按同样的思路改只是需要额外注意新版本在鉴权、连接池配置上的变化。2.2 金仓JDBC驱动和连接URL别用Oracle模式用PG模式金仓的JDBC驱动包叫kingbase8驱动类名是com.kingbase8.Driver一看这个命名就知道它和PostgreSQL的血缘关系。连接URL格式是jdbc:kingbase8://IP:端口/数据库名。金仓默认端口是54321默认数据库通常叫test默认用户是SYSTEM具体以你安装时的配置为准。驱动包获取方式有两种一种是从金仓安装目录的JDBC目录里拿另一种是从Maven仓库拉坐标大概是com.kingbase8:kingbase8:8.6.0。我建议直接用安装目录里自带的那个省得版本对不上。拿到驱动jar后把它丢到Nacos的lib目录下和Nacos自带的那些jar放一起。这里有个很关键的操作细节不要删掉lib里的MySQL驱动至少在你改完源码验证稳定之前不要删。为什么接着往下看。2.3 初始库表准备直接跑金仓方言的schemaNacos安装包conf目录下自带一个nacos-mysql.sql在MySQL里执行就能建好全部表。但这脚本拿到金仓里基本跑不通反引号、AUTO_INCREMENT、ENGINEInnoDB这些全都要改。我的做法是单独准备一份nacos-kingbase.sql用PG方言重写建表语句。核心表包括config_info、config_info_gray、config_info_tag、config_info_beta、his_config_info、group_capacity、tenant_capacity、tenant_info、users、roles、permissions这些十几张表说多不多但手工改容易漏最好还是参照原脚本逐张核对。后面第三节我会给出关键表的改写样例。在这个阶段你只需要知道必须先提前把这个金仓版SQL准备好不要等到Nacos启动时让它自动建表自动建表的结果往往就是报错或者建出来的表结构不完整。3. 核心实操把Nacos的数据源完整切到人大金仓3.1 改配置文件只动db相关几项进入Nacos安装目录的conf文件夹编辑application.properties把数据源相关配置改成下面这样spring.datasource.platformmysql db.num1 db.url.0jdbc:kingbase8://192.168.1.10:54321/nacos_db?currentSchemapublicstringtypeunspecifieduseUnicodetruecharacterEncodingutf8 db.user.0SYSTEM db.password.0你的密码这里最反直觉的地方在于spring.datasource.platform仍然写成mysql。很多第一次接触的人会改成kingbase或者pg结果Nacos直接起不来。原因是Nacos源码里就是靠这个字段判断走哪套数据源初始化逻辑的只有写成mysql才会去加载db.url.0这些配置。这算是一个很经典的工程妥协标记还是那个标记实际连的已经是金仓了。只要lib里保留着MySQL驱动启动时的驱动检查就能通过然后真正干活的是金仓驱动。URL里我加了stringtypeunspecified参数这个参数是PG生态里很实用的一个开关可以避免一些字符串和空值转换导致的异常。另外给Nacos单独建一个数据库别和其他业务共库后面备份、恢复、排查问题都会省心很多。3.2 SQL脚本迁移核心表怎么建直接把原版nacos-mysql.sql扔给金仓执行是不行的我整理了一份金仓可用的建表样例。以最核心的config_info为例MySQL原版长这样CREATE TABLE config_info ( id bigint(20) NOT NULL AUTO_INCREMENT, data_id varchar(255) NOT NULL, group_id varchar(255) DEFAULT NULL, content longtext NOT NULL, md5 varchar(32) DEFAULT NULL, gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, src_user text, src_ip varchar(50) DEFAULT NULL, app_name varchar(128) DEFAULT NULL, tenant_id varchar(128) DEFAULT , c_desc varchar(256) DEFAULT NULL, c_use varchar(64) DEFAULT NULL, effect varchar(64) DEFAULT NULL, type varchar(64) DEFAULT NULL, c_schema text, encrypted_data_key text NOT NULL, PRIMARY KEY (id), KEY uk_configinfo_datagrouptenant (data_id,group_id,tenant_id) );转成金仓PG兼容模式的版本是这样CREATE TABLE config_info ( id BIGSERIAL NOT NULL, data_id VARCHAR(255) NOT NULL, group_id VARCHAR(255), content TEXT NOT NULL, md5 VARCHAR(32), gmt_create TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, gmt_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, src_user TEXT, src_ip VARCHAR(50), app_name VARCHAR(128), tenant_id VARCHAR(128) DEFAULT , c_desc VARCHAR(256), c_use VARCHAR(64), effect VARCHAR(64), type VARCHAR(64), c_schema TEXT, encrypted_data_key TEXT NOT NULL DEFAULT , CONSTRAINT pk_config_info PRIMARY KEY (id) ); CREATE UNIQUE INDEX uk_configinfo_datagrouptenant ON config_info (data_id, group_id, tenant_id);改动点总结一下第一反引号全部去掉第二bigint AUTO_INCREMENT改成BIGSERIAL金仓PG模式下会自动处理自增序列第三MySQL的datetime改成timestamp注意不要加ON UPDATE CURRENT_TIMESTAMPPG不支持第四longtext改成text第五末尾的ENGINE和CHARSET直接删掉第六原脚本里的普通索引建议改成唯一索引因为Nacos的业务逻辑本身就要求data_id、group_id、tenant_id三者组合唯一。users表也很关键注意enabled字段MySQL里常用tinyint(1)金仓PG模式建议用BOOLEAN不然Nacos登录时查询用户状态可能出问题。3.3 源码层方言修复一个绕不开的分页问题配置文件改完、表结构建好Nacos大概率能启动但停留在“能启动”是不够的。跑到配置列表页面、历史版本页面时你会发现部分查询报错问题基本集中在分页SQL上。Nacos内部大量使用MySQL的LIMIT offset, size写法金仓PG模式只认LIMIT size OFFSET offset。解决思路有两条。如果你的环境允许改代码我推荐直接在Nacos源码里改搜索所有LIMIT ?,?或者LIMIT , 这类写法把分页语句统一改成LIMIT ? OFFSET ?的PG语法。Nacos 2.3.0里这些SQL散落在几个持久化相关的类中比如nacos-config模块的PersistService实现类、nacos-console模块的部分查询。改完之后执行打包mvn -Prelease-nacos -DskipTests clean install -U产物在distribution/target目录下是一个完整的nacos-server压缩包直接替换原来的部署目录就行。如果你不想动源码还有一个土办法看看金仓是否支持开启部分MySQL兼容功能但这属于数据库层的适配而且不同金仓版本差异大不够稳定。我实际项目里是直接改源码重新打包的虽然第一次编译Nacos花了不少时间但后面所有环境都用这个定制包一劳永逸。4. 踩坑实录从驱动报错到大小写玄学4.1 驱动类找不到、Nacos起不来第一次部署时我把金仓驱动放到了conf目录下想着配置文件就在旁边驱动放一起也应该能加载。结果启动直接报ClassNotFoundException。Nacos加载lib目录下的jar不会去conf目录找你放的驱动。正确做法是把kingbase8的jar复制到nacos目录的lib文件夹里和Nacos自带的jar放在同一层。另外要确认lib里还有MySQL驱动因为前面说了platform还是mysql启动时Nacos会主动检查MySQL驱动类是否存在少了它照样起不来。这个问题排查起来很迷惑日志里报的是mysql驱动缺失但你以为自己已经换成金仓了很容易绕晕。4.2 自动建表失败与时间字段报错我刚开始没有手动执行初始化脚本而是直接启动Nacos让它按自己的逻辑自动建表。结果日志刷了一堆syntax error仔细看是卡在CONSTRAINTconfig_info_ibfk_1这种反引号语法上。后来改成手动执行金仓版脚本先把表建好再启动Nacos问题就消失了。还有一次是时间字段报错原因是MySQL脚本里gmt_create字段写了DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPPG模式下不支持ON UPDATE建表直接失败。把所有类似写法都改干净之后建表才顺利通过。4.3 表名大小写引发的“表不存在”这是个非常隐蔽的坑。金仓PG模式对未加引号的表名会自动转成小写存储而Nacos源码里查询语句用的表名都是小写理论上一一对应。但问题出在初始化脚本上如果你手工建表时用了大写表名或者加引号创建了大小写混合的表名那Nacos启动后查询小写表名就会报relation config_info does not exist。我当时用客户端工具建表工具默认给表名加了双引号结果建出来的表是书写的原始大小写Nacos查询全小写两边对不上。解决方法是统一用不带引号的小写建表语句或者直接执行我上一节给的那种脚本别用图形化工具去手工建。4.4 常见问题排查速查表现象可能原因解决办法启动报ClassNotFoundException: com.mysql.cj.jdbc.Driverlib目录缺少MySQL驱动把MySQL驱动jar也放进lib目录启动报ClassNotFoundException: com.kingbase8.Driver金仓驱动没放对位置驱动jar放到lib目录重启启动成功但控制台登录后没有任何数据实际连的还是内嵌Derby检查platform是否mysql、db.url是否配置正确建表时语法报错提示反引号附近有错误执行了MySQL版建表脚本换成PG/金仓方言的SQL脚本登录时报用户表查询异常users表的enabled字段类型不兼容确认enabled字段为BOOLEAN配置列表分页查询报LIMIT语法错误源码里MySQL方言分页语句改源码并重新打包或数据库层做兼容处理偶尔出现锁等待超时Nacos多个节点并发读写同一张表检查金仓连接池参数避免慢SQL堆积5. 切换完成后的运行检查与维护建议5.1 配置发布、热更新、集群同步还正常吗切到金仓之后Nacos配置中心本身的发布、监听、热更新机制照常工作。你在Nacos控制台改一个配置客户端能在几秒内收到变更通知这个走的是Nacos内部的通知推送链路和数据源关系不大。集群场景下页面修改配置会直接写入金仓数据库其他节点读取同一份库数据所以只要数据库是同一个库配置数据天然一致。可能有同学担心“集群会自动同步吗”这里拆开说服务实例的注册信息走Nacos节点间的Distro协议同步不走数据库配置数据走数据库落盘相当于所有节点共享一份持久化配置。所以切换数据源之后重点检查数据库连接是否正常、表锁是否频繁Nacos节点本身不需要额外同步配置。5.2 顺手做掉的安全加固换完库之后别急着收工Nacos暴露在网络上风险很高。至少做几件事第一修改默认账号密码不要用nacos/nacos这种初始组合第二在application.properties里开启鉴权配置nacos.core.auth.enabledtrue同时设置独立的token密钥不要用网上一搜一大把的默认值第三控制好8848和9848端口的网络访问范围不要让它们裸奔到公网。这些安全配置和数据源切换没关系但很多人在部署时容易忽略等出了事情再补就晚了。5.3 后续维护中的几个注意点数据库切到金仓后日常运维有几个地方容易踩坑。第一是备份Nacos的配置数据都在这一个库里务必纳入你的备份体系金仓有自带的备份工具类似PG的pg_dump定期备份整个nacos库非常有必要。第二是连接池Nacos 2.x支持通过配置调整数据库连接池如果节点多、配置读写频繁适当调大连接数避免高峰期连接等待。第三是初始化脚本的归档我强烈建议把改好的nacos-kingbase.sql、定制好的Nacos安装包、金仓驱动jar统一放到内部工具仓库或者版本管理里存一份下次新环境部署直接复制粘贴不用重新踩一遍坑。我个人在实际操作中的体会是整个切换过程最花时间的不是配置而是SQL方言排查。你能想到的问题大部分都能搜到答案真正坑人的全是那些想不到的边角料比如大小写、时间字段、驱动加载顺序。另外一点就是不要因为Nacos默认支持MySQL就认定它只能配MySQLNacos的存储层抽象并不复杂只要愿意花点时间改改动接什么数据库都有可能。做完这次切换之后我对Nacos的内部结构也熟悉了不少后面再遇到环境适配类的问题心里基本有底了。本文还有配套的精品资源点击获取
返回列表