Как установить и настроить кластер Apache ZooKeeper в Ubuntu 18.04

Автор выбралWikimedia Foundation Inc. для получения пожертвования в рамках программыWrite for DOnations.

Вступление

Apache ZooKeeper - это программное обеспечение с открытым исходным кодом, которое обеспечивает отказоустойчивую и высоконадежную распределенную координацию. Он обычно используется в распределенных системах для управления информацией о конфигурации, службами именования, распределенной синхронизацией, кворумом и состоянием. Кроме того, распределенные системы полагаются на ZooKeeper для реализации консенсуса, выбора лидера и управления группами.

В этом руководстве вы установите и настроите Apache ZooKeeper 3.4.13 в Ubuntu 18.04. Для достижения устойчивости и высокой доступности ZooKeeper предназначен для репликации через набор хостов, называемых ансамблем. Сначала вы создадите автономную установку сервера ZooKeeper с одним узлом, а затем добавите подробности для настройки многоузлового кластера. Автономная установка полезна в средах разработки и тестирования, но кластер является наиболее практичным решением для производственных сред.

Предпосылки

Прежде чем начать это руководство по установке и настройке, вам потребуется следующее:

  • Для автономной установки требуется один сервер Ubuntu 18.04 с минимум 4 ГБ ОЗУ, настроенный с помощьюthe Ubuntu 18.04 initial server setup guide, включая пользователя без полномочий root с привилегиями sudo и брандмауэром. Для кластера с несколькими узлами вам необходимо настроить два дополнительных сервера, выполнив те же действия.

  • OpenJDK 8 установлен на вашем сервере, так как ZooKeeper требует Java для запуска. Для этого выполните шаг «Установка определенных версий OpenJDK» из руководстваHow To Install Java with apt on Ubuntu 18.04.

Поскольку ZooKeeper хранит данные в памяти для достижения высокой пропускной способности и низкой задержки, производственные системы лучше всего работают с 8 ГБ ОЗУ. Меньшее количество оперативной памяти может привести к перестановке JVM, что может привести к задержке сервера ZooKeeper. Высокая задержка сервера ZooKeeper может привести к таким проблемам, как тайм-ауты клиентских сеансов, которые могут отрицательно повлиять на функциональность системы.

[[step-1 -—- created-a-user-for-zookeeper]] == Шаг 1. Создание пользователя для ZooKeeper

Выделенный пользователь должен запускать службы, которые обрабатывают запросы по сети и потребляют ресурсы. Эта практика создает сегрегацию и контроль, которые улучшат безопасность и управляемость вашей среды. На этом этапе вы создадите пользователя sudo без полномочий root с именемzk в этом руководстве для запуска службы ZooKeeper.

Сначала войдите в систему как пользователь root без полномочий root, созданный в предварительных условиях.

ssh sammy@your_server_ip

Создайте пользователя, который будет запускать сервис ZooKeeper:

sudo useradd zk -m

Передача флага-m командеuseradd создаст домашний каталог для этого пользователя. Домашний каталог дляzk по умолчанию будет/home/zk.

Установитеbash в качестве оболочки по умолчанию для пользователяzk:

sudo usermod --shell /bin/bash zk

Установите пароль для этого пользователя:

sudo passwd zk

Затем вы добавите пользователяzk в группуsudo, чтобы он мог выполнять команды в привилегированном режиме:

usermod -aG sudo zk

С точки зрения безопасности рекомендуется разрешить доступ по SSH как можно меньшему числу пользователей. Удаленный вход в систему какsammy, а затем использованиеsu для переключения на желаемого пользователя создает уровень разделения между учетными данными для доступа к системе и запущенных процессов. На этом шаге вы отключите доступ по SSH для пользователейzk иroot.

Откройте ваш файлsshd_config:

sudo nano /etc/ssh/sshd_config

Найдите строкуPermitRootLogin и установите значениеno, чтобы отключить доступ по SSH для пользователяroot:

/etc/ssh/sshd_config

PermitRootLogin no

Под значениемPermitRootLogin добавьте строкуDenyUsers и установите значение как любого пользователя, у которого должен быть отключен доступ по SSH:

/etc/ssh/sshd_config

DenyUsers zk

Сохраните и закройте файл, а затем перезапустите демон SSH, чтобы активировать изменения.

sudo systemctl restart sshd

Переключитесь на пользователяzk:

su -l zk

Флаг-l вызывает оболочку входа в систему после переключения пользователей. Оболочка входа в систему сбрасывает переменные среды и обеспечивает чистый старт для пользователя.

Введите пароль в приглашении для аутентификации пользователя.

Теперь, когда вы создали, настроили и вошли в систему как пользовательzk, вы создадите каталог для хранения ваших данных ZooKeeper.

[[step-2 -—- created-a-data-directory-for-zookeeper]] == Шаг 2 - Создание каталога данных для ZooKeeper

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

Создайте каталог для ZooKeeper для использования:

sudo mkdir -p /data/zookeeper

Предоставьте своему пользователюzk право владения каталогом:

sudo chown zk:zk /data/zookeeper

chown меняет владельца и группу каталога/data/zookeeper, так что пользовательzk, который принадлежит к группеzk, владеет каталогом данных.

Вы успешно создали и настроили каталог данных. Когда вы перейдете к настройке ZooKeeper, вы укажете этот путь в качестве каталога данных, который ZooKeeper будет использовать для хранения своих файлов.

[[step-3 -—- download-and-extract-the-zookeeper-binaries]] == Шаг 3. Загрузка и извлечение двоичных файлов ZooKeeper

На этом этапе вы вручную загрузите и извлечете двоичные файлы ZooKeeper в каталог/opt. Вы можете использовать Advanced Packaging Tool,apt, чтобы загрузить ZooKeeper, но он может установить более старую версию с другими функциями. Установка ZooKeeper вручную предоставит вам полный контроль над выбором версии, которую вы хотите использовать.

Поскольку вы загружаете эти файлы вручную, начните с перехода в каталог/opt:

cd /opt

На локальном компьютере перейдите кApache download page. Эта страница автоматически предоставит вам ближайшее к вам зеркало для самой быстрой загрузки. Щелкните ссылку на предлагаемый зеркальный сайт, затем прокрутите вниз и щелкнитеzookeeper/, чтобы просмотреть доступные выпуски. Выберите версию ZooKeeper, которую вы хотите установить. В этом руководстве основное внимание уделяется использованию3.4.13. После выбора версии щелкните правой кнопкой мыши двоичный файл, заканчивающийся на.tar.gz, и скопируйте адрес ссылки.

На своем сервере используйте командуwget вместе со скопированной ссылкой, чтобы загрузить двоичные файлы ZooKeeper:

sudo wget http://apache.osuosl.org/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

Извлеките двоичные файлы из сжатого архива:

sudo tar -xvf zookeeper-3.4.13.tar.gz

Расширение.tar.gz представляет собой комбинацию упаковки TAR, за которой следует сжатие GNU zip (gzip). Вы заметите, что вы передали флаг-xvf команде извлечения архива. Флагx означает извлечение,v включает подробный режим для отображения прогресса извлечения, аf позволяет указать ввод, в нашем случаеzookeeper-3.4.13.tar.gz, в отличие от STDIN.

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

sudo chown zk:zk -R  zookeeper-3.4.13

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

Создайте символическую ссылку с помощью командыln.

sudo ln -s zookeeper-3.4.13 zookeeper

Измените владельца этой ссылки наzk:zk. Обратите внимание, что вы передали флаг-h, чтобы изменить владельца самой ссылки. Отсутствие указания-h изменяет владельца цели ссылки, что вы явно сделали на предыдущем шаге.

sudo chown -h zk:zk zookeeper

После создания символических ссылок ваши пути к каталогам в конфигурациях останутся актуальными и неизменными при будущих обновлениях. Теперь вы можете настроить ZooKeeper.

[[step-4 -—- configuring-zookeeper]] == Шаг 4. Настройка ZooKeeper

Теперь, когда вы настроили свою среду, вы готовы настроить ZooKeeper.

Файл конфигурации будет находиться в каталоге/opt/zookeeper/conf. Этот каталог содержит пример файла конфигурации, который поставляется с дистрибутивом ZooKeeper. Этот образец файла с именемzoo_sample.cfg содержит наиболее распространенные определения параметров конфигурации и образцы значений для этих параметров. Некоторые из общих параметров следующие:

  • tickTime: Устанавливает длину тика в миллисекундах. Тик - это единица времени, используемая ZooKeeper для измерения длины между биениями. Минимальное время ожидания сеанса в два раза больше времени.

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

  • clientPort: порт, используемый для прослушивания клиентских подключений.

  • maxClientCnxns: ограничивает максимальное количество клиентских подключений.

Создайте файл конфигурации с именемzoo.cfg в/opt/zookeeper/conf. Вы можете создать и открыть файл с помощьюnano или вашего любимого редактора:

nano /opt/zookeeper/conf/zoo.cfg

Добавьте следующий набор свойств и значений в этот файл:

/opt/zookeeper/conf/zoo.cfg

tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60

Рекомендуемый интервал между ударами сердца составляетtickTime в 2000 миллисекунд. Более короткий интервал может привести к перегрузке системы с ограниченными преимуществами. ПараметрdataDir указывает на путь, определенный символической ссылкой, которую вы создали в предыдущем разделе. Обычно ZooKeeper использует порт2181 для прослушивания клиентских подключений. В большинстве случаев 60 разрешенных клиентских подключений достаточно для разработки и тестирования.

Сохраните файл и выйдите из редактора.

Вы настроили ZooKeeper и готовы запустить сервер.

[[step-5 -—- start-zookeeper-and-testing-the-standalone-installation]] == Шаг 5. Запуск ZooKeeper и тестирование автономной установки

Вы настроили все компоненты, необходимые для запуска ZooKeeper. На этом шаге вы запустите сервис ZooKeeper и протестируете свою конфигурацию, подключившись к сервису локально.

Вернитесь в каталог/opt/zookeeper.

cd /opt/zookeeper

Запустите ZooKeeper с помощью командыzkServer.sh.

bin/zkServer.sh start

На стандартном выводе вы увидите следующее:

OutputZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

Подключитесь к локальному серверу ZooKeeper с помощью следующей команды:

bin/zkCli.sh -server 127.0.0.1:2181

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

OutputConnecting to 127.0.0.1:2181
...
...
[zk: 127.0.0.1:2181(CONNECTED) 0]

Введитеhelp в этом запросе, чтобы получить список команд, которые вы можете выполнить с клиента. Вывод будет следующим:

Output[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit
    getAcl path
    close
    connect host:port

После тестирования вы закроете клиентский сеанс, набравquit в командной строке. Служба ZooKeeper продолжит работу после закрытия клиентского сеанса. Выключите службу ZooKeeper, поскольку на следующем шаге вы настроите ее как службуsystemd:

bin/zkServer.sh stop

Теперь вы установили, настроили и протестировали отдельную службу ZooKeeper. Эта настройка полезна для ознакомления с ZooKeeper, но также полезна для сред разработки и тестирования. Теперь, когда вы знаете, что конфигурация работает, вы настроитеsystemd, чтобы упростить управление вашей службой ZooKeeper.

[[step-6 -—- create-and-using-a-systemd-unit-file]] == Шаг 6 - Создание и использование файла модуля Systemd

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

Systemd Essentials - отличный вводный ресурс для получения дополнительной информации оsystemd и его составляющих компонентах.

Используйте свой редактор, чтобы создать файл.service с именемzk.service в/etc/systemd/system/.

sudo nano /etc/systemd/system/zk.service

Добавьте следующие строки в файл для определения сервиса ZooKeeper:

/etc/systemd/system/zk.service

[Unit]
Description=Zookeeper Daemon
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target

[Service]
Type=forking
WorkingDirectory=/opt/zookeeper
User=zk
Group=zk
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure

[Install]
WantedBy=default.target

РазделService в конфигурации файла модуля указывает рабочий каталог, пользователя, под которым будет запускаться служба, и исполняемые команды для запуска, остановки и перезапуска службы ZooKeeper. Для получения дополнительной информации обо всех параметрах конфигурации файла модуля вы можете прочитать статьюUnderstanding Systemd Units and Unit Files.

Сохраните файл и выйдите из редактора.

Теперь, когда ваша конфигурацияsystemd готова, вы можете запустить службу:

sudo systemctl start zk

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

sudo systemctl enable zk

Эти выходные данные подтверждают создание символической ссылки:

OutputCreated symlink /etc/systemd/system/multi-user.target.wants/zk.service → /etc/systemd/system/zk.service.

Проверьте статус сервиса ZooKeeper, используя:

sudo systemctl status zk

Остановите службу ZooKeeper, используяsystemctl.

sudo systemctl stop zk

Наконец, чтобы перезапустить демон, используйте следующую команду:

sudo systemctl restart zk

Механизмsystemd становится предпочтительной системой инициализации во многих дистрибутивах Linux. Теперь, когда вы настроилиsystemd для управления ZooKeeper, вы можете использовать эту быструю и гибкую модель инициализации для запуска, остановки и перезапуска службы ZooKeeper.

[[step-7 -—- configuring-a-multi-node-zookeeper-cluster]] == Шаг 7. Настройка многоузлового кластера ZooKeeper

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

Узлы в кластере ZooKeeper, которые работают вместе как приложение, образуютquorum. Кворум относится к минимальному количеству узлов, которым необходимо согласовать транзакцию до ее совершения. Кворуму нужно нечетное количество узлов, чтобы он мог установить большинство. Четное число узлов может привести к связыванию, что будет означать, что узлы не достигнут большинства или консенсуса.

В производственной среде каждый узел ZooKeeper должен запускаться на отдельном хосте. Это предотвращает прерывание обслуживания из-за аппаратного сбоя или перезагрузки хоста. Это важный и необходимый архитектурный аспект для построения отказоустойчивой и высокодоступной распределенной системы.

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

Выполнив шаги с первого по шестой для новых узлов, откройтеzoo.cfg в редакторе на каждом узле.

sudo nano /opt/zookeeper/conf/zoo.cfg

Всем узлам в кворуме потребуется один и тот же файл конфигурации. В вашем файлеzoo.cfg на каждом из трех узлов добавьте дополнительные параметры конфигурации и значения дляinitLimit,syncLimit и серверов в кворуме в конце файла.

/opt/zookeeper/conf/zoo.cfg

tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
initLimit=10
syncLimit=5
server.1=your_zookeeper_node_1:2888:3888
server.2=your_zookeeper_node_2:2888:3888
server.3=your_zookeeper_node_3:2888:3888

initLimit указывает время, которое может занять начальная фаза синхронизации. Это время, в течение которого каждый из узлов кворума должен соединиться с лидером. syncLimit указывает время, которое может пройти между отправкой запроса и получением подтверждения. Это максимальное время, которое узлы могут быть не синхронизированы с лидером. Узлы ZooKeeper используют пару портов,:2888 и:3888, для ведомых узлов для подключения к ведущему узлу и для выбора лидера соответственно.

Обновив файл на каждом узле, вы сохраните и выйдите из редактора.

Чтобы завершить настройку нескольких узлов, вы должны указать идентификатор узла на каждом из серверов. Для этого вы создадите файлmyid на каждом узле. Каждый файл будет содержать номер, который соответствует номеру сервера, назначенному в файле конфигурации.

Наyour_zookeeper_node_1 создайте файлmyid, в котором будет указан идентификатор узла:

sudo nano /data/zookeeper/myid

Посколькуyour_zookeeper_node_1 идентифицируется какserver.1, вы должны ввести1, чтобы определить идентификатор узла. После добавления значения ваш файл будет выглядеть так:

your_zookeeper_node_1 /data/zookeeper/myid1

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

your_zookeeper_node_1 /data/zookeeper/myid1
your_zookeeper_node_2 /data/zookeeper/myid2
your_zookeeper_node_3 /data/zookeeper/myid3

Теперь вы настроили трехузловой кластер ZooKeeper. Далее вы запустите кластер и протестируете установку.

[[step-8 -—- running-and-testing-the-multi-node-installation]] == Шаг 8 - Запуск и тестирование многоузловой установки

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

Чтобы запустить узел кворума, сначала перейдите в каталог/opt/zookeeper на каждом узле:

cd /opt/zookeeper

Запустите каждый узел с помощью следующей команды:

java -cp zookeeper-3.4.13.jar:lib/log4j-1.2.17.jar:lib/slf4j-log4j12-1.7.25.jar:lib/slf4j-api-1.7.25.jar:conf org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.cfg

Когда узлы запускаются, вы периодически видите некоторые ошибки соединения, после чего следует этап, на котором они присоединяются к кворуму и выбирают лидера между собой. После нескольких секунд инициализации вы можете начать тестирование вашей установки.

Войдите через SSH вyour_zookeeper_node_3 как пользователь без полномочий root, который вы настроили в предварительных условиях:

ssh sammy@your_zookeeper_node_3

После входа в систему переключитесь на своего пользователяzk:

your_zookeeper_node_3 /data/zookeeper/myidsu -l zk

Введите пароль для пользователяzk. После входа в систему измените каталог на/opt/zookeeper:

your_zookeeper_node_3 /data/zookeeper/myidcd /opt/zookeeper

Теперь вы запустите клиент командной строки ZooKeeper и подключитесь к ZooKeeper наyour_zookeeper_node_1:

your_zookeeper_node_3 /data/zookeeper/myidbin/zkCli.sh -server your_zookeeper_node_1:2181

В автономной установке клиент и сервер работали на одном хосте. Это позволило вам установить клиентское соединение с сервером ZooKeeper, используяlocalhost. Поскольку клиент и сервер работают на разных узлах в многоузловом кластере, на предыдущем шаге вам нужно было указать IP-адресyour_zookeeper_node_1 для подключения к нему.

Вы увидите знакомую подсказку с меткойCONNECTED, похожую на то, что вы видели на шаге 5.

Затем вы создадите, перечислите и затем удалитеznode. Znodes - это фундаментальные абстракции в ZooKeeper, аналогичные файлам и каталогам в файловой системе. ZooKeeper хранит свои данные в иерархическом пространстве имен, а znodes - это регистры данных этого пространства имен.

Проверка того, что вы можете успешно создавать, перечислять, а затем удалять znode, очень важна для определения того, что ваш кластер ZooKeeper установлен и настроен правильно.

Создайте znode с именемzk_znode_1 и свяжите с ним строкуsample_data.

create /zk_znode_1 sample_data

После создания вы увидите следующий вывод:

OutputCreated /zk_znode_1

Список недавно созданных znode:

ls /

Получить данные, связанные с ним:

get /zk_znode_1

ZooKeeper ответит так:

Output[zk: your_zookeeper_node_1:2181(CONNECTED)] ls /
[zk_znode_1, zookeeper]
[zk: your_zookeeper_node_1:2181(CONNECTED)] get /zk_znode_1
sample_data
cZxid = 0x100000002
ctime = Tue Nov 06 19:47:41 UTC 2018
mZxid = 0x100000002
mtime = Tue Nov 06 19:47:41 UTC 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

Выходные данные подтверждают значениеsample_data, которое вы связали сzk_node_1. ZooKeeper также предоставляет дополнительную информацию о времени созданияctimeс и времени модификацииmtimeс. ZooKeeper является версионным хранилищем данных, поэтому он также предоставляет вам метаданные о версии данных.

Удалите znodezk_znode_1:

delete /zk_znode_1

На этом этапе вы успешно протестировали соединение между двумя вашими узлами ZooKeeper. Вы также изучили основы управления znode, создав, перечислив и удалив znode. Ваша многоузловая конфигурация завершена, и вы готовы начать использовать ZooKeeper.

Заключение

В этом руководстве вы настроили и протестировали как автономную, так и многоузловую среду ZooKeeper. Теперь, когда ваше многоузловое развертывание ZooKeeper готово к использованию, вы можете просмотретьofficial ZooKeeper documentation для получения дополнительной информации и проектов.

Related