KaiwuDB 征文

部署KWDB多副本集群环境踩过的坑和经验总结

转载元码2026-04-14
0

原文链接:【KWDB创作者计划】_部署KWDB多副本集群环境踩过的坑和经验总结-CSDN博客

作者:降世神童

1. 概述

KWDB是由开放原子开源基金会孵化及运营的开源项目,是一款面向AIoT场景的分布式多模数据库产品,支持在同一实例同时建立时序库和关系库并融合处理多模数据,具备千万级设备接入、百万级数据秒级写入、亿级数据秒级读取等时序数据高效处理能力,具有稳定安全、高可用、易运维等特点。

■ 部署方式分为:

● 二进制安装包:支持单机和集群以及安全和非安全部署模式,本篇博客就使用此种方式进行集群部署。

● 容器镜像:KWDB支持容器方式集群部署。

● 源码:源码编译目前支持单节点非安全模式部署。

2. 部署准备

KWDB-v2.2.0版本官方下载地址:https://gitee.com/kwdb/kwdb/releases/tag/V2.2.0

在部署过程中,系统将对配置文件、运行环境、硬件配置、软件依赖和免密登录进行检查。如果硬件不满足要求,系统仍会继续安装,并提示硬件规格不足。如果软件依赖未满足要求,系统将中止安装,并给出相应提示。

IP地址    |主机名|CPU|内存|硬盘|操作系统
10.1.248.95|kwdb|18核|16G|100G|Ubuntu20.04
10.1.248.74|kwdb|28核|16G|100G|Ubuntu20.04
10.1.248.75|kwdb|38核|16G|100G|Ubuntu20.04

2.1. 配置主机名

root@vm10-1-248-95:~# hostnamectl set-hostname kwdb1
root@vm10-1-248-74:~# hostnamectl set-hostname kwdb2
root@vm10-1-248-75:~# hostnamectl set-hostname kwdb3

配置三个节点的/etc/hosts文件:

10.1.248.95 kwdb1
10.1.248.74 kwdb2
10.1.248.75 kwdb3

2.2. SSH免密登录

先在kwdb1节点生成公私密钥对:

ssh-keygen -f ~/.ssh/id_rsa -N ""

将密钥分发至集群其它节点:

ssh-copy-id -f -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no kwdb1
ssh-copy-id -f -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no kwdb2
ssh-copy-id -f -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no kwdb3

确认是否可以使用非交互式的方法登录集群其它节点:

ssh kwdb2
ssh kwdb3

上述操作也需要在kwdb2和kwdb3也执行一遍。

2.3. 时钟同步

关闭 timesyncd 服务:

timedatectl set-ntp false

使用阿里云NTP服务器配置时钟同步:

apt install -y ntp
ntpdate -u time.pool.aliyun.com
crontab -e
0 6 * * *  /usr/sbin/ntpdate -e time.pool.aliyun.com  >/dev/null 2>&1

3. 裸机集群部署

3.1. 前提配置

mkdir -p /data/kaiwudb   // 创建数据目录
tar xf KWDB-2.2.0-ubuntu20.04-x86_64-debs.tar.gz
cd kwdb_install/
vim deploy.cfg
[global]
# Whether to turn on secure mode
secure_mode=tls
# Management KaiwuDB user
management_user=kaiwudb
# KaiwuDB cluster http port
rest_port=8080
# KaiwuDB service port
kaiwudb_port=26257
# KaiwuDB data directory
#data_root=/var/lib/kaiwudb
data_root=/data/kaiwudb
# CPU usage[0-1]
# cpu=1
[local]
# local node configuration
node_addr=10.1.248.95
# section cluster is optional
[cluster]
# remote node addr,split by ','
node_addr=10.1.248.95,10.1.248.74,10.1.248.65
# ssh info
ssh_port=22
ssh_user=root

secure_mode:是否开启安全模式,支持以下两种设置:

● insecure:使用非安全模式。

● tls:(默认选项)开启 TLS 安全模式。开启安全模式后,KWDB 生成 TLS 证书,作为客户端或应用程序连接数据库的凭证。

特殊说明:本人认为此处KWDB设计不太友善,如果将secure_mode配置为insecure,也就是不使用TLS安全模式,但是在最后的KWDB客户端连接中还要指定--insecure选项,表示不安全的连接,有重复性配置。

kwbase sql --host=10.1.248.95:26257 --user=wangzy --insecure

在执行安装多副本集群命令之前,先安装依赖包,否则在安装过程中会报如下错误,注意三个节点都需要安装:

[ERROR] 2025-04-13 10:53:02 Install failed: Selecting previously unselected package kwdb-server. (Reading database ... 76572 files and directories currently installed.) Preparing to unpack .../kwdb-server_2.2.0-ubuntu-20.04_amd64.deb ... Unpacking kwdb-server (2.2.0-ubuntu-20.04) ... dpkg: dependency problems prevent configuration of kwdb-server: kwdb-server depends on libprotobuf17; however: Package libprotobuf17 is not installed. kwdb-server depends on squashfs-tools; however: Package squashfs-tools is not installed. dpkg: error processing package kwdb-server (--install): dependency problems - leaving unconfigured Errors were encountered while processing: kwdb-server
apt install -y openssl libprotobuf-dev protobuf-compiler libgeos-dev liblzma-dev squashfs-tools  libgcc1  mount squashfuse
for pkg in openssl libprotobuf geos liblzma squashfs-tools libgcc mount squashfuse; do dpkg -l | grep $pkg;done
openssl1.1.1f-1ubuntu2.24
libprotobuf-dev:amd643.6.1.3-2ubuntu5.2
libprotobuf-lite17:amd643.6.1.3-2ubuntu5.2
libprotobuf17:amd643.6.1.3-2ubuntu5.2
libgeos-3.8.0:amd643.8.0-1build1
libgeos-c1v5:amd643.8.0-1build1
libgeos-dev3.8.0-1build1
liblzma-dev:amd645.2.4-1ubuntu1.1
liblzma5:amd645.2.4-1ubuntu1.1
squashfs-tools1:4.4-1ubuntu0.3
libgcc-9-dev:amd649.3.0-10ubuntu2
libgcc-s1:amd6410.5.0-1ubuntu1~20.04
libgcc11:10.5.0-1ubuntu1~20.04
libmount1:amd642.34-0.1ubuntu9
libsquashfuse0:amd640.1.103-2
mount2.34-0.1ubuntu9.6
squashfuse0.1.103-2
libsquashfuse0:amd640.1.103-2
squashfuse0.1.103-2

3.2. 部署执行

接下来再执行安装多副本集群命令,执行成功后,控制台输出以下信息:

root@kwdb1:~/kwdb_install# ./deploy.sh install --multi-replica
Please input kaiwudb's password:                                                                                                                        
[INSTALL COMPLETED]:KaiwuDB has been installed successfully! To start KaiwuDB, please execute the command 'systemctl daemon-reload'.

这一点KWDB还需要再完善下,只给一次输入密码的机会,建议再加一次确认密码,如果两次不一致用户创建失败。

根据系统提示重新加载 systemd 守护进程的配置文件:

root@kwdb1:~/kwdb_install# systemctl daemon-reload

对集群进行初始化:

root@kwdb1:~/kwdb_install# ./deploy.sh cluster --init
[INIT COMPLETED]:Cluster init successfully.

查看集群节点状态:

root@kwdb1:~/kwdb_install# ./deploy.sh cluster --status
  id |      address      |    sql_address    | build |            started_at            |            updated_at            |   locality   | start_mode | is_available | is_live
-----+-------------------+-------------------+-------+----------------------------------+----------------------------------+--------------+------------+--------------+----------
   1 | 10.1.248.95:26257 | 10.1.248.95:26257 | 2.2.0 | 2025-04-13 08:11:44.385779+00:00 | 2025-04-13 08:11:53.422494+00:00 | region=NODE1 | start      | true         | true
   2 | 10.1.248.74:26257 | 10.1.248.74:26257 | 2.2.0 | 2025-04-13 08:11:44.490362+00:00 | 2025-04-13 08:11:53.495896+00:00 | region=NODE2 | start      | true         | true
   3 | 10.1.248.65:26257 | 10.1.248.65:26257 | 2.2.0 | 2025-04-13 08:11:45.367234+00:00 | 2025-04-13 08:11:54.373949+00:00 | region=NODE3 | start      | true         | true
(3 rows)

在三个节点检查下kwdb端口和服务:

root@kwdb1:~/kwdb_install# systemctl status kaiwudb -l
● kaiwudb.service - KaiwuDB Service
     Loaded: loaded (/etc/systemd/system/kaiwudb.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2025-04-13 11:32:03 CST; 9min ago
    Process: 226456 ExecStartPre=/usr/bin/sudo /usr/sbin/sysctl -w vm.max_map_count=10000000 (code=exited, status=0/SUCCESS)
   Main PID: 226466 (kwbase)
      Tasks: 42 (limit: 19144)
     Memory: 405.2M
     CGroup: /system.slice/kaiwudb.service
             └─226466 /usr/local/kaiwudb/bin/kwbase start --certs-dir=/etc/kaiwudb/certs --listen-addr=0.0.0.0:26257 --advertise-addr=0.0.0.0:26257
root@kwdb1:~/kwdb_install# ss -tnlp | grep 26257
LISTEN    0         4096                     *:26257                  *:*        users:(("kwbase",pid=226466,fd=16))  
root@kwdb1:~/kwdb_install# ss -tnlp | grep 8080
LISTEN    0         4096                     *:8080                   *:*        users:(("kwbase",pid=226466,fd=10))
root@kwdb2:~# systemctl status kaiwudb
● kaiwudb.service - KaiwuDB Service
     Loaded: loaded (/etc/systemd/system/kaiwudb.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2025-04-13 11:32:07 CST; 3min 56s ago
    Process: 224238 ExecStartPre=/usr/bin/sudo /usr/sbin/sysctl -w vm.max_map_count=10000000 (code=exited, status=0/SUCCESS)
   Main PID: 224245 (kwbase)
      Tasks: 23 (limit: 19144)
     Memory: 30.0M
     CGroup: /system.slice/kaiwudb.service
             └─224245 /usr/local/kaiwudb/bin/kwbase start --certs-dir=/etc/kaiwudb/certs --listen-addr=0.0.0.0:26257 --advertise-addr=10.1.248.74:26257
root@kwdb2:~# ss -tnlp | grep 26257
LISTEN    0         4096                     *:26257                  *:*        users:(("kwbase",pid=224245,fd=16))   
                                         
root@kwdb2:~# ss -tnlp | grep 8080
LISTEN    0         4096                     *:8080                   *:*        users:(("kwbase",pid=224245,fd=10))
root@kwdb3:~# systemctl status kaiwudb
● kaiwudb.service - KaiwuDB Service
     Loaded: loaded (/etc/systemd/system/kaiwudb.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2025-04-13 11:32:07 CST; 4min 8s ago
    Process: 173040 ExecStartPre=/usr/bin/sudo /usr/sbin/sysctl -w vm.max_map_count=10000000 (code=exited, status=0/SUCCESS)
   Main PID: 173043 (kwbase)
      Tasks: 23 (limit: 19136)
     Memory: 30.5M
     CGroup: /system.slice/kaiwudb.service
             └─173043 /usr/local/kaiwudb/bin/kwbase start --certs-dir=/etc/kaiwudb/certs --listen-addr=0.0.0.0:26257 --advertise-addr=10.1.248.65:26257
root@kwdb3:~# ss -tnlp | grep 26257
LISTEN    0         4096                     *:26257                  *:*        users:(("kwbase",pid=173043,fd=16))       
                                     
root@kwdb3:~# ss -tnlp | grep 8080
LISTEN    0         4096                     *:8080                   *:*        users:(("kwbase",pid=173043,fd=10))

配置KWDB开机自启动后,如果系统重启,则自动启动KWDB:

systemctl enable kaiwudb

4. 集群优化配置

部署完成后,系统会将KWDB封装成系统服务,并生成kaiwudb.service 和kaiwudb_env两个文件。用户可以按需配置KWDB集群。

4.1. 配置启动参数

启动参数是节点级配置。如需修改整个集群的配置,用户需要登录集群中的每个节点并完成相应的配置。

通常情况下,如果用户没有配置启动参数,系统会使用参数默认值启动 KWDB。当用户配置了启动参数,KWDB 启动时会优先使用配置的启动参数。部署完 KWDB 后,用户可以按需修改kaiwudb_env文件中的启动参数。

● 停止KWDB服务:

systemctl stop kaiwudb

● 编辑/etc/kaiwudb/script/kaiwudb_env文件,根据需要配置KWDB启动参数:

#KAIWUDB_START_ARG=""
KAIWUDB_START_ARG="--cache=10000"

● 保存kaiwudb_env文件并重新加载文件,最后启动KWDB服务:

systemctl daemon-reload
systemctl start kaiwudb

4.2. 配置CPU资源占用率

CPU资源占用率是节点级配置。如需修改整个集群的配置,用户需要登录集群中的每个节点并完成相应的配置。

KWDB支持在不停止KWDB服务的情况下实时修改CPU资源占用率:

● 编辑/etc/systemd/system/kaiwudb.service文件,根据需要修改KWDB的CPU资源占用率:

 ......
[Service]
User=kaiwudb
Group=kaiwudb
Type=simple
CPUQuota=240%   # 添加CPUQuota值
LimitMEMLOCK=infinity
LimitNOFILE=1048576
......

CPUQuota的计算公式为:CPU占用率 x 服务器CPU核数 x 100%。例如,我部署环境的CPU核数为8,计划将 CPU占用率为0.3, 则对应的CPUQuota的值应为 0.3 x 8 x 100% = 240%

● 保存修改后的kaiwudb.service文件并重新加载文件:

systemctl daemon-reload

● 确认新的CPU资源占用率是否生效:

systemctl show kaiwudb | grep CPUQuota
CPUQuotaPerSecUSec=2.400000s
CPUQuotaPeriodUSec=infinity

5. 创建/删除用户

KWDB在安装包中提供了add_user.sh脚本。在安装并运行KWDB后,用户可以运行此脚本为数据库创建用户和密码,并使用创建的用户名和密码来连接、登录数据库。

root@kwdb1:~/kwdb_install# ./add_user.sh 
Please enter the username:wangzy
Please enter the password: 
[ADD USER COMPLETED]:User creation completed.

这一点KWDB还需要再完善下,只给一次输入密码的机会,如果自己输入错误,那么只能再去删除库删除后重新创建。建议再加一次确认密码,如果两次不一致用户创建失败。

使用新建的用户连接数据库:

root@kwdb1:~/kwdb_install# kwbase sql --host=10.1.248.95:26257 --certs-dir=/etc/kaiwudb/certs/ --user=wangzy
#
# Welcome to the KWDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
Enter password: 
# Server version: KaiwuDB 2.2.0 (x86_64-linux-gnu, built 2025/03/31 07:20:47, go1.16.15, gcc 9.4.0) (same version as client)
# Cluster ID: 65071f3e-f4a4-48e4-9a4e-953f772bf661
#
# Enter \? for a brief introduction.
#
wangzy@10.1.248.95:26257/defaultdb> show databases;
  database_name | engine_type
----------------+--------------
  defaultdb     | RELATIONAL
  postgres      | RELATIONAL
  system        | RELATIONAL
(3 rows)
Time: 5.441202ms
wangzy@10.1.248.95:26257/defaultdb> show users;
  username |  options   | member_of
-----------+------------+------------
  admin    | CREATEROLE | {}
  root     | CREATEROLE | {admin}
  wangzy   |            | {admin}
(3 rows)
Time: 18.748018ms

删除用户:

drop user wangzy;

6. 启动与停止KWDB服务

启动KWDB服务:

systemctl start kaiwudb

停止KWDB服务:

systemctl stop kaiwudb

7. 总结

KWDB(KaiwuDB)分企业版和开源版,企业版相比开源版的核心优势在于企业级可靠性、高性能和专属服务。KWDB可部署中心分布式架构,支持水平扩展,性能线性提升,并且支持多副本集群部署,保障集群整体的高可用性。提供低成本的数据存储,数据降采样存储;按“时间热度” 进行数据生命周期管理。提供可插拔式 AI分析预测能力,支持对模型的导、练、预、评、换。KWDB提供标准ODBC、JDBC、RESTful API 接口,提供多种编程语言接口, 兼容 MQTT (EMQX)、Kafka、Telegraf 等;兼容主流芯片和操作系统。支持身份鉴权、权限管理、数据库审计、支持通信加密。提供上百种监控接口,完善迁移方案支持。

-- 坚持原创,转载请注明出处 --

评论(0)

Me