kong 需要在 cassandra 之后启动,但 cassandra 实际接受连接的速度很慢,因此 kong 无法启动

kong 需要在 cassandra 之后启动,但 cassandra 实际接受连接的速度很慢,因此 kong 无法启动

我正在将 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'

相关内容