SQLite上に構築された軽量の分散リレーショナルデータベースを使用してみる。また使いどころがどこなのか考えてみる。
https://github.com/rqlite/rqlite
インストール
macOSの場合はHomebrewでインストールできる。
brew install rqlite
Docker Imageが用意されているので、それを用いることもできる。
起動
rqlitedコマンドでサーバープロセスを起動する。
更にデータを同期させるために2つプロセスを起動する。 通常これらは別のコンピュータ上で動作させるべきだが、 今回は挙動を確認する事が目的のため同一ホストで起動する。
接続
rqliteを用いて接続する。
rqlite
テスト用にfooテーブルを作成しレコードをINSERTする。
Welcome to the rqlite CLI. Enter ".help" for usage hints. Version 6, commit unknown, branch unknown Connected to rqlited version 6 127.0.0.1:4001> .schema +-----+ | sql | +-----+ 127.0.0.1:4001> CREATE TABLE foo (id INT); 0 row affected 127.0.0.1:4001> INSERT INTO foo VALUES (1); 1 row affected
SELECTなどするとデータが入っていることがわかる。
127.0.0.1:4001> SELECT * FROM foo; +----+ | id | +----+ | 1 | +----+ 127.0.0.1:4001> .schema +---------------------------+ | sql | +---------------------------+ | CREATE TABLE foo (id INT) | +---------------------------+ 127.0.0.1:4001>
node1を削除し再接続
次にnode1を停止、データを格納しているディレクトリを削除した後、 node1を起動するとデータが復活することを試す。
先程起動した -node-id 1
のプロセスを停止させる。
killコマンドを用いても良いし C-c C-c
で停止しても良い。
この時node 2及びnode 3は停止させない。
そしてnode1のデータを削除する。node1のデータは node.1
ディレクトリに保持されている。
このディレクトリはrqlitedの起動時の引数で指定している。
rm -rf ./node.1
再度rqlitedコマンドでプロセスを起動する。
rqlited -node-id 1 ~/node.1
_ _ _
| (_) |
_ __ __ _| |_| |_ ___
| '__/ _ | | | __/ _ \ The lightweight, distributed
| | | (_| | | | || __/ relational database.
|_| \__, |_|_|\__\___|
| | www.rqlite.io
|_|
[rqlited] 2022/01/29 14:42:42 rqlited starting, version 6, commit unknown, branch unknown, compiler gc
[rqlited] 2022/01/29 14:42:42 go1.17.3, target architecture is amd64, operating system target is darwin
[rqlited] 2022/01/29 14:42:42 launch command: rqlited -node-id 1 ./node.1
[rqlited] 2022/01/29 14:42:42 Raft TCP mux Listener registered with 1
[mux] 2022/01/29 14:42:42 mux serving on 127.0.0.1:4002, advertising 127.0.0.1:4002
[rqlited] 2022/01/29 14:42:42 no preexisting node state detected in /opt/ng/symdon/pages/posts/1643259860/node.1, node may be bootstrapping
[rqlited] 2022/01/29 14:42:42 no join addresses set
[store] 2022/01/29 14:42:42 opening store with node ID 1
[store] 2022/01/29 14:42:42 configured for an in-memory database
[store] 2022/01/29 14:42:42 ensuring directory for Raft exists at /opt/ng/symdon/pages/posts/1643259860/node.1
[store] 2022/01/29 14:42:42 0 preexisting snapshots present
[store] 2022/01/29 14:42:42 first log index: 0, last log index: 0, last command log index: 0:
[store] 2022/01/29 14:42:42 created in-memory database at open
2022-01-29T14:42:42.570+0900 [INFO] raft: initial configuration: index=0 servers=[]
[store] 2022/01/29 14:42:42 executing new cluster bootstrap
2022-01-29T14:42:42.570+0900 [INFO] raft: entering follower state: follower="Node at 127.0.0.1:4002 [Follower]" leader=
[cluster] 2022/01/29 14:42:42 service listening on 127.0.0.1:4002
[rqlited] 2022/01/29 14:42:42 Cluster TCP mux Listener registered with 2
[http] 2022/01/29 14:42:42 service listening on 127.0.0.1:4001
2022-01-29T14:42:43.777+0900 [WARN] raft: heartbeat timeout reached, starting election: last-leader=
2022-01-29T14:42:43.777+0900 [INFO] raft: entering candidate state: node="Node at 127.0.0.1:4002 [Candidate]" term=2
2022-01-29T14:42:43.864+0900 [INFO] raft: election won: tally=1
2022-01-29T14:42:43.864+0900 [INFO] raft: entering leader state: leader="Node at 127.0.0.1:4002 [Leader]"
[store] 2022/01/29 14:42:43 waiting for up to 2m0s for application of initial logs (lcIdx=0)
[rqlited] 2022/01/29 14:42:43 store has reached consensus
[rqlited] 2022/01/29 14:42:43 node is ready, HTTP API available at http://localhost:4001
2022-01-29T14:42:50.066+0900 [WARN] raft: failed to get previous log: previous-index=11 last-index=2 error="log not found"
2022-01-29T14:42:50.066+0900 [INFO] raft: entering follower state: follower="Node at 127.0.0.1:4002 [Follower]" leader=127.0.0.1:4006
rqliteコマンドで再度接続する。
rqlite
接続できたらデータが復活していることを確認する。
Welcome to the rqlite CLI. Enter ".help" for usage hints. Version 6, commit unknown, branch unknown Connected to rqlited version 6 127.0.0.1:4001> .schema +---------------------------+ | sql | +---------------------------+ | CREATE TABLE foo (id INT) | +---------------------------+ 127.0.0.1:4001> SELECT * FROM foo; +----+ | id | +----+ | 1 | +----+ 127.0.0.1:4001>
データが復旧している。 node2やnode3からデータが同期されたためfooテーブルとレコードが復活している。