Не удалось запустить Zookeeper

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Symptom

Не удалось запустить процесс ZooKeeper.

Сообщения об ошибках

При попытке запустить процесс ZooKeeper возвращается следующее сообщение об ошибке, указывающее на то, что ZooKeeper не удалось запустить:

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

Возможные причины

В таблице ниже перечислены возможные причины этой проблемы.

Причина Для кого
Неправильно настроенный файл myid в ZooKeeper Пользователи Edge Private Cloud
Используется порт ZooKeeper Пользователи Edge Private Cloud
Неправильный идентификатор процесса в файле apigee-zookeeper.pid Пользователи Edge Private Cloud
Сбой при выборе лидера ZooKeeper Пользователи Edge Private Cloud

Нажмите на ссылку в таблице, чтобы посмотреть возможные решения.

Неправильно настроенный идентификатор myid в ZooKeeper

В следующих разделах приведена информация о файле myid, а также описано, как диагностировать и устранять проблемы с неправильной конфигурацией.

Обзор файла myid

На каждом узле ZooKeeper есть два файла:

  1. Файл /opt/apigee/apigee-zookeeper/conf/zoo.cfg, содержащий список IP-адресов всех узлов ZooKeeper в кластере.

    Например, если в файле /opt/apigee/apigee-zookeeper/conf/zoo.cfg указаны IP-адреса трех узлов ZooKeeper, входящих в кластер, следующим образом:

    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. Файл /opt/apigee/data/apigee-zookeeper/data/myid содержит одну строку текста, соответствующую номеру сервера определенного узла ZooKeeper. Файл myid сервера 1 будет содержать только текст "1". Идентификатор должен быть уникальным в рамках ансамбля и иметь значение от 1 до 255.

    Например, на сервере ZooKeeper.1 файл /opt/apigee/data/apigee-zookeeper/data/myid должен содержать только текст 1, как показано ниже:

    $ cat myid
    1

диагностика;

  1. Проверьте журнал ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log на наличие ошибок.
  2. Если вы видите предупреждение, похожее на "Connection broken for id #, my id = #" (Соединение с идентификатором # разорвано, мой идентификатор – #), как показано на рисунке ниже, то, возможно, сервер # в файле 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. Проверьте файл /opt/apigee/apigee-zookeeper/conf/zoo.cfg и запишите номер сервера для текущего узла ZooKeeper.
  4. Проверьте файл /opt/apigee/data/apigee-zookeeper/data/myid и убедитесь, что текст в нем соответствует серверу, указанному на шаге 2.
  5. Если они не совпадают, вы нашли причину, по которой не запускается ZooKeeper.

Разрешение

Если файл myid настроен неправильно, отредактируйте его и замените значение на правильный текст, представляющий параметр server.# в файле zoo.cfg.

Используется порт ZooKeeper

диагностика;

  1. Проверьте журнал ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log на наличие ошибок.
  2. Если при подключении к порту 2181 вы видите исключение java.net.BindException: Address already in use , как показано на рисунке ниже, это означает, что порт 2181 ZooKeeper используется другим процессом. Поэтому 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. Чтобы убедиться, что порт ZooKeeper 2181 используется другим процессом, выполните приведенную ниже команду netstat:
    netstat -an | grep 2181

Разрешение

Если порт ZooKeeper 2181 по-прежнему используется, выполните следующие действия:

  1. Чтобы найти процесс, который удерживает порт 2181, используйте команду netstat. Завершите процесс, использующий порт 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. Удалите файлы pid и блокировки, если они существуют:
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
  3. Перезапустите ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Неправильный идентификатор процесса в файле apigee-zookeeper.pid

При попытке остановить или перезапустить ZooKeeper может произойти сбой, поскольку в файле apigee-zookeeper.pid указан устаревший или неверный идентификатор процесса, а не идентификатор текущего процесса ZooKeeper. Это может произойти, если процесс ZooKeeper неожиданно или резко завершился по какой-либо причине, а файл apigee-zookeeper.pid не был удален.

диагностика;

  1. Чтобы получить идентификатор процесса ZooKeeper, который выполняется в данный момент, введите команду ps:
    ps -ef | grep zookeeper
  2. Проверьте, существует ли файл /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid. Если он существует, запишите идентификатор процесса, указанный в этом файле.
  3. Сравните идентификаторы процессов, полученные на шагах 1 и 2. Если они различаются, значит в файле apigee-zookeeper.pid file. указан неверный идентификатор процесса.

Разрешение

  1. Измените файл apigee-zookeeper.pid и замените неправильный идентификатор процесса на правильный, полученный с помощью команды ps (шаг 1 выше).
  2. Перезапустите ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Сбой при выборе лидера ZooKeeper

диагностика;

Как узнать, к какой теме мы отнесли видео

  1. Проверьте журнал ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log на наличие ошибок.
  2. Проверьте, не было ли изменений в конфигурации, которые могли привести к сбою при выборе лидера ZooKeeper.
  3. Проверьте файл /opt/apigee/apigee-zookeeper/conf/zoo.cfg и убедитесь, что у всех ZooKeeper в кластере указано правильное количество IP-адресов для параметра server.#. Обратите внимание, что для успешного выбора лидера необходимо как минимум три голосующих, и их количество должно быть нечетным. Если голосующих слишком мало, например всего два, то кворум не будет достигнут и лидера выбрать не получится.

Разрешение

Обычно сбой в выборе ZooKeeper вызван неправильной настройкой myid. Чтобы устранить проблему с выбором, используйте разрешение в разделе Неправильно настроенный myid ZooKeeper.

Если проблема не исчезнет и потребуется дополнительная диагностика, обратитесь в службу поддержки Apigee Edge.