(摘) rqlite分布工数据库

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

rqlite是一个使用Go语言开发的轻量级的分布式数据库,它使用SQLite作为后端存储引擎,可以通过HTTP API进行访问,具有高可用性和可扩展性。

官宣: 基于SQLite构建的轻量级、易于使用的分布式关系数据库

rqlite 官网:https://rqlite.io
rqlite 仓库:https://github.com/rqlite/rqlite
rqlite 文档:https://rqlite.io/docs/quick-start/

rqlite的特点

1.使用SQLite作为后端存储引擎,具有良好的性能和稳定性。

2.支持SQL语法,可以通过HTTP API进行访问,方便快捷。

3.支持分布式部署,可以在多台服务器上部署rqlite节点,实现高可用性和可扩展性。

4.支持ACID事务,保证数据一致性。

5.支持备份和恢复,方便数据的管理和维护。

6.支持安全性,可以通过TLS进行加密通信。 rqlite的架构设计

rqlite的架构设计非常简单,它由多个节点组成,每个节点都运行rqlite服务。当客户端向rqlite发送查询请求时,请求将由Raft协议分发到集群中的所有节点。一旦大多数节点都确认了该查询请求,rqlite将返回查询结果给客户端。

具体来说,rqlite的架构包含以下几个组件:

Raft协议:rqlite使用Raft一致性协议来实现数据分布式存储和复制。Raft协议确保了数据的一致性和可靠性,并且使得rqlite可以提供高可用性和数据冗余。

SQLite:rqlite基于SQLite数据库实现,它完全兼容SQLite的SQL语法和API,并在此基础上增加了分布式特性。SQLite是一种轻量级的、嵌入式的关系数据库,它被广泛应用于各种应用中。

HTTP API:rqlite提供了HTTP API来管理和查询数据。客户端可以使用HTTP API来查询数据、插入数据、更新数据和删除数据。HTTP API提供了一种可编程的接口来与rqlite交互,它具有简单、易用、高效的特点。

命令行工具:rqlite提供了命令行工具来管理和查询数据。通过命令行工具,用户可以轻松地进行数据备份、恢复、节点管理和查询。命令行工具具有简单、灵活、高效的特点。

Web UI:rqlite提供了一个Web UI界面来帮助用户可视化管理和查询数据库。Web UI提供了一个可视化的界面,让用户可以通过浏览器来管理和查询数据库。它具有简单、直观、易用的特点。

rqlite的安装

rqlite的安装非常简单,只需下载对应的二进制文件即可。

在Linux系统上,可以使用以下命令进行安装:

$ wget https://github.com/rqlite/rqlite/releases/download/v7.19.0/rqlite-v7.19.0-linux-amd64.tar.gz
$ tar -xzf rqlite-v7.19.0-linux-amd64.tar.gz
$ cd rqlite-v7.19.0-linux-amd64
$ ./rqlited ~/node.1

上述命令将下载rqlite的二进制文件并解压,然后将rqlite启动在~/node.1目录下,默认监听4001端口。 rqlite的使用

rqlite的使用非常简单,可以使用任何支持HTTP请求的客户端进行访问。

例如,可以使用curl命令进行访问:

$ curl -XPOST -H 'Content-Type: application/json' -d '{"stmt": "CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT)"}' http://127.0.0.1:4001/db/execute

上述命令将向rqlite发送一个SQL语句,创建一个名为foo的表。

可以使用以下命令查看已创建的表:

$ curl -XPOST -H 'Content-Type: application/json' -d '{"stmt": "SELECT name FROM sqlite_master WHERE type=\\'table\\'"}' http://127.0.0.1:4001/db/query

上述命令将向rqlite发送一个SQL语句,查询所有已创建的表。 rqlite的分布式部署

rqlite支持分布式部署,可以在多台服务器上部署rqlite节点,实现高可用性和可扩展性。

例如,可以在两台服务器上部署两个rqlite节点:

$ ./rqlited ~/node.1
$ ./rqlited -http-addr 192.168.1.2:4001 -raft-addr 192.168.1.2:4002 ~/node.2

上述命令将在两台服务器上启动两个rqlite节点,分别绑定在不同的IP地址和端口上。 rqlite的备份和恢复

rqlite支持备份和恢复,方便数据的管理和维护。

例如,可以使用以下命令备份rqlite的数据:

$ curl -XPOST http://127.0.0.1:4001/db/backup > backup.db

上述命令将向rqlite发送一个备份请求,并将备份数据保存到backup.db文件中。

可以使用以下命令恢复备份数据:

$ ./rqlited -f backup.db ~/node.1

上述命令将使用backup.db文件中的数据恢复rqlite节点的数据。 rqlite的安全性

rqlite可以通过TLS进行通信加密,以保证数据安全性。

例如,可以使用以下命令启动rqlite节点并启用TLS:

$ ./rqlited -tls-cert /path/to/cert.pem -tls-key /path/to/key.pem ~/node.1

上述命令将使用cert.pem和key.pem文件作为TLS证书,启动rqlite节点并启用TLS。 rqlite的性能

rqlite的性能非常好,一般的机子可以达到每秒数千次的请求处理能力。当然,也会因硬件配置的不同而导致性能有所差异。

不过,你可以参考下述命令进行性能测试,以检测其真实性能:

$ wrk -t4 -c100 -d30s http://127.0.0.1:4001/db/query

上述命令将使用wrk工具进行性能测试,模拟100个并发连接,持续30秒。


  1. 不知道并发写如何,sqlite的并发写是弱项
  2. rqlite基于golang,天生跨平台及网络性能。但不知道是否能直接使用GORM。

GoRQlite 似乎做了一些工作,用于与rqlite进行操作。但并非GORM的方式,使用原始的SQL语句。尚有些问题在TODO。
此包据说GORM,尚不知道如何开头。可以看看它的test文件:https://github.com/goki/rqlite/blob/main/rqlite_test.go


2025.4.13

/rqlited -node-id 1 -http-addr ‘192.168.2.70:4002’ -raft-addr 192.168.2.70:4003 data/
-node-id 结点编号
-http-addr http服务地址(提供外部访问)
-raft-addr 集群间访问地址

./rqlited -node-id 2 -http-addr 192.168.2.22:4003 -raft-addr 192.168.2.22:4004 -join 192.168.2.70:4003 -raft-cluster-remove-shutdown data/ 加入群集,成为一个结点。
-join 群主
-raft-cluster-remove-shutdown 关闭的时候退群(要不然群主会一直找你)

创建表:CREATE TABLE IF NOT EXISTS webtotal (id INTEGER PRIMARY KEY AUTOINCREMENT,web TEXT,click INTEGER);
清加记录:insert into webtotal (web,click) values ('day.scwy.net',0);
命令行查询:curl -X POST '192.168.1.70:4002/db/query?pretty&timings' -H "Content-Type:text/plain" -d 'select * from webtotal'
命令行执行:curl -X POST '192.168.1.70:4002/db/execute?pretty&timings' -H "Content-Type:text/plain" -d "update webtotal set click=click+1 where web='day.scwy.net'"
参数化语句:
		执行命令:curl -X POST '192.168.1.70:4002/db/execute?pretty&timings' -H "Content-Type:text/json" -d '[["update webtotal set click=click+?",2]]'
                                curl -X POST '192.168.1.70:4002/db/execute?pretty&timings' -H "Content-Type:text/json" -d '[["update webtotal set click=click+? where web=\"day.scwy.net\"",2]]'
                                curl -X POST '192.168.1.70:4002/db/execute?pretty&timings' -H "Content-Type:text/json" -d '[["update webtotal set click=click+? where web=?",2,"day.scwy.net"]]'
                查询:curl -X POST '192.168.1.70:4002/db/query?pretty&timings' -H "Content-Type:text/json" -d '[["select * from webtotal where web=?","day.scwy.net"]]'

命令行工具:rqlite -H 192.168.1.70 -p 4002
操作发现:通过单独进入群主机和子机,均可以查看数据。对子机或主机进行数据操作,均可以同步。
不知道当主机挂了,子机能不能直接接管,或者由操作人员手动“升位”


GORM操作

实现一个网站点击次数的获取及保存。比如有10个网址做点击统计,不需要每个网址单独带一个数据库,直接远程写入服务器即可。
想来通过javascript post也是可以的。
另外,通过 github.com/rqlite/rqlite-go-http 此库也是一样的,只是执着于GORM罢了,虽然这里也没用到。

package main

import (
	"fmt"

	"goki.dev/rqlite"
	"gorm.io/gorm"
)

var clickDB *gorm.DB

func dbOpen() *gorm.DB {
	// 打开数据库
	db, err := gorm.Open(&rqlite.Dialector{
		DriverName: "rqlite",
		DSN:        "http://192.168.1.70:4002",
	}, &gorm.Config{})
	if err != nil {
		fmt.Println(err.Error())
	}
	return db
}

// 写入点击数
func dbWrite(webName string, value uint) {
	db := dbOpen()
	db.Exec(fmt.Sprintf("UPDATE webtotal SET click=%d WHERE web='%s'", value, webName))
	return
}

// 读取点击数
func dbRead(webName string) uint {
	var ret uint
	db := dbOpen()
	db.Raw(fmt.Sprintf("SELECT click FROM webtotal WHERE web='%s'", webName)).Scan(&ret)
	return ret
}