CLOVER🍀

That was when it all began.

CockroachDBをUbuntu Linux 20.04 LTSにインストールする

これは、なにをしたくて書いたもの?

前々から少しCockroachDBに興味があったので、少しずつ試していこうかなと思いまして。

その一歩目ということで。

CockroachDBとは

オフィシャルサイトは、こちら。

Cockroach Labs, the company building CockroachDB

CockroachDBがなんであるかは、FAQを見るのが端的で良さそうです。

Frequently Asked Questions / What is CockroachDB?

CockroachDB is a distributed SQL database built on a transactional and strongly-consistent key-value store. It scales horizontally; survives disk, machine, rack, and even datacenter failures with minimal latency disruption and no manual intervention; supports strongly-consistent ACID transactions; and provides a familiar SQL API for structuring, manipulating, and querying data.

トランザクショナルな、強い一貫性を持つKey Valueストア上に構築された、分散SQLデータベースです。水平スケーリングができ、
ディスクやマシンなどに対する障害耐性も持ちます。ACIDトランザクションやデータ操作を行うSQL APIも提供します。

CockroachDB is inspired by Google's Spanner and F1 technologies, and the source code is freely available.

GoogleのSpannerおよびF1にインスパイアされたデータベースです。

提供形態としては、CockroachDB Core、CockroachDB Enterprise、CockroachCloud、CockroachCloud Free(Beta)の
4つがあり、CockroachDB Coreは無料利用ができます。

Get Started with CockroachDB

ライセンスは、現在はBSL(Business Source License)とCCL(Cockroach Community License)です。

Licensing FAQs | CockroachDB Docs

CockroachDB 19.1までは、Apache Software License 2.0だったようです。

アクセスは、CockroachDB SQL Clientを使うか

Frequently Asked Questions / Why is CockroachDB SQL?

cockroach sql | CockroachDB Docs

PostgreSQLのプロトコルと互換性があるので、各種言語のドライバーを利用できます。

What languages can I use to work with CockroachDB?

Example Apps | CockroachDB Docs

PostgreSQLとの互換性についてはこちら。サポートしていない機能もあるようです。

PostgreSQL Compatibility | CockroachDB Docs

FAQには、ゆっくり目を通した方が良さそうですね。

MongoDBやPostgreSQLとの比較。

CockroachDB in Comparison | CockroachDB Docs

アーキテクチャーについては、こちら。

Architecture Overview | CockroachDB Docs

このあたりは、徐々に見ていこうかなと思います。

まずは、インストールして動かしてみましょう。

環境

今回の環境は、こちら。Ubuntu Linux 20.04 LTSです。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:    20.04
Codename:   focal


$ uname -srvmpio
Linux 5.4.0-80-generic #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

最後にはクラスタも組んでみますが、その場合は192.168.33.10〜192.168.33.12の3台のサーバーを使います。

CockroachDBをスタンドアロンでインストールする

CockroachDBは分散データベースですが、まずは単一ノードで動かしてみましょう。

Install CockroachDB on Linux | CockroachDB Docs

事前に必要なパッケージは、glibc、libncurses、tzdataとなっています。Alpine Linux以外は、ほぼデフォルトでインストール
されているパッケージです。

インストールは、ドキュメントの通りにコマンドを実行。/usr/local/bin/にコピーします。

$ curl https://binaries.cockroachdb.com/cockroach-v21.1.6.linux-amd64.tgz | tar -xz && sudo cp -i cockroach-v21.1.6.linux-amd64/cockroach /usr/local/bin/

今回インストールしたCockroachDBは、21.1.6です。

$ cockroach version
Build Tag:        v21.1.6
Build Time:       2021/07/20 15:30:39
Distribution:     CCL
Platform:         linux amd64 (x86_64-unknown-linux-gnu)
Go Version:       go1.15.11
C Compiler:       gcc 6.5.0
Build Commit ID:  03b83e02502e8876ecb366659156ab00f7431a51
Build Type:       release

シングルバイナリなんですね。リポジトリを見ると、Goで実装されているようです。

GitHub - cockroachdb/cockroach: CockroachDB - the open source, cloud-native distributed SQL database.

GEOSライブラリをインストールする場合は、さらにライブラリをコピーする必要があります。

デフォルトで/usr/local/lib/cockroachディレクトリにあるライブラリを参照するようなので、以下のようにディレクトリを
作成してファイルをコピーします。

$ sudo mkdir -p /usr/local/lib/cockroach
$ sudo cp -i cockroach-v21.1.6.linux-amd64/lib/libgeos.so /usr/local/lib/cockroach/
$ sudo cp -i cockroach-v21.1.6.linux-amd64/lib/libgeos_c.so /usr/local/lib/cockroach/

このライブラリは、こちらのようです。ライセンスはLGPLですね。

GEOS

インメモリのデモデータベースで起動する

では、起動してみましょう。ドキュメントに記載されているcockroach demoで、スタンドアロンなインメモリデータベースを
起動してSQL Shellを開くようです。

$ cockroach help demo

Start an in-memory, standalone, single-node CockroachDB instance, and open an
interactive SQL prompt to it. Various datasets are available to be preloaded as
subcommands: e.g. "cockroach demo startrek". See --help for a full list.

By default, the 'movr' dataset is pre-loaded. You can also use --no-example-database
to avoid pre-loading a dataset.

cockroach demo attempts to connect to a Cockroach Labs server to obtain a
temporary enterprise license for demoing enterprise features and enable
telemetry back to Cockroach Labs. In order to disable this behavior, set the
environment variable "COCKROACH_SKIP_ENABLING_DIAGNOSTIC_REPORTING" to true.

Usage:
  cockroach demo [flags]
  cockroach demo [command]

Examples:
  cockroach demo

〜省略〜

起動。

$ cockroach demo
#
# Welcome to the CockroachDB demo database!
#
# You are connected to a temporary, in-memory CockroachDB cluster of 1 node.
#
# This demo session will attempt to enable enterprise features
# by acquiring a temporary license from Cockroach Labs in the background.
# To disable this behavior, set the environment variable
# COCKROACH_SKIP_ENABLING_DIAGNOSTIC_REPORTING=true.
#
# Beginning initialization of the movr dataset, please wait...
#
# The cluster has been preloaded with the "movr" dataset
# (MovR is a fictional vehicle sharing company).
#
# Reminder: your changes to data stored in the demo session will not be saved!
#
# If you wish to access this demo cluster using another tool, you will need
# the following details:
#
#   - Connection parameters:
#     (webui)    http://127.0.0.1:8080/demologin?password=demo1287&username=demo
#     (sql)      postgres://demo:demo1287@127.0.0.1:26257?sslmode=require
#     (sql/unix) postgres://demo:demo1287@?host=%2Ftmp%2Fdemo380812230&port=26257
#   
#   - Username: "demo", password: "demo1287"
#   - Directory with certificate files (for certain SQL drivers/tools): /tmp/demo380812230
#
# Server version: CockroachDB CCL v21.1.6 (x86_64-unknown-linux-gnu, built 2021/07/20 15:30:39, go1.15.11) (same version as client)
# Cluster ID: cca41404-b0c7-4891-9e2a-0b44f997aa29
# Organization: Cockroach Demo
No entry for terminal type "xterm-256color";
using dumb terminal settings.
#
# Enter \? for a brief introduction.
#
demo@127.0.0.1:26257/movr> 

テーブルの一覧を見てみます。

demo@127.0.0.1:26257/movr> show tables;
  schema_name |         table_name         | type  | owner | estimated_row_count | locality
--------------+----------------------------+-------+-------+---------------------+-----------
  public      | promo_codes                | table | demo  |                   0 | NULL
  public      | rides                      | table | demo  |                   0 | NULL
  public      | user_promo_codes           | table | demo  |                   0 | NULL
  public      | users                      | table | demo  |                   0 | NULL
  public      | vehicle_location_histories | table | demo  |                   0 | NULL
  public      | vehicles                   | table | demo  |                   0 | NULL
(6 rows)

Time: 22ms total (execution 22ms / network 1ms)

PostgreSQLに付属しているpsqlのように、\dなども使えるようです。

demo@127.0.0.1:26257/movr> \d
  schema_name |         table_name         | type  | owner | estimated_row_count | locality
--------------+----------------------------+-------+-------+---------------------+-----------
  public      | promo_codes                | table | demo  |                1000 | NULL
  public      | rides                      | table | demo  |                 500 | NULL
  public      | user_promo_codes           | table | demo  |                   0 | NULL
  public      | users                      | table | demo  |                  50 | NULL
  public      | vehicle_location_histories | table | demo  |                1000 | NULL
  public      | vehicles                   | table | demo  |                  15 | NULL
(6 rows)

Time: 22ms total (execution 22ms / network 0ms)

SQLを実行。

demo@127.0.0.1:26257/movr> select * from promo_codes limit 3; 
             code            |                                                                     description                                                                     |    creation_time    |   expiration_time   |                    rules
-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+-----------------------------------------------
  0_explain_theory_something | Live sing car maybe. Give safe edge chair discuss resource. Stop entire look support instead. Sister focus long agency like argue.                  | 2018-12-27 03:04:05 | 2019-01-02 03:04:05 | {"type": "percent_discount", "value": "10%"}
  100_address_garden_certain | Hour industry himself student position international. Southern traditional rest name prepare. Tough sign little into class. Money general care guy. | 2018-12-27 03:04:05 | 2019-01-13 03:04:05 | {"type": "percent_discount", "value": "10%"}
  101_system_skin_night      | Plan fire present image.                                                                                                                            | 2019-01-06 03:04:05 | 2019-01-16 03:04:05 | {"type": "percent_discount", "value": "10%"}
(3 rows)

Time: 1ms total (execution 1ms / network 0ms)

SQL Shellで使えるコマンドやSQLについては、このあたりを見るとよいでしょう。

cockroach sql / Commands

SQL Feature Support in CockroachDB v21.1 | CockroachDB Docs

SQL Statements | CockroachDB Docs

スタンドアロンクラスタで起動する

次は、インメモリではなくスタンドアロンなクラスタを立ててみましょう。

データの保存先が必要なようなので、こちらを先に作っておきます。今回は/var/lib/cockroach/dataとしましょう。

$ sudo mkdir -p /var/lib/cockroach/data
$ sudo chown -R `whoami`:`whoami` /var/lib/cockroach

シングルノードでのクラスタは、cockroach start-single-nodeで起動します。--storeオプションで、先ほど作成した
ディレクトリをデータの保存先として指定。SSL/TLSに関しては、今回は無効にしておきましょう。--insecureを
指定します。

$ cockroach start-single-node --insecure --store=/var/lib/cockroach/data
*
* WARNING: ALL SECURITY CONTROLS HAVE BEEN DISABLED!
* 
* This mode is intended for non-production testing only.
* 
* In this mode:
* - Your cluster is open to any client that can access any of your IP addresses.
* - Intruders with access to your machine or network can observe client-server traffic.
* - Intruders can log in without password and read or write any data in the cluster.
* - Intruders can consume all your server's resources and cause unavailability.
*
*
* INFO: To start a secure server without mandating TLS for clients,
* consider --accept-sql-without-tls instead. For other options, see:
* 
* - https://go.crdb.dev/issue-v/53404/v21.1
* - https://www.cockroachlabs.com/docs/v21.1/secure-a-cluster.html
*
*
* WARNING: neither --listen-addr nor --advertise-addr was specified.
* The server will advertise "host1" to other nodes, is this routable?
* 
* Consider using:
* - for local-only servers:  --listen-addr=localhost
* - for multi-node clusters: --advertise-addr=<host/IP addr>
* 
*
CockroachDB node starting at 2021-08-04 11:06:32.535256815 +0000 UTC (took 0.7s)
build:               CCL v21.1.6 @ 2021/07/20 15:30:39 (go1.15.11)
webui:               http://host1:8080
sql:                 postgresql://root@host1:26257?sslmode=disable
RPC client flags:    cockroach <client cmd> --host=host1:26257 --insecure
logs:                /var/lib/cockroach/data/logs
temp dir:            /var/lib/cockroach/data/cockroach-temp414960422
external I/O path:   /var/lib/cockroach/data/extern
store[0]:            path=/var/lib/cockroach/data
storage engine:      pebble
status:              restarted pre-existing node
clusterID:           68d822f8-2efb-4754-a2f3-e21b39f58ae8
nodeID:              1

SSL/TLSまわりは、別の回で確認しましょう。

CockroachDBにはWebで参照できるコンソールが付属しているようで、http://[CockroachDBが動作しているホスト]:8080で
アクセスできます。

f:id:Kazuhira:20210804200813p:plain

ドキュメントは、こちら。

DB Console Overview | CockroachDB Docs

最後に、SQL Shellからアクセスしてみます。アクセス先のホストは、192.168.33.10とします。また、ここでも--insecureの
指定が必要になります。

$ cockroach sql --host=192.168.33.10:26257 --insecure
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: CockroachDB CCL v21.1.6 (x86_64-unknown-linux-gnu, built 2021/07/20 15:30:39, go1.15.11) (same version as client)
# Cluster ID: 68d822f8-2efb-4754-a2f3-e21b39f58ae8
No entry for terminal type "xterm-256color";
using dumb terminal settings.
#
# Enter \? for a brief introduction.
#
root@192.168.33.10:26257/defaultdb>

CockroachDBのリッスンポートは、デフォルトでは26257みたいですね。

データベースを作成してみましょう。

root@192.168.33.10:26257/defaultdb> create database example;
CREATE DATABASE

Time: 57ms total (execution 57ms / network 0ms)

root@192.168.33.10:26257/defaultdb> set database=example;
SET

Time: 19ms total (execution 18ms / network 0ms)

テーブルの作成とデータの登録。

root@192.168.33.10:26257/example> create table t1(id int primary key, name string);
CREATE TABLE

Time: 75ms total (execution 74ms / network 0ms)

root@192.168.33.10:26257/example> begin;
BEGIN

Time: 0ms total (execution 1ms / network 0ms)

root@192.168.33.10:26257/example  OPEN> insert into t1(id, name) values(1, 'カツオ');
INSERT 1

Time: 91ms total (execution 91ms / network 0ms)

root@192.168.33.10:26257/example  OPEN> insert into t1(id, name) values(2, 'タラオ');
INSERT 1

Time: 1ms total (execution 1ms / network 0ms)

root@192.168.33.10:26257/example  OPEN> commit;
COMMIT

Time: 19ms total (execution 18ms / network 0ms)

root@192.168.33.10:26257/example> select * from t1;
  id |  name
-----+---------
   1 | カツオ
   2 | タラオ
(2 rows)

Time: 2ms total (execution 2ms / network 1ms)

良さそうですね。

クラスタを構成してみる

最後に、3ノードでクラスタを構成してみましょう。ホスト名がhost1〜3、IPアドレスが192.168.33.10〜192.168.33.13の
3ノードで、CockroachDBクラスタを構成します。

ドキュメントは、こちらを参考に。

Start a Local Cluster (Secure) | CockroachDB Docs

まずは、以下のコマンドを全ノードで実行して準備します。

$ curl https://binaries.cockroachdb.com/cockroach-v21.1.6.linux-amd64.tgz | tar -xz && sudo cp -i cockroach-v21.1.6.linux-amd64/cockroach /usr/local/bin/
$ sudo mkdir -p /usr/local/lib/cockroach
$ sudo cp -i cockroach-v21.1.6.linux-amd64/lib/libgeos.so /usr/local/lib/cockroach/
$ sudo cp -i cockroach-v21.1.6.linux-amd64/lib/libgeos_c.so /usr/local/lib/cockroach/
$ sudo mkdir -p /var/lib/cockroach/data
$ sudo chown -R `whoami`:`whoami` /var/lib/cockroach

次に、CockroachDBノードを起動します。今回は、ノードごとに実行するコマンドを変更します。

host1。

$ cockroach start \
  --insecure \
  --store=/var/lib/cockroach/data \
  --advertise-addr=192.168.33.10:26257 \
  --join=192.168.33.10:26257 \
  --join=192.168.33.11:26257 \
  --join=192.168.33.12:26257 \
  --background

host2。

$ cockroach start \
  --insecure \
  --store=/var/lib/cockroach/data \
  --advertise-addr=192.168.33.11:26257 \
  --join=192.168.33.10:26257 \
  --join=192.168.33.11:26257 \
  --join=192.168.33.12:26257 \
  --background

host3。

$ cockroach start \
  --insecure \
  --store=/var/lib/cockroach/data \
  --advertise-addr=192.168.33.12:26257 \
  --join=192.168.33.10:26257 \
  --join=192.168.33.11:26257 \
  --join=192.168.33.12:26257 \
  --background

新しいオプションを指定しました。--joinはクラスタを構成するための初期ノードを指定します。--joinの複数回指定、
またはカンマ区切りで指定します。--backgroundはCockroachDBをバックグラウンドで動作させるための
オプションです。

ノードごとに違うのは--advertise-addrで、これはCockroachDBの内部通信に使うアドレスです。デフォルトでは
--listen-addrと同じ値が使われるようなのですが、どうもホスト名で解決しようとするようで、今回はIPアドレスでの
解決にしたいと思い指定しました。

ノードが起動したら、クラスタの初期化を行います。これは、1回だけ実行し、--hostオプションでは--joinで指定した
いずれかのノードを指定します。

$ cockroach init --insecure --host=192.168.33.10:26257
Cluster successfully initialized

今回は、host1上で実行しています。

ここまで行うと、Webコンソール上でクラスタが構成できていることが確認できます。

f:id:Kazuhira:20210804212959p:plain

サンプルワークロードをロードしてみる

CockroachDBには、いくつかのサンプルワークロードが付属しています。

cockroach workload | CockroachDB Docs

ワークロードは、全部で7種類あります。

cockroach workload / Workloads

$ cockroach workload init --help
set up tables for a workload

Usage:
  cockroach workload init [flags]
  cockroach workload init [command]

Available Commands:
  bank        Bank models a set of accounts with currency balances
  intro       Intro contains a single table with a hidden message
  kv          KV reads and writes to keys spread randomly across the cluster.
  movr        MovR is a fictional vehicle sharing company
  startrek    Star Trek models episodes and quotes from the tv show
  tpcc        TPC-C simulates a transaction processing workload using a rich schema of multiple tables
  ycsb        YCSB is the Yahoo! Cloud Serving Benchmark

〜省略〜

今回はmovrワークロードを選択してみましょう。host1上で、cockroach workload init movrを実行。

$ cockroach workload init movr 'postgresql://root@192.168.33.10:26257?sslmode=disable'
I210804 12:52:54.769355 1 workload/workloadsql/dataload.go:146  [-] 1  imported users (0s, 50 rows)
I210804 12:52:54.992126 1 workload/workloadsql/dataload.go:146  [-] 2  imported vehicles (0s, 15 rows)
I210804 12:52:55.385565 1 workload/workloadsql/dataload.go:146  [-] 3  imported rides (0s, 500 rows)
I210804 12:52:55.756980 1 workload/workloadsql/dataload.go:146  [-] 4  imported vehicle_location_histories (0s, 1000 rows)
I210804 12:52:56.212094 1 workload/workloadsql/dataload.go:146  [-] 5  imported promo_codes (0s, 1000 rows)
I210804 12:52:56.218272 1 workload/workloadsql/workloadsql.go:113  [-] 6  starting 8 splits
I210804 12:52:58.154380 1 workload/workloadsql/workloadsql.go:113  [-] 7  starting 8 splits
I210804 12:53:00.267930 1 workload/workloadsql/workloadsql.go:113  [-] 8  starting 8 splits

これで、データがロードされます。

--hostオプションなどは指定できないみたいですが、接続文字列は指定可能です。

なお、cockroach workload run [ワークロード名]でワークロードを使った負荷をかけます。

SQL Shellで接続して確認してみましょう。

$ cockroach sql --host=192.168.33.10:26257 --insecure --database movr

データが入ったようです。movrワークロードは、インメモリモードに入っていたものと同じようですね。

root@192.168.33.10:26257/movr> \d
  schema_name |         table_name         | type  | owner | estimated_row_count | locality
--------------+----------------------------+-------+-------+---------------------+-----------
  public      | promo_codes                | table | root  |                1000 | NULL
  public      | rides                      | table | root  |                 500 | NULL
  public      | user_promo_codes           | table | root  |                   0 | NULL
  public      | users                      | table | root  |                  50 | NULL
  public      | vehicle_location_histories | table | root  |                1000 | NULL
  public      | vehicles                   | table | root  |                  15 | NULL
(6 rows)

Time: 52ms total (execution 52ms / network 1ms)

同じデータが、各ノードから見れることを確認してみましょう。

$ cockroach sql --host=192.168.33.10:26257 --insecure --database movr --execute 'select count(*) from promo_codes;'
  count
---------
   1000
(1 row)

Time: 2ms


$ cockroach sql --host=192.168.33.11:26257 --insecure --database movr --execute 'select count(*) from promo_codes;'
  count
---------
   1000
(1 row)

Time: 221ms


$ cockroach sql --host=192.168.33.12:26257 --insecure --database movr --execute 'select count(*) from promo_codes;'
  count
---------
   1000
(1 row)

Time: 228ms

OKですね。

まとめ

CockroachDBをインストールして、動かしてみました。

けっこう簡単に動かせそうなので、これからちょっとずつ遊んでいってみましょう。