web-dev-qa-db-ja.com

Cassandra withdocker-composeの初期化スクリプト

Cassandraコンテナの先頭に、キースペースと列ファミリを作成したいと思います。

docker-compose.ymlファイルで次のことを試しました。

# shortened for clarity
cassandra:
    hostname: my-cassandra
    image: my/cassandra:latest
    command: "cqlsh -f init-database.cql"

画像my/cassandra:latestには、init-database.cql/が含まれています。しかし、これはうまくいかないようです。

これを実現する方法はありますか?

9
blakelead

最近、Cassandraのリファレンスアプリケーションである KillrVideo で同様の問題を解決しようとしました。 Docker Composeを使用して、DataStax Enterprise(Cassandraなど)ノードを含むアプリケーションに必要な環境を起動しています。 CQLスキーマのインストールを初めて開始したときに、そのノードでブートストラップを実行する必要がありました(cqlshを使用して、実行しようとしているのと同じように.cqlファイルでステートメントを実行します)。基本的に、私たちが採用したアプローチは、Dockerエントリポイント用のシェルスクリプトを作成することでした。

  1. 通常どおりノードを起動しますが、バックグラウンドで起動します。
  2. ポート9042が使用可能になるまで待機します(これは、クライアントが接続してCQLステートメントを実行する場所です)。
  3. cqlsh -fを使用して、いくつかのCQLステートメントを実行し、スキーマを初期化します。
  4. バックグラウンドで実行されているノードを停止します。
  5. ノードを正常に起動するDockerイメージの通常のエントリポイントに進みます(Dockerが期待するようにフォアグラウンドで)。

ファイルの存在を使用して、ノードがすでにブートストラップされているかどうかを示し、起動時にそれをチェックして、上記のロジックを実行する必要があるかどうか、または通常どおりに起動できるかどうかを判断します。結果は GitHubのkillrvideo-dse-dockerリポジトリ で確認できます。

このアプローチには1つの注意点があります。これは、リファレンスアプリケーションでは、単一のノードのみをスピンアップしているため(つまり、複数のノードでクラスターを作成していないため)、非常にうまく機能しました。複数のノードを実行している場合は、複数のクライアントがスキーマを作成するために、ノードの1つのみがブートストラップを実行することを確認する必要があります。スキーマを同時に変更すると、クラスターでいくつかの問題が発生する可能性があります。 (これは 既知の問題です そしてうまくいけばいつか修正されるでしょう。)

6
Luke Tillman

私もこの質問の解決策を探していました、そしてこれが私がそれを達成した方法です。
ここで、Cassandraの2番目のインスタンスにはschema.cqlのボリュームがあり、CQLSHコマンドを実行します

My Version with healthcheck これで、sleepコマンドを削除できます

version: '2.2'

services:
  cassandra:
      image: cassandra:3.11.2
      container_name: cassandra
      ports:
        - "9042:9042"
      environment:
        - "MAX_HEAP_SIZE=256M"
        - "HEAP_NEWSIZE=128M"
      restart: always
      volumes:
        - ./out/cassandra_data:/var/lib/cassandra
      healthcheck:
        test: ["CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces"]
        interval: 15s
        timeout: 10s
        retries: 10

  cassandra-load-keyspace:
      container_name: cassandra-load-keyspace
      image: cassandra:3.11.2
      depends_on:
        cassandra:
          condition: service_healthy
      volumes:
        - ./src/main/resources/cassandra_schema.cql:/schema.cql
      command: /bin/bash -c "echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"

NetFlixバージョンsleep

version: '3.5'

services:
  cassandra:
      image: cassandra:latest
      container_name: cassandra
      ports:
        - "9042:9042"
      environment:
        - "MAX_HEAP_SIZE=256M"
        - "HEAP_NEWSIZE=128M"
      restart: always
      volumes:
        - ./out/cassandra_data:/var/lib/cassandra

  cassandra-load-keyspace:
      container_name: cassandra-load-keyspace
      image: cassandra:latest
      depends_on:
        - cassandra
      volumes:
        - ./src/main/resources/cassandra_schema.cql:/schema.cql 
      command: /bin/bash -c "sleep 60 && echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"

P.S私はこの方法を Netflix Repos の1つで見つけました

3
Dias