Конфигурирование кластера ZooKeeper#

Конфигурирование кластера Apache ZooKeeper осуществляется в файле zookeeper.properties.

Минимальная конфигурация кластера#

Пример минимального конфигурационного файла zookeeper.properties для кластера из трех серверов:

server.1=zookeeper-1-ip:2888:3888
server.2=zookeeper-2-ip:2888:3888
server.3=zookeeper-3-ip:2888:3888
dataDir=/path/to/zookeeper-data
clientPort=2181
tickTime=2000
initLimit=5
syncLimit=2

Шаги создания конфигурационного файла:

  1. Добавьте в файл переменные server.INDEX=IP:PORT1:PORT2, где:

    • INDEX — индекс (myid) узла ZooKeeper в кластере;

    • IP — адрес данного сервера;

    • PORT1 — порт для подключения серверов-последователей в кластере к лидеру;

    • PORT2 — порт для подключения остальных сервисов ZooKeeper в момент выбора сервиса-лидера в кластере.

    Если необходимо запустить кластер ZooKeeper на нескольких серверах, то в конфигурационном файле укажите адреса всех серверов.

    Пример

    server.1=10.XX.XX.X1:YYYY:ZZZZ
    server.2=10.XX.XX.X2:YYYY:ZZZZ
    
  2. Для переменной dataDir укажите путь к директории, в которую ZooKeeper будет сохранять файлы с данными, необходимыми ему для работы.

    Пример

    dataDir=/var/log/kafka_2.11-0.9.0.0/zookeeper-data

  3. Для переменной clientPort укажите номер порта, к которому будут подключаться клиенты.

    Пример

    clientPort=2181

  4. Для переменной tickTime укажите единицу измерения времени ZooKeeper — это время в миллисекундах, которое уходит на один «тик» или «такт» ZooKeeper. tickTime неявно используется в настройках для различных временных параметров ZooKeeper. Например, для временной настройки initLimit=10 — это означает, что initLimit будет выполняться за 10 * tickTime миллисекунд.

    По умолчанию tickTime=2000 миллисекунд.

    Пример

    tickTime=2000

  5. Добавьте в файл переменную initLimit — максимальное допустимое количество «тиков» (tickTime), которое может пройти, прежде чем узел кластера синхронизируется при запуске. При превышении будет сгенерирована ошибка.

    Пример

    initLimit=10

    Т. е. максимальное допустимое время на синхронизацию узла кластера при запуске будет равно (tickTime * initLimit) миллисекунд.

    Примечание

    Это обязательное свойство, без которого узел ZooKeeper не будет запущен.

  6. Добавьте в файл переменную syncLimit — максимальное допустимое количество «тиков» (tickTime) между отправкой запроса и получением ответа, прежде чем будет сгенерировано исключение.

    Пример

    syncLimit=5

    Примечание

    Это обязательное свойство, без которого узел ZooKeeper не будет запущен.

На этом минимальное конфигурирование кластера ZooKeeper завершается.

Расширенная конфигурация кластера#

Существует ряд дополнительных настроек, которые можно включить в конфигурационный файл:

  • electionAlg — тип алгоритма для выбора лидера. Возможные значения:

    • 3 — версия алгоритма для быстрого выбора лидера на основе TCP.

    Начиная с ZooKeeper 3.6.0 доступна только версия алгоритма 3. Другие значения параметра electionAlg не допускаются.

    Пример

    electionAlg=3

  • leaderServes — опция разрешает клиентам подключаться к серверу-лидеру. Значение по умолчанию — yes. Одна из основных задач сервера-лидера — следить за обновлениями и координировать. Отключением этой опции (установкой значения no) можно добиться некоторого прироста производительности при координации обновлений.

    Пример

    leaderServes=yes

  • Свойства, используемые совместно:

    • group.x=nnnn[:nnnn] — позволяет построить кворум с иерархической структурой, где x — это идентификатор кворума, а в качестве значения указывается список идентификаторов серверов, разделенных двоеточием.

      Примечание

      Группы не должны пересекаться, т. е. объединение всех групп должно давать полный список всех серверов.

    • weight.x=nnnnn — при использовании вместе с group.x=nnnn[:nnnn] позволяет назначить «вес» каждому серверу, который будет учитываться при выборе лидера. По умолчанию вес равен 1.

    Пример

    group.1=1:2:3
    group.2=4:5:6
    group.3=7:8:9
    weight.1=1
    weight.2=1
    weight.3=1
    weight.4=1
    weight.5=1
    weight.6=1
    weight.7=1
    weight.8=1
    weight.9=1
    

Следует учитывать, что запуск всех узлов кластера должен происходить за промежуток времени, не превышающий 10 тиков (heartbeat), заданных в строке initLimit=10. Поэтому лучше создать скрипт последовательного запуска всех узлов кластера с одной машины.

Запуск каждого узла ZooKeeper выполняется командой:

bin/zookeeper-server-start.sh -daemon
config/zookeeper.properties

Или с параллельным выводом файла логов в консоль:

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties && tail --f logs/zookeeper.out

Проверка работоспособности#

При запуске всех узлов кластера ZooKeeper в файлах logs/zookeeper.out должны быть следующие записи:

  • В файлах logs/zookeeper.out серверов-последователей:

    INFO FOLLOWING - LEADER ELECTION TOOK - 847
    (org.apache.zookeeper.server.quorum.Learner)
    
  • В файле logs/zookeeper.out сервера-лидера:

    INFO LEADING - LEADER ELECTION TOOK - 408
    (org.apache.zookeeper.server.quorum.Leader)
    

Также в консоли сервера-лидера должна быть запись, информирующая о создании кворума в кластере с перечислением ID узлов:

INFO Have quorum of supporters, sids: [ 1,2 ]; starting up and setting
last processed zxid: 0x100000000
(org.apache.zookeeper.server.quorum.Leader)