rqlite 轻量分布式 SQLite

FreeGuideOnline 最新 2026-07-14

bash

以 Linux amd64 为例

wget https://github.com/rqlite/rqlite/releases/download/v8.23.0/rqlite-v8.23.0-linux-amd64.tar.gz tar -xzf rqlite-v8.23.0-linux-amd64.tar.gz cd rqlite-v8.23.0-linux-amd64

将 rqlited 和 rqlite 放入 PATH

sudo cp rqlited rqlite /usr/local/bin/


### 方式二:使用 Docker

```bash
docker pull rqlite/rqlite

方式三:从源码编译

需要 Go 1.21+ 环境:

git clone https://github.com/rqlite/rqlite.git
cd rqlite
make build

安装完成后,你会得到两个主要可执行文件:

  • rqlited:服务端守护进程,运行数据库节点。
  • rqlite:命令行客户端,用于与服务端交互。

启动你的第一个 rqlite 节点

开发模式(单节点)

开发或测试时,可以直接启动一个单节点集群(无需 Raft 多数派)。

rqlited -node-id 1 ~/node1
  • -node-id:指定节点 ID,单节点可任意设置。
  • ~/node1:数据存储目录。

启动后,rqlite 默认监听 http://localhost:4001(Raft 通信端口)和 http://localhost:4002(HTTP API 端口)。

形成多节点集群

多节点集群至少需要 3 个节点 以容忍 1 个节点故障。下面在同一台机器上启动三个节点作为演示(生产环境应部署在不同机器)。

# 节点 1
rqlited -node-id 1 -http-addr localhost:4001 -raft-addr localhost:4002 ~/node1

# 节点 2
rqlited -node-id 2 -http-addr localhost:4003 -raft-addr localhost:4004 -join http://localhost:4001 ~/node2

# 节点 3
rqlited -node-id 3 -http-addr localhost:4005 -raft-addr localhost:4006 -join http://localhost:4001 ~/node3
  • 节点 1 为初始引导节点。
  • 节点 2、3 通过 -join 参数自动加入节点 1 所在的集群。

提示:当所有节点都指定了 -join 时,集群会自动选出 Leader,无需额外操作。


基本操作:通过 HTTP API 使用 rqlite

rqlite 提供了一套 RESTful HTTP API,所有操作均通过发送 JSON 请求完成。你可以使用 curl、HTTPie 或任何编程语言的 HTTP 客户端。

执行写操作(执行 SQL)

/db/execute 端点 POST 一个包含 SQL 语句的 JSON 数组。写操作仅 Leader 处理,但请求可发送至任意节点(节点会自动将写请求转发给 Leader)。

curl -XPOST 'localhost:4002/db/execute?pretty' -H "Content-Type: application/json" -d '[
    "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)"
]'

返回结果示例:

{
    "results": [
        {
            "last_insert_id": null,
            "rows_affected": 0,
            "time": 0.003
        }
    ],
    "time": 0.003
}

插入数据:

curl -XPOST 'localhost:4002/db/execute?pretty' -H "Content-Type: application/json" -d '[
    "INSERT INTO users(name, email) VALUES(\"Alice\", \"alice@example.com\")",
    "INSERT INTO users(name, email) VALUES(\"Bob\", \"bob@example.com\")"
]'

支持批量执行多条语句,rqlite 将其作为一个事务原子提交。

执行查询(只读)

查询通过 /db/query 端点进行。你可以选择一致性级别:

  • none:由任意节点返回结果,性能最高但可能读到旧数据。
  • weak:只从 Leader 读取,保证单调一致性(默认)。
  • strong:每次查询前 Leader 确认自己仍是 Leader,保证线性一致性。
curl -G 'localhost:4002/db/query?pretty' --data-urlencode 'q=SELECT * FROM users'

返回结果:

{
    "results": [
        {
            "columns": ["id", "name", "email"],
            "types": ["integer", "text", "text"],
            "values": [
                [1, "Alice", "alice@example.com"],
                [2, "Bob", "bob@example.com"]
            ],
            "time": 0.001
        }
    ],
    "time": 0.001
}

设置一致性级别:

curl -G 'localhost:4002/db/query?level=strong&pretty' --data-urlencode 'q=SELECT * FROM users'

使用 rqlite 命令行客户端

除了 HTTP API,rqlite 还提供了一个小巧的命令行客户端 rqlite,用法类似 sqlite3

rqlite -H localhost -p 4002

进入交互模式后,可以直接输入 SQL:

127.0.0.1:4002> .tables
users
127.0.0.1:4002> SELECT * FROM users;
+----+-------+-------------------+
| id | name  | email             |
+----+-------+-------------------+
| 1  | Alice | alice@example.com |
| 2  | Bob   | bob@example.com   |
+----+-------+-------------------+

备份与恢复

创建备份

rqlite 支持热备份,备份文件为标准的 SQLite 数据库文件。通过 /db/backup 端点下载:

curl -L -o backup.sqlite 'localhost:4002/db/backup?pretty'

获取的 backup.sqlite 可以用任何 SQLite 工具打开,也可以用于还原到另一个 rqlite 集群。

从 SQLite 文件恢复

如果你已经有一个 SQLite 文件,可以通过 /db/load 端点将其加载到 rqlite 集群中。该操作会替换当前数据库。

curl -XPOST 'localhost:4002/db/load?pretty' -H "Content-Type: application/octet-stream" --data-binary @backup.sqlite

注意:加载操作仅应在集群处于健康状态且无正在进行的写入时执行,且需要将请求发送到 Leader。


监控与管理接口

rqlite 提供了一些有用的诊断端点,方便你监控集群状态。

查看节点状态

curl 'localhost:4002/status?pretty'

输出包含节点 ID、Raft 状态(Leader/Follower)、集群地址、版本等信息。

查看 Raft 集群成员

curl 'localhost:4002/cluster?pretty'

可以查看所有节点的 ID、地址和连状态。

移除节点

当节点永久故障时,可以从 Leader 上将其移除:

curl -XDELETE 'localhost:4002/remove?pretty' -H "Content-Type: application/json" -d '{"id": "3"}'