我正在将 kong 设置为 API 网关。它需要卡桑德拉。
我使用的是 Centos 7,我为每个 kong 创建了 systemd 单元文件,该文件在 cassandra 之后开始,并且需要 cassandra。
这是我的单位文件。
孔:
[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 用来知道它已启动的文件,但它在几秒钟内不会开始侦听连接。
有没有一个好的系统方法来完成这项工作?
我的想法之一是为 kong 创建一个单独的脚本,在启动之前等待 cassandra TCP 端口侦听。
如果 cassandra 在实际准备好之前不会分叉,或者在实际准备好之前不会创建 pid 文件,我认为这会解决它。
答案1
您可以ExecStartPost=
在 中使用指令,cassandra.service
该指令将等待 Cassandra 允许连接。这将延迟 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'