はじめに
CockroachDBをDocker Swarm環境上で動かし、高可用性と拡張性を試してみたの続きです。
今回、CockroachDBクラスター内のサービス数を増やし、CockroachDBの機能にて、データが自動でレプリカされるかを確認します。
環境
- Windows7
- Vagrant V1.8.6
- VirtualBox V4.3.10
- Coreos-alpha V1465.0.0
- CockroachDB V1.05
1.CockroachDBクラスターの起動(1クラスター/1サービス)
- 1.1. CoreOSのダウンロード
C:\Users\IBM_ADMIN>mkdir vagrant_test
C:\Users\IBM_ADMIN>cd vagrant_test
C:\Users\IBM_ADMIN\vagrant_test>git clone https://github.com/coreos/coreos-vagrant/
- 1.2. CoreOSの起動
Vagrantfileにて、インスタンス数が1個であることを確認します。
$num_instances = 1
CoreOSのインスタンスを1つ起動します。vagrant global-statusコマンドを実行し、stateがrunningであることを確認します。
C:\Users\IBM_ADMIN\vagrant_test>cd coreos-vagrant
C:\Users\IBM_ADMIN\vagrant_test\coreos-vagrant>vagrant up
Bringing machine 'core-01' up with 'virtualbox' provider...
(省略)
PS C:\Users\IBM_ADMIN\vagrant_test\coreos-vagrant> vagrant global-status
id name provider state directory
--------------------------------------------------------------------------------------
81ef246 core-01 virtualbox running C:/Users/IBM_ADMIN/vagrant_test/coreos-vagrant
- 1.3. Teraterm plugin導入と起動
C:\Users\IBM_ADMIN\vagrant_test\coreos-vagrant>vagrant plugin install vagrant-teraterm
C:\Users\IBM_ADMIN\vagrant_test\coreos-vagrant>vagrant teraterm core-01
- 1.4. CockroachDBのDockerイメージのダウンロード
起動させたTeratermから下記コマンドを実行します。CockroachDBは、執筆時点での最新版V1.0.5を使用します。
core@core-01 ~ $ sudo -s
core-01 core # docker pull cockroachdb/cockroach:v1.0.5
v1.0.5: Pulling from cockroachdb/cockroach
cd0a524342ef: Pull complete
6cf552a06a24: Pull complete
0d5d5f6dea12: Pull complete
Digest: sha256:9db5df93d2e453ec8c6b78a944a647ade3d63a96f840cb570a0158ea11a5a883
Status: Downloaded newer image for cockroachdb/cockroach:v1.0.5
core-01 core # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cockroachdb/cockroach v1.0.5 810ca9af6e1b 12 days ago 163MB
- 1.5. ブリッジネットワークの作成
1つのCoreOSインスタンス上に複数のDockerコンテナーを起動し、1つのDockerコンテナー上に1つのCockroachDBを稼働させます。
最初に、複数のDockerコンテナー間で通信するために、roachnetという名前のブリッジネットワークを作成します。
core-01 core # docker network create -d bridge roachnet
dfbe9d0ca6e76fdd8738d945ea34f4d4d9726294b428b80bf14fd1e618741b37
core-01 core # docker network ls
NETWORK ID NAME DRIVER SCOPE
725d01be8b96 bridge bridge local
da1a8876cfd5 host host local
94a03f6842f0 none null local
dfbe9d0ca6e7 roachnet bridge local
- 1.6. CockroachDBクラスターの起動
Dockerコンテナーノード上に、CockroachDBクラスターを起動します。
pullしたCockroachのDockerイメージを指定し、Dockerコンテナーを起動します。
コンテナー名はroach1、コンテナーホスト名はroach1とします。
他と通信するために26257ポート(=CockroachDB用)と8080ポート(=Admin UI用)をフォワードします。
コンテナー上の/cockroach/cockroach-dataを、ホストOS上の${PWD}/cockroach-data/roach1にマウントします。
動かしてみるのが目的ですので、InsecureモードでCockroachDBを起動します。
core-01 core # 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:v1.0.5 start --insecure \
--store=repdemo-node1
2. データの書き込みと確認
- 2.1. サンプルデータベースの作成
コンテナー名:roach1から、cockroach gemコマンドとcockroach sqlコマンドを実行し、製品で用意されているサンプルのデータベースを作成します。
core-01 core # docker exec -it roach1 bash
root@roach1:/cockroach# ./cockroach gen example-data intro | ./cockroach sql --insecure
CREATE DATABASE
SET
DROP TABLE
CREATE TABLE
INSERT 1
INSERT 1
(省略)
root@roach1:/cockroach# exit
- 2.2. Cockroachサンプルデータベースの確認
コンテナー名:roach1から、サンプルのデータベースの中身を確認します。
core-01 core # docker exec -it roach1 ./cockroach sql --insecure
# Welcome to the cockroach SQL interface.
# All statements must be terminated by a semicolon.
# To exit: CTRL + D.
root@:26257/> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| crdb_internal |
| information_schema |
| intro |
| pg_catalog |
| system |
+--------------------+
(5 rows)
root@:26257/> SHOW TABLES FROM intro;
+---------+
| Table |
+---------+
| mytable |
+---------+
(1 row)
root@:26257/> SELECT * FROM intro.mytable WHERE (l % 2) = 0;
+----+------------------------------------------------------+
| l | v |
+----+------------------------------------------------------+
| 0 | !__aaawwmqmqmwwwaas,,_ .__aaawwwmqmqmwwaaa,, |
| 2 | !"VT?!"""^~~^"""??T$Wmqaa,_auqmWBT?!"""^~~^^""??YV^ |
| 4 | ! "?##mW##?"- |
| 6 | ! C O N G R A T S _am#Z??A#ma, Y |
| 8 | ! _ummY" "9#ma, A |
| 10 | ! vm#Z( )Xmms Y |
| 12 | ! .j####mmm#####mm#m##6. |
| 14 | ! W O W ! jmm###mm######m#mmm##6 |
| 16 | ! ]#me*Xm#m#mm##m#m##SX##c |
| 18 | ! dm#||+*$##m#mm#m#Svvn##m |
| 20 | ! :mmE=|+||S##m##m#1nvnnX##; A |
| 22 | ! :m#h+|+++=Xmm#m#1nvnnvdmm; M |
| 24 | ! Y $#m>+|+|||##m#1nvnnnnmm# A |
| 26 | ! O ]##z+|+|+|3#mEnnnnvnd##f Z |
| 28 | ! U D 4##c|+|+|]m#kvnvnno##P E |
| 30 | ! I 4#ma+|++]mmhvnnvq##P` ! |
| 32 | ! D I ?$#q%+|dmmmvnnm##! |
| 34 | ! T -4##wu#mm#pw##7' |
| 36 | ! -?$##m####Y' |
| 38 | ! !! "Y##Y"- |
| 40 | ! |
+----+------------------------------------------------------+
(21 rows)
root@:26257/> \q
- 2.3. データのレプリカ確認
データのレプリカ状況を確認します。Webブラウザから、ホストオンリーアダプターのIPアドレスを指定し、http://(IPアドレス):8080/にアクセスします。[View nodes list]を選択し、roach1が登録されていることを確認します。
3. CockroachDBクラスターの起動(1クラスター/3サービス)
- 3.1. CockroachDBクラスターの起動(1クラスター/3サービス)
1で作成したCockroachDBクラスターに、別のDockerコンテナーノード上(=roach2)のCockroachDBを追加します。
pullしたCockroachのDockerイメージを指定し、Dockerコンテナーを起動します。
コンテナー名はroach2、コンテナーホスト名はroach2とします。
コンテナー上の/cockroach/cockroach-dataを、ホストOS上の${PWD}/cockroach-data/roach2にマウントします。
動かしてみるのが目的ですので、InsecureモードでCockroachDBを起動し、コンテナー名:roach1上のCockroachDBにジョインします。
core-01 core # docker run -d \
--name=roach2 \
--hostname=roach2 \
--net=roachnet \
-v "${PWD}/cockroach-data/roach2:/cockroach/cockroach-data" \
cockroachdb/cockroach:v1.0.5 start --insecure \
--store=repdemo-node2 \
--port=26258 \
--http-port=8081 \
--join=roach1
core-01 core # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad90eb659699 cockroachdb/cockroach:v1.0.5 "/cockroach/cockro..." 15 seconds ago Up 15 seconds 8080/tcp, 26257/tcp roach2
0b003551961c cockroachdb/cockroach:v1.0.5 "/cockroach/cockro..." About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp, 0.0.0.0:26257->26257/tcp roach1
1で作成したCockroachDBクラスターに、別のDockerコンテナーノード上(=roach3)のCockroachDBを追加します。
pullしたCockroachのDockerイメージを指定し、Dockerコンテナーを起動します。
コンテナー名はroach3、コンテナーホスト名はroach3とします。
コンテナー上の/cockroach/cockroach-dataを、ホストOS上の${PWD}/cockroach-data/roach3にマウントします。
動かしてみるのが目的ですので、InsecureモードでCockroachDBを起動し、コンテナー名:roach1上のCockroachDBにジョインします。
core-01 core # docker run -d \
--name=roach3 \
--hostname=roach3 \
--net=roachnet \
-v "${PWD}/cockroach-data/roach3:/cockroach/cockroach-data" \
cockroachdb/cockroach:v1.0.5 start --insecure \
--store=repdemo-node3 \
--port=26259 \
--http-port=8082 \
--join=roach1
core-01 core # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b5949a85c96 cockroachdb/cockroach:v1.0.5 "/cockroach/cockro..." 16 seconds ago Up 16 seconds 8080/tcp, 26257/tcp roach3
ad90eb659699 cockroachdb/cockroach:v1.0.5 "/cockroach/cockro..." 3 minutes ago Up 3 minutes 8080/tcp, 26257/tcp roach2
0b003551961c cockroachdb/cockroach:v1.0.5 "/cockroach/cockro..." About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp, 0.0.0.0:26257->26257/tcp roach1
- 3.2. データのレプリカ確認(レプリカ数=3)
データのレプリカ状況を確認します。Webブラウザから、ホストオンリーアダプターのIPアドレスを指定し、http://(IPアドレス):8080/にアクセスします。[View nodes list]を選択し、roach2とroach3が登録され、データがレプリカされていることを確認します。
CockroachDBは、デフォルトでデータのレプリカ数が3(=num_replicas: 3)に設定されています。
core-01 core # docker exec -it roach1 ./cockroach zone get .default --insecure
.default
range_min_bytes: 1048576
range_max_bytes: 67108864
gc:
ttlseconds: 86400
num_replicas: 3
constraints: []
従いまして、下図のように、均等にroach2とroach3にデータがレプリカされます。
4. CockroachDBクラスターの起動(1クラスター/3サービス/3レプリカ)
- 4.1. CockroachDBクラスターの起動(1クラスター/5サービス/)
1で作成したCockroachDBクラスターに、別のDockerコンテナーノード上(=roach4、roach5)のCockroachDBを追加します。
core-01 core # docker run -d \
--name=roach4 \
--hostname=roach4 \
--net=roachnet \
-v "${PWD}/cockroach-data/roach4:/cockroach/cockroach-data" \
cockroachdb/cockroach:v1.0.5 start --insecure \
--store=repdemo-node4 \
--port=26260 \
--http-port=8083 \
--join=roach1
core-01 core # docker run -d \
--name=roach5 \
--hostname=roach5 \
--net=roachnet \
-v "${PWD}/cockroach-data/roach5:/cockroach/cockroach-data" \
cockroachdb/cockroach:v1.0.5 start --insecure \
--store=repdemo-node5 \
--port=26261 \
--http-port=8084 \
--join=roach1
- 4.2. データのレプリカ確認(レプリカ数=3)
データのレプリカ状況を確認します。Webブラウザから、ホストオンリーアダプターのIPアドレスを指定し、http://(IPアドレス):8080/にアクセスします。[View nodes list]を選択し、roach4とroach5が登録され、データがレプリカされていることを確認します。
現在、データのレプリカ数が3(=num_replicas: 3)に設定されていますので、下図のように、roach4とroach5にもデータがレプリカされます。
最初のデータ量を10とすると、3つレプリカされて合計のデータ量が30になります。この30を5つのCockroachサービスで保持しています。
- 4.3. データのレプリカ数の変更
データのレプリカ数を3から5(=num_replicas: 5)に増やします。
core-01 core # docker exec -it roach1 bash
root@roach1:/cockroach# echo 'num_replicas: 5' | ./cockroach zone set .default --insecure -f -
range_min_bytes: 1048576
range_max_bytes: 67108864
gc:
ttlseconds: 86400
num_replicas: 5
constraints: []
- 4.4. データのレプリカ確認(レプリカ数=5)
データのレプリカ状況を確認します。Webブラウザから、ホストオンリーアダプターのIPアドレスを指定し、http://(IPアドレス):8080/にアクセスします。[View nodes list]を選択し、データがレプリカされていることを確認します。
現在は、サービス数=5、レプリカ数=5ですので、下図のように均等にデータがレプリカされています。
5. CockroachDBクラスターの停止
最後に、コンテナ名を指定し、Dockerコンテナーを停止します。
core-01 core # docker stop roach1 roach2 roach3 roach4 roach5
まとめ
CockroachDBのデータレプリカを確認してみました。CockroachDBクラスターのサービス数もレプリカ数も、自由自在に増減できそうです。
データベースであっても、Active-Activeの構成を選択できそうです。そして、それらの管理は製品機能で実施してくれるので、運用を気にしないで済む(=軽減される)。(安易で申し訳ないのですが)マイクロサービスのアーキテクチャーを(ACID特性が求められる)データベースでも実現できる世界は近いかも知れません。
参考
Data Replication
Qiita:Cockroach関連記事 1.CockroachDBをDocker環境上で動かしてみる
Qiita:Cockroach関連記事 2.CockroachDBをDocker環境上で動かし、サンプルデータベースをselectして、ぎょっとする
Qiita:Cockroach関連記事 3.CockroachDBをDocker Swarm環境上で動かし、高可用性と拡張性を試してみた