看到标题不知道你猜到了没?
今天介绍一款国产分布式数据库。
泽拓科技
先来了解一下研发这款产品的厂商: 泽拓科技
2020.12,泽拓科技(深圳)有限公司成立。
2021年中,完成天使轮融资,由蓝驰和常春藤投资。
2021.11,泽拓科技正式发布了其核心产品 KunlunBase 的完整商业版本。
2022.08,泽拓科技发布了 KunlunBase 1.0 商用版本。
2022.09,入驻阿里云计算巢。
2023年初,完成pre-A轮融资,由复星创富投资,常春藤追加投资。
2023.03,KunlunBase 产品的名称改为 Klustron,取自cluster strong,意为分布式数据库集群能力强大。
2023.03,泽拓科技成为大数据技术标准推进委员会成员单位并加入数据库与存储工作组、金融大数据工作组。
2023.07,泽拓科技数据库产品 Klustron v1.2 成功通过中国信通院“可信数据库”评测。
同时,泽拓科技 Klustron 作为成员之一参与《数据库发展研究报告(2023年)》编制工作并正式入选《中国数据库产业图谱(2023年)》。
2023.07,KunlunBase Serverless数据库云服务(DBaaS) 正式上线亚马逊云科技Marketplace(中国区)
2023.10,泽拓科技签署 CLA 协议,正式加入 OpenCloudOS 操作系统开源社区。
2023.12,泽拓科技荣获“2023数字经济隐形独角兽企业”。
2023.12,泽拓科技 Klustron V1.3 荣获“2023年度信创卓越贡献奖”。
2024.01,泽拓科技入选“2023粤港澳大湾区科创榜—深港澳科创新锐企业TOP100”。
2024.05,Klustron 1.3 正式发布。
国家专利
泽拓科技目前拥有 10 项国家专利。
- 分布式任务协调方法、装置、设备和介质
- 元数据同步方法、装置、电子设备及存储介质
- 元数据备份恢复方法、装置、电子设备及存储介质
- 分布式事务处理方法、系统及装置
- 线程复用的任务分段处理方法、装置、设备和介质
- 分布式数据集群的数据恢复方法、装置和电子设备
- 合并网络连接的通信方法、系统、存储介质及设备
- 分布式数据库并发控制方法、系统、计算机设备
- 多存储引擎数据复制方法、系统、计算机设备
- 分布式事务处理方法方法、系统、计算机设备及存储介质
Klustron
Klustron 是由泽拓科技研发的一款国产的分布式 HTAP 关系型数据库,作为 NewSQL 的一个代表,可处理 TB 和 PB 级别海量数据,并且具有金融级高可靠性,高性能,高可扩展性,高可用性和具有完备容灾能力。Klustron 具备完整的 OLAP 功能,扩展了传统数据分析领域,适合分析最新的和不断更新的业务数据,并且支持大数据分析。适合金融、电信、能源、互联网等各领域的数据管理、事务处理和数据分析场景。
KunlunBase 基于 MySQL 打造存储节点,而基于 PostgreSQL 打造的计算节点是行业首发。整体来看,KunlunBase 扩展了这两个全球使用最广泛(基于 DB-Engines 排名)的开源单机数据库产品的能力,让它们的用户可以管理PB级别的数据量并具备弹性伸缩和金融级高可用能力。
Klustron 整个系统主要由5个组件组成,分别是计算节点、存储节点,元数据集群,管理集群和辅助工具集。
(Klustron 架构图)
下面这段文字节选自韩峰老师的文章:《分布式数据库KlustronBase–初探》
昆仑数据库架构上是属于 share nothing 架构,覆盖场景包括 OLTP、HTAP。其可在满足承载大规模数据容量的前提下,提供有时延保证的数据访问能力。支持多种数据分片的同时,也支持一定复杂度的在线数据分析。
可以说国内分布式数据库非常繁多,如何在众多产品中定位、选择一款产品非常关键。这里通过一张简图进行说明,并尝试将主要技术架构路线覆盖范围及昆仑数据库所在定位进行描述。下图将用户的数据库使用场景,简单从数据容量、响应时长角度进行归类。横轴表示数据容量,越靠右规模越大;纵轴表示响应时延,越靠上时延越高。根据常规的的划分,我们可以将数据使用场景,简单分为 OLTP-联机交易、HTAP-混合负载和 OLAP-联机分析,其对应的数据规模和时延要求各有不同。从主要技术实现路线来看,可大致按照擅长的领域做下划分,如下图。其中会有部分场景上有所交叉。
快速体验
使用 Docker 启动集群
通过 Klustron 多合一 Docker 镜像来快速体验 Klustron 的集群结构和基本功能
- 集群节点说明:
- 三个 Klustron-storage 节点,构成一个3副本的 Meta Shard;
- 还有六个 Klustron-storage 节点,构成两个 Data Shard, 每个 Shard 的副本数为 3;
- 三个 Klustron-server 节点,构成三个各自独立的计算节点,用于处理客户端的数据请求。该集群的各个 Klustron-storage 节点的 buffer pool size 仅为 64MB, 所以该集群仅可用于功能体验,不能用于性能和压力测试。
- 拉取容器镜像,并拉起集群:
[root@rocky9 ~]# podman pull registry.cn-hangzhou.aliyuncs.com/kunlundb/kunlun:latest
Trying to pull registry.cn-hangzhou.aliyuncs.com/kunlundb/kunlun:latest...
Getting image source signatures
Copying blob 39d718b5788a done
...
Writing manifest to image destination
b86d8a15e5c93df58b3df62ad1c71d126dbc6888d0bfdc69d46ae75ecbc329e5
[root@rocky9 ~]# podman run --name kunlun1 -itd \
-p 5401:5401 -p 5402:5402 -p 5403:5403 -p 5404:5404 -p 5405:5405 \
registry.cn-hangzhou.aliyuncs.com/kunlundb/kunlun:latest \
bash -c 'bash /kunlun/start_kunlun.sh'
abb0619063b01fbbebee18a5f55fd266a2a7a3e22999b7fd9775ff91d075b5af
- 检查节点运行情况:
# 进入集群服务器
[root@rocky9 ~]# podman exec -it kunlun bash
root@kunlun:/kunlun#
# 检查计算节点
root@kunlun:/kunlun# ps aux | grep bin/postgres
kunlun 21832 0.0 0.4 115116 64600 ? S 03:31 0:00 /kunlun/kunlun-server-1.3.1/bin/postgres -D /kunlun/server_datadir/5401
kunlun 21835 0.0 0.4 115116 64860 ? S 03:31 0:00 /kunlun/kunlun-server-1.3.1/bin/postgres -D /kunlun/server_datadir/5402
kunlun 21838 0.0 0.4 115116 64828 ? S 03:31 0:00 /kunlun/kunlun-server-1.3.1/bin/postgres -D /kunlun/server_datadir/5403
# 检查元数据集群和存储节点
root@kunlun:/kunlun# ps aux | grep mysqld_safe
kunlun 38 0.1 0.0 19248 10416 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6001/data/6001.cnf --user=kunlun
kunlun 2451 0.1 0.0 19248 10496 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6002/data/6002.cnf --user=kunlun
kunlun 4865 0.1 0.0 19248 10404 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6003/data/6003.cnf --user=kunlun
kunlun 7278 0.1 0.0 19248 10488 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6004/data/6004.cnf --user=kunlun
kunlun 9689 0.1 0.0 19248 10468 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6005/data/6005.cnf --user=kunlun
kunlun 12100 0.1 0.0 19248 10416 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6006/data/6006.cnf --user=kunlun
kunlun 14511 0.1 0.0 19248 10476 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6007/data/6007.cnf --user=kunlun
kunlun 16926 0.1 0.0 19248 10508 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6008/data/6008.cnf --user=kunlun
kunlun 19337 0.1 0.0 19248 10460 ? S 03:30 0:00 /bin/sh ./bin/mysqld_safe --defaults-file=/kunlun/storage_datadir/6009/data/6009.cnf --user=kunlun
6004 端口是存储节点分片1的主节点, 6005,6006 是存储节点分片1的两个从节点
6007 端口是存储节点分片2的主节点, 6008,6009 是存储节点分片2的两个从节点
- 连接数据库,检查集群分片存储信息:
root@kunlun:/kunlun# source env.sh
root@kunlun:/kunlun# psql -h 127.0.0.1 -p 5401 -U abc postgres
psql (PostgreSQL 11.21 on x86_64-pc-linux-gnu, 64-bit)
Type "help" for help.
postgres=# show mysql_port;
mysql_port
------------
6401
(1 row)
root@kunlun:/kunlun# mysql -uabc -P6401 -h 127.0.0.1 -e 'table pg_shard'
+--------+----+----------------+-----------+--------------+-------------+---------------+------------------------+
| name | id | master_node_id | num_nodes | space_volumn | num_tablets | db_cluster_id | when_created |
+--------+----+----------------+-----------+--------------+-------------+---------------+------------------------+
| shard1 | 1 | 3 | 3 | 0 | 0 | 1 | 2024-05-11 04:03:57+08 |
| shard2 | 2 | 6 | 3 | 0 | 0 | 1 | 2024-05-11 04:03:57+08 |
+--------+----+----------------+-----------+--------------+-------------+---------------+------------------------+
root@kunlun:/kunlun# psql -h 127.0.0.1 -p 5401 -U abc postgres -c 'table pg_shard'
name | id | master_node_id | num_nodes | space_volumn | num_tablets | db_cluster_id | when_created
--------+----+----------------+-----------+--------------+-------------+---------------+------------------------
shard1 | 1 | 3 | 3 | 0 | 0 | 1 | 2024-05-11 04:03:57+08
shard2 | 2 | 6 | 3 | 0 | 0 | 1 | 2024-05-11 04:03:57+08
(2 rows)
功能体验
- 创建普通表
CREATE TABLE testtable1 (id int primary key);
- 创建分区表
CREATE TABLE testtable (id int primary key, name char(8)) partition by hash(id);
CREATE TABLE testtable_p1 PARTITION OF testtable FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE testtable_p2 PARTITION OF testtable FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE testtable_p3 PARTITION OF testtable FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE testtable_p4 PARTITION OF testtable FOR VALUES WITH (MODULUS 4, REMAINDER 3);
- 检查表分布情况
mysql> select relname,relshardid from pg_class where reltype0 and relname like 'testtable%';
+--------------+------------+
| relname | relshardid |
+--------------+------------+
| testtable | 0 |
| testtable1 | 2 |
| testtable_p1 | 1 |
| testtable_p2 | 1 |
| testtable_p3 | 2 |
| testtable_p4 | 1 |
+--------------+------------+
6 rows in set (0.03 sec)
- 创建带枚举类型的表
mysql> CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
Query OK, 0 rows affected (0.07 sec)
mysql> CREATE TABLE people (
-> id SERIAL PRIMARY KEY,
-> name TEXT,
-> current_mood mood
-> );
Query OK, 0 rows affected (0.22 sec)
mysql> show create table people\G
*************************** 1. row ***************************
Table: people
Create Table: CREATE TABLE people (
id integer DEFAULT "nextval"('people_id_seq'::regclass) NOT NULL,
name text COLLATE "utf8mb4_0900_bin",
current_mood mood,
CONSTRAINT people_pkey PRIMARY KEY (id)
) WITH (engine=innodb, shard='2')
1 row in set (0.00 sec)
mysql> INSERT INTO people (name, current_mood) VALUES ('ShawnYan', 'happy');
Query OK, 1 row affected (0.07 sec)
mysql> table people;
+----+----------+--------------+
| id | name | current_mood |
+----+----------+--------------+
| 1 | ShawnYan | happy |
+----+----------+--------------+
1 row in set (0.01 sec)
- 在 Klustron 中使用 pgvector
在 Klustron-1.3 技术规范中增加了 pgvector 的支持。
pgvector 扩展将开源矢量相似性搜索添加到 Klustron 数据库。
接下来演示如何创建、存储和查询向量。
postgres=# create extension vector ;
CREATE EXTENSION
postgres=# CREATE TABLE tv (
postgres(# id bigserial PRIMARY KEY,
postgres(# item text,
postgres(# embedding vector
postgres(# );
CREATE TABLE
postgres=# INSERT INTO tv (item, embedding) VALUES ('cat', '[1, 1]'), ('dog', '[1.2, 0.8]'), ('apple', '[6, 0.4]');
INSERT 0 3
postgres=# SELECT item, 1 - (embedding '[6,0]') AS cosine_similarity from tv order by cosine_similarity desc;
item | cosine_similarity
-------+-------------------
apple | 0.972345132747034
cat | 0.916666666666667
dog | 0.903846156274655
(3 rows)
mysql> table tv;
+----+-------+-----------+
| id | item | embedding |
+----+-------+-----------+
| 1 | cat | [1,1] |
| 2 | dog | [1.2,0.8] |
| 3 | apple | [6,0] |
+----+-------+-----------+
3 rows in set (0.01 sec)
mysql> SELECT item, 1 - (embedding '[6,0]') AS cosine_similarity from tv order by cosine_similarity desc;
+-------+-------------------+
| item | cosine_similarity |
+-------+-------------------+
| apple | 0.972345132747034 |
| cat | 0.916666666666667 |
| dog | 0.903846156274655 |
+-------+-------------------+
3 rows in set (0.00 sec)
结果:apple 最接近匹配。
总结
在一个数据库中同时实现了PG,MySQL协议,这对于熟悉PG或者MySQL的用户来说,都可以很方便的上手使用,这种感觉很奇妙。
参考资料
http://doc.klustron.com/zh/
🌻 往期精彩 ▼
- [Oracle]
- Oracle 数据库全面升级为 23ai
- python-oracledb 已率先支持 Oracle 23ai
- 一文带你了解 Oracle 23ai 新特性 Vector 的基础用法
- [MySQL]
- MySQL 9.0 的 VECTOR 文档更新
- MySQL 9.0.0 新鲜出炉!支持向量类型
- 「合集」MySQL 8.x 系列文章汇总
- 如何选择适合的 MySQL Connector/J 版本
- [TiDB]
- 星辰考古:TiDB v4.0 进化前夜
- 国产基础软件“出海”标杆炼成记
- 敢于公布BUG的国产数据库才是好数据库
- [PG]
- [RL9] Rocky Linux 9.4 搭载 PG 16.1
- 即将告别PG 12,建议升级到PG 16.3版本
- 后 EL 7 时代,PG 16 如何在 CentOS 7 上运行
– / END / –
👉 这里可以找到我
- 微信公众号:少安事务所
- 墨天轮:严少安
- PGFans: 严少安
- ITPUB:少安事务所
- TiDB 专栏:@ShawnYan
如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『在看』or『转发』吧,感谢!ღ( ´・ᴗ・` )~