在这篇文章里,我将分享如何通过扩展KCache(https://github.com/rayokota/kcache)来实现一个全功能的关系型数据库,我把这个数据库叫作KarelDB(https://github.com/rayokota/kareldb)。另外,我也将分享如何通过组装开源组件来实现新的数据库架构,就像Dropwizard(https://github.com/dropwizard/dropwizard)那样。Dropwizard是通过组装其他组件来实现的,比如Web服务器(Jetty)、REST API框架(Jersey)、JSON序列化框架(Jackson)和ORM框架(JDBI或Hibernate)。
Hello,KarelDB
在深入介绍组成KarelDB的组件之前,先让我们来了解一下如何快速让它运行起来。首先要把它下载(https://github.com/rayokota/kareldb/releases)下来,解压缩,修改config/kareldb.properties,把它指向Kafka服务器,然后运行下面的命令:
$ bin/kareldb-start config/kareldb.properties
在KarelDB运行的同时,可以在另一个终端输入以下命令来启动sqlline,然后用它来访问JDBC数据库。
$ bin/sqlline
sqlline version 1.8.0
sqlline> !connect jdbc:avatica:remote:url=http://localhost:8765 admin admin
sqlline> create table books (id int, name varchar, author varchar);
No rows affected (0.114 seconds)
sqlline> insert into books values (1, 'The Trial', 'Franz Kafka');
1 row affected (0.576 seconds)
sqlline> select * from books;
+----+-----------+-------------+
| ID | NAME | AUTHOR |
+----+-----------+-------------+
| 1 | The Trial | Franz Kafka |
+----+-----------+-------------+
1 row selected (0.133 seconds)
持久化:Kafka
KarelDB的核心组件是KCache。KCache是一个基于Kafka的嵌入式键值存储引擎。有很多组件将Kafka作为简单的键值存储,比如Kafka Connect和Confluent Schema Registry。但KCache更进一步,它提供了一套基于Map的API,方便用户使用。另外,KCache还支持不同的嵌入式键值存储实现,只要它们是基于Kafka的。
KarelDB的默认KCache配置是RocksDB(https://github.com/facebook/rocksdb),所以它支持海量数据集,启动速度也很快。当然,KCache也可以被配置成使用内存缓存,而不是RocksDB。