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