1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Philip O'Toole 31aef91d17 Add FullNeeded() to Snapshot store
It may be necessary to override the FullNeeded definition, so wrap it.
10 months ago
.circleci Change directory before running test 10 months ago
.github/ISSUE_TEMPLATE Update issue templates 2 years ago
DOC fix: performance typo 1 year ago
auth Add Join Perms back 10 months ago
auto Move VACUUM to DB layer 10 months ago
aws Add support for custom S3 endpoint 1 year ago
cluster Set credentials on Remover 10 months ago
cmd Reduce Raft threshold to 2048 10 months ago
command Support optional VACUUM on backup 10 months ago
db Move VACUUM to DB layer 10 months ago
disco Disco should return Raft address 10 months ago
http Add friendly string version of time 10 months ago
log Periodically record actually applied index 1 year ago
queue More minor fixes 1 year ago
random Fix GoDoc 1 year ago
rtls Remove no-longer supported command-line options 1 year ago
scripts Update release_creator.py 10 months ago
snapshot Add FullNeeded() to Snapshot store 10 months ago
store Add FullNeeded() to Snapshot store 10 months ago
system_test End-to-end testing of VACUUM uploads 10 months ago
tcp Allow test nodes to enable TLS client 10 months ago
testdata More gofmt 2 years ago
.gitignore Add initial skeleton of WAL Compactor 1 year ago
CHANGELOG.md CHANGELOG 10 months ago
CONTRIBUTING.md Update CONTRIBUTING.md 2 years ago
LICENSE Update LICENSE 2 years ago
README.md Update README.md 10 months ago
Vagrantfile Add node ID 2 years ago
appveyor.yml Update appveyor.yml 1 year ago
doc.go Update doc.go 2 years ago
go.mod Upgrade to SQLite 3.44.0 10 months ago
go.sum Upgrade to SQLite 3.44.0 10 months ago
vagrant_setup.sh More upgrades to Go 1.21 1 year ago

README.md

Circle CI appveyor Go Report Card Release Docker Slack Google Group

rqlite is an easy-to-use, lightweight, distributed relational database, which uses SQLite as its storage engine.

rqlite is simple to deploy, operating and accessing it is very straightforward, and its clustering capabilities provide you with fault-tolerance and high-availability. rqlite is available for Linux, macOS, and Microsoft Windows, and can be built for many target CPUs, including x86, AMD, MIPS, RISC, PowerPC, and ARM.

Check out the rqlite FAQ.

Why?

rqlite gives you the functionality of a rock solid, fault-tolerant, replicated relational database, but with very easy installation, deployment, and operation. With it you've got a lightweight and reliable distributed relational data store.

You could use rqlite as part of a larger system, as a central store for some critical relational data, without having to run larger, more complex distributed databases.

Finally, if you're interested in understanding how distributed systems actually work, rqlite is a good example to study. Much thought has gone into its design and implementation, with clear separation between the various components, including storage, distributed consensus, and API.

How?

rqlite uses Raft to achieve consensus across all the instances of the SQLite databases, ensuring that every change made to the system is made to a quorum of SQLite databases, or none at all. You can learn more about the design here.

Key features

Quick Start

The quickest way to get running is to download a pre-built release binary, available on the GitHub releases page. Once installed, you can start a single rqlite node like so:

rqlited -node-id 1 ~/node.1

This single node automatically becomes the leader. You can pass -h to rqlited to list all configuration options.

Docker

docker run -p4001:4001 rqlite/rqlite

Check out the rqlite Docker page for more details on running nodes via Docker.

Homebrew

brew install rqlite

Forming a cluster

While not strictly necessary to run rqlite, running multiple nodes means you'll have a fault-tolerant cluster. Start two more nodes, allowing the cluster to tolerate the failure of a single node, like so:

rqlited -node-id 2 -http-addr localhost:4003 -raft-addr localhost:4004 -join http://localhost:4001 ~/node.2
rqlited -node-id 3 -http-addr localhost:4005 -raft-addr localhost:4006 -join http://localhost:4001 ~/node.3

This demonstration shows all 3 nodes running on the same host. In reality you probably wouldn't do this, and then you wouldn't need to select different -http-addr and -raft-addr ports for each rqlite node.

With just these few steps you've now got a fault-tolerant, distributed relational database. For full details on creating and managing real clusters, including running read-only nodes, check out this documentation.

Inserting records

Let's insert some records via the rqlite CLI, using standard SQLite commands. Once inserted, these records will be replicated across the cluster, in a durable and fault-tolerant manner.

$ rqlite
127.0.0.1:4001> CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT)
0 row affected (0.000668 sec)
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 row affected (0.000080 sec)
127.0.0.1:4001> SELECT * FROM foo
+----+-------+
| id | name  |
+----+-------+
| 1  | fiona |
+----+-------+

Limitations

  • Because rqlite peforms statement-based replication certain non-deterministic functions, e.g. RANDOM(), are rewritten by rqlite before being passed to the Raft system and SQLite. To learn more about rqlite's support for non-deterministic functions, check out the documentation.
  • This has not been extensively tested, but you can directly read the SQLite file under any node at anytime. However there is no guarantee that the SQLite file reflects all the changes that have taken place on the cluster unless you are sure the host node itself has received and applied all changes.
  • In case it isn't obvious, rqlite does not replicate any changes made directly to any underlying SQLite file. If you change the SQLite file directly, you may cause rqlite to fail. Only modify the database via the HTTP API.
  • SQLite dot-commands such as .schema or .tables are not directly supported by the API, but the rqlite CLI supports some very similar functionality. This is because those commands are features of the sqlite3 command, not SQLite itself.

Pronunciation?

How do I pronounce rqlite? For what it's worth I try to pronounce it "ree-qwell-lite". But it seems most people, including me, often pronounce it "R Q lite".