これは、なにをしたくて書いたもの?
前々から少し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は無料利用ができます。
ライセンスは、現在は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で実装されているようです。
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ですね。
インメモリのデモデータベースで起動する
では、起動してみましょう。ドキュメントに記載されている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については、このあたりを見るとよいでしょう。
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
CockroachDBにはWebで参照できるコンソールが付属しているようで、http://[CockroachDBが動作しているホスト]:8080
で
アクセスできます。
ドキュメントは、こちら。
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コンソール上でクラスタが構成できていることが確認できます。
サンプルワークロードをロードしてみる
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をインストールして、動かしてみました。
けっこう簡単に動かせそうなので、これからちょっとずつ遊んでいってみましょう。