KongはCassandraの後に開始する必要がありますが、Cassandraは実際に接続を非常に遅く受け入れるため、Kongを起動できません。

KongはCassandraの後に開始する必要がありますが、Cassandraは実際に接続を非常に遅く受け入れるため、Kongを起動できません。

kongをAPIゲートウェイに設定しています。カサンドラが必要です。

私はCentos 7を使用しており、cassandraの後に起動し、cassandraが必要な各kongに対してsystemdユニットファイルを作成しました。

これは私のユニットファイルです。

穴:

[Unit]
Description=Kong API Gateway
After=network.target
After=cassandra.service
Requires=cassandra.service

[Service]
ExecStart=/usr/local/bin/kong start
ExecStop=/usr/local/bin/kong stop
ExecReload=/usr/local/bin/kong reload
Type=forking
PIDFile=/usr/local/kong/kong.pid

[Install]
WantedBy=default.target

カサンドラ:

[Unit]
Description=Cassandra DB
After=network.target

[Service]
ExecStart=/opt/apache-cassandra-2.1.11/bin/cassandra -p /run/cassandra.pid
ExecStop=/usr/bin/kill $(cat /run/cassandra.pid)
Type=forking
PIDFile=/run/cassandra.pid

[Install]
WantedBy=default.target

Cassandraがまだ接続を受け入れていないため、Kongは常に失敗します。 Cassandraはpidファイルを生成しますが、これはsystemdが起動したことを知るために使用されているようですが、数秒間接続の受信を開始しません。

これを行うための体系的な方法はありますか?

私のアイデアの1つは、始める前にcassandra TCPポートがリッスンするのを待っているkong用の別のスクリプトを作成することです。

Cassandraが実際に準備されるまでフォークしない場合、または実際に準備されるまでpidファイルを生成しない場合、これは問題を解決すると思います。

答え1

Cassandraが接続を許可するのを待つExecStartPost=ディレクティブを使用できます。cassandra.serviceこれにより、Cassandraの「開始」イベントが遅れ、Kongの開始が遅れます。

@Gregoryが見つけました。

ExecStartPost=/bin/bash -c 'for i in `seq 1 100`; do \
        if lsof -Pi :5671 -sTCP:LISTEN &>/dev/null; then \
            exit 0; \
        fi; \
        sleep 0.1; \
    done; \
    exit 1'

関連情報