kong precisa ser iniciado após o cassandra, mas a cassandra demora a aceitar conexões, então o kong não inicia

3

Estou configurando o kong como um gateway de API. Requer cassandra.

Estou usando o Centos 7 e criei o arquivo de unidade systemd para cada um com o kong começando após o cassandra e exigindo o cassandra.

Aqui estão os arquivos da minha unidade.

Kong:

[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

Cassandra:

[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

O Kong sempre falha, pois a cassandra ainda não aceita conexões. O Cassandra cria seu arquivo pid, que parece ser o que o systemd usa para saber que está pronto, mas não começa a escutar conexões por alguns segundos.

Existe uma boa maneira de fazer isso funcionar?

Uma de minhas ideias era criar um script separado para kong que esperaria que a porta TCP da cassandra estivesse ouvindo antes de iniciar.

Se a cassandra não for bifurcada até que esteja realmente pronta, ou não crie o arquivo pid até que esteja realmente pronto, acho que isso iria consertar isso.

    
por Gregory 09.11.2015 / 22:41

1 resposta

4

Você pode usar uma diretiva ExecStartPost= no cassandra.service que aguardará até que o Cassandra esteja permitindo conexões. Isso atrasará o evento "start" do Cassandra e, portanto, atrasará o início do Kong.

@Gregory surgiu com:

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'
    
por 10.11.2015 / 22:27

Tags