プロジェクト

全般

プロフィール

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

Quick Setup of a Multi-node Cluster Database with Cassandra


約2時間前に更新