Docker Composeを利用したZooKeeper擬似クラスタの構築手順

分散アプリケーションのコーディネーションを担うZooKeeperは、高可用性を確保するために通常は複数台のサーバーでクラスタ(アンサンブル)を構成します。開発やテストの目的で、物理的なマシンを複数用意することなくローカル環境でクラスタの動作を確認したい場合、Docker Composeを利用した「擬似クラスタ」の構築が非常に効率的です。

1. Docker Compose設定ファイルの作成

3つのノード(znode1, znode2, znode3)で構成されるZooKeeperクラスタを定義します。以下の内容で docker-compose.yml ファイルを作成してください。

version: '3.8'

services:
  znode1:
    image: zookeeper:3.9
    container_name: zk-cluster-node1
    restart: always
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=znode2:2888:3888;2181 server.3=znode3:2888:3888;2181
      ZOO_4LW_COMMANDS_WHITELIST: "*"
    ports:
      - "2181:2181"
    volumes:
      - ./zk_storage/node1/data:/data
      - ./zk_storage/node1/log:/datalog

  znode2:
    image: zookeeper:3.9
    container_name: zk-cluster-node2
    restart: always
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=znode1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=znode3:2888:3888;2181
      ZOO_4LW_COMMANDS_WHITELIST: "*"
    ports:
      - "2182:2181"
    volumes:
      - ./zk_storage/node2/data:/data
      - ./zk_storage/node2/log:/datalog

  znode3:
    image: zookeeper:3.9
    container_name: zk-cluster-node3
    restart: always
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=znode1:2888:3888;2181 server.2=znode2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
      ZOO_4LW_COMMANDS_WHITELIST: "*"
    ports:
      - "2183:2181"
    volumes:
      - ./zk_storage/node3/data:/data
      - ./zk_storage/node3/log:/datalog

networks:
  default:
    name: zk-internal-net

主要な設定パラメータの解説

  • ZOO_MY_ID: 各ノードを一意に識別するためのIDです(1〜255)。
  • ZOO_SERVERS: クラスタを構成する全サーバーのリストです。フォーマットは server.id=hostname:quorum_port:election_port;client_port となります。自分自身を指す場合は 0.0.0.0 を指定するのが一般的です。
  • ports: ホストマシンから各ノードにアクセスできるよう、クライアントポート(2181)を異なるポート(2181, 2182, 2183)にマッピングしています。
  • volumes: コンテナを削除してもデータが消えないよう、ホスト上のディレクトリに永続化しています。

2. クラスタの起動と動作確認

ターミナルで設定ファイルのあるディレクトリへ移動し、以下のコマンドを実行します。

# コンテナをバックグラウンドで起動
docker-compose up -d

# 起動状態の確認
docker-compose ps

次に、各ノードの役割(LeaderまたはFollower)を確認します。

docker exec zk-cluster-node1 zkServer.sh status
docker exec zk-cluster-node2 zkServer.sh status
docker exec zk-cluster-node3 zkServer.sh status

出力の中に Mode: leader または Mode: follower という記述があれば、正常にクラスタが組まれています。

3. 高可用性の検証(フェイルオーバー)

クラスタの耐障害性をテストするために、現在のLeaderノードを意図的に停止させてみます。

  1. zkServer.sh statusleader と表示されたノードを停止します(例: node1の場合)。
    docker stop zk-cluster-node1
  2. 残りのノード(node2, node3)の状態を再度確認します。
    docker exec zk-cluster-node2 zkServer.sh status
    いずれかのノードが新しく leader に昇格していれば、自動選出が正しく機能しています。
  3. 停止したノードを復帰させます。
    docker start zk-cluster-node1
    復帰したノードは follower としてクラスタに再参加します。

4. ZooKeeper CLIによるデータ操作

いずれかのノードにログインして、データの読み書きを試行します。

# node1のCLIに接続
docker exec -it zk-cluster-node1 zkCli.sh

# ノードの作成
[zk: localhost:2181] create /test_node "hello_zookeeper"

# データの取得
[zk: localhost:2181] get /test_node

別のノード(例: zk-cluster-node2)に接続しても、同じパス /test_node からデータが取得できるはずです。これにより、データがクラスタ全体で同期されていることが確認できます。

5. クリーンアップ

テストが終了し、環境を削除する場合は以下のコマンドを実行します。

# コンテナとネットワークの削除
docker-compose down

# データも含めて完全に削除する場合(ボリュームの削除)
# docker-compose down -v

タグ: ZooKeeper Docker Compose Distributed Systems containerization

8月24日 00:34 投稿