Nie udało się uruchomić aplikacji Zookeeper

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Krótki opis problemu

Nie udało się rozpocząć procesu ZooKeeper.

Komunikaty o błędach

Przy próbie uruchomienia procesu ZooKeeper zwracany jest następujący komunikat o błędzie informujący, że nie udało się uruchomić aplikacji 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:
Błędna konfiguracja identyfikatora ZooKeeper Użytkownicy chmury Private Cloud
Port ZooKeeper w użyciu Użytkownicy chmury Private Cloud
Nieprawidłowy identyfikator procesu w pliku apigee-zookeeper.pid Użytkownicy chmury Private Cloud
Nieudane wybory lidera ZooKeeper Użytkownicy chmury Private Cloud

Kliknij link w tabeli, aby wyświetlić możliwe rozwiązania tej przyczyny.

Błędna konfiguracja identyfikatora ZooKeeper

Poniższe sekcje zawierają omówienie pliku myid oraz sposoby diagnozowania i rozwiązywania problemów 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 /opt/apigee/apigee-zookeeper/conf/zoo.cfg zawiera adresy IP 3 węzłów ZooKeeper, część klastra wygląda tak:

    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 jeden wiersz tekstu, który odpowiada numerowi serwera tego konkretnego węzła ZooKeeper. Myid serwera 1 będzie zawierał tekst „1” i nic więcej. Identyfikator musi być unikalny w obrębie zbioru i mieć wartość z zakresu 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 w tym przykładzie:

    $ cat myid
    1
    

Diagnostyka

  1. Sprawdź dziennik ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log pod kątem błędów.
  2. Jeśli zobaczysz komunikat WARN podobne do „Połączenie przerwane, identyfikator = #”, jak pokazano na ilustracji poniżej, prawdopodobną przyczyną tego problemu może być niewłaściwa konfiguracja serwera o identyfikatorze myid 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 parametr „server.#” bieżącego węzła ZooKeeper.
  4. Sprawdź plik /opt/apigee/data/apigee-zookeeper/data/myid i zobacz, czy tekst w tym pliku jest zgodny z tekstem na serwerze.# wymienionym w kroku 2.
  5. Występowanie rozbieżności oznacza, że udało Ci się określić przyczynę niepowodzenia uruchomienia aplikacji ZooKeeper.

Rozdzielczość

Jeśli plik myid jest nieprawidłowo skonfigurowany, zmodyfikuj go i zastąp wartość prawidłowym tekstem reprezentującym parametr „server.#” w zoo.cfg.

Używasz portu ZooKeeper

Diagnostyka

  1. Sprawdź błędy w logu ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log.
  2. Jeśli zauważysz wyjątek java.net.BindException: Address already in use podczas wiązania z portem nr 2181 (jak pokazano na ilustracji poniżej), oznacza to, że port 2181 jest używany przez inny proces. Z tego powodu nie można uruchomić aplikacji 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. Użyj poniższego polecenia netstat, aby potwierdzić, że port ZooKeeper 2181 jest rzeczywiście używany przez inny proces:
    netstat -an | grep 2181
    

Rozdzielczość

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

  1. Za pomocą polecenia netstat znajdź proces, który trzyma się na porcie 2181. Zakończ proces, który korzysta z 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. Usuń pliki pid i zablokuj je, jeśli istnieją:
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
    
  3. Ponownie uruchom ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
    

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

Próba zatrzymania lub ponownego uruchomienia aplikacji ZooKeeper może się zakończyć niepowodzeniem, ponieważ plik apigee-zookeeper.pid zawiera starszy/nieprawidłowy pid, a nie ten aktualnie uruchomiony proces ZooKeeper. Może się tak zdarzyć, jeśli proces ZooKeeper zakończy się nieoczekiwanie lub nagle z jakiegoś powodu, a plik apigee-zookeeper.pid nie został usunięty.

Diagnostyka

  1. Uzyskaj identyfikator procesu obecnie uruchomionego procesu ZooKeeper, uruchamiając polecenie ps:
    ps -ef | grep zookeeper
    
  2. Sprawdź, czy plik /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid istnieje. 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 elemencie apigee-zookeeper.pid file.

Rozdzielczość

  1. Edytuj plik apigee-zookeeper.pid i zastąp nieprawidłowy identyfikator procesu prawidłowym identyfikatorem procesu uzyskanym z polecenia ps (krok 1 powyżej).
  2. Ponownie uruchom ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
    

Nieudany wybory lidera ZooKeeper

Diagnostyka

Aby zdiagnozować problem:

  1. Sprawdź dziennik ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log pod kątem błędów.
  2. Sprawdź, czy nie wprowadzono żadnych zmian w konfiguracji, które mogły spowodować niepowodzenie wyboru lidera w przypadku ZooKeeper.
  3. Sprawdź /opt/apigee/apigee-zookeeper/conf/zoo.cfg i upewnij się, że wszystkie ZooKeepers w klastrze mają prawidłowy numer i adresy IP dla parametruserver.#. Pamiętaj też, że aby wybory lidera zostały ocenione, wymagane są co najmniej 3 głosy, a liczba głosów powinna być nieparzysta. Jeśli głosujących jest zbyt mało, np. tylko 2 głosy, nie można uzyskać kworum, aby wyłonić lidera spośród jedynie 2 głosów.

Rozdzielczość

Nieudana próba wyborów ZooKeeper jest zwykle spowodowana nieprawidłową konfiguracją mojego identyfikatora. Aby rozwiązać problem z wyborami, skorzystaj z rozwiązania w artykule Błędna konfiguracja ZooKeeper myid.

Jeśli problem nie ustąpi i potrzebna jest dalsza diagnoza, skontaktuj się z zespołem pomocy Apigee Edge.