SQLite上に構築された軽量の分散リレーショナルデータベースを使用してみる。また使いどころがどこなのか考えてみる。
https://github.com/rqlite/rqlite
インストール
macOSの場合はHomebrewでインストールできる。
brew install rqlite
Docker Imageが用意されているので、それを用いることもできる。
起動
rqlitedコマンドでサーバープロセスを起動する。
rqlited -node-id 1 ~/node.1
更にデータを同期させるために2つプロセスを起動する。 通常これらは別のコンピュータ上で動作させるべきだが、 今回は挙動を確認する事が目的のため同一ホストで起動する。
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.3g
接続
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テーブルとレコードが復活している。