Невозможно запустить Zookeeper

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

Симптом

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

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

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

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

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

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

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

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

Неправильно настроен идентификатор пользователя ZooKeeper (myid).

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

Обзор файла myid

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

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

    Например, если файл /opt/apigee/apigee-zookeeper/conf/zoo.cfg содержит IP-адреса 3 узлов 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 server.1 файл /opt/apigee/data/apigee-zookeeper/data/myid должен содержать только текст 1, как показано ниже:

    $ cat myid
    1

Диагноз

  1. Проверьте журнал ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log на наличие ошибок.
  2. Если вы видите сообщение WARN, похожее на «Соединение разорвано для идентификатора #, мой идентификатор = #», как показано на рисунке ниже, то возможной причиной этой проблемы может быть неправильная настройка или повреждение имени сервера в файле 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 и запишите server.# для текущего узла ZooKeeper.
  4. Проверьте файл /opt/apigee/data/apigee-zookeeper/data/myid и убедитесь, что текст в этом файле совпадает с server.#, указанным в шаге #2.
  5. Если обнаружено несоответствие, значит, вы определили причину, по которой ZooKeeper не запускается.

Разрешение

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

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

Диагноз

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

Разрешение

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

  1. Используйте команду netstat , чтобы найти процесс, занимающий порт 2181. Завершите процесс, использующий порт 2181 ZooKeeper:
    $ 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 содержит устаревший/некорректный PID, а не 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

Провал выборов лидера зоопарка

Диагноз

Для диагностики:

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

Разрешение

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

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