数据源管理功能通过联合 KMS(密钥管理服务),提供面向应用侧的统一数据源配置管理与动态轮转能力,支持RDS、PolarDB、Redis 等主流数据库,应用侧无需代码改造,仅需配置化接入即可实现运行期账号密码的无缝更新。
仅MSE Nacos企业版支持,专业版与开发版暂不支持此功能。
背景与挑战
核心能力
数据源管理是针对以上问题设计的通用解决方案:
加密存储:数据源账密通过 KMS 加密存储,杜绝明文泄露风险。
自动轮转:联合 KMS 实现账密定时轮转,支持运行期无缝更新,无需重启应用。
配置化接入:应用侧通过 Nacos 配置中心读取数据源信息,0 代码改造即可接入。
前提条件
1. 数据库实例准备
创建RDS/PolarDB数据库实例:可使用现有实例或新建实例。
2. 密钥管理服务(KMS)配置
开通密钥管理服务(KMS):购买并启用KMS实例,且KMS实例镜像版本在dkms-3.0.0以上。如需升级镜像版本请参考升级KMS实例的镜像版本。
完成KMS密钥创建:创建密钥并获取
KeyId
,用于加密存储数据库账号密码。创建KMS凭据:关联目标数据库实例,设置轮转账号。
3. 绑定KMS密钥
在MSE控制台完成KMS密钥绑定,确保数据源账密加密存储。
创建数据源
数据源功能底层基于Nacos配置中心实现,数据源配置将以加密形式存储在配置中心中。
在注册配置中心的实例列表页,单击目标实例名称,选择数据源管理。
若未绑定 KMS 密钥:按弹窗提示完成 KMS 密钥绑定。
选择目标命名空间,单击创建数据源,配置相关参数:
数据源名称:输入数据源名称。
描述:数据库源的描述,比如:给A应用的访问xx数据库的内网数据源。
数据源类型:
spring-datasource:适用于Java Spring应用程序访问关系型数据库(如MySQL,RDS,PolarDB)。
spring-redis:适用于Java Spring应用程序访问缓存数据库(如Redis,Tair)。(应用侧接入中,近期开放)
子类型:当前支持开源数据库连接池 druid。
数据库类型:选择数据库类型,然后选择数据库实例。
数据库实例地址:如rm-02345**********imo.mysql.rds.aliyuncs.com。
数据库引擎类型:当前支持Mysql,Sql Server,PostgreSQL,MariaDB,影响应用访问数据库的jdbc连接串格式。
数据库端口:数据库端口号,比如:3306。
数据库名称:数据库。
数据库地址参数:除访问地址-端口-数据外的jdbc扩展参数,比如connectTimeout=20000&socketTimeout=60000&serverTimeZone=Asia/Shanghai等参数。
初始连接数:应用侧数据源连接的初始连接数。
最小连接数:当业务空闲时保留的最小连接数。
最大连接数:当业务访问量高的创建的最大连接数。
最大等待时间:数据请求等待连接池的最大等待时间。
初始连接数:应用侧连接数据源的初始连接数。
最小连接数:当业务空闲时保留的最小连接数。
最大连接数:当业务高并发时允许的最大连接数。
最大等待时间:业务请求等待连接池的最大等待时间。
关联KMS凭据(重要):选择KMS凭据,访问数据库的账号密码信息保存在KMS凭据中。
凭据可以选择数据库凭据,也可选择通用凭据,需保证为格式为包含
AccountName
和AccountPassword
的JSON。当设置KMS凭据时指定了数据库实例及数据库,会同时校验选择数据源时的数据库实例和凭据内关联的数据一致性,减少误操作。
更多参数:支持除了常用参数之外,可以设置更多自定义参数,如testWhileIdle,testOnBorrow,testOnReturn等,示例:
#是否开启空闲连接的检测 spring.datasource.druid.testWhileIdle=true #获取连接时检测可用性,建议关闭 spring.datasource.druid.testOnBorrow=false #返还连接时检测可用性,建议关闭 spring.datasource.druid.testOnReturn=false
单击确定,在确认创建数据源弹框中,再单击确定,提交数据源。
数据源详情
在数据源管理列表页,单击目标数据源名称,进入数据源详情页:
原生配置内容:可以查看底层配置中的DataId,分组Group及内容,明文仅在控制台侧展示。
数据源功能底层基于Nacos配置中心实现,数据源配置将以加密形式存储在配置中心中。
监听查询:复用配置中心的监听查询功能,可以在此查看监听该数据源的应用节点。
变更事件:
记录创建/更新数据源,凭据账密轮转事件,可在事件详情页查看变更前后的内容差异对比。
涉及凭据帐密轮转事件的变更前后的帐密,请前往KMS凭据管理界面查看。
推送轨迹:复用配置中心的推送轨迹功能,记录数据源配置的变更及推送事件。
编辑数据源
在数据源管理列表页,编辑目标数据源。
注意事项
配置更新机制
编辑数据源后,配置中心的加密配置将同步更新。
若当前数据源已被应用程序订阅,运行期变更由 Apache Druid 提供异常保护。
运行期变更影响
数据库地址/端口修改后:若新配置无法正常访问,现有连接不受影响。
凭据(账号密码)修改后:新凭据无权限访问数据源,现有连接仍可正常访问。
尽管应用程序侧数据源支持异常保护,但对线上业务的更新需要谨慎,实时观察业务指标,异常保护支持探测连接层面的可用性,帐密的权限等,无法完整覆盖线上完整业务(如新数据库实例缺少某张业务表)。
凭据账密轮转
数据源的帐密轮转功能由KMS密钥管理服务提供,有两种轮转方式:
定时轮转:创建凭据时可以设置定时轮转周期,到时会自动轮转
立即轮转:当出现帐密泄漏或者其他需要实时轮转时可以KMS凭据管理控制台进行立即轮转。
当KMS凭据发生定时或者主动轮转时,会通知MSE Nacos进行加密数据源配置的更新,Nacos会实时推送应用侧进行账号密码的更新,Druid会优雅进行在线连接的替换,保证对业务无损。
删除数据源
在数据源管理列表页,删除目标数据源,并输入数据源名称进行二次确认。
注意:
删除数据源,将同步删除底层配置中心关联的加密配置,请谨慎操作。
应用侧对数据源删除场景提供了运行期异常保护,确保在线业务的存量连接不受影响,但应用启动时会导致启动失败。
应用侧接入
单击数据源详情页的应用侧接入,查看每个数据源的接入步骤。
参数配置请以控制台应用侧接入的实际设置为准,控制台中每一步的参数均与目标实例及数据源的绑定关系和动态适配规则直接关联。
Step 1: 版本升级
Spring Cloud 版本升级 2023.0.3.3 版本以上。
Druid 升级至 1.2.25版本以上。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.25</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2023.0.3.3</version>
</dependency>
Step2: 修改配置
修改
application.properties
,配置开启动态数据源轮转及指定数据源对应的Nacos配置。
#将数据源配置导入Spring,初始化数据源
spring.config.import[0]=optional:nacos:cipher-kms-aes-256-proxy-spring-{resourceName}.properties?group=nacos-datasource
#指定Nacos地址,此处默认为公网地址,请按需修改
spring.cloud.nacos.config.server-addr={nacos server}
#指定命名空间
spring.cloud.nacos.config.namespace={命名空间ID}
#指定kms region id
spring.cloud.nacos.config.kms_region_id={实例region}
#打开druid数据源托管开关并指定轮转加密配置dataId
spring.nacos.config.proxy.druid.enabled=true
spring.nacos.config.proxy.druid.data-id={dataID}
Step3 设置访问凭证
凭证需要提前完成授权,可以前往
授权粒度选择“针对 KMS 加密的解密权限“ 按照指引完成授权。授权之后,数据源对应的加密配置在应用运行时通过内存解密,需要设置可解密配置的凭证。
设置JVM参数:
-Dspring.cloud.nacos.config.accessKey=${accessKey}
-Dspring.cloud.nacos.config.secretKey=${secretKey}
请替换为实际的accessKey及secretKey,并且为对应账号或者角色授予“针对 KMS 加密的解密权限”。更多的凭证形式可参考客户端配置访问凭证。
常见问题
1. 当前支持哪些数据源类型,未来会接入更多的类型吗?
当前支持 Spring应用中使用Druid作为数据源类型进行全链路数据源配置托管及运行时无损轮转,redis类型会在近期支持并上线,未来也会计划支持AI领域的appKey,Token等AI领域数据源的托管。
2. KMS的凭据轮转什么时候会对旧帐密进行失效处理呢?
KMS在凭据轮转时会通知MSE更新帐密,并且保留两个版本的帐密生效,2个版本前帐密会失效,未来会对接具体数据源的会话管理,当旧帐密不存在在线连接才会失效,进一步保证稳定性。
3. 当应用侧触发异常保护机制时,有办法感知吗?
在Nacos的推送机制中,当应用侧数据连接池触发异常保护机制时,会告知nacos通知失败,可以通过nacos的config.log 查看notify-error关键字感知异常保护事件的发生,未来在nacos的新版本中会上报客户端监听期的回调状态,在监听查询功能中可以直接看到客户端的回调失败的状态。