rqlite 轻量分布式 SQLite
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"}'