Перейти к содержанию

Инструкция по развертыванию

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

Минимальный вариант кластера

Picodata может создать кластер, состоящий всего из одного экземпляра/инстанса. Обязательных параметров у него нет, что позволяет свести запуск к выполнению всего одной простой команды:

picodata run

Можно добавлять сколько угодно последующих инcтансов — все они будут подключаться к этому кластеру. Каждому инстансу следует задать отдельную рабочую директорию (параметр --data-dir), а также указать адрес и порт для приема соединений (параметр --listen) в формате <HOST>:<PORT>. Фактор репликации по умолчанию равен 1 — каждый инстанс образует отдельный репликасет. Если для --listen указать только порт, то будет использован IP-адрес по умолчанию (127.0.0.1):

picodata run --data-dir i1 --listen :3301
picodata run --data-dir i2 --listen :3302
picodata run --data-dir i3 --listen :3303

Если не использовать параметр cluster-id, то по умолчанию кластер будет носить имя demo.

Кластер на нескольких серверах

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

На 192.168.0.1:

picodata run --listen 192.168.0.1:3301

На 192.168.0.2:

picodata run --listen 192.168.0.2:3301 --peer 192.168.0.1:3301

На что нужно обратить внимание:

Во-первых, для параметра --listen вместо стандартного значения 127.0.0.1 надо указать конкретный адрес. Формат адреса допускает упрощения — можно указать только хост 192.168.0.1 (порт по умолчанию :3301), или только порт, но для наглядности лучше использовать полный формат <HOST>:<PORT>.

Значение параметра --listen не хранится в кластерной конфигурации и может меняться при перезапуске инстанса.

Во-вторых, надо дать инстансам возможность обнаружить друг друга для того чтобы механизм discovery правильно собрал все найденные экземпляры Picodata в один кластер. Для этого в параметре --peer нужно указать адрес какого-либо соседнего инстанса. По умолчанию значение параметра --peer установлено в 127.0.0.1:3301. Параметр --peer не влияет больше ни на что, кроме механизма обнаружения других инстансов.

Параметр --advertise используется для установки публичного IP-адреса и порта инстанса. Параметр сообщает, по какому адресу остальные инстансы должны обращаться к текущему. По умолчанию он равен --listen, поэтому в примере выше не упоминается. Но, например, в случае --listen 0.0.0.0 его придется указать явно:

picodata run --listen 0.0.0.0:3301 --advertise 192.168.0.1:3301

Значение параметра --advertise анонсируется кластеру при запуске инстанса. Его можно поменять при перезапуске инстанса или в процессе его работы командой picodata set-advertise.

Именование инстансов

Чтобы проще было отличать инстансы друг от друга, им можно давать имена:

picodata run --instance-id barsik

Если имя не дать, то оно будет сгенерировано автоматически в момент добавления в кластер. Имя инстанса задается один раз и не может быть изменено в дальнейшем (например, оно постоянно сохраняется в снапшотах инстанса). В кластере нельзя иметь два инстанса с одинаковым именем — пока инстанс живой, другой инстанс сразу после запуска получит ошибку при добавлении в кластер. Тем не менее, имя можно повторно использовать если предварительно исключить первый инстанс с таким именем из кластера.

Проверка работы кластера

Каждый инстанс Picodata — это отдельный процесс в ОС. Для его диагностики удобно воспользоваться встроенной консолью, которая автоматически открывается после запуска инстанса (picodata run ...). Для диагностики всей Raft-группы (например, для оценки количества инстансов в кластере) выполните следующую команду:

box.space.raft_group:fselect()

Дополнительно, можно добиться ответа инстансов с помощью такой команды:

pico.raft_propose_info("Hello, Picodata!")

В журнале каждого инстанса (по умолчанию выводится в stderr) появится фраза "Hello, Picodata!"

Репликация и зоны доступности (failure domains)

Количество инстансов в репликасете определяется значением переменной replication_factor. Внутри кластера используется один и тот же replication_factor.

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

По мере усложнения топологии возникает еще один вопрос — как не допустить объединения в репликасет инстансов из одного и того же датацентра. Для этого в Picodata имеется параметр --failure-domainзона доступности, отражающая признак физического размещения сервера, на котором выполняется инстанс Picodata. Это может быть как датацентр, так и какое-либо другое обозначение расположения: регион (например, eu-east), стойка, сервер, или собственное обозначение (blue, green, yellow). Ниже показан пример запуска инстанса Picodata с указанием зоны доступности:

picodata run --init-replication-factor 2 --failure-domain region=us,zone=us-west-1

Добавление инстанса в репликасет происходит по следующим правилам:

  • Если в каком-либо репликасете количество инстансов меньше необходимого фактора репликации, то новый инстанс добавляется в него при условии, что их параметры --failure-domain отличаются (регистр символов не учитывается).
  • Если подходящих репликасетов нет, то Picodata создает новый репликасет.

Параметр --failure-domain играет роль только в момент добавления инстанса в кластер. Принадлежность инстанса репликасету впоследствии не меняется.

Как и параметр --advertise, значение параметра--failure-domain каждого инстанса можно редактировать, перезапустив инстанс с новыми параметрами.

Добавляемый инстанс должен обладать тем же набором параметров, которые уже есть в кластере. Например, инстанс dc=msk не сможет присоединиться к кластеру с --failure-domain region=eu/us и вернет ошибку.

Как было указано выше, сравнение зон доступности производится без учета регистра символов, поэтому, к примеру, два инстанса с аргументами --failure-domain region=us и --failure-domain REGION=US будут относиться к одному региону и, следовательно, не попадут в один репликасет.

Добавляемый инстанс использует алгоритм discovery для получения от Raft информации о текущем лидере Raft-группы.

Динамическое переключение голосующих узлов в Raft (Raft voter failover)

Все узлы Raft в кластере делятся на два типа: голосующие (voter) и неголосующие (learner). За консистентность Raft-группы отвечают только узлы первого типа. Для коммита каждой транзакции требуется собрать кворум из N/2 + 1 голосующих узлов. Неголосующие узлы в кворуме не участвуют.

Чтобы сохранить баланс между надежностью кластера и удобством его эксплуатации, в Picodata предусмотрена удобная функция — динамическое переключение типа узлов. Если один из голосующих узлов становится недоступным или прекращает работу (что может нарушить кворум в Raft), то тип voter автоматически присваивается одному из доступных неголосующих узлов. Переключение происходит незаметно для пользователя.

Количество голосующих узлов в кластере не настраивается и зависит только от общего количества инстансов. Если инстансов 1 или 2, то голосующий узел один. Если инстансов 3 или 4, то таких узлов три. Для кластеров с 5 или более инстансами — пять голосующих узлов.

Подробнее о запуске Picodata в командной строке см. разделе Описание параметров запуска

Удаление инстансов из кластера (expel)

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

Удаление инстанса с помощью консольной команды

picodata expel --instance-id <instance-id> [--cluster-id <cluster-id>] [--peer <peer>]

где cluster-id и instance-id — данные об удаляемом инстансе, peer — любой инстанс кластера.

Пример:

picodata expel --instance-id i3 --peer 192.168.100.123

В этом случае на адрес 192.168.100.123:3301 будет отправлена команда expel с instance-id = "i3" и стандартным значением cluster-id. Инстанс на 192.168.100.123:3301 найдет лидера и отправит ему команду expel. Лидер отметит, что указанный инстанс удален; остальные инстансы получат эту информацию через Raft. Если удаляемый инстанс запущен, он завершится, если не запущен — примет информацию о своем удалении при запуске и затем завершится. При последующих запусках удаленный инстанс будет сразу завершаться.

Удаление инстанса из консоли Picodata с помощью Lua API

В консоли запущенного инстанса введите следующее:

pico.expel(<instance-id>)

например:

pico.expel("i3")

Будет удален инстанс i3. Сам инстанс i3 будет завершен. Если вы находитесь в консоли удаляемого инстанса — процесс завершится, консоль будет закрыта.

См. отдельный подраздел с практическим примером развертывания кластера. Дополнительно о внутренней архитектуре кластера Picodata можно узнать в разделе Общая схема инициализации кластера.


Исходный код страницы


Последнее обновление: 25 мая 2023 г.
Дата создания: 10 апреля 2023 г.