文章链接:【KWDB创作者计划】容器赋能KaiwuDB:探索浪潮数据库KWDB2.2.0 实战指南_ITPUB博客
作者:ShunWah
在运维管理领域,我拥有多年深厚的专业积累,兼具坚实的理论基础与广泛的实践经验。精通运维自动化流程,对于OceanBase、MySQL等多种数据库的部署与运维,具备从初始部署到后期维护的全链条管理能力。拥有OceanBase的OBCA和OBCP认证、OpenGauss社区认证结业证书,以及崖山DBCA、亚信AntDBCA、翰高-HDCA、GBase 8a | 8c | 8s、Galaxybase的GBCA、Neo4j的Graph Data Science Certification、NebulaGraph的NGCI & NGCP、东方通TongTech TCPE等多项权威认证。
在OceanBase & 墨天轮的技术征文大赛中,多次荣获一、二、三等奖。同时,在OpenGauss第五届、第六届、第七届技术征文大赛,TiDB社区专栏征文大赛,金仓数据库有奖征文活动,以及YashanDB「产品体验官」征文等活动中,我也屡获殊荣。此外,我还活跃于墨天轮、CSDN、ITPUB等技术平台,经常发布原创技术文章,并多次被首页推荐。
浪潮数据库KWDB2.2.0:探索分布式多模数据库的创新之旅
在这个春暖花开的季节里,我有幸踏入了KWDB开源社区的怀抱,与一群有热情、有理想的开发者们共同探索分布式多模数据库的创新之道。作为开源数据库社区的新人,我深感荣幸能够试用 KWDB2.2.0数据库,并通过这次试用与KWDB结缘,共同构建技术与创新的桥梁。
初识KWDB:开源的力量
KWDB 是由开放原子开源基金会孵化及运营的开源项目,是一款面向 AIoT 场景的分布式多模数据库产品,支持在同一实例同时建立时序库和关系库并融合处理多模数据,具备千万级设备接入、百万级数据秒级写入、亿级数据秒级读取等时序数据高效处理能力,具有稳定安全、高可用、易运维等特点。
KWDB 为不同角色开发者提供以下支持(包括但不限于):
为开发者提供通用连接接口,具备高速写入、极速查询、SQL 支持、随需压缩、数据生命周期管理、集群部署等特性,与第三方工具无缝集成,降低开发及学习难度,提升开发使用效率。
为运维管理人员提供快速安装部署、升级、迁移、监控等能力,降低数据库运维管理。
为了更深入地了解KWDB2.2.0,我迫不及待地从 Gitee 上查看了最新版的源码,并通过 docker 获取kwdb/kwdb:2.2.0 镜像开始了我的探索之旅。在用 docker 安装与配置 kwdb:2.2.0 的过程中,我深刻体会到了KWDB的易用性。通过简单的几步操作,我就能够成功部署一个KWDB实例,并开始进行各种数据库操作。
CPU 和内存 单节点配置建议不低于 4 核 8G。对于数据量大、复杂的工作负载、高并发和高性能场景,建议配置更高的 CPU 和内存资源以确保系统的高效运行。
本文以 x86 架构的 CentOS Linux 7.4 镜像作为环境介绍如何使用 obd 图形化界面部署 OceanBase 数据库。
[root@worker3 ob4-3]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@worker3 ob4-3]# free -h
total used free shared buff/cache available
Mem: 27G 676M 18G 41M 8.6G 26G
Swap: 8.0G 0B 8.0G
[root@worker3 ob4-3]#
本文介绍如何使用 YAML 文件或 KaiwuDB 容器安装包在单个节点上部署 KaiwuDB。使用 YAML(.yml)文件进行部署时,仅支持非安全模式,登录 KaiwuDB 数据库时需使用非安全连接模式。容器安装包部署支持安全模式和非安全模式。
如果目标机器尚未安装 Docker,请提前安装适合您操作系统的 Docker 容器。更多信息,参见 Docker 安装文档。
[root@worker3 ~]# docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b7f0
Built: Wed Mar 11 01:22:56 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b7f0
Built: Wed Mar 11 01:30:32 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
[root@worker3 ~]#
如果目标机器无法联网且未安装 Docker-compose,请采用二进制包安装 Docker-compose 。更多信息,参见 Docker-compose 安装文档和安装后说明。
[root@worker3 soft]# docker-compose version
docker-compose version 1.28.6, build 5db8d86f
docker-py version: 4.4.4
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
[root@worker3 soft]#
KWDB 支持通过以下方式获取容器镜像:
Docker 命令:执行 docker pull kwdb/kwdb:2.2.0 获取镜像。
[root@worker3 soft]# docker pull kwdb/kwdb:2.2.0
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
[root@worker3 soft]# vim /etc/docker/daemon.json
[root@worker3 soft]#
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
[root@worker3 soft]# systemctl daemon-reload
[root@worker3 soft]# systemctl restart docker
[root@worker3 soft]#
[root@worker3 soft]# docker pull kwdb/kwdb:2.2.0
2.2.0: Pulling from kwdb/kwdb
9b857f539cb1: Pull complete
24fd278016bd: Pull complete
e915a1b38e6a: Pull complete
Digest: sha256:9dda946922a69557e20be9f1d99c504c467fba6351bb8af0a34fe42711cde73f
Status: Downloaded newer image for kwdb/kwdb:2.2.0
docker.io/kwdb/kwdb:2.2.0
[root@worker3 soft]#
[root@worker3 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kwdb/kwdb 2.2.0 54712e6a5f83 11 days ago 259MB
cym1102/nginxwebui latest 84ed89f8ea1b 8 months ago 163MB
oceanbase/oceanbase-ce latest 21865b1446f4 11 months ago 662MB
mysql 8.0.36 f5f171121fa3 12 months ago 603MB
registry.cn-hangzhou.aliyuncs.com/cym19871102/nginxwebui latest 5b57dac52b1a 22 months ago 146MB
oceanbase/oceanbase-ce <none> 13aacde96f5b 2 years ago 505MB
jc21/nginx-proxy-manager latest 1d0ce4696d69 3 years ago 868MB
redis latest 7614ae9453d1 3 years ago 113MB
portainer/portainer-ce latest 0df02179156a 3 years ago 273MB
mongo 5.0.2 0bcbeb494bed 3 years ago 684MB
progrium/consul latest 09ea64205e55 9 years ago 69.4MB
[root@worker3 soft]#
部署 KWDB 时,系统将对配置文件、运行环境、硬件配置和软件依赖进行检查。如果相应硬件未能满足要求,系统将继续安装,并提示硬件规格不满足要求。如果软件依赖未能满足要求,系统将中止安装,并提供相应的提示信息。
在部署过程中,系统会自动生成相关日志。如果部署时出现错误,用户可以通过查看终端输出或 KWDB 安装目录中 log 目录里的日志文件,获取详细的错误信息。
创建 docker-compose.yml 配置文件。
[root@worker3 data]# mkdir kaiwudb[root@worker3 data]# cd kaiwudb/[root@worker3 kaiwudb]# vim docker-compose.yml[root@worker3 kaiwudb]#
image 参数的取值必须是导入 KaiwuDB.tar 文件后获取的镜像名或拉取的镜像名。
配置文件示例:
version: '3.3'
services:
kaiwudb-container:
image: "kwdb/kwdb:2.2.0"
container_name: kaiwudb-experience
hostname: kaiwudb-experience
ports:
- 8080:8080
- 26257:26257
ulimits:
memlock: -1
volumes:
- /dev:/dev
networks:
- default
restart: on-failure
ipc: shareable
privileged: true
environment:
- LD_LIBRARY_PATH=/kaiwudb/lib
tty: true
working_dir: /kaiwudb/bin
command:
- /bin/bash
- -c
- |
/kaiwudb/bin/kwbase start-single-node --insecure --listen-addr=0.0.0.0:26257 --advertise-addr=127.0.0.1:26257 --http-addr=0.0.0.0:8080 --store=/kaiwudb/deploy/kaiwudb
初次docker-compose up带日志启动
[root@worker3 kaiwudb]# docker-compose up
Creating network "kaiwudb_default" with the default driver
Creating kaiwudb-experience ... done
Attaching to kaiwudb-experience
kaiwudb-experience | *
kaiwudb-experience | * WARNING: RUNNING IN INSECURE MODE!
kaiwudb-experience | *
kaiwudb-experience | * - Your cluster is open for any client that can access 0.0.0.0.
kaiwudb-experience | * - Any user, even root, can log in without providing a password.
kaiwudb-experience | * - Any user, connecting as root, can read or write any data in your cluster.
kaiwudb-experience | * - There is no network encryption nor authentication, and thus no confidentiality.
kaiwudb-experience | *
kaiwudb-experience | * Check out how to secure your cluster on KWDB website
kaiwudb-experience | *
kaiwudb-experience | *
kaiwudb-experience | * INFO: Replication was disabled for this cluster.
kaiwudb-experience | * When/if adding nodes in the future, update zone configurations to increase the replication factor.
kaiwudb-experience | *
kaiwudb-experience | KWDB node starting at 2025-04-11 08:25:30.345632043 +0000 UTC (took 0.3s)
kaiwudb-experience | build: 2.2.0 @ 2025/03/31 07:20:02 (go1.16.15)
kaiwudb-experience | sql: postgresql://root@127.0.0.1:26257?sslmode=disable
kaiwudb-experience | RPC client flags: /kaiwudb/bin/kwbase <client cmd> --host=127.0.0.1:26257 --insecure
kaiwudb-experience | logs: /kaiwudb/deploy/kaiwudb/logs
kaiwudb-experience | temp dir: /kaiwudb/deploy/kaiwudb/kwbase-temp064723318
kaiwudb-experience | external I/O path: /kaiwudb/deploy/kaiwudb/extern
kaiwudb-experience | store[0]: path=/kaiwudb/deploy/kaiwudb
kaiwudb-experience | storage engine: rocksdb
kaiwudb-experience | status: initialized new cluster
kaiwudb-experience | clusterID: b565096e-c243-4399-8aa0-6ec3ea6b77a5
kaiwudb-experience | nodeID: 1
运行以下命令,快速启动 KWDB 不带日志启动。
docker-compose up -d
[root@worker3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40305e626095 kwdb/kwdb:2.2.0 "/bin/bash -c '/kaiw…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:26257->26257/tcp kaiwudb-experience
596eb2a88f53 progrium/consul "/bin/start -server …" 21 months ago Up 14 minutes 53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp consul
[root@worker3 ~]#
[root@worker3 ~]# docker exec -it kaiwudb-experience bash
root@kaiwudb-experience:/kaiwudb/bin# ls
df.sh err_inject.sh kwbase query_kwbase_status.sh query_status.sh setup_cert_file.sh utils.sh
root@kaiwudb-experience:/kaiwudb/bin#
kwbase 是 KaiwuDB 提供的内置命令行工具。用户可以通过 kwbase 以安全模式(适用于生产环境)或非安全模式(适用于测试)连接 KaiwuDB,进行数据库操作和维护。
root@kaiwudb-experience:/kaiwudb/bin# ./kwbase sql --insecure --host=127.0.0.1
#
# Welcome to the KWDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: KaiwuDB 2.2.0 (x86_64-linux-gnu, built 2025/03/31 07:20:02, go1.16.15, gcc 11.4.0) (same version as client)
# Cluster ID: b565096e-c243-4399-8aa0-6ec3ea6b77a5
#
# Enter \? for a brief introduction.
#
root@127.0.0.1:26257/defaultdb>
root@127.0.0.1:26257/defaultdb> CREATE USER user1;
CREATE USER
Time: 9.914786ms
root@127.0.0.1:26257/defaultdb>
root 用户退出登录。
./kwbase sql --insecure --host=127.0.0.1 -u user1
root@127.0.0.1:26257/defaultdb> exit
root@kaiwudb-experience:/kaiwudb/bin# ./kwbase sql --insecure --host=127.0.0.1 -u user1
#
# Welcome to the KWDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: KaiwuDB 2.2.0 (x86_64-linux-gnu, built 2025/03/31 07:20:02, go1.16.15, gcc 11.4.0) (same version as client)
# Cluster ID: b565096e-c243-4399-8aa0-6ec3ea6b77a5
#
# Enter \? for a brief introduction.
#
user1@127.0.0.1:26257/defaultdb>
在实操过程中,我尝试了各种数据库操作命令,包括创建数据库、表、索引,插入数据、查询数据等。其中,让我印象深刻的是KWDB对时序数据的处理能力。通过以下几个命令,我能够轻松地实现时序数据的存储与查询:
root@127.0.0.1:26257/defaultdb> CREATE DATABASE my_tsdb;
CREATE DATABASE
Time: 8.038233ms
root@127.0.0.1:26257/defaultdb>
root@127.0.0.1:26257/defaultdb> SHOW DATABASES;
database_name | engine_type
----------------+--------------
defaultdb | RELATIONAL
my_tsdb | RELATIONAL
postgres | RELATIONAL
system | RELATIONAL
(4 rows)
Time: 2.146362ms
root@127.0.0.1:26257/defaultdb>
root@127.0.0.1:26257/defaultdb> USE my_tsdb;
SET
Time: 635.856µs
root@127.0.0.1:26257/my_tsdb>
root@127.0.0.1:26257/my_tsdb> CREATE TABLE my_ts_table (
time TIMESTAMPTZ NOT NULL,
value DOUBLE PRECISION NOT NULL
);
-> time TIMESTAMPTZ NOT NULL,
-> value DOUBLE PRECISION NOT NULL
-> );
CREATE TABLE
Time: 6.631034ms
root@127.0.0.1:26257/my_tsdb>
root@127.0.0.1:26257/my_tsdb> CREATE INDEX idx_my_ts_table_time ON my_ts_table (time);
CREATE INDEX
Time: 181.039591ms
root@127.0.0.1:26257/my_tsdb>
INSERT INTO my_ts_table (time, value) VALUES
(‘2025-04-01 00:00:00+00’, 10.5),
(‘2025-04-01 01:00:00+00’, 11.2),
(‘2025-04-01 02:00:00+00’, 12.8),
(‘2025-04-02 00:00:00+00’, 13.4),
(‘2025-04-02 01:00:00+00’, 14.1);
root@127.0.0.1:26257/my_tsdb> INSERT INTO my_ts_table (time, value) VALUES
('2025-04-02 00:00:00+00', 13.4),
('2025-04-02 01:00:00+00', 14.1);
-> ('2025-04-01 00:00:00+00', 10.5),
-> ('2025-04-01 01:00:00+00', 11.2),
-> ('2025-04-01 02:00:00+00', 12.8),
-> ('2025-04-02 00:00:00+00', 13.4),
-> ('2025-04-02 01:00:00+00', 14.1);
INSERT 5
Time: 3.357929ms
root@127.0.0.1:26257/my_tsdb>
SELECT * FROM my_ts_table
WHERE time >= ‘2025-04-01 00:00:00+00’ AND time < ‘2025-04-02 00:00:00+00’
ORDER BY time;
root@127.0.0.1:26257/my_tsdb>
root@127.0.0.1:26257/my_tsdb> SELECT * FROM my_ts_table
ORDER BY time;
-> WHERE time >= '2025-04-01 00:00:00+00' AND time < '2025-04-02 00:00:00+00'
-> ORDER BY time;
time | value
----------------------------+--------
2025-04-01 00:00:00+00:00 | 10.5
2025-04-01 01:00:00+00:00 | 11.2
2025-04-01 02:00:00+00:00 | 12.8
(3 rows)
Time: 2.196569ms
root@127.0.0.1:26257/my_tsdb>
– 查询所有数据
SELECT * FROM my_ts_table ORDER BY time;
root@127.0.0.1:26257/my_tsdb> SELECT * FROM my_ts_table ORDER BY time;
time | value
----------------------------+--------
2025-04-01 00:00:00+00:00 | 10.5
2025-04-01 01:00:00+00:00 | 11.2
2025-04-01 02:00:00+00:00 | 12.8
2025-04-02 00:00:00+00:00 | 13.4
2025-04-02 01:00:00+00:00 | 14.1
(5 rows)
Time: 1.21612ms
root@127.0.0.1:26257/my_tsdb>
root@127.0.0.1:26257/my_tsdb> SELECT * FROM my_ts_table
ORDER BY time;
-> WHERE time >= '2025-04-01 00:00:00+00' AND time < '2025-04-02 00:00:00+00'
-> ORDER BY time;
time | value
----------------------------+--------
2025-04-01 00:00:00+00:00 | 10.5
2025-04-01 01:00:00+00:00 | 11.2
2025-04-01 02:00:00+00:00 | 12.8
(3 rows)
Time: 2.196569ms
KWDB2.2.0作为分布式多模数据库,支持多种数据模型。为体验这一特性,我创建了一个包含关系型数据的数据库实例。
以下示例创建一个名为 db1
的关系数据库:
root@127.0.0.1:26257/my_tsdb> CREATE DATABASE db1;CREATE DATABASETime: 4.982239ms
root@127.0.0.1:26257/my_tsdb>
2. 查看数据库
时序数据库和关系数据库的 engine_type
分别为 TIME SERIES
和 RELATIONAL
。使用以下命令查看所有数据库:
root@127.0.0.1:26257/my_tsdb> SHOW DATABASES;
database_name | engine_type----------------+--------------
db1 | RELATIONAL
defaultdb | RELATIONAL
my_tsdb | RELATIONAL
postgres | RELATIONAL
system | RELATIONAL
(5 rows)
Time: 2.59214ms
root@127.0.0.1:26257/my_tsdb>
3. 查看数据库的建库语句
SHOW CREATE DATABASE
语句用于查看创建数据库的 SQL 语句。目前,关系数据库只支持查看创建数据库时使用的数据库名称。
reldb1
:root@127.0.0.1:26257/my_tsdb> CREATE DATABASE reldb1 WITH ENCODING = 'UTF8';CREATE DATABASETime: 5.796565ms
root@127.0.0.1:26257/my_tsdb>
reldb1
数据库: root@127.0.0.1:26257/my_tsdb> SHOW CREATE DATABASE reldb1;
database_name | create_statement----------------+-------------------------
reldb1 | CREATE DATABASE reldb1
(1 row)Time: 2.150319ms
root@127.0.0.1:26257/my_tsdb>
4. 切换数据库
以下示例将 db1
数据库设置为当前数据库:
root@127.0.0.1:26257/my_tsdb> USE db1;SETTime: 1.272966ms
root@127.0.0.1:26257/db1>
5.修改数据库
KaiwuDB 支持修改数据库名称以及修改数据库区域配置。
修改数据库名称:
以下示例将 reldb1
数据库重命名为 relationaldb
:
root@127.0.0.1:26257/db1> SHOW DATABASES;
database_name | engine_type----------------+--------------
db1 | RELATIONAL
defaultdb | RELATIONAL
my_tsdb | RELATIONAL
postgres | RELATIONAL
reldb1 | RELATIONAL
system | RELATIONAL
(6 rows)
Time: 2.37597ms
root@127.0.0.1:26257/db1>
root@127.0.0.1:26257/db1> ALTER DATABASE reldb1 RENAME TO relationaldb;RENAME DATABASETime: 5.403811ms
root@127.0.0.1:26257/db1>
root@127.0.0.1:26257/db1> SHOW DATABASES;
database_name | engine_type----------------+--------------
db1 | RELATIONAL
defaultdb | RELATIONAL
my_tsdb | RELATIONAL
postgres | RELATIONAL
relationaldb | RELATIONAL
system | RELATIONAL
(6 rows)
Time: 2.712377ms
root@127.0.0.1:26257/db1>
6.修改数据库区域配置
以下示例将 my_tsdb
数据库副本数改为 5,并将数据在垃圾回收前保留的时间改为 100000 秒:
root@127.0.0.1:26257/db1> ALTER DATABASE my_tsdb CONFIGURE ZONE USING num_replicas = 5, gc.ttlseconds = 100000;
CONFIGURE ZONE 1
Time: 7.818099ms
root@127.0.0.1:26257/db1>
root@127.0.0.1:26257/db1> SHOW ZONE CONFIGURATION FOR DATABASE my_tsdb;
target | raw_config_sql-------------------+----------------------------------------------
DATABASE my_tsdb | ALTER DATABASE my_tsdb CONFIGURE ZONE USING
| range_min_bytes = 134217728,
| range_max_bytes = 536870912,
| gc.ttlseconds = 100000,
| num_replicas = 5,
| constraints = '[]',
| lease_preferences = '[]'(1 row)Time: 1.896908ms
root@127.0.0.1:26257/db1>
7.删除数据库
DROP DATABASE
语句用于从 KaiwuDB 中删除数据库及其所有对象。删除成功后,所有用户针对目标数据库及其下全部模式及对象的所有权限均被删除。
示例:
relationaldb
数据库中的关系表:root@127.0.0.1:26257/db1> SHOW TABLES FROM my_tsdb;
table_name | table_type--------------+-------------
my_ts_table | BASE TABLE
users | BASE TABLE
(2 rows)
Time: 4.263235ms
root@127.0.0.1:26257/db1>
my_tsdb
数据库及其级联对象:root@127.0.0.1:26257/db1> DROP DATABASE my_tsdb CASCADE;DROP DATABASETime: 63.143052ms
root@127.0.0.1:26257/db1>
my_tsdb
数据库中的关系表:root@127.0.0.1:26257/db1> SHOW TABLES FROM my_tsdb;
ERROR: target database or schema does not exist
SQLSTATE: 3F000
root@127.0.0.1:26257/db1>
输出错误信息:
ERROR: target database or schema does not exist
8. 使用 RESTRICT
关键字阻止删除非空数据库:
以下示例使用 RESTRICT
关键字阻止删除非空数据库 db1
:
root@127.0.0.1:26257/db1> CREATE TABLE test_table ( id INT PRIMARY KEY, name TEXT );
CREATE TABLE
Time: 6.237899ms
root@127.0.0.1:26257/db1>
root@127.0.0.1:26257/db1> INSERT INTO test_table (id, name) VALUES (1, 'test');
INSERT 1
Time: 7.91633ms
root@127.0.0.1:26257/db1>
db1
数据库中的关系表:root@127.0.0.1:26257/db1> SHOW TABLES FROM db1;
table_name | table_type-------------+-------------
test_table | BASE TABLE
(1 row)
Time: 4.053667ms
root@127.0.0.1:26257/db1>
db1
数据库:root@127.0.0.1:26257/db1> DROP DATABASE db1 RESTRICT;
ERROR: database "db1" is not empty and RESTRICT was specified
SQLSTATE: 2BP01
root@127.0.0.1:26257/db1>
输出错误信息:
ERROR: database "db1" is not empty and RESTRICT was specified
本文详细介绍了如何在 KaiwuDB 中管理多模数据库,包括创建、查看、切换、修改和删除数据库的操作。通过这些功能,用户可以高效地管理数据库资源并满足不同场景下的需求。需要注意的是,在操作数据库时应谨慎处理,尤其是在删除非空数据库时,避免误删导致数据丢失。建议结合实际业务需求,合理规划数据库的设计与维护工作。
—— 仅供参考。如果有更多具体的问题或需要进一步的帮助,请随时告知。