次世代の データベース CockroachDB を試してみた。

こんにちは、 k-jun です。今回は Spanner の OSS 実装であり次の世代のデータベースとなりうる CockroachDB を試していこうと思います。 同系統の TiDB が MySQL 互換なのに対してこちらは Postgres 互換のようですね。Aurora 互換のこういう DB 出ないかしら...?

https://github.com/cockroachdb/cockroach

https://www.cockroachlabs.com/

公式のドキュメントを参照してみると以下の項目が羅列されており、Cockroach の由来はここら辺なんじゃないのかなぁとなんとなく思っています。

  • SCALE FAST
    • Build fast & build to last Familiar SQL
    • Elastic Scale Grow locally and/or globally
  • SURVIVE ANYTHING
    • Bulletproof Resilience Survive any failure
    • Consistent Transactions Guarantee data correctness
  • THRIVE EVERYWHERE
    • Geo-partitioned data Performance & Regulatory Compliance
    • Hybrid and multi-cloud Deploy on and across any cloud

ゴキブリのような生命力を DB に求めるかと言われればそれは YES なんですけれども...。システムの最も重要な箇所がゴキブリに荒らされているような感覚に陥りますね...。 Docker でサクッと試せそうなのでそちらで起動してみます。あとは適当に sysbench で SQL が使えるかどうかと性能を見てみます。ゴキブリのような生命力を有しているのかの確認もしてみたいですが 笑、今回はパスです。

Run

ここら辺 を参考にやってみる。

# docker network
$ docker network create -d bridge roachnet

# cockroach cluster
$ docker run -d \
--name=roach1 \
--hostname=roach1 \
--net=roachnet \
-p 26257:26257 -p 8080:8080  \
-v "${PWD}/cockroach-data/roach1:/cockroach/cockroach-data"  \
cockroachdb/cockroach:v21.1.9 start \
--insecure \
--join=roach1,roach2,roach3

# cockroach node
$ docker run -d \
--name=roach2 \
--hostname=roach2 \
--net=roachnet \
-v "${PWD}/cockroach-data/roach2:/cockroach/cockroach-data" \
cockroachdb/cockroach:v21.1.9 start \
--insecure \
--join=roach1,roach2,roach3
c0b9420b32548db935009c779b1e23d7277d3e6599ac4c07642c3e2b30ac22f
$ docker run -d \
--name=roach3 \
--hostname=roach3 \
--net=roachnet \
-v "${PWD}/cockroach-data/roach3:/cockroach/cockroach-data" \
cockroachdb/cockroach:v21.1.9 start \
--insecure \
--join=roach1,roach2,roach3

謎のコマンド。initialization みたい。

$ docker exec -it roach1 ./cockroach init --insecure
Cluster successfully initialized
$ docker exec -it roach1 grep 'node starting' cockroach-data/logs/cockroach.log -A 11
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +CockroachDB node starting at 2021-09-23 20:21:01.726278 +0000 UTC (took 109.8s)
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +build:               CCL v21.1.9 @ 2021/09/20 21:47:27 (go1.15.14)
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +webui:               ‹http://roach1:8080›
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +sql:                 ‹postgresql://root@roach1:26257?sslmode=disable›
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +RPC client flags:    ‹/cockroach/cockroach <client cmd> --host=roach1:26257 --insecure›
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +logs:                ‹/cockroach/cockroach-data/logs›
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +temp dir:            ‹/cockroach/cockroach-data/cockroach-temp470954380›
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +external I/O path:   ‹/cockroach/cockroach-data/extern›
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +store[0]:            ‹path=/cockroach/cockroach-data›
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +storage engine:      pebble
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +status:              initialized new cluster
I210923 20:21:01.726415 85 1@cli/start.go:704 ⋮ [-] 182 +clusterID:           ‹6ee045f0-07a0-455a-bf12-bfe6c95e138d›

以下のコマンドを実行することで SQL の Interface を利用することが出来る。

$ docker exec -it roach1 ./cockroach sql --insecure
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
CREATE DATABASE bank;
CREATE TABLE bank.accounts (id INT PRIMARY KEY, balance DECIMAL);
INSERT INTO bank.accounts VALUES (1, 1000.50);
SELECT * FROM bank.accounts;

うーん... 実行しても出力が何も返らない... ダメそう ...。なにか間違えたのだろうか...? console が localhost:8080 に立っているようなのでこれを見てみる。

f:id:K-jun1221:20210924053018p:plain

database が defaultdb / postgres / system 以外に作成されていないのでダメそう。 しかし local の docker で構築しても console が付与されているのは非常に体験として良いな。

postgres の client app で直接中身を覗いてみる。

$ psql -h 127.0.0.1 -p 26257 -U root -d defaultdb
psql (13.4, server 13.0.0)
Type "help" for help.

defaultdb=# CREATE DATABASE bank;

もろもろ確認してみるとどうやら node が2つとも落ちていたようです。詳細にログを追ってはいないので詳細は不明ですが。 再起動してみると動くようになったので先程の SQL をポチポチしてみます。

defaultdb=# CREATE TABLE bank.accounts (id INT PRIMARY KEY, balance DECIMAL);
defaultdb=# INSERT INTO bank.accounts VALUES (1, 1000.50);
defaultdb=# SELECT * FROM bank.accounts;
 id | balance
----+---------
  1 | 1000.50
(1 row)

おおお...! 実行できていそうです。いい感じに postgres 互換ですね。sysbench を実行してみますか。

$ brew install sysbench --with-postgresql
...
Error: invalid option: --with-postgresql

https://github.com/akopytov/sysbench/issues/302

brew install ができないじゃねえか...。辛い...。うーん。。。まあ、CockroachDB が起動することは確認できましたし今回はこれでよしとしましょう。 後で ubuntu 環境に TiDB と CockroachDB を起動して sysbench で性能を比べてみるとかやって見ます 笑。

それでは今回はこのへんで。