Nie udało się uruchomić aplikacji Zookeeper

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Krótki opis problemu

Nie można uruchomić procesu ZooKeeper.

Komunikaty o błędach

Gdy próbujesz uruchomić proces ZooKeeper, pojawia się ten komunikat o błędzie wskazujący, że nie udało się uruchomić ZooKeeper:

+ apigee-service apigee-zookeeper status
apigee-service: apigee-zookeeper: Not running (DEAD)
apigee-all: Error: status failed on [apigee-zookeeper]

Możliwe przyczyny

W tabeli poniżej znajdziesz możliwe przyczyny tego problemu:

Przyczyna Dla
Nieprawidłowo skonfigurowany identyfikator ZooKeeper Użytkownicy Edge Private Cloud
Port ZooKeeper jest używany Użytkownicy Edge Private Cloud
Nieprawidłowy identyfikator procesu w pliku apigee-zookeeper.pid Użytkownicy Edge Private Cloud
Nie udało się wybrać lidera ZooKeeper Użytkownicy Edge Private Cloud

Kliknij link w tabeli, aby zobaczyć możliwe rozwiązania tego problemu.

Nieprawidłowo skonfigurowany identyfikator ZooKeeper

W sekcjach poniżej znajdziesz omówienie pliku myid oraz informacje o tym, jak zdiagnozować i rozwiązać problemy z nieprawidłową konfiguracją.

Omówienie pliku myid

W każdym węźle ZooKeeper znajdują się 2 pliki:

  1. Plik /opt/apigee/apigee-zookeeper/conf/zoo.cfg zawierający listę adresów IP wszystkich węzłów ZooKeeper w klastrze.

    Jeśli na przykład plik /opt/apigee/apigee-zookeeper/conf/zoo.cfg zawiera adresy IP 3 węzłów ZooKeeper należących do klastra w ten sposób:

    server.1=11.11.11.11:2888:3888
    server.2=22.22.22.22:2888:3888
    server.3=33.33.33.33:2888:3888
  2. Plik /opt/apigee/data/apigee-zookeeper/data/myid zawiera 1 wiersz tekstu, który odpowiada numerowi serwera danego węzła ZooKeeper. Identyfikator myid serwera 1 będzie zawierać tekst „1” i nic więcej. Identyfikator musi być unikalny w obrębie zespołu i mieć wartość od 1 do 255.

    Na przykład na serwerze ZooKeeper.1 plik /opt/apigee/data/apigee-zookeeper/data/myid powinien zawierać tylko tekst 1 jak pokazano poniżej:

    $ cat myid
    1

Diagnostyka

  1. Sprawdź, czy w dzienniku ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log nie ma błędów.
  2. Jeśli widzisz komunikat ostrzegawczy podobny do „Connection broken for id #, my id = #”, jak pokazano na ilustracji poniżej, przyczyną tego problemu może być nieprawidłowa konfiguracja lub uszkodzenie serwera # w pliku myid.
    [myid:2] - WARN [RecvWorker:2:QuorumCnxManager$RecvWorker@762] -
      Connection broken for id 2, my id = 2, error = java.io.EOFException
        at java.io.DataInputStream.readInt(DataInputStream.java:375)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager$RecvWorker.
          run(QuorumCnxManager.java:747)
  3. Sprawdź plik /opt/apigee/apigee-zookeeper/conf/zoo.cfg i zanotuj serwer.# dla bieżącego węzła ZooKeeper.
  4. Sprawdź plik /opt/apigee/data/apigee-zookeeper/data/myid i zobacz, czy tekst w tym pliku pasuje do serwera.# zanotowanego w kroku 2.
  5. Jeśli występuje niezgodność, oznacza to, że udało Ci się zidentyfikować przyczynę niepowodzenia uruchomienia ZooKeeper.

Rozwiązanie

Jeśli plik myid jest nieprawidłowo skonfigurowany, otwórz go do edycji i zastąp wartość a prawidłowym tekstem reprezentującym parametr serwer.# w pliku zoo.cfg.

Port ZooKeeper jest używany

Diagnostyka

  1. Sprawdź, czy w dzienniku ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log nie ma błędów.
  2. Jeśli podczas wiązania z portem 2181 zauważysz wyjątek java.net.BindException: Address already in use , jak pokazano na ilustracji poniżej, oznacza to, że port ZooKeeper 2181 jest używany przez inny proces. W związku z tym nie można uruchomić ZooKeeper.
    2017-04-26 07:00:10,420 [myid:3] - INFO  [main:NIOServerCnxnFactory@94] -
      binding to port 0.0.0.0/0.0.0.0:2181
    2017-04-26 07:00:10,421 [myid:3] - ERROR [main:QuorumPeerMain@89] -
      Unexpected exception, exiting abnormally
      java.net.BindException: Address already in use
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
        at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:95)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:130)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:111)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
  3. Aby potwierdzić, że port ZooKeeper 2181 jest rzeczywiście używany przez inny proces, użyj tego polecenia netstat:
    netstat -an | grep 2181

Rozwiązanie

Jeśli port ZooKeeper 2181 jest nadal używany, wykonaj te czynności, aby rozwiązać ten problem:

  1. Użyj polecenia netstat, aby znaleźć proces, który korzysta z portu 2181. Zakończ proces, który używa portu ZooKeeper 2181:
    $ netstat -antp | grep 2181
    tcp        0      0 0.0.0.0:2181            0.0.0.0:*
    LISTEN      28016/java <defunct>
    $ kill -9 28016
  2. Wyczyść pliki pid i lock, jeśli istnieją:
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
  3. Uruchom ponownie ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Nieprawidłowy identyfikator procesu w pliku apigee-zookeeper.pid

Gdy próbujesz zatrzymać lub ponownie uruchomić ZooKeeper, może się to nie udać, ponieważ plik apigee-zookeeper.pid zawiera starszy lub nieprawidłowy identyfikator pid, a nie identyfikator aktualnie działającego procesu ZooKeeper. Może się tak zdarzyć, jeśli proces ZooKeeper z jakiegoś powodu niespodziewanie lub nagle się zakończył, a plik apigee-zookeeper.pid nie został usunięty.

Diagnostyka

  1. Aby uzyskać identyfikator procesu aktualnie działającego procesu ZooKeeper, uruchom polecenie ps:
    ps -ef | grep zookeeper
  2. Sprawdź, czy istnieje plik /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid. Jeśli istnieje, zanotuj identyfikator procesu zapisany w tym pliku.
  3. Porównaj identyfikatory procesów uzyskane w krokach 1 i 2. Jeśli są różne, przyczyną tego problemu jest nieprawidłowy identyfikator procesu w pliku apigee-zookeeper.pid file.

Rozwiązanie

  1. Otwórz do edycji plik apigee-zookeeper.pid i zastąp nieprawidłowy identyfikator procesu prawidłowym identyfikatorem uzyskanym za pomocą polecenia ps (krok 1 powyżej).
  2. Uruchom ponownie ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Nie udało się wybrać lidera ZooKeeper

Diagnostyka

Aby przeprowadzić diagnostykę:

  1. Sprawdź, czy w dzienniku ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log nie ma błędów.
  2. Sprawdź, czy nie wprowadzono żadnych zmian w konfiguracji, które mogą spowodować niepowodzenie wyboru lidera ZooKeeper.
  3. Sprawdź plik /opt/apigee/apigee-zookeeper/conf/zoo.cfg i upewnij się, że wszystkie ZooKeeper w klastrze mają prawidłową liczbę i adresy IP dla parametru serwer.#. Pamiętaj też, że aby wybór lidera się powiódł, musi być co najmniej 3 głosujących a ich liczba powinna być nieparzysta. Jeśli jest zbyt mało głosujących, np. tylko 2 głosujących, nie można osiągnąć kworum, aby wybrać lidera spośród tylko 2 głosujących.

Rozwiązanie

Zwykle przyczyną niepowodzenia wyboru lidera ZooKeeper jest nieprawidłowo skonfigurowany identyfikator myid. Aby rozwiązać problem z wyborem, skorzystaj z rozwiązania opisanego w sekcji Nieprawidłowo skonfigurowany identyfikator ZooKeeper.

Jeśli problem będzie się powtarzał i konieczna będzie dalsza diagnostyka, skontaktuj się z zespołem pomocy Apigee Edge.