2.2. Масштабирование кластера
Архитектура Shardman позволяет масштабировать кластер, не прерывая его работу. В этом разделе описывается, как добавить дополнительные узлы в кластер Shardman, чтобы повысить производительность/масштабируемость запросов. Если кластер Shardman не соответствует ожиданиям по производительности или ёмкости хранилища, можно добавить в кластер новые узлы.
2.2.1. Добавление и удаление узлов
Тип конфигурации определяет, как узлы добавляются в кластер и где будут располагаться реплики. Shardman поддерживает два типа конфигураций: режим перекрёстной репликации (cross) и режим ручной топологии (manual). Параметр PlacementPolicy
в sdmspec.json
позволяет выбрать поведение кластера и поддерживает два соответствующих значения: cross
и manual
. По умолчанию используется cross
. Например:
{ "PlacementPolicy": "cross", "Repfactor": 1, ... }
2.2.1.1. Перекрёстная репликация
Для добавления новых узлов в кластер Shardman используется команда shardmanctl nodes add
. С политикой размещения cross узлы добавляются в кластер звеньями. Каждый узел в звене запускает основной экземпляр СУБД и реплики других узлов звена. Количество реплик определяется параметром конфигурации Repfactor. Таким образом, каждое звено состоит из Repfactor + 1
узлов и может выдержать потерю Repfactor
узлов. Пример создания кластера из четырёх узлов с Repfactor
=1 и перекрёстной репликацией показан ниже:
$ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 init -f sdmspec.json $ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 nodes add -n n1,n2,n3,n4
Посмотрите на топологию кластера:
$
shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 cluster topology
Ожидается такой результат:
┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-1-n1, RGID - 1 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n1 │ 5432 │ PRIMARY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n2 │ 5433 │ STANDBY │ └─────────────────────────┴─────────────────┴─────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-1-n2, RGID - 2 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n1 │ 5433 │ STANDBY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n2 │ 5432 │ PRIMARY │ └─────────────────────────┴─────────────────┴─────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-2-n3, RGID - 1 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n3 │ 5432 │ PRIMARY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n4 │ 5433 │ STANDBY │ └─────────────────────────┴─────────────────┴─────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-2-n4, RGID - 2 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n3 │ 5433 │ STANDBY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n4 │ 5432 │ PRIMARY │ └─────────────────────────┴─────────────────┴─────────────────────────┘
Для удаления узлов из кластера Shardman используется команда shardmanctl nodes rm
. Эта команда удаляет из кластера звенья, содержащие указанные узлы. Последнее звено в кластере не может быть удалено. Любые данные (например, секции сегментированных отношений) в удалённых группах репликации переносятся в оставшиеся группы репликации с использованием логической репликации, а все ссылки на удалённые группы репликации (включая определения сторонних серверов) удаляются из метаданных оставшихся групп репликации. На последнем этапе обновляются метаданные в etcd.
$
shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 nodes rm -n n3
Посмотрите на топологию кластера:
$
shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 cluster topology
Вывод команды выглядит так:
┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-1-n1, RGID - 1 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n1 │ 5432 │ PRIMARY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n2 │ 5433 │ STANDBY │ └─────────────────────────┴─────────────────┴─────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-1-n2, RGID - 2 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n1 │ 5433 │ STANDBY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n2 │ 5432 │ PRIMARY │ └─────────────────────────┴─────────────────┴─────────────────────────┘
2.2.1.2. Ручная топология
В режиме ручной топологии для добавления основного узла в кластер используется команда shardmanctl nodes add
, добавляющая список узлов в кластер в качестве основных узлов с отдельной группой репликации для каждого ведущего узла. Создайте кластер с тремя ведущими узлами и ручной топологией (PlacementPolicy
=manual
в sdmspec.json
):
$ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 init -f sdmspec.json $ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 nodes add -n n1,n2,n3
Чтобы посмотреть на топологию кластера, используйте команду shardmanctl cluster topology
:
$
shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 cluster topology
Ожидается такой результат:
┌────────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-1-n1, RGID - 1 == │ ├──────────────────────────┬──────────────────┬──────────────────────────┤ │ HOST │ PORT │ STATUS │ ├──────────────────────────┼──────────────────┼──────────────────────────┤ │ n1 │ 5432 │ PRIMARY │ └──────────────────────────┴──────────────────┴──────────────────────────┘ ┌────────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-2-n2, RGID - 2 == │ ├──────────────────────────┬──────────────────┬──────────────────────────┤ │ HOST │ PORT │ STATUS │ ├──────────────────────────┼──────────────────┼──────────────────────────┤ │ n2 │ 5432 │ PRIMARY │ └──────────────────────────┴──────────────────┴──────────────────────────┘ ┌────────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-3-n3, RGID - 3 == │ ├──────────────────────────┬──────────────────┬──────────────────────────┤ │ HOST │ PORT │ STATUS │ ├──────────────────────────┼──────────────────┼──────────────────────────┤ │ n3 │ 5432 │ PRIMARY │ └──────────────────────────┴──────────────────┴──────────────────────────┘
Добавьте узлы n4
, n5
, n6
в качестве реплик, используя команду shardmanctl shard add
:
$ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 shard --shard clover-1-n1 add -n n4 $ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 shard --shard clover-2-n2 add -n n5 $ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 shard --shard clover-3-n3 add -n n6
В режиме ручной топологии один узел можно добавить более чем в одну группу репликации.
В результате получится следующая конфигурация кластера:
┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-1-n1, RGID - 1 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n1 │ 5432 │ PRIMARY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n4 │ 5432 │ STANDBY │ └─────────────────────────┴─────────────────┴─────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-2-n2, RGID - 2 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n2 │ 5432 │ PRIMARY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n5 │ 5432 │ STANDBY │ └─────────────────────────┴─────────────────┴─────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ == REPLICATION GROUP clover-3-n3, RGID - 3 == │ ├─────────────────────────┬─────────────────┬─────────────────────────┤ │ HOST │ PORT │ STATUS │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n3 │ 5432 │ PRIMARY │ ├─────────────────────────┼─────────────────┼─────────────────────────┤ │ n6 │ 5432 │ STANDBY │ └─────────────────────────┴─────────────────┴─────────────────────────┘
Для удаления реплики запустите команду shardmanctl shard rm
. Например:
$ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 shard --shard clover-1-n1 rm -n n4
Для удаления ведущего сервера сначала запустите команду shardmanctl shard switch
, чтобы переключить ведущий сервер на реплику; затем удалите старый ведущий сервер.
$ shardmanctl --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 shard --shard clover-1-n1 switch --new-primary n4