Шардирование коллекций MongoDB
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
При шардировании кластера Managed Service for MongoDB автоматически создаются служебные хосты, которые тарифицируются отдельно от основных хостов СУБД:
- либо
MONGOS
иMONGOCFG
, - либо
MONGOINFRA
.
Внимание
Отменить шардирование кластера невозможно: чтобы воссоздать кластер до шардирования, его придется создать заново из резервной копии текущего кластера.
Шардирование коллекций имеет смысл, когда распределение по шардам поможет существенно улучшить производительность СУБД или доступность данных. Для повышения доступности каждый шард рекомендуется составлять из трех и более хостов БД.
Удобство в работе и фактическое улучшение производительности сильно зависят от выбора ключа шардирования: данные коллекции должны быть логично распределены по шардам, а данные разных шардов не должны быть связаны между собой.
Распределять по шардам стоит:
- Данные значительного объема: если коллекция занимает больше 200 ГБ.
- Коллекции с неоднородным содержанием: например, данные можно четко разделить на часто и редко запрашиваемые.
- Коллекции с высокими требованиями к скорости чтения и записи данных: шардирование поможет распределить нагрузку по хостам, чтобы обойти технические ограничения.
Подробнее о концепции шардирования читайте в разделе Шардирование в Managed Service for MongoDB.
Как включить шардирование коллекций
Важно
Все операции по настройке шардирования с помощью CLI mongosh
необходимо выполнять от имени пользователя с ролью mdbShardingManager в базе данных admin
-
Включите шардирование для кластера.
-
Подключитесь к хосту
MONGOS
илиMONGOINFRA
с помощью CLImongosh
и включите шардирование:sh.enableSharding("<имя_БД>")
Тип хоста можно запросить со списком хостов в кластере.
-
Задайте индекс в шардированной коллекции:
db.getSiblingDB("<имя_БД>").<имя_коллекции>.createIndex( { "<индекс>": <тип_индекса> } )
-
Включите шардирование коллекции:
sh.shardCollection( "<имя_БД>.<коллекция>", { "<индекс>": <тип_индекса> } )
Подробное описание команды
shardCollection
см. в документации MongoDB . -
Переключите приложения, которые используют вашу базу данных, на использование исключительно хостов
MONGOS
илиMONGOINFRA
.
Шардирование разнородных данных
Если коллекция состоит из документов с разнородными типами данных_id
одинакового типа, пользуясь механизмом Type Bracketing_id
.
Ссылки по теме
Документация MongoDB рассказывает о решениях проблем шардирования:
- О механизме шардирования в общем: Sharding
. - О выборе ключа шардирования и стратегиях шардирования: Shard Keys
.
Пример шардирования
Допустим, у вас уже есть кластер Managed Service for MongoDB с шардами и базой данных billing
. Необходимо включить шардирование для коллекций payment
и addresses
. Для примера в качестве ключа шардирования используется хэш индекса для payment
и значение поля addresses
.
Последовательность операций:
-
Подключитесь к базе
billing
. У пользователя, от имени которого вы подключаетесь к базе, должна быть роль mdbShardingManager в базе данных admin . -
Включите шардирование для базы
billing
:sh.enableSharding("billing")
-
Определите индекс в шардированной коллекции:
db.payments.ensureIndex( { "_id": "hashed" } )
-
Создайте необходимое количество шардов в консоли управления
. -
Задайте шардирование для коллекции с учетом ее пространства имен:
sh.shardCollection( "billing.payments", { "_id": "hashed" } )
После этого шардирование будет включено и настроено. Чтобы убедиться в этом, попробуйте вывести список доступных шардов с помощью команды sh.status()
.