JSONベースでドキュメント指向のデータベースでスケールするCouchbase Serverのように、最初からスケールする設計のNoSQLを選択した方がRDBMSよりも適しているケースが増えていると思います。今回はIDCFクラウドにDockerのMulti-host networkを構築したのでCouchbaseもセットアップしてみます。
このシリーズ
- IDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 1: Overlayネットワークの作成
- IDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 2: Docker Swarmクラスタの作成
- IDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 3: OverlayネットワークとDocker SwarmとDocker ComposeでRethinkDBをスケールさせる
- IDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 4: Couchbase Serverをスケールしてみる
Multi-host network
Docker 1.9から採用されたMulti-host networkとDocker SwarmのセットアップはIDCFクラウドのDebian JessieでMulti-Host Docker Networking - Part 2: Docker Swarmクラスタの作成を参考にしてください。
仮想マシン
Swarmクラスタは以下の仮想マシンで構成しています。
Dockerホストのhostname | Dockerホストのeth0 | Docker Swarm |
---|---|---|
minion-1 | 10.3.0.101 | Swarm Manager/Agent |
minion-2 | 10.3.0.102 | Swarm Agent |
minion-3 | 10.3.0.103 | Swarm Agent |
docker-compose.yml
Docker Swarmに参加しているノードでDockcer Composeのディレクトリを作成します。どこでも構いませんが今回はminion-1 (10.3.0.101)
の仮想マシンで作業します。デフォルトではこのディレクトリ名がDockerネットワーク名として自動的に作成されます。
$ mkdir ~/couch
$ cd !$
Dockerイメージは公式のcouchbaseを使います。ライセンスについてはEnterprise版でも以下の条件で無償で使うことができるのでDockerイメージもEnterprise版にします。
非商用利用では無制限のノード、商用利用2ノードまで無償で利用
docker-compose.ymlを作成します。couchbase
サービスはDocker ComposeとDocker Swarmを使ってスケールさせるコンテナです。anti-affinityを設定して同じDockerホストでは起動を避けるようにします。proxy
サービスもCouchbase Server クラスタに参加しますが、DockerホストにマップしてパブリックIPアドレスから管理画面などを操作できるように公開します。
couchbase:
image: couchbase:enterprise
environment:
- "affinity:container!=couch_couchbase_*"
proxy:
image: couchbase:enterprise
environment:
- constraint:node==minion-3
ports:
- 8091:8091
- 8092:8092
- 8093:8093
- 11210:11210
up
~/couch
ディレクトリに移動します。DOCKER_HOST
環境変数にSwarm Manager (10.3.0.101) を指定してupします。--x-networking
フラグでDocker Composeからnetworkを有効にします。--x-network-driver=overlay
フラグでOverlayネットワークドライバを指定します。
$ cd ~/couch
$ export DOCKER_HOST=tcp://10.3.0.101:3333
$ docker-compose \
--x-networking \
--x-network-driver=overlay \
up -d
minion-1
の仮想マシンでup
しましたがDocker Swarm環境なので、minion-3/couch_proxy_1
とminion-2/couch_couchbase_1
にコンテナが起動しました。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bc37df3ff03 couchbase:enterprise "/entrypoint.sh couch" 6 seconds ago Up 4 seconds 10.3.0.103:8091-8093->8091-8093/tcp, 11207/tcp, 11211/tcp, 10.3.0.103:11210->11210/tcp, 18091-18092/tcp minion-3/couch_proxy_1
5c4f9006df94 couchbase:enterprise "/entrypoint.sh couch" 8 seconds ago Up 6 seconds 8091-8093/tcp, 11207/tcp, 11210-11211/tcp, 18091-18092/tcp minion-2/couch_couchbase_1
またMulti-host network構成にしているので異なるDockerホストのコンテナが同じネットワークアドレスにつながっています。
$ docker inspect --format="{{ .NetworkSettings.Networks.couch.IPAddress }}" minion-2/couch_couchbase_1
10.0.1.2
$ docker inspect --format="{{ .NetworkSettings.Networks.couch.IPAddress }}" minion-3/couch_proxy_1
10.0.1.3
Couchbase Server クラスタへのノードの追加
RethinkDBの時はDocker Composeでscaleさせるとコンテナが自動的にクラスタが追加されたのですがCouchbaseの場合は管理画面かREST APIを使う必要があります。proxy
サービスのコンテナ自身もCouchbase Server クラスタに参加していますが、パブリックIPアドレスから接続する役割をもたせました。
proxy:
image: couchbase:enterprise
environment:
- constraint:node==minion-3
proxy
サービスのコンテナをブラウザからCouchbaseの管理画面を8091ポートで開きます。
初期設定を行います。テスト用にサンプルのバケットを作成してデータを投入しておきます。
Enterprise版を利用しているのでライセンスに同意します。非商用の場合ノードは無制限で利用できます。
Server Nodes
タブからノードの追加をします。minion-2/couch_couchbase_1
コンテナのIPアドレス、10.0.1.2を登録します。
Pending Rebalance
ボタンを押してクラスタのリバランスをします。クラスタにサーバーを追加してデータやRAM、CPU利用の再配置が簡単にできるのがCouchbaseの魅力です。
scale
Docker Composeを使ってscaleしてみます。couchbase
サービスを3に変更します。コンテナが2つ追加されました。
$ docker-compose \
--x-networking \
--x-network-driver=overlay \
scale couchbase=3
Creating and starting 2 ... done
Creating and starting 3 ... done
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0c34609c697 couchbase:enterprise "/entrypoint.sh couch" 57 seconds ago Up 56 seconds 8091-8093/tcp, 11207/tcp, 11210-11211/tcp, 18091-18092/tcp minion-3/couch_couchbase_3
dd3aca431d53 couchbase:enterprise "/entrypoint.sh couch" 57 seconds ago Up 56 seconds 8091-8093/tcp, 11207/tcp, 11210-11211/tcp, 18091-18092/tcp minion-1/couch_couchbase_2
4bc37df3ff03 couchbase:enterprise "/entrypoint.sh couch" 39 minutes ago Up 39 minutes 10.3.0.103:8091-8093->8091-8093/tcp, 11207/tcp, 11211/tcp, 10.3.0.103:11210->11210/tcp, 18091-18092/tcp minion-3/couch_proxy_1
5c4f9006df94 couchbase:enterprise "/entrypoint.sh couch" 39 minutes ago Up 39 minutes 8091-8093/tcp, 11207/tcp, 11210-11211/tcp, 18091-18092/tcp minion-2/couch_couchbase_1
minion-1/couch_couchbase_2
とminion-3/couch_couchbase_3
のコンテナのIPアドレスを確認します。
$ docker inspect --format="{{ .NetworkSettings.Networks.couch.IPAddress }}" minion-1/couch_couchbase_2
10.0.1.4
$ docker inspect --format="{{ .NetworkSettings.Networks.couch.IPAddress }}" minion-3/couch_couchbase_3
10.0.1.5
scaleした2つのコンテナをCouchbase管理画面から先ほどと同様に追加してrebalanceします。サーバーの追加もとても簡単です。
minion-3
の仮想マシンにはminion-3/couch_proxy_1 (10.0.1.3)
とminion-3/couch_couchbase_3 (10.0.1.3)
が起動していますが、DockerのMulti-host networkのおかげでこれまでDocker単体では難しかったMultiple hosts, multiple containers per hostもとても簡単になりました。
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
│ Host OS (Linux) │ │ Host OS (Linux) │
│ ┌─────────────────┐ ┌─────────────────┐ │ │ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Container OS │ │ Container OS │ │ │ │ Container OS │ │ Container OS │ │
│ │ (Ubuntu) │ │ (Ubuntu) │ │ │ │ (Ubuntu) │ │ (Ubuntu) │ │
│ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │
│ │ │ Couchbase │ │ │ │ Couchbase │ │ │ │ │ │ Couchbase │ │ │ │ Couchbase │ │ │
│ │ │ Server │ │ │ │ Server │ │ │ │ │ │ Server │ │ │ │ Server │ │ │
│ │ └───────────┘ │ │ └───────────┘ │ │ │ │ └───────────┘ │ │ └───────────┘ │ │
│ └─────────────────┘ └─────────────────┘ │ │ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘
Couchbase Serverクラスタは以下のように構成されました。
コンテナのhostname | コンテナのIPアドレス | Dockerホスト | DockerホストのIPアドレス |
---|---|---|---|
couch_couchbase_1 | 10.0.1.2 | minion-2 | 10.3.0.102 |
couch_proxy_1 | 10.0.1.3 | minion-3 | 10.3.0.103 |
couch_couchbase_2 | 10.0.1.4 | minion-1 | 10.3.0.101 |
couch_couchbase_3 | 10.0.1.5 | minion-3 | 10.3.0.103 |
XCDR
IDCFクラウドのリージョンは白河の東日本リージョンと北九州の西日本リージョンが選択できます。リージョン間の接続も簡単にできそうなので、CouchbaseのCross Datacenter Replication (XCDR)機能も使ってみたいと思います。