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'