Rqlite:基于SQLite的轻量级分布式关系数据库

2021-01-22 23:21:17

rqlite是一个轻量级的分布式关系数据库,它使用SQLite作为其存储引擎。形成集群非常简单,可以很好地处理领导者选举,并容忍包括领导者在内的机器故障。 rqlite可用于Linux,OSX和Microsoft Windows。

rqlite为您提供坚如磐石的,容错的,复制的关系数据库的功能,但安装,部署和操作非常简单。有了它,您将获得轻量级且可靠的分布式关系数据存储。可以考虑使用etcd或Consul,但也可以使用关系数据建模。

您可以将rqlite用作大型系统的一部分,作为一些关键关系数据的中央存储,而不必运行更大,更复杂的分布式数据库。

最后,如果您有兴趣了解分布式系统的实际工作方式,那么rqlite是一个很好的研究示例。在其设计和实现中已经进行了很多思考,各个组件之间的清晰分离,包括存储,分布式共识和API。

rqlite使用Raft在SQLite数据库的所有实例之间达成共识,从而确保对系统所做的每个更改都是针对一定数量的SQLite数据库进行的,或者根本不进行。您可以在此处了解有关该设计的更多信息。

易于使用的HTTP(S)API,包括领导者重定向和批量更新支持。命令行界面以及各种客户端库也都可用。

详细文档可用。您可能还希望查看rqlite Google网上论坛。

在OSX和Linux上运行的最快方法是下载预构建的发行版二进制文件。您可以在Github版本页面上找到这些二进制文件。如果您喜欢Windows,可以在此处下载最新版本。安装后,您可以像这样启动一个rqlite节点:

目前绝对不需要设置-node-id,但强烈建议您设置。它使群集管理更加清晰。

该单个节点自动成为领导者。您可以将-h传递给rqlited以列出所有配置选项。

虽然并非严格要求运行rqlite,但运行多个节点意味着您将拥有容错群集。再启动两个节点,使群集可以容忍单个节点的故障,如下所示:

rqlited -node-id 2 -http-addr localhost:4003 -raft-addr localhost:4004 -join http:// localhost:4001〜/ node.2rqlited -node-id 3 -http-addr localhost:4005 -raft-addr本地主机:4006-加入http://本地主机:4001〜/ node.3

此演示显示了在同一主机上运行的所有3个节点。实际上,您可能不需要这样做,然后就不必为每个rqlite节点选择不同的-http-addr和-raft-addr端口。

只需完成这几个步骤,您就可以得到一个容错的分布式关系数据库。有关创建和管理实际集群(包括运行只读节点)的完整详细信息,请查阅此文档。

还有一个rqlite发现服务,允许节点自动连接并形成集群。这样可以更加方便,从而可以动态创建集群。查看文档以获取更多详细信息。

让我们使用标准SQLite命令通过rqlite CLI插入一些记录。插入后,这些记录将以持久且容错的方式在整个群集中复制。您的3节点群集可以遭受单个节点的故障,而不会损失任何功能或数据。

$ rqlite127.0.0.1:4001> CREATE TABLE foo(id INTEGER NOT NULL PRIMARY KEY,name TEXT)受影响的0行(0.000668秒)127.0.0.1:4001> .schema + ------------------------------------------------ ----------------------------- + | sql | + ----------------------------------------------- ------------------------------ + | CREATE TABLE foo(id INTEGER NOT NULL PRIMARY KEY,name TEXT)| + ---------------------------------- ------------------------------------------- + 127.0.0.1:4001>将INSERT INTO foo(name)VALUES(" fiona")1受影响的行(0.000080秒)127.0.0.1:4001>选择* FROM foo + ---- + ------- + | id |名称| + ---- + ------- + | 1 |菲奥娜| + ---- + ------- +

rqlite具有丰富的HTTP API,可以完全控制对rqlite的写入和查询。查看文档以获取完整详细信息。也有可用的客户端库。

rqlite复制SQLite以实现容错。它不会复制它以提高性能。实际上,由于网络往返,性能有所降低。

取决于您的计算机(尤其是其IO性能)和网络,单个INSERT性能可能从每秒10次操作到每秒200次以上的操作。但是,通过使用批量API,事务或同时使用两者,吞吐量将显着增加,通常增加2个数量级。这种加速是由于Raft和SQLite的工作方式所致。因此,为了获得高吞吐量,请在单个事务中执行尽可能多的操作。

默认情况下,rqlite使用内存中的SQLite数据库来最大化性能。在这种模式下,不会创建实际的SQLite文件,并且整个数据库都存储在内存中。如果您希望rqlite使用实际的基于文件的SQLite数据库,请在启动时将-on-disk传递给rqlite。

由于Raft日志是所有数据的权威存储,并且由每个节点写入到磁盘,因此可以在启动时完全重新创建内存数据库。使用内存数据库不会使您的数据面临风险。

只有确定性的SQL语句才可以与rqlite一起使用,因为这些语句在发送到每个节点之前已提交到Raft日志。换句话说,rqlite执行基于语句的复制。例如,以下语句可能导致每个节点下都有一个不同的SQLite数据库:

从技术上讲,这不受支持,但是您可以随时在任何节点下直接读取SQLite,前提是您是在“磁盘上”运行的。模式。但是,除非您确定主机节点本身已接收并应用了所有更改,否则无法保证SQLite文件会反映群集上已发生的所有更改。

如果不是很明显,当在磁盘上运行时,rqlite不会直接对任何基础SQLite文件复制所做的任何更改。模式。如果直接更改SQLite文件,将导致rqlite失败。仅通过HTTP API修改数据库。

API不直接支持SQLite点命令(例如.schema或.tables),但是rqlite CLI支持一些非常相似的功能。这是因为这些命令是sqlite3命令的功能,而不是SQLite本身的功能。

在此处了解如何热备份rqlite群集。您也可以直接从SQLite转储文件加载数据。

我如何发音?对于它的价值,我尝试将其发音为“ ree-qwell-lite”。但是似乎大多数人,包括我在内,常常都对它赞不绝口。