Запуск кластера
В данном разделе приведена информация по развертыванию кластера Picodata на физических узлах. Данная информация применима также к узлам в виртуальной среде.
Минимальный вариант кластера
Запуск кластера сводится к выполнению команды picodata run
с нужным
набором параметров для каждого инстанса (узла). Полный перечень
возможных параметров запуска и их описание содержатся в разделе
Аргументы командной строки Picodata, а также в выводе команды
picodata run --help
. С точки зрения внутренней архитектуры, кластер
корректно называть raft-группой — в дальнейшем при мониторинге и
управлении конфигурацией будет уместнее использовать именно этот термин.
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 run
запускает инстанс, но не
предоставляет доступ к управлению им в консоли. Для подключения к
интерактивной консоли следует либо запускать инстанс с ключом -i
(picodata run -i
), либо отдельно подключаться к инстансу командой
picodata connect
(см. подробнее).
Кластер на нескольких серверах
Выше был показан запуск Picodata на одном сервере, что удобно для
тестирования и отладки, но не отражает сценариев полноценного
использования кластера. Поэтому ниже будет показан запуск Picodata на
нескольких серверах. Предположим, что их два: 192.168.0.1
и
192.168.0.2
. Порядок действий будет следующим:
На 192.168.0.1
:
picodata run --listen 192.168.0.1:3301 --peer 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
Если имя не дать, то оно будет сгенерировано автоматически в момент добавления в кластер. Имя инстанса задается один раз и не может быть изменено в дальнейшем (например, оно постоянно сохраняется в снапшотах инстанса). В кластере нельзя иметь два инстанса с одинаковым именем — пока инстанс живой, другой инстанс сразу после запуска получит ошибку при добавлении в кластер. Тем не менее, имя можно повторно использовать, если предварительно исключить первый инстанс с таким именем из кластера.
Репликация и зоны доступности (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-группы.
Удаление инстансов из кластера (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
будет завершен. Если вы находитесь в консоли удаляемого инстанса — процесс завершится, консоль будет закрыта.
См. отдельный подраздел с описанием работы алгоритма Raft для обеспечения отказоустойчивости кластера.