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가 시작되었음을 알기 위해 사용하는 것으로 보이지만 몇 초 동안 연결 수신을 시작하지 않습니다.
이를 수행할 수 있는 체계적인 방법이 있습니까?
내 아이디어 중 하나는 시작하기 전에 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'