【KWDB创作者计划】_部署KWDB多副本集群环境踩过的坑和经验总结
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 | kwdb1 | 8核 | 16G | 100G | Ubuntu20.04 |
10.1.248.74 | kwdb2 | 8核 | 16G | 100G | Ubuntu20.04 |
10.1.248.75 | kwdb3 | 8核 | 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
在执行安装多副本集群命令之前,先安装依赖包,否则在安装过程中会报如下错误,注意三个节点都需要安装:
[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
openssl 1.1.1f-1ubuntu2.24
libprotobuf-dev:amd64 3.6.1.3-2ubuntu5.2
libprotobuf-lite17:amd64 3.6.1.3-2ubuntu5.2
libprotobuf17:amd64 3.6.1.3-2ubuntu5.2
libgeos-3.8.0:amd64 3.8.0-1build1
libgeos-c1v5:amd64 3.8.0-1build1
libgeos-dev 3.8.0-1build1
liblzma-dev:amd64 5.2.4-1ubuntu1.1
liblzma5:amd64 5.2.4-1ubuntu1.1
squashfs-tools 1:4.4-1ubuntu0.3
libgcc-9-dev:amd64 9.3.0-10ubuntu2
libgcc-s1:amd64 10.5.0-1ubuntu1~20.04
libgcc1 1:10.5.0-1ubuntu1~20.04
libmount1:amd64 2.34-0.1ubuntu9
libsquashfuse0:amd64 0.1.103-2
mount 2.34-0.1ubuntu9.6
squashfuse 0.1.103-2
libsquashfuse0:amd64 0.1.103-2
squashfuse 0.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'.
根据系统提示重新加载 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.
使用新建的用户连接数据库:
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 等;兼容主流芯片和操作系统。支持身份鉴权、权限管理、数据库审计、支持通信加密。提供上百种监控接口,完善迁移方案支持。