nacos适配达梦、人大金仓数据库

简介: 准备工作 1、下载nacos源码、编译,官网更详细 https://nacos.io/zh-cn/docs/quick-start.html 2、下载源码,按官网更详细 git地址:https://g

准备工作

1、下载nacos源码、编译,官网更详细

https://nacos.io/zh-cn/docs/quick-start.html

2、下载源码,按官网更详细

git地址:https://github.com/alibaba/nacos.git

3、下载达梦、人大金仓数据库驱动

我下载的是:Dm、Kingbase依赖

dm: https://download.csdn.net/download/qq_24101357/20677620
kingbase: https://download.csdn.net/download/qq_24101357/20677646

修改nacos源码

引入达梦数据库驱动依赖

nacos-all的pom.xml

<!--达梦、人大金仓-->
<dm-connector-java.version>1.8</dm-connector-java.version>
<kingbase-connector-java.version>8.2.0</kingbase-connector-java.version>
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>Dm8JdbcDriver18</artifactId>
    <version>${dm-connector-java.version}</version>
</dependency>

<dependency>
    <groupId>com.kingbase</groupId>
    <artifactId>kingbase8</artifactId>
    <version>${kingbase-connector-java.version}</version>
</dependency>

nacos-config的pom.xml

<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>Dm8JdbcDriver18</artifactId>
</dependency>

<dependency>
    <groupId>com.kingbase</groupId>
    <artifactId>kingbase8</artifactId>
</dependency>
修改数据库配置

nacos-console模块的application.properties:

主要修改了:

1、增加了驱动db.jdbcDriverName;

2、spring.datasource.platform=mysql,现在的意思其实是是否使用外置数据库,直接mysql就等于是使用外置数据库,使用什么数据库则由db.jdbcDriverName决定;

#*************** Config Module Related Configurations ***************#
#达梦
### If user MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1
db.jdbcDriverName=dm.jdbc.driver.DmDriver

### Connect URL of DB:
db.url.0=jdbc:dm://127.0.0.1:5236/NACOS?STU&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
db.user=root
db.password=root

#人大金仓
#spring.datasource.platform=mysql
#db.num=1
#db.jdbcDriverName=com.kingbase8.Driver
#db.url.0=jdbc:kingbase8://127.0.0.1:54321/nacos
#db.user.0=root
#db.password.0=root

#mysql
#spring.datasource.platform=mysql
#db.jdbcDriverName=com.mysql.cj.jdbc.Driver
#db.num=1
#db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
#db.user=root
#db.password=root
修改的程序

nacos-config模块

com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties

其实就改了可以通过配置文件指定数据库驱动

/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package com.alibaba.nacos.config.server.service.datasource;

import static com.alibaba.nacos.common.utils.CollectionUtils.getOrDefault;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.core.env.Environment;

import com.google.common.base.Preconditions;
import com.zaxxer.hikari.HikariDataSource;

/**
 * Properties of external DataSource
 *
 * @author Nacos
 */
public class ExternalDataSourceProperties{

    public static final long CONNECTION_TIMEOUT_MS = 3000L;
    public static final long VALIDATION_TIMEOUT = 10L;
    public static final String TEST_QUERY = "SELECT 1 FROM dual";
    public static final int DEFAULT_MAX_POOL_SIZE = 20;
    public static final int DEFAULT_MINIMUM_IDLE = 50;

    private Integer num;
    private List<String> url = new ArrayList<>();
    private List<String> user = new ArrayList<>();
    private List<String> password = new ArrayList<>();
    private List<Integer> maxPoolSize = new ArrayList<>();
    private List<Integer> minIdle = new ArrayList<>();

    /**
     * 数据库驱动
     * 增加对达梦、人大金仓数据库的支持
     */
    private String jdbcDriverName;

    public String getJdbcDriverName() {
        return jdbcDriverName;
    }

    public void setJdbcDriverName(String jdbcDriverName) {
        this.jdbcDriverName = jdbcDriverName;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public void setUrl(List<String> url) {
        this.url = url;
    }

    public void setUser(List<String> user) {
        this.user = user;
    }

    public void setPassword(List<String> password) {
        this.password = password;
    }

    public void setMaxPoolSize(List<Integer> maxPoolSize) {
        this.maxPoolSize = maxPoolSize;
    }

    public void setMinIdle(List<Integer> minIdle) {
        this.minIdle = minIdle;
    }

    /**
     *
     * @param environment
     *            {@link Environment}
     * @param callback
     *            Callback function when constructing data source
     * @return List of {@link HikariDataSource}
     */
    List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {
        List<HikariDataSource> dataSources = new ArrayList<>();
        Binder.get(environment).bind("db", Bindable.ofInstance(this));
        Preconditions.checkArgument(Objects.nonNull(num), "db.num is null");
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(user), "db.user or db.user.[index] is null");
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(password), "db.password or db.password.[index] is null");
        for (int index = 0; index < num; index++) {
            int currentSize = index + 1;
            Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index);
            HikariDataSource ds = new HikariDataSource();
            
            // ds.setDriverClassName(JDBC_DRIVER_NAME)
            // 增加对达梦、人大金仓数据库的支持
            ds.setDriverClassName(jdbcDriverName);
            if(StringUtils.isNotEmpty(jdbcDriverName)){
                // 增加对达梦、人大金仓数据库的支持
                ds.setDriverClassName(jdbcDriverName);
            }else{
                //默认使用mysql驱动
                ds.setDriverClassName(JDBC_DRIVER_NAME);
            }

            ds.setJdbcUrl(url.get(index).trim());
            ds.setUsername(getOrDefault(user, index, user.get(0)).trim());
            ds.setPassword(getOrDefault(password, index, password.get(0)).trim());
            ds.setConnectionTimeout(CONNECTION_TIMEOUT_MS);
            ds.setMaximumPoolSize(getOrDefault(maxPoolSize, index, DEFAULT_MAX_POOL_SIZE));
            ds.setMinimumIdle(getOrDefault(minIdle, index, DEFAULT_MINIMUM_IDLE));
            // Check the connection pool every 10 minutes
            ds.setValidationTimeout(TimeUnit.MINUTES.toMillis(VALIDATION_TIMEOUT));
            ds.setConnectionTestQuery(TEST_QUERY);
            dataSources.add(ds);
            callback.accept(ds);
        }
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), "no datasource available");
        return dataSources;
    }

    interface Callback<DataSource> {
        /**
         *  Perform custom logic
         * @param dataSource
         */
        void accept(DataSource dataSource);
    }

}
重新编译、运行nacos

mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

或:mvn -Prelease-nacos -Dmaven.test.skip=true -Drat.skip=true clean install -U

或:mvn -Prelease-nacos -Dmaven.test.skip=true -Dcheckstyle.skip=true clean install -U

成功后,编译好的在这里
distribution\target\nacos-server-1.3.0\nacos\bin\startup.cmd

此时,nacos已支持达梦数据库,其实也支持oracle数据库,只要更换驱动就可以

(注:可以查看nacos文件夹,目录里面有一个BUILDING文件中说明)

关于nacos集群

集群和数据库没有关系,业务系统也不需要作任何改变

主要是以下步骤:

1、修改conf/cluster.conf文件,指定参与集群的3个nacos

192.168.4.128:8845
192.168.4.128:8846
192.168.4.128:8847

2、通过nginx代理nacos

upstream nacos {
server 192.168.4.128:8845;
server 192.168.4.128:8846;
server 192.168.4.128:8847;
}
server {
    listen       8848;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;
    }

    location /nacos {
      proxy_pass http://nacos;
    }            

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
11月前
|
数据库
【赵渝强老师】达梦数据库实例的状态
达梦数据库实例包含NORMAL、PRIMARY和STANDBY三种模式,以及MOUNT、OPEN和SUSPEND三种状态。模式之间可在MOUNT状态下相互转换,不同状态与模式适用于数据库的启动、配置及运行需求。
495 1
|
SQL 数据库 Docker
【赵渝强老师】在Docker中运行达梦数据库
本文介绍了在Docker容器中部署达梦数据库(DM 8)的具体步骤,包括创建文件夹、下载安装包、导入镜像、启动容器、登录数据库及查看状态等操作。同时,通过视频讲解辅助理解。文中还分析了将数据库服务容器化的潜在问题,如数据安全性、硬件资源争用、网络带宽占用和额外隔离带来的挑战,指出数据库服务在生产环境中可能不适合容器化的原因。
2173 4
【赵渝强老师】在Docker中运行达梦数据库
|
SQL 缓存 分布式数据库
【赵渝强老师】达梦数据库的线程结构
达梦数据库采用单进程、多线程结构,利用对称服务器架构实现高效资源利用与可扩展性。其核心线程类型包括监听线程(管理客户端连接)、I/O线程(处理数据页读写)、工作线程(执行数据操作)、调度线程(定时任务管理)和日志刷新线程(确保REDO日志刷盘)。通过合理分工与同步机制,达梦数据库实现了高性能与稳定性。视频讲解进一步详细介绍了各线程的功能与协作方式。
458 1
【赵渝强老师】达梦数据库的线程结构
|
存储 SQL NoSQL
【赵渝强老师】达梦数据库的逻辑存储结构
本文介绍了达梦数据库的存储结构,包括逻辑和物理存储两部分。逻辑存储结构由数据库(Database)、表空间(Tablespaces)、段(Segments)、簇(Cluster)和页(Page)组成。数据库是最大逻辑单元,包含所有表、索引等;表空间由数据文件组成,用于存储对象;段由簇构成,簇包含连续的数据页;页是最小存储单元。文中还提供了查询表空间、段和页大小的SQL语句,并附有视频讲解和示意图。
616 7
|
存储 SQL 数据库
【赵渝强老师】达梦数据库的数据库对象
达梦数据库包含基本与复杂两大类数据库对象。基本对象如表、索引、视图、序列和同义词,通过单一DDL语句创建和管理。表是数据存储核心,支持多种数据类型;索引提升查询速度,常见类型包括聚集、唯一、函数等索引;视图提供虚表功能;序列生成有序整数;同义词简化对象访问。复杂对象包括存储过程、函数和触发器,需用DMSQL语言开发,适用于更复杂的业务逻辑处理。文中通过实例详细介绍了各类对象的创建与使用方法。
829 3
|
存储 SQL 并行计算
【赵渝强老师】达梦数据库MPP集群的架构
达梦数据库提供大规模并行处理(MPP)架构,以低成本实现高性能并行计算,满足海量数据存储和复杂查询需求。DM MPP采用完全对等无共享体系,消除主节点瓶颈,通过多节点并行执行提升性能。其执行流程包括主EP生成计划、分发任务、各EP并行处理及结果汇总返回。为确保高可用性,建议结合数据守护部署。
670 0
|
SQL 存储 运维
【赵渝强老师】达梦数据库的客户端工具
本文介绍了达梦数据库的多种工具及其使用方法,包括disql交互式查询工具、数据库配置助手DBCA、DM管理工具、DM服务查看器、DM控制台工具、DM数据迁移工具、DM性能监视工具以及DM审计分析工具。每种工具的功能和操作步骤均有详细说明,并配有相关图片和代码示例,帮助用户更好地理解和使用这些工具,提升数据库管理和维护效率。
1851 1
|
SQL 存储 数据库
【赵渝强老师】达梦数据库的归档模式
本文介绍了达梦数据库备份与恢复中重做日志文件的作用,重点讲解了归档模式的必要性及其配置方法。文章分析了非归档模式可能导致的数据丢失问题,并推荐使用归档模式以保障数据一致性和完整性。归档模式分为本地归档和远程归档:本地归档将重做日志存储在本地,而远程归档适用于集群环境,确保所有节点拥有完整日志。文中还详细展示了如何通过SQL命令开启归档模式,包括切换状态、设置路径及验证配置等步骤,并附有视频教程辅助理解。
1376 1
|
SQL 存储 缓存
【赵渝强老师】达梦数据库的内存结构
本文介绍了达梦数据库管理系统的内存结构,包括内存池、缓冲区、排序区和哈希区。内存池分为共享内存池和运行时内存池,能够提高内存申请与释放效率,并便于监控内存使用情况。缓冲区涵盖数据缓冲区、日志缓冲区、字典缓冲区和SQL缓冲区,用于优化数据读写和查询性能。排序区和哈希区分别提供排序和哈希连接所需的内存空间,通过合理配置参数可提升系统效率。文内附有具体配置示例及视频讲解,帮助用户深入理解达梦数据库的内存管理机制。
590 0
|
存储 SQL 安全
【赵渝强老师】达梦数据库的物理存储结构
本文介绍了达梦数据库的存储结构及各类物理文件的作用。达梦数据库通过逻辑和物理存储结构管理数据,包含配置文件(如dm.ini、sqllog.ini)、控制文件(dm.ctl)、数据文件(*.dbf)、重做日志文件(*.log)、归档日志文件、备份文件(*.bak)等。配置文件用于功能设置,控制文件记录数据库初始信息,数据文件存储实际数据,重做日志用于故障恢复,归档日志增强数据安全性,备份文件保障数据完整性,跟踪与事件日志辅助问题分析。这些文件共同确保数据库高效、稳定运行。
799 0