当前位置 博文首页 > RtxTitanV的博客:Nacos数据持久化到mysql
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力。按照Nacos官方文档中步骤将Nacos的数据持久化方式改为mysql存储,过程中会踩几个坑,这里记录一下。
安装数据库,版本要求:5.6.5+。本文使用的mysql版本为8.0.18,Windows本地安装(安装过程网上很多,这里就不说了):
初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
,该文件在nacos主目录的conf
目录下。新建一个名为nacos_test
的数据库,再运行nacos-mysql.sql
:
执行完成后得到如下表结构:
如果Nacos服务器中有配置并且也需要持久化到mysql,需要先将配置导出,不同的命名空间下的配置要分别导出:
修改conf/application.properties
文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_test?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
Nacos较新的版本都支持8.0以上的mysql,比如Nacos1.4.0,2.0.1,所以在使用mysql8.0及其以上版本时,不会出现mysql驱动不匹配的问题,但还是需要在url上加上serverTimezone
时区。如果url上不加时区serverTimezone
时区,Nacos服务器在启动时会报如下错误(只截取了部分日志):
在conf/application.properties
文件中添加了mysql相关配置后,如果Nacos服务器正在运行,需关闭后再以单机模式启动Nacos,之后Nacos的数据都会写到mysql。查看Nacos管理页面,里面没有数据:
查看mysql的nacos_test
数据库中config_info
表,暂时还没有数据:
如果之前的Nacos创建有命名空间,那么需要重新手动创建:
然后在导入之前导出的数据,不同的命名空间下的配置要分别导入:
导入完成之后查看配置列表:
然后查看mysql中nacos_test
数据库中的config_info
表,可见Nacos服务器中的数据已经成功持久化到mysql中:
Nacos较新的版本都支持8.0以上的mysql,比如Nacos1.4.0,2.0.1,所以在使用mysql8.0及其以上版本时,不会出现mysql驱动不匹配的问题。而如果使用的是老版本的Nacos,可以去查看一下它使用的mysql版本是不是8.0以上的。在nacos主目录的target
目录下,查看nacos-server.jar
中的BOOT-INF\lib
,可以看到nacos使用的mysql版本,如果使用的是8.0以上版本,我们的mysql选用8.0及以上版本时,就不会出现因mysql驱动不匹配导致的问题。下图为查看Nacos2.0.1使用的mysql:
也可以在nacos源码中查看使用的mysql版本,下面在nacos2.0.1源码中主项目的根目录下的pom.xml
文件中查看使用的mysql版本:
发现高于8.0,说明nacos2.0.1与mysql8.0以上的兼容性问题已经得到了解决,所有推荐使用新版本的Nacos。下面查看Nacos1.2.0使用的mysql,为5.1.34,使用mysql8.0以上版本会出现兼容性问题:
下面测试了一下Nacos1.2.0版本的数据持久化到mysql8,先初始化mysql数据库:
修改conf/application.properties
文件,新增以下配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_1.2.0?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
然后启动Nacos服务器,发现启动成功,能成功查看Nacos管理页面,里面没有数据:
但在新建配置时会出错:
在网上查阅了相关资料,Nacos1.2.0可以通过在Nacos安装目录下新建plugins\mysql
目录,然后将把对应的驱动jar包放在该目录中就能解决问题:
mysql-connector-java
的jar包下载地址:https://repo1.maven.org/maven2/mysql/mysql-connector-java/。
然后再次启动,新建一个配置文件:
查看配置列表,发现创建成功:
然后查看mysql中nacos_1.2.0
数据库中的config_info
表,可见Nacos服务器中的数据已经成功持久化到mysql中:
下面测试了一下Nacos1.1.4版本的数据持久化到mysql8,先初始化mysql数据库:
然后按照之前的步骤,最后启动依然能启动成功,但是仍然会出现与Nacos1.2.0版本类似的问题,并且按照Nacos1.2.0的解决方式也不能解决问题。解决方式是需要对源码进行修改并重新打包构建。首先下载Nacos1.1.4源码:
打开nacos1.1.4源码,修改Nacos主项目的根目录下的pom.xml
文件中mysql-connector-java
依赖的版本:
这里修改为8.0.18:
<!-- JDBC libs -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
修改naming项目com.alibaba.nacos.naming.healthcheck
包下的MysqlHealthCheckProcessor
类的第24行的导包:
修改为:
import com.mysql.cj.jdbc.MysqlDataSource;
mysql8.0及其以上版本需要指定时区,所以还需要修改console项目resources/META-INF
下nacos-default.properties
中的db.url
:
修改为:
db.url.0=jdbc:mysql://11.162.196.161:3306/diamond_devtest?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://11.163.152.91:3306/diamond_devtest?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
然后进行打包,cmd命令窗口进入项目根目录执行:
mvn -Prelease-nacos -DskipTests clean install -U
执行成功之后打包生成的文件在项目根目录下的distribution\target
中:
将打包生成的nacos-server-1.1.4.zip
拷贝到自己定义好的目录解压,修改conf/application.properties
文件,新增以下配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_1.1.4?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
启动Nacos服务器,新建一个配置文件:
查看配置列表,发现创建成功:
然后查看mysql中nacos_1.1.4
数据库中的config_info
表,可见Nacos服务器中的数据已经成功持久化到mysql中: