Инструкция по развертыванию¶
В данном документе рассматриваются различные сценарии работы с кластером. Все они основаны на одном и том же принципе: запуске и объединении отдельных экземпляров 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 можно узнать в разделе Общая схема инициализации кластера.
Дата создания: 10 апреля 2023 г.