2022-06-13
Yaroslav Dynnikov
Мы рассмотрим несколько сценариев работы с кластером. Все они основаны на одном и том же принципе, а сложность деплоя фактически зависит только от сложности самой топологии.
С минимальными, так с минимальными. Обязательных параметров у пикодаты нет совсем. Так что одноинстансовый кластер запускается командой
Запускайте сколько хотите инстансов, кластер будет расти. Каждому инстансу придётся выделить рабочую директорию и listen
адрес. Фактор репликации по умолчанию равен 1 — каждый инстанс образует отдельный репликасет.
Q: Что, даже peer не надо указывать (для кластера из 3х)?
A: Да, по умолчанию--peer=127.0.0.1:3301
, прям как дефолтный--listen
Когда локалхост покорён, самое время запустить пикодату на нескольких серверах. Предположим их два — 192.168.0.1
и 192.168.0.2
. Запускаем:
На 192.168.0.1
:
На 192.168.0.2
:
Во-первых, вместо дефолтного 127.0.0.1
надо указать --listen=0.0.0.0
. Порт указывать не обязательно (по умолчанию везде используется :3301
), но для наглядности лучше использовать полноценный формат <HOST>:<PORT>
.
Значение --listen
не хранится в кластерной конфигурации. Поменять его можно на рестарте.
Во-вторых, надо дать инстансам возможность обнаружить друг друга. В параметре --peer
указываем адрес одного соседа для дискавери. По дефолту --peer=127.0.0.1:3301
. Параметр --peer
ни на что, кроме дискавери, не влияет.
Параметр --advertise
сообщает, по какому адресу остальные инстансы должны обращаться к данному. По умолчанию он определяется автоматически как <HOSTNAME>:<LISTEN_PORT>
.
Значение --advertise
анонсируется кластеру на старте инстанса. Его можно поменять при рестарте или в рантайме командой picodata set-advertise
.
Чтобы проще было отличать инстансы друг от друга, инстансам можно давать имена:
Если имя не дать, оно будет сгенерировано автоматически в момент добавления в кластер. Имя инстанса персистится в снапшотах и не подлежит редактированию. Иметь в кластере два инстанса с одинаковым именем тоже запрещено — второй инстанс получит ошибку при добавлении. Тем не менее, имя можно переиспользовать, если предварительно выгнать инстанс командой picodata expel barsik
.
Количество реплик настраивается параметром --init-replication-factor
.
Этот параметр играет роль только в момент инициализации кластера. Бутстрап лидер записывает это значение в кластерную конфигурацию (replication-factor
). В дальнейшем значение --init-replication-factor
игнорируется.
Отредактировать фактор репликации, сохраненный в конфиге кластера, можно командой picodata set-replication-factor
. Редактирование кластерного конфига сказывается только на новых добавляемых инстансах, но не затрагивает уже работающие.
Этот параметр составляет часть конфигурации кластера и обозначает желаемое количество реплик в каждом репликасет.е
При добавлении инстанса, фактор репликации будет записан в кластерную конфигурацию, но такой сценарий позволяет изменять аго только в сторону увеличения. Уменьшить фактор репликации можно командой picodata set-replication-factor
, но опять же, с уже работающими инстансами ничего не произойдёт.
По мере усложнения топологии встаёт ещё один вопрос — как запретить пикодате объединять в репликасет инстансы из одного датацентра. Понятие датацентра здесь используется только как пример, на самом деле пикодата позволяет использовать любые удобные понятия — регион (eu-east
), датацентр, стойка, сервер, или придумать свои обозначения (blue, green, yellow).
Добавление инстанса в репликасет происходит по следующим правилам:
Параметр --failure-domain
играет роль только в момент добавления инстанса в кластер. Принадлежность инстанса репликасету впоследствии не меняется.
Как и параметр --advertise
, значение failure-domain
каждого инстанса можно редактировать
picodata set-failure-domain
.Добавляемый инстанс должен обладать тем же набором ключей, которые уже есть в кластере. Например, инстанс dc=msk
не сможет присоединиться к кластеру с --failure-domain region=eu/us
и вернёт ошибку.
Иногда бывает так, что в разных репликасетах хочется использовать разный фактор репликации или ограничить размер хранимых данных. Классический пример — разделение кластера на стораджа и роутеры.
Это делается с помощью параметра --replicaset-group
. По умолчанию инстансы добавляются в неявную группу "default"
, но пользователь может насоздавать сколько угодно новых, перечислив их в параметре --available-replicaset-groups
.
Теперь при запуске инстансов можно будет указывать
Наличие групп не ограничивает пользователя в создании новых. Как и в случае с --replication-factor
, новые группы можно добавлять вместе с добавлением новых инстансов.
Пикодата старается не объединять в один репликасет инстансы, у которых совпадает хотя бы один фейл домен. Но иногда это прямо таки необходимо. Чтобы ограничить пикодату в бесконечном создании репликасетов, можно воспользоваться флагом --max-replicaset-count
(по умолчанию inf
).
Как и --replication-factor
, параметр --max-replicaset-count
можно назначать разным для разных групп репликасетов.
Как и другие параметры, --max-replicaset-count
редактируется в любой момент:
Единственное, --max-replicaset-count
нельзя сделать меньше существующего количества репликасетов.
Пикодата позволяет передавать параметры из трёх мест (в порядке возрастания приоритета):
PICODATA_<PARAM>=<VALUE>
--param value
Мы перечислили достаточно много разнобразных параметров, некоторые из которых достаточно развесистые. Пользуйтесь конфигами:
c1.toml
Все рафт ноды в кластере делятся на две роли - воутеры и лёрнеры. За консистентность отвечают только воутеры. Для коммита каждой транзакции требуется собрать кворум из N/2 + 1
воутеров. Лернеры в кворуме не участвуют.
Чтобы сохранить баланс между надёжностью кластера и беззаботностью его эксплуатации, пикодата обладает фишечкой — при смерти одного из воутеров (на которох держится кворум рафта и который терять очень не хочется) роль воутера автоматически передаётся одному из живых инстансов. Переключение происходит незаметно для пользователя.
Количество воутеров в кластере не настраивается и зависит только от общего количества инстансов. Если инстансов 1 или 2, воутер один. Если инстансов 3 или 4, то воутера три. Для кластеров от 5 инстансов и больше - пять воутеров.
--cfg <path>
: Read configuration parameters from file (toml / yaml).
env:PICODATA_CFG
default: none
--data-dir
PICODATA_DATA_DIR
.
--listen
PICODATA_LISTEN
localhost:3301
--peer <[host][:port]>
PICODATA_PEER
localhost:3301
--advertise <[host][:port]>
PICODATA_ADVERTISE
%hostname%:%listen_port%
%listen% == "0.0.0.0"
, то надо подставлять %hostname%
. Сейчас дефолт всегда просто %listen%
.--cluster-id <name>
PICODATA_CLUSTER_ID
demo
--instance-id <name>
PICODATA_INSTANCE_ID
i%raft_id%
, e.g. i1
, i42
, etc.--failure-domain <key=value,...>
PICODATA_FAILURE_DOMAIN
--replicaset-group <name>
PICODATA_REPLICASET_GROUP
default
--init-replication-factor <number>
PICODATA_INIT_REPLICATION_FACTOR
1
--init-storage-weight <number>
PICODATA_INIT_STORAGE_WEIGHT
1
--max-replicaset-count
PICODATA_MAX_REPLICASET_COUNT