« ^ »

Rqliteを使う

所要時間: 約 3分

SQLite上に構築された軽量の分散リレーショナルデータベースを使用してみる。また使いどころがどこなのか考えてみる。

https://github.com/rqlite/rqlite

インストール

macOSの場合はHomebrewでインストールできる。

brew install rqlite

Docker Imageが用意されているので、それを用いることもできる。

起動

rqlitedコマンドでサーバープロセスを起動する。

rqlited -node-id 1 ~/node.1
node1

更にデータを同期させるために2つプロセスを起動する。 通常これらは別のコンピュータ上で動作させるべきだが、 今回は挙動を確認する事が目的のため同一ホストで起動する。

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

接続

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テーブルとレコードが復活している。