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

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

(メモ) CockroachDB のローカルクラスタを起動するコマンド

CockroachDB のローカルクラスタを構築するコマンドめも。

Insecure クラスタ (Docker 使用)

Docker Network 作成

$ sudo docker network create cockroach-net

ノード (コンテナ) 起動

$ sudo docker run -d \
--name=cockroach-1 \
--hostname=cockroach-1 \
--net=cockroach-net \
-p 26257:26257 -p 8081:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-1:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-2 \
--hostname=cockroach-2 \
--net=cockroach-net \
-p 8082:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-2:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-3 \
--hostname=cockroach-3 \
--net=cockroach-net \
-p 8083:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-3:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-4 \
--hostname=cockroach-4 \
--net=cockroach-net \
-p 8084:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-4:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-5 \
--hostname=cockroach-5 \
--net=cockroach-net \
-p 8085:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-5:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-6 \
--hostname=cockroach-6 \
--net=cockroach-net \
-p 8086:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-6:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-7 \
--hostname=cockroach-7 \
--net=cockroach-net \
-p 8087:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-7:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-8 \
--hostname=cockroach-8 \
--net=cockroach-net \
-p 8088:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-8:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-9 \
--hostname=cockroach-9 \
--net=cockroach-net \
-p 8089:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-9:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.2.5 start \
--insecure \
--join=cockroach-1,cockroach-2,cockroach-3

DB 初期化

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

DB アクセス (Built-in SQL Shell)

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

Admin UI (Web UI) アクセス

http://localhost:8081/

Insecure クラスタ削除

$ sudo docker rm $(sudo docker kill cockroach-1 cockroach-2 cockroach-3 cockroach-4 cockroach-5 cockroach-6 cockroach-7 cockroach-8 cockroach-9)
$ sudo docker network rm cockroach-net
$ sudo rm -rf ${PWD}/cockroach-cluster/

Secure クラスタ (Docker 使用)

証明書作成

$ mkdir -p ${PWD}/cockroach-cluster/cockroach-certs
$ mkdir -p ${PWD}/cockroach-cluster/cockroach-certs/certs
$ mkdir -p ${PWD}/cockroach-cluster/cockroach-certs/my-safe-directory
$ for i in `seq 1 9`; do mkdir -p ${PWD}/cockroach-cluster/cockroach-certs/cockroach-${i}; done
$ mkdir -p ${PWD}/cockroach-cluster/cockroach-certs/client-root
$ sudo docker run -it --rm \
--name cockroach-tmp \
--hostname cockroach-tmp \
-v "${PWD}/cockroach-cluster/cockroach-certs:/cockroach/cockroach-certs" \
cockroachdb/cockroach:v19.2.5 \
cert create-ca \
--certs-dir=/cockroach/cockroach-certs/certs \
--ca-key=/cockroach/cockroach-certs/my-safe-directory/ca.key
$ sudo docker run -it --rm \
--name cockroach-tmp \
--hostname cockroach-tmp \
-v "${PWD}/cockroach-cluster/cockroach-certs:/cockroach/cockroach-certs" \
cockroachdb/cockroach:v19.2.5 \
cert create-node \
localhost \
cockroach-1 \
cockroach-2 \
cockroach-3 \
cockroach-4 \
cockroach-5 \
cockroach-6 \
cockroach-7 \
cockroach-8 \
cockroach-9 \
--certs-dir=/cockroach/cockroach-certs/certs \
--ca-key=/cockroach/cockroach-certs/my-safe-directory/ca.key
$ sudo docker run -it --rm \
--name cockroach-tmp \
--hostname cockroach-tmp \
-v "${PWD}/cockroach-cluster/cockroach-certs:/cockroach/cockroach-certs" \
cockroachdb/cockroach:v19.2.5 \
cert create-client \
root \
--certs-dir=/cockroach/cockroach-certs/certs \
--ca-key=/cockroach/cockroach-certs/my-safe-directory/ca.key
$ for i in `seq 1 9`; do sudo cp ${PWD}/cockroach-cluster/cockroach-certs/certs/* ${PWD}/cockroach-cluster/cockroach-certs/cockroach-${i}/; done
$ sudo cp ${PWD}/cockroach-cluster/cockroach-certs/certs/* ${PWD}/cockroach-cluster/cockroach-certs/client-root/

Docker Network 作成

$ sudo docker network create cockroach-net

ノード (コンテナ) 起動

$ sudo docker run -d \
--name=cockroach-1 \
--hostname=cockroach-1 \
--net=cockroach-net \
-p 26257:26257 -p 8081:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-1:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-1:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-2 \
--hostname=cockroach-2 \
--net=cockroach-net \
-p 8082:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-2:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-2:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-3 \
--hostname=cockroach-3 \
--net=cockroach-net \
-p 8083:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-3:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-3:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-4 \
--hostname=cockroach-4 \
--net=cockroach-net \
-p 8084:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-4:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-4:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-5 \
--hostname=cockroach-5 \
--net=cockroach-net \
-p 8085:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-5:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-5:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-6 \
--hostname=cockroach-6 \
--net=cockroach-net \
-p 8086:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-6:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-6:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-7 \
--hostname=cockroach-7 \
--net=cockroach-net \
-p 8087:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-7:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-7:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-8 \
--hostname=cockroach-8 \
--net=cockroach-net \
-p 8088:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-8:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-8:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3
$ sudo docker run -d \
--name=cockroach-9 \
--hostname=cockroach-9 \
--net=cockroach-net \
-p 8089:8080 \
-v "${PWD}/cockroach-cluster/cockroach-data/cockroach-9:/cockroach/cockroach-data" \
-v "${PWD}/cockroach-cluster/cockroach-certs/cockroach-9:/cockroach/certs" \
-v "${PWD}/cockroach-cluster/cockroach-certs/client-root:/cockroach/client-certs" \
cockroachdb/cockroach:v19.2.5 start \
--certs-dir=certs \
--join=cockroach-1,cockroach-2,cockroach-3

DB 初期化

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

DB アクセス (Built-in SQL Shell)

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

Admin UI (Web UI) アクセス

$ sudo docker exec -it cockroach-1 ./cockroach sql --host=cockroach-1 --certs-dir=client-certs -e "CREATE USER cockroach PASSWORD 'cockroach'"
https://localhost:8081/

Secure クラスタ削除

$ sudo docker rm $(sudo docker kill cockroach-1 cockroach-2 cockroach-3 cockroach-4 cockroach-5 cockroach-6 cockroach-7 cockroach-8 cockroach-9)
$ sudo docker network rm cockroach-net
$ sudo rm -rf ${PWD}/cockroach-cluster/

小ネタ

cockroach-1 起動 -> cockroach-2 起動 -> cockroach-3 起動 -> ... -> cockroach-N 起動 -> クラスタ初期化 (cockroach init) の順で実行すると、以下のように "ノード名の数字 (cockroach-N)" と "CockroachDB 内部で各ノードに割り当てられる ID" が バラバラ になる (一致しない)。

  id |      address      |    sql_address    |  build  |            started_at            |            updated_at            | locality | is_available | is_live  
+----+-------------------+-------------------+---------+----------------------------------+----------------------------------+----------+--------------+---------+
   1 | cockroach-1:26257 | cockroach-1:26257 | v19.2.5 | 2020-03-12 11:30:57.023256+00:00 | 2020-03-12 11:31:10.625955+00:00 |          | true         | true     
   2 | cockroach-8:26257 | cockroach-8:26257 | v19.2.5 | 2020-03-12 11:30:57.342416+00:00 | 2020-03-12 11:31:10.973333+00:00 |          | true         | true     
   3 | cockroach-9:26257 | cockroach-9:26257 | v19.2.5 | 2020-03-12 11:30:57.612006+00:00 | 2020-03-12 11:31:11.206786+00:00 |          | true         | true     
   4 | cockroach-7:26257 | cockroach-7:26257 | v19.2.5 | 2020-03-12 11:30:57.778118+00:00 | 2020-03-12 11:31:11.400892+00:00 |          | true         | true     
   5 | cockroach-6:26257 | cockroach-6:26257 | v19.2.5 | 2020-03-12 11:30:57.875776+00:00 | 2020-03-12 11:31:11.509177+00:00 |          | true         | true     
   6 | cockroach-3:26257 | cockroach-3:26257 | v19.2.5 | 2020-03-12 11:30:57.908572+00:00 | 2020-03-12 11:31:11.529298+00:00 |          | true         | true     
   7 | cockroach-2:26257 | cockroach-2:26257 | v19.2.5 | 2020-03-12 11:30:58.39514+00:00  | 2020-03-12 11:31:12.033717+00:00 |          | true         | true     
   8 | cockroach-4:26257 | cockroach-4:26257 | v19.2.5 | 2020-03-12 11:30:58.674961+00:00 | 2020-03-12 11:31:12.299762+00:00 |          | true         | true     
   9 | cockroach-5:26257 | cockroach-5:26257 | v19.2.5 | 2020-03-12 11:30:58.84338+00:00  | 2020-03-12 11:31:12.4652+00:00   |          | true         | true     
(9 rows)

cockroach-1 起動 -> クラスタ初期化 (cockroach init) -> cockroach-2 起動 -> cockroach-3 起動 -> ... -> cockroach-N 起動 の順で実行すると、以下のように "ノード名の数字 (cockroach-N)" と "CockroachDB 内部で各ノードに割り当てられる ID" が 一致する

  id |      address      |    sql_address    |  build  |            started_at            |            updated_at            | locality | is_available | is_live  
+----+-------------------+-------------------+---------+----------------------------------+----------------------------------+----------+--------------+---------+
   1 | cockroach-1:26257 | cockroach-1:26257 | v19.2.5 | 2020-03-12 12:04:19.949289+00:00 | 2020-03-12 12:06:39.498269+00:00 |          | true         | true     
   2 | cockroach-2:26257 | cockroach-2:26257 | v19.2.5 | 2020-03-12 12:05:25.179127+00:00 | 2020-03-12 12:06:41.736312+00:00 |          | true         | true     
   3 | cockroach-3:26257 | cockroach-3:26257 | v19.2.5 | 2020-03-12 12:05:32.196454+00:00 | 2020-03-12 12:06:39.756711+00:00 |          | true         | true     
   4 | cockroach-4:26257 | cockroach-4:26257 | v19.2.5 | 2020-03-12 12:05:45.115173+00:00 | 2020-03-12 12:06:39.176477+00:00 |          | true         | true     
   5 | cockroach-5:26257 | cockroach-5:26257 | v19.2.5 | 2020-03-12 12:05:55.636434+00:00 | 2020-03-12 12:06:40.683675+00:00 |          | true         | true     
   6 | cockroach-6:26257 | cockroach-6:26257 | v19.2.5 | 2020-03-12 12:06:03.864341+00:00 | 2020-03-12 12:06:39.948482+00:00 |          | true         | true     
   7 | cockroach-7:26257 | cockroach-7:26257 | v19.2.5 | 2020-03-12 12:06:13.726423+00:00 | 2020-03-12 12:06:40.789314+00:00 |          | true         | true     
   8 | cockroach-8:26257 | cockroach-8:26257 | v19.2.5 | 2020-03-12 12:06:21.316927+00:00 | 2020-03-12 12:06:39.391539+00:00 |          | true         | true     
   9 | cockroach-9:26257 | cockroach-9:26257 | v19.2.5 | 2020-03-12 12:06:29.451055+00:00 | 2020-03-12 12:06:38.502739+00:00 |          | true         | true     
(9 rows)