当前位置 博文首页 > RtxTitanV的博客:Nacos数据持久化到mysql

    RtxTitanV的博客:Nacos数据持久化到mysql

    作者:[db:作者] 时间:2021-06-20 12:22

    在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力。按照Nacos官方文档中步骤将Nacos的数据持久化方式改为mysql存储,过程中会踩几个坑,这里记录一下。

    一、Nacos2.0.1的数据持久化到mysql

    安装数据库,版本要求:5.6.5+。本文使用的mysql版本为8.0.18,Windows本地安装(安装过程网上很多,这里就不说了):
    1
    初始化mysql数据库,数据库初始化文件:nacos-mysql.sql,该文件在nacos主目录的conf目录下。新建一个名为nacos_test的数据库,再运行nacos-mysql.sql
    2
    执行完成后得到如下表结构:
    3
    如果Nacos服务器中有配置并且也需要持久化到mysql,需要先将配置导出,不同的命名空间下的配置要分别导出:
    4
    修改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服务器在启动时会报如下错误(只截取了部分日志):
    5
    conf/application.properties文件中添加了mysql相关配置后,如果Nacos服务器正在运行,需关闭后再以单机模式启动Nacos,之后Nacos的数据都会写到mysql。查看Nacos管理页面,里面没有数据:
    6

    查看mysql的nacos_test数据库中config_info表,暂时还没有数据:
    7
    如果之前的Nacos创建有命名空间,那么需要重新手动创建:
    8
    然后在导入之前导出的数据,不同的命名空间下的配置要分别导入:
    9
    导入完成之后查看配置列表:
    10
    然后查看mysql中nacos_test数据库中的config_info表,可见Nacos服务器中的数据已经成功持久化到mysql中:
    11

    二、Nacos1.2.0的数据持久化到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:
    12
    也可以在nacos源码中查看使用的mysql版本,下面在nacos2.0.1源码中主项目的根目录下的pom.xml文件中查看使用的mysql版本:
    13
    发现高于8.0,说明nacos2.0.1与mysql8.0以上的兼容性问题已经得到了解决,所有推荐使用新版本的Nacos。下面查看Nacos1.2.0使用的mysql,为5.1.34,使用mysql8.0以上版本会出现兼容性问题:
    14
    下面测试了一下Nacos1.2.0版本的数据持久化到mysql8,先初始化mysql数据库:
    15
    修改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管理页面,里面没有数据:
    16
    但在新建配置时会出错:
    17
    在网上查阅了相关资料,Nacos1.2.0可以通过在Nacos安装目录下新建plugins\mysql目录,然后将把对应的驱动jar包放在该目录中就能解决问题:
    18
    mysql-connector-java的jar包下载地址:https://repo1.maven.org/maven2/mysql/mysql-connector-java/。

    然后再次启动,新建一个配置文件:
    19
    查看配置列表,发现创建成功:
    20
    然后查看mysql中nacos_1.2.0数据库中的config_info表,可见Nacos服务器中的数据已经成功持久化到mysql中:
    21

    三、Nacos1.1.4的数据持久化到mysql

    下面测试了一下Nacos1.1.4版本的数据持久化到mysql8,先初始化mysql数据库:
    22
    然后按照之前的步骤,最后启动依然能启动成功,但是仍然会出现与Nacos1.2.0版本类似的问题,并且按照Nacos1.2.0的解决方式也不能解决问题。解决方式是需要对源码进行修改并重新打包构建。首先下载Nacos1.1.4源码:
    23
    打开nacos1.1.4源码,修改Nacos主项目的根目录下的pom.xml文件中mysql-connector-java依赖的版本:
    24
    这里修改为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行的导包:
    25
    修改为:

    import com.mysql.cj.jdbc.MysqlDataSource;
    

    mysql8.0及其以上版本需要指定时区,所以还需要修改console项目resources/META-INFnacos-default.properties中的db.url
    26
    修改为:

    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中:
    27
    将打包生成的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服务器,新建一个配置文件:
    28
    查看配置列表,发现创建成功:
    29
    然后查看mysql中nacos_1.1.4数据库中的config_info表,可见Nacos服务器中的数据已经成功持久化到mysql中:
    30

    下一篇:没有了