Cassandra DBをDocker Composeで動かす¶
Cassandra DB のクラスタを、1台のPC上で構成します。主に開発・検証用です。
同じマシン上で複数のCassandraノードをDockerコンテナで実行するには、複数のDockerコンテナを連動して実行する Docker compose を使用します。
まず、作業ディレクトリを作成し、そこに compose.yaml ファイルを定義します。
通常 各ノードのcassandra.yamlに設定を記述する方法は、同じDockerイメージから複数コンテナを起動する場合に適用が難しいので、環境変数から設定を各ノードに入れます。
ステップ by ステップ¶
クラスタを組まないで3ノード実行¶
compose.yamlの記述¶
3ノードをDocker Composeで実行するので、サービスを3つ記述します。サービスの内容は、起動するだけの最低限の記述としてDockerイメージ名とコンテナ名を指定します。
services:
cassandra1:
image: cassandra:5.0.9
container_name: cassandra1
cassandra2:
image: cassandra:5.0.9
container_name: cassandra2
cassandra3:
image: cassandra:5.0.9
container_name: cassandra3
単一コンテナの起動¶
まずはこの設定ファイルで単一のコンテナ(cassandra1)が起動できるか確認します。
~cassandra_docker$ docker compose up -d cassandra1
[+] Running 1/1
✔ Container cassandra1 Started 0.2s
~cassandra_docker$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1a96b1273ef cassandra:5.0.9 "docker-entrypoint.s…" 4 seconds ago Up 4 seconds 7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp cassandra1
3ノードの起動¶
Docker composeで3つのコンテナが起動できることを確認します。
~cassandra_docker$ docker compose up -d
[+] Running 4/4
✔ Network docker2_default Created ✔ Container cassandra2 Started ✔ Container cassandra3 Started
✔ Container cassandra1 Started
この状態で、ノードの情報を参照するとクラスタにはなっておらず各コンテナが単独ノードとして動いています。
~cassandra_docker$ docker exec cassandra1 nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.19.0.4 172.12 KiB 16 100.0% cb9bc4d4-6ebb-4353-bbf3-1d6605abf508 rack1
クラスタを構成する¶
この3つのCassandraコンテナで同一のクラスタを組むには、追加の設定が必要です。
シード・ノードの定義¶
ノードが起動したときに、クラスタ構成を問い合わせるノードをシードとして指定します。同一データセンター内で最低1つのノードを指定しますが、障害を考慮して2つないし3つをシードに指定するのが定番です。シードが正常に稼働していないと、新規参入するノードがクラスタに加わることができません。
そのため、新規にクラスタを構築するときは、まずシードノードが正常に起動したあとに、追加のノードを起動していきます。
cassandra2:
image: cassandra:5.0.9
container_name: cassandra2
+ environment:
+ - CASSANDRA_SEEDS: cassandra1
cassandra3:
image: cassandra:5.0.9
container_name: cassandra3
+ environment:
+ - CASSANDRA_SEEDS: cassandra1
シードノードとなるcassandra1にはシードの定義は不要です。
まず、cassandra1から手動で順番にコンテナを起動し、都度 nodetool でステータスを確認します。
- cassandra1の起動
docker compose up -d cassandra1 - cassandra1のnodetool status確認
$ docker exec cassandra1 nodetool status Datacenter: datacenter1 ======================= Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 172.19.0.4 172.12 KiB 16 100.0% cb9bc4d4-6ebb-4353-bbf3-1d6605abf508 rack1
- cassandra1のステータスがUNになったことを確認し、cassandra2の起動
docker compose up -d cassandra2 - しばらく待ってから、nodetoolのsutatus確認
$ docker exec cassandra1 nodetool status Datacenter: datacenter1 ======================= Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 172.19.0.2 119.83 KiB 16 100.0% f2a68fdc-c15d-445c-9a67-e6f0c81aefcc rack1 UN 172.19.0.3 119.67 KiB 16 100.0% e92cbc68-bd5f-4755-8f00-2d082c856a97 rack1
- cassandra2のステータスがUNになったことを確認し、 cassandra3の起動
docker compose up -d cassandra3 - しばらく待ってから、nodetoolのsutatus確認
$ docker exec cassandra1 nodetool status Datacenter: datacenter1 ======================= Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 172.19.0.4 30.9 KiB 16 76.0% 03efb4bf-0722-4188-925d-d3fcc18a79ee rack1 UN 172.19.0.2 119.83 KiB 16 64.7% f2a68fdc-c15d-445c-9a67-e6f0c81aefcc rack1 UN 172.19.0.3 85.11 KiB 16 59.3% e92cbc68-bd5f-4755-8f00-2d082c856a97 rack1
- cluster_nameはデフォルトでTest Clusterとなるので、cluster_name未設定でも同じクラスタを組むことができます
- この設定で、すべてのノードをcomopseで新規起動すると、クラスタが
ノードの起動タイミングの制御¶
Cassandraのノードを複数同時起動するとクラスタ構成がうまくいかないので、順序立てて起動します。
- servicesの定義で、depends_onを定義し先に起動されているべきノードを指定
- serivcesの定義で、healthcheckを定義し、そのノードが起動完了していることをチェックする定義を記述
未整理メモ¶
- Snitchの設定
Rack、Data centerを意識しない構成なら SimpleSnitchでもよい
Rack、Data centerを考慮する構成なら GossipingPropertyFileSnitch - GossipingPropertyFileSnitchを設定したら、CASSANDRA_DCを明示的に指定
- cassandra.yaml の cluster_name設定、cassandra-rackdc.properties の dc設定と同等
資料¶
Running Apache Cassandra Single and Multi-Node Clusters on Docker with Docker Compose