こたつ&&みかん&&でーたべーす

DB 関連の話を中心に技術っぽい記事を書きます。

CockroachDB のローカルクラスタを Docker で構築するお話

今回は Docker を使ってローカル (単一ホスト上) に検証用の CockroachDB クラスタを構築する方法についてのお話です。

環境

今回は以下の環境で検証しています。

Ubuntu : 19.10
Docker : 19.03.5
CockroachDB : 19.2.4

CockroachDB のクラスタの種類について

CockroachDB のクラスタには Insecure クラスタと Secure クラスタがあり、以下の様な特徴があります。

Insecure クラスタ

  • ノード間の通信は暗号化されない (平文で通信)。
  • クライアント - サーバ間の通信も暗号化されない (平文で通信)。
  • root を含む全ての DB ユーザが認証無しで接続可能 (認証処理が無く、誰でも root で接続可能)。

Secure クラスタ

  • ノード間の通信は TLS で暗号化される。
  • クライアント - サーバ間の通信も TLS で暗号化される。
  • root ユーザでの接続にはクライアント証明書を使った認証が必要。
  • (root 以外の) 一般ユーザでの接続にはパスワード認証もしくはクライアント証明書を使った認証が必要。

クラスタ構築

それでは、それぞれのクラスタを構築してみます。今回は 3匹構成のクラスタを構築します。各手順で利用する Docker イメージは、Cockroach Labs が Docker Hub で公開している cockroachdb/cockroach を使います。

Insecure クラスタ

Insecure クラスタの場合は、各ノードを起動する際に --insecure オプションを指定します。また、Insecure クラスタの構築方法は公式ドキュメント Start Cluster in Docker にも記載されています。

Insecure クラスタの構築

1) まずは、各ノード (コンテナ) を接続させる Docker Network を作成します。

$ sudo docker network create cockroach-net

2) 作成した Docker Network を指定し、1匹目を起動します。

$ sudo docker run -d \
--name=cockroach-1 \
--hostname=cockroach-1 \
--net=cockroach-net \
-p 26257:26257 -p 8080:8080 \
-v "${PWD}/cockroach-data/cockroach-1:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.4 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3

3) 同様に、2匹目/3匹目も起動します。

$ sudo docker run -d \
--name=cockroach-2 \
--hostname=cockroach-2 \
--net=cockroach-net \
-v "${PWD}/cockroach-data/cockroach-2:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.4 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-3 \
--hostname=cockroach-3 \
--net=cockroach-net \
-v "${PWD}/cockroach-data/cockroach-3:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.4 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3

4) 最後に cockroach init コマンドでクラスタを初期化します。

$ sudo docker exec -it cockroach-1 ./cockroach init --host=cockroach-1 --insecure

これで、Insecure クラスタの構築は完了です。cockroach node status コマンドを実行すると、構築したクラスタの情報を参照できます。

$ sudo docker exec -it cockroach-1 ./cockroach node status --host=cockroach-1 --insecure
  id |      address      |    sql_address    |  build  |            started_at            |            updated_at            | locality | is_available | is_live  
+----+-------------------+-------------------+---------+----------------------------------+----------------------------------+----------+--------------+---------+
   1 | cockroach-1:26257 | cockroach-1:26257 | v19.2.4 | 2020-02-14 11:01:07.838801+00:00 | 2020-02-14 11:01:16.888403+00:00 |          | true         | true     
   2 | cockroach-3:26257 | cockroach-3:26257 | v19.2.4 | 2020-02-14 11:01:08.106229+00:00 | 2020-02-14 11:01:12.651449+00:00 |          | true         | true     
   3 | cockroach-2:26257 | cockroach-2:26257 | v19.2.4 | 2020-02-14 11:01:08.641134+00:00 | 2020-02-14 11:01:13.190636+00:00 |          | true         | true     
(3 rows)

Built-in SQL Shell を使って Insecure クラスタに接続

Insecure クラスタ構築後、cockroach sql コマンド (Built-in SQL Shell) を使って CockroachDB (cockroach-1) に接続できます (cockroach sql にも --insecure オプションを指定します)。

$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-1 --insecure

また、CockroachDB クラスタ内の各ノードには Master/Standby や Coordinator/Worker と呼ばれるような役割の分担はなく、全てのノードで Read/Write のクエリを処理できる (どのノードに接続しても Read/Write 可能な) 仕組みになっているので、cockroach-2/cockroach-3 にも同じように接続できます。

$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-2 --insecure
$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-3 --insecure

上記のように cockroach sql で CockroachDB に接続すると、以下のように SQL を実行できます。

$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-1 --insecure
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: CockroachDB CCL v19.2.4 (x86_64-unknown-linux-gnu, built 2020/02/06 21:55:19, go1.12.12) (same version as client)
# Cluster ID: 310436c0-c651-4630-aa45-b6f8c61c8760
#
# Enter \? for a brief introduction.
#
root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> SELECT version();
                                          version                                           
+------------------------------------------------------------------------------------------+
  CockroachDB CCL v19.2.4 (x86_64-unknown-linux-gnu, built 2020/02/06 21:55:19, go1.12.12)  
(1 row)

Time: 579.754µs

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> CREATE TABLE t0 (id INT PRIMARY KEY, c1 INT, c2 INT, c3 INT);
CREATE TABLE

Time: 57.580178ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> INSERT INTO t0 VALUES (1, 111, 222, 333);
INSERT 1

Time: 49.529782ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> SELECT * FROM t0;
  id | c1  | c2  | c3   
+----+-----+-----+-----+
   1 | 111 | 222 | 333  
(1 row)

Time: 2.391171ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> UPDATE t0 SET (c1, c2, c3) = (444, 555, 666) WHERE id = 1;
UPDATE 1

Time: 17.290369ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> SELECT * FROM t0;
  id | c1  | c2  | c3   
+----+-----+-----+-----+
   1 | 444 | 555 | 666  
(1 row)

Time: 2.541162ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> DELETE FROM t0 WHERE id = 1;
DELETE 1

Time: 15.74363ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> SELECT * FROM t0;
  id | c1 | c2 | c3  
+----+----+----+----+
(0 rows)

Time: 2.044183ms

root@cockroach-1:26257/defaultdb>

SQL Shell を終了する場合は、\q を実行します。

root@cockroach-1:26257/defaultdb> \q

Admin UI (Web UI) へ接続 (Insecure クラスタ)

CockroachDB にはいい感じの雰囲気の Admin UI (Web UI) があります。以下の URL (docker run 実行時に指定した port) にアクセスすると、Admin UI 画面を開くことができます。

http://localhost:8080/

00_insecure_admin_ui

Insecure クラスタの削除

Insecure クラスタを削除する場合は、各コンテナ, Docker Network, DB のデータを格納しているディレクト${PWD}/cockroach-data/ をそれぞれ削除します。

1) コンテナを削除

$ sudo docker rm $(sudo docker kill cockroach-1 cockroach-2 cockroach-3)

2) Docker Network を削除

$ sudo docker network rm cockroach-net

3) DB のデータが入ったディレクトリを削除

$ sudo rm -rf ${PWD}/cockroach-data/

Secure クラスタ

公式ドキュメントには Docker を使って Secure クラスタを構築する方法が記載されていないのですが、Start a Local Cluster (Secure)Secure Your Cluster あたりの情報を参考に証明書等を準備すれば、Secure クラスタを構築することが可能です。

Secure クラスタの場合は、事前に各ノード用の証明書等を準備し、それらを格納したディレクトリを各ノード起動時の --certs-dir オプションに指定します。

証明書作成準備

1) Docker ホスト上に、証明書等を格納するディレクトリを作成します。

$ mkdir ${PWD}/cockroach-certs
$ mkdir ${PWD}/cockroach-certs/certs
$ mkdir ${PWD}/cockroach-certs/my-safe-directory

2) 作成した ${PWD}/cockroach-certs をマウントしつつ、証明書を作成するための作業用コンテナを起動します。

$ sudo docker run -it --rm \
--name cockroach-tmp \
--hostname cockroach-tmp \
-v "${PWD}/cockroach-certs:/cockroach/cockroach-certs" \
--entrypoint /bin/bash \
cockroachdb/cockroach:v19.2.4

CA 作成 (作業用コンテナで実施)

1) cockroach cert create-ca コマンドで CA 証明書と鍵を作成します。(ここからは起動した作業用コンテナ内での作業)

root@cockroach-tmp:/cockroach# ./cockroach cert create-ca \
--certs-dir=cockroach-certs/certs \
--ca-key=cockroach-certs/my-safe-directory/ca.key

1匹目用の証明書作成 (作業用コンテナで実施)

1) 1匹目用の証明書を格納するディレクトリを作成します。(引き続きコンテナ内で作業)

root@cockroach-tmp:/cockroach# mkdir cockroach-certs/cockroach-1

2) cockroach cert create-node コマンドで 1匹目用の証明書を作成します。

root@cockroach-tmp:/cockroach# ./cockroach cert create-node \
cockroach-1 \
--certs-dir=cockroach-certs/certs \
--ca-key=cockroach-certs/my-safe-directory/ca.key

3) 作成した証明書を cockroach-certs/cockroach-1/ 配下 (1匹目用のディレクトリ) にコピーします。

root@cockroach-tmp:/cockroach# ls -l cockroach-certs/certs/
total 12
-rw-r--r-- 1 root root 1111 Feb 14 11:10 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 11:11 node.crt
-rw------- 1 root root 1675 Feb 14 11:11 node.key
root@cockroach-tmp:/cockroach# cp cockroach-certs/certs/* cockroach-certs/cockroach-1/
root@cockroach-tmp:/cockroach# ls -l cockroach-certs/cockroach-1/
total 12
-rw-r--r-- 1 root root 1111 Feb 14 11:12 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 11:12 node.crt
-rw------- 1 root root 1675 Feb 14 11:12 node.key

2匹目用の証明書作成 (作業用コンテナで実施)

1) 2匹目用の証明書を格納するディレクトリを作成します。(引き続きコンテナ内で作業)

root@cockroach-tmp:/cockroach# mkdir cockroach-certs/cockroach-2

2) cockroach cert create-node コマンドで 2匹目用の証明書を作成します (1匹目用の証明書が残っているとエラーになるので --overwrite オプションをつけて実行します)。

root@cockroach-tmp:/cockroach# ./cockroach cert create-node \
cockroach-2 \
--certs-dir=cockroach-certs/certs \
--ca-key=cockroach-certs/my-safe-directory/ca.key \
--overwrite

3) 作成した証明書を cockroach-certs/cockroach-2/ 配下 (2匹目用のディレクトリ) にコピーします。

root@cockroach-tmp:/cockroach# ls -l cockroach-certs/certs/
total 12
-rw-r--r-- 1 root root 1111 Feb 14 11:10 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 11:19 node.crt
-rw------- 1 root root 1675 Feb 14 11:19 node.key
root@cockroach-tmp:/cockroach# cp cockroach-certs/certs/* cockroach-certs/cockroach-2/
root@cockroach-tmp:/cockroach# ls -l cockroach-certs/cockroach-2/
total 12
-rw-r--r-- 1 root root 1111 Feb 14 11:19 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 11:19 node.crt
-rw------- 1 root root 1675 Feb 14 11:19 node.key

3匹目用の証明書作成 (作業用コンテナで実施)

1) 3匹目用の証明書を格納するディレクトリを作成します。(引き続きコンテナ内で作業)

root@cockroach-tmp:/cockroach# mkdir cockroach-certs/cockroach-3

2) cockroach cert create-node コマンドで 3匹目用の証明書を作成します (2匹目用の証明書が残っているとエラーになるので --overwrite オプションをつけて実行します)。

root@cockroach-tmp:/cockroach# ./cockroach cert create-node \
cockroach-3 \
--certs-dir=cockroach-certs/certs \
--ca-key=cockroach-certs/my-safe-directory/ca.key \
--overwrite

3) 作成した証明書を cockroach-certs/cockroach-3/ 配下 (3匹目用のディレクトリ) にコピーします。

root@cockroach-tmp:/cockroach# ls -l cockroach-certs/certs/
total 12
-rw-r--r-- 1 root root 1111 Feb 14 11:10 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 11:21 node.crt
-rw------- 1 root root 1679 Feb 14 11:21 node.key
root@cockroach-tmp:/cockroach# cp cockroach-certs/certs/* cockroach-certs/cockroach-3/
root@cockroach-tmp:/cockroach# ls -l cockroach-certs/cockroach-3/
total 12
-rw-r--r-- 1 root root 1111 Feb 14 11:21 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 11:21 node.crt
-rw------- 1 root root 1679 Feb 14 11:21 node.key

root ユーザ用のクライアント証明書作成 (作業用コンテナで実施)

1) root ユーザ用のクライアント証明書を格納するディレクトリを作成します。(引き続きコンテナ内で作業)

root@cockroach-tmp:/cockroach# mkdir cockroach-certs/client-root

2) cockroach cert create-client コマンドで root ユーザ用のクライアント証明書を作成します。

root@cockroach-tmp:/cockroach# ./cockroach cert create-client \
root \
--certs-dir=cockroach-certs/certs \
--ca-key=cockroach-certs/my-safe-directory/ca.key

3) 作成した証明書を cockroach-certs/client-root/ 配下 (root ユーザ用のディレクトリ) にコピーします。証明書認証で DB に接続する際には、ca.crtnode.key も必要になるため、一緒にコピーします (厳密には node.crt は不要です)。

root@cockroach-tmp:/cockroach# ls -l cockroach-certs/certs/
total 20
-rw-r--r-- 1 root root 1111 Feb 14 11:10 ca.crt
-rw-r--r-- 1 root root 1103 Feb 14 11:22 client.root.crt
-rw------- 1 root root 1679 Feb 14 11:22 client.root.key
-rw-r--r-- 1 root root 1147 Feb 14 11:21 node.crt
-rw------- 1 root root 1679 Feb 14 11:21 node.key
root@cockroach-tmp:/cockroach# cp cockroach-certs/certs/* cockroach-certs/client-root/
root@cockroach-tmp:/cockroach# ls -l cockroach-certs/client-root/
total 20
-rw-r--r-- 1 root root 1111 Feb 14 11:23 ca.crt
-rw-r--r-- 1 root root 1103 Feb 14 11:23 client.root.crt
-rw------- 1 root root 1679 Feb 14 11:23 client.root.key
-rw-r--r-- 1 root root 1147 Feb 14 11:23 node.crt
-rw------- 1 root root 1679 Feb 14 11:23 node.key

証明書の確認

1) 作業用コンテナで実行していた bash を終了します。(以降は Docker ホスト側での作業)

root@cockroach-tmp:/cockroach# exit

2) Docker ホスト側で、${PWD}/cockroach-certs/ 配下に作成した各証明書が存在してることを確認しておきます。

$ ls -lR ${PWD}/cockroach-certs/
/cockroach/cockroach-certs/:
total 24
drwxr-xr-x 2 ubuntu ubuntu 4096 Feb 14 20:22 certs
drwxr-xr-x 2 root   root   4096 Feb 14 20:23 client-root
drwxr-xr-x 2 root   root   4096 Feb 14 20:12 cockroach-1
drwxr-xr-x 2 root   root   4096 Feb 14 20:19 cockroach-2
drwxr-xr-x 2 root   root   4096 Feb 14 20:21 cockroach-3
drwxr-xr-x 2 ubuntu ubuntu 4096 Feb 14 20:10 my-safe-directory

/cockroach/cockroach-certs/certs:
total 20
-rw-r--r-- 1 root root 1111 Feb 14 20:10 ca.crt
-rw-r--r-- 1 root root 1103 Feb 14 20:22 client.root.crt
-rw------- 1 root root 1679 Feb 14 20:22 client.root.key
-rw-r--r-- 1 root root 1147 Feb 14 20:21 node.crt
-rw------- 1 root root 1679 Feb 14 20:21 node.key

/cockroach/cockroach-certs/client-root:
total 20
-rw-r--r-- 1 root root 1111 Feb 14 20:23 ca.crt
-rw-r--r-- 1 root root 1103 Feb 14 20:23 client.root.crt
-rw------- 1 root root 1679 Feb 14 20:23 client.root.key
-rw-r--r-- 1 root root 1147 Feb 14 20:23 node.crt
-rw------- 1 root root 1679 Feb 14 20:23 node.key

/cockroach/cockroach-certs/cockroach-1:
total 12
-rw-r--r-- 1 root root 1111 Feb 14 20:12 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 20:12 node.crt
-rw------- 1 root root 1675 Feb 14 20:12 node.key

/cockroach/cockroach-certs/cockroach-2:
total 12
-rw-r--r-- 1 root root 1111 Feb 14 20:19 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 20:19 node.crt
-rw------- 1 root root 1675 Feb 14 20:19 node.key

/cockroach/cockroach-certs/cockroach-3:
total 12
-rw-r--r-- 1 root root 1111 Feb 14 20:21 ca.crt
-rw-r--r-- 1 root root 1147 Feb 14 20:21 node.crt
-rw------- 1 root root 1679 Feb 14 20:21 node.key

/cockroach/cockroach-certs/my-safe-directory:
total 4
-rw------- 1 root root 1675 Feb 14 20:10 ca.key

事前に必要な証明書作成作業はここまでです。

Secure クラスタの構築

それでは、作成した証明書を利用してクラスタを構築 (各ノードを起動) します。

1) 各ノード (コンテナ) を接続させる Docker Network を作成します。

$ sudo docker network create cockroach-net

2) 作成した Docker Network を指定し、1匹目を起動します。この時、先程作成した 1匹目用の証明書が格納されたディレクトリと、root 用のクライアント証明書が格納されたディレクトリをそれぞれマウントします。

また、Secure クラスタの場合は --insecure オプションの代わりに、--certs-dir オプションを指定 (ノード用の証明書が格納さていディレクトリを指定) します。

$ sudo docker run -d \
--name=cockroach-1 \
--hostname=cockroach-1 \
--net=cockroach-net \
-p 26257:26257 -p 8080:8080 \
-v "${PWD}/cockroach-data/cockroach-1:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-certs/cockroach-1:/cockroach/certs" \
-v "${PWD}/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.4 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3

3) 同様に、2匹目/3匹目もそれぞれの証明書が格納されたディレクトリをマウントして起動します。

$ sudo docker run -d \
--name=cockroach-2 \
--hostname=cockroach-2 \
--net=cockroach-net \
-v "${PWD}/cockroach-data/cockroach-2:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-certs/cockroach-2:/cockroach/certs" \
-v "${PWD}/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.4 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-3 \
--hostname=cockroach-3 \
--net=cockroach-net \
-v "${PWD}/cockroach-data/cockroach-3:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-certs/cockroach-3:/cockroach/certs" \
-v "${PWD}/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.4 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3

4) 最後に cockroach init コマンドでクラスタを初期化します。こちらのコマンドにも (--insecure オプションの代わりに) --certs-dir オプションを指定 (root ユーザ用のクライアント証明書を指定) します。

$ sudo docker exec -it cockroach-1 ./cockroach init --host=cockroach-1 --certs-dir=client-certs

これで、Secure クラスタの構築は完了です。cockroach node status コマンドでクラスタが構築されていることを確認できます。

$ sudo docker exec -it cockroach-1 ./cockroach node status --host=cockroach-1 --certs-dir=client-certs
  id |      address      |    sql_address    |  build  |            started_at            |            updated_at            | locality | is_available | is_live  
+----+-------------------+-------------------+---------+----------------------------------+----------------------------------+----------+--------------+---------+
   1 | cockroach-1:26257 | cockroach-1:26257 | v19.2.4 | 2020-02-14 11:25:37.328938+00:00 | 2020-02-14 11:25:46.396334+00:00 |          | true         | true     
   2 | cockroach-2:26257 | cockroach-2:26257 | v19.2.4 | 2020-02-14 11:25:37.681192+00:00 | 2020-02-14 11:25:42.226629+00:00 |          | true         | true     
   3 | cockroach-3:26257 | cockroach-3:26257 | v19.2.4 | 2020-02-14 11:25:38.283192+00:00 | 2020-02-14 11:25:42.827082+00:00 |          | true         | true     
(3 rows)

Built-in SQL Shell を使って Secure クラスタに接続

Secure クラスタ構築後、cockroach sql コマンド (Built-in SQL Shell) を使って、CockroachDB に接続できます (cockroach sql にも --certs-dir オプションを指定します)。

前述した通り、CockroachDB クラスタ内の各ノードには Master/Standby や Coordinator/Worker のような役割分担はないので、cockroach-1/cockroach-2/cockroach-3 いずれのノードに接続しても Read/Write のクエリを実行できます。

$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-1 --certs-dir=client-certs
$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-2 --certs-dir=client-certs
$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-3 --certs-dir=client-certs

上記のように cockroach sql で CockroachDB に接続すると、以下のように SQL を実行できます。

$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-1 --certs-dir=client-certs
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: CockroachDB CCL v19.2.4 (x86_64-unknown-linux-gnu, built 2020/02/06 21:55:19, go1.12.12) (same version as client)
# Cluster ID: 7e9b40b9-1241-4066-9e94-a56c7700ae7a
#
# Enter \? for a brief introduction.
#
root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> SELECT version();
                                          version                                           
+------------------------------------------------------------------------------------------+
  CockroachDB CCL v19.2.4 (x86_64-unknown-linux-gnu, built 2020/02/06 21:55:19, go1.12.12)  
(1 row)

Time: 644.658µs

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> CREATE TABLE t0 (id INT PRIMARY KEY, c1 INT, c2 INT, c3 INT);
CREATE TABLE

Time: 57.624205ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> INSERT INTO t0 VALUES (1, 111, 222, 333);
INSERT 1

Time: 46.974669ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> SELECT * FROM t0;
  id | c1  | c2  | c3   
+----+-----+-----+-----+
   1 | 111 | 222 | 333  
(1 row)

Time: 2.4231ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> UPDATE t0 SET (c1, c2, c3) = (444, 555, 666) WHERE id = 1;
UPDATE 1

Time: 18.007125ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> SELECT * FROM t0;
  id | c1  | c2  | c3   
+----+-----+-----+-----+
   1 | 444 | 555 | 666  
(1 row)

Time: 2.303627ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> DELETE FROM t0 WHERE id = 1;
DELETE 1

Time: 17.040103ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> SELECT * FROM t0;
  id | c1 | c2 | c3  
+----+----+----+----+
(0 rows)

Time: 2.172402ms

root@cockroach-1:26257/defaultdb>

SQL Shell を終了する場合は、\q を実行します。

root@cockroach-1:26257/defaultdb> \q

Admin UI (Web UI) へ接続 (Secure クラスタ)

Secure クラスタの場合 は、(Insecure クラスタと違って) Admin UI に接続する際にパスワード認証が必要です。

また、現時点 (v19.2.4 時点) では root ユーザで Admin UI にログインすることができないので、Admin UI にログインするための一般ユーザ (非 root ユーザ) を作成する必要があります。

1) まずは、cockroach sql コマンドで (root ユーザで) DB に接続します。

$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-1 --certs-dir=client-certs

2) 次に、Admin UI 接続用の一般ユーザを作成します。

root@cockroach-1:26257/defaultdb> CREATE USER cockroach_user WITH PASSWORD 'cockroach_pass';

3) 一般ユーザ (roach_user) が作成されていることを確認し、SQL Shell を終了します。

root@cockroach-1:26257/defaultdb> SHOW USERS;
    user_name     
+----------------+
  cockroach_user  
  root            
(2 rows)

Time: 1.590451ms

root@cockroach-1:26257/defaultdb>
root@cockroach-1:26257/defaultdb> \q

4) 一般ユーザ作成後、以下の URL (docker run 実行時に指定した port) にアクセスします。

https://localhost:8080/

5) すると、ログイン画面が表示されるので、先程作成したユーザ/パスワード (cockroach_user/cockroach_pass) でログインします。

01_secure_admin_ui_login

6) パスワード認証に成功すると、以下のような Admin UI が表示されます。

02_secure_admin_ui

7) ログアウトする場合は、画面左下の "LGO OUT" ボタンを選択します。

03_secure_admin_ui_logout

Secure クラスタの削除

Secure クラスタを削除する場合は、各コンテナ, Docker Network, 証明書を格納しているディレクト${PWD}/cockroach-certs/, DB のデータを格納しているディレクト${PWD}/cockroach-data/ をそれぞれ削除します。

1) コンテナを削除

$ sudo docker rm $(sudo docker kill cockroach-1 cockroach-2 cockroach-3)

2) Docker Network を削除

$ sudo docker network rm cockroach-net

3) 証明書が入ったディレクトリを削除

$ sudo rm -rf ${PWD}/cockroach-certs/

4) DB のデータが入ったディレクトリを削除

$ sudo rm -rf ${PWD}/cockroach-data/

まとめ

分散 DB である CockroachDB ですが、Docker を使うとローカル (単一ホスト) 上でクラスタを構築できました。