[Документация Yandex Cloud](../../index.md) > [Практические руководства](../index.md) > [Построение Data Platform](index.md) > Шардирование коллекций Yandex StoreDoc

# Шардирование коллекций Yandex StoreDoc

# Шардирование коллекций Yandex StoreDoc


{% note warning %}

Часть ресурсов, необходимых для прохождения практического руководства, доступны только в [регионе Россия](../../overview/concepts/region.md).

{% endnote %}


При [шардировании](../../glossary/sharding.md) кластера Yandex StoreDoc автоматически создаются служебные хосты, которые [тарифицируются](../../storedoc/pricing.md) отдельно от основных хостов СУБД:
- либо `MONGOS` и `MONGOCFG`,
- либо `MONGOINFRA`.

{% note alert %}

Отменить шардирование кластера невозможно: чтобы воссоздать кластер до шардирования, его придется создать заново из резервной копии текущего кластера.

{% endnote %}

Шардирование коллекций имеет смысл, когда распределение по шардам поможет существенно улучшить производительность СУБД или доступность данных. Для повышения доступности каждый шард рекомендуется составлять из трех и более хостов БД.

Удобство в работе и фактическое улучшение производительности сильно зависят от выбора ключа шардирования: данные коллекции должны быть логично распределены по шардам, а данные разных шардов не должны быть связаны между собой.

Распределять по шардам стоит:

* Данные значительного объема: если коллекция занимает больше 200 ГБ.
* Коллекции с неоднородным содержанием: например, данные можно четко разделить на часто и редко запрашиваемые.
* Коллекции с высокими требованиями к скорости чтения и записи данных: шардирование поможет распределить нагрузку по хостам, чтобы обойти технические ограничения.

Подробнее о концепции шардирования читайте в разделе [Шардирование в Yandex StoreDoc](../../storedoc/concepts/sharding.md).


## Необходимые платные ресурсы {#paid-resources}

Оплачивается использование кластера Yandex StoreDoc: выделенные хостам вычислительные ресурсы, включая ресурсы дополнительных служебных хостов, а также объем хранилища и резервных копий ([тарифы Yandex StoreDoc](../../storedoc/pricing.md)).


## Как включить шардирование коллекций {#enable}

{% note warning %}

Все операции по настройке шардирования с помощью CLI `mongosh` необходимо выполнять от имени пользователя с ролью [mdbShardingManager](../../storedoc/concepts/users-and-roles.md#mdbShardingManager) в базе данных `admin`.

{% endnote %}

1. [Включите шардирование](../../storedoc/operations/shards.md#enable) для кластера.
1. [Подключитесь](../../storedoc/operations/connect/index.md) к хосту `MONGOS` или `MONGOINFRA` с помощью CLI `mongosh` и включите шардирование:

   ```text
   sh.enableSharding("<имя_БД>")
   ```

   Тип хоста можно запросить со [списком хостов в кластере](../../storedoc/operations/hosts.md#list-hosts).

1. Задайте индекс в шардированной коллекции:

   ```text
   db.getSiblingDB("<имя_БД>").<имя_коллекции>.createIndex( { "<индекс>": <тип_индекса> } )
   ```

1. Включите шардирование коллекции:

   ```text
   sh.shardCollection( "<имя_БД>.<коллекция>", { "<индекс>": <тип_индекса> } )
   ```


1. Переключите приложения, которые используют вашу базу данных, на использование **исключительно** хостов `MONGOS` или `MONGOINFRA`.

### Шардирование разнородных данных {#brackets}

Если коллекция состоит из документов с разнородными типами данных, шарды лучше формировать по значениям ключа `_id` одинакового типа, пользуясь механизмом `Type Bracketing`. Тогда распределение по шардам и поиск документов выполняется быстрее, чем с разнотипными значениями `_id`.


## Пример шардирования {#example}

Допустим, у вас уже есть кластер Yandex StoreDoc с шардами и базой данных `billing`. Необходимо включить шардирование для коллекций `payment` и `addresses`. Для примера в качестве ключа шардирования используется хэш индекса для `payment` и значение поля `addresses`.

Последовательность операций:

1. [Подключитесь](../../storedoc/operations/connect/index.md) к базе `billing`. У пользователя, от имени которого вы подключаетесь к базе, должна быть роль [mdbShardingManager](../../storedoc/concepts/users-and-roles.md#mdbShardingManager) в базе данных `admin`.
1. Включите шардирование для базы `billing`:

   ```text
   sh.enableSharding("billing")
   ```

1. Определите индекс в шардированной коллекции:

   ```text
   db.payments.ensureIndex( { "_id": "hashed" } )
   ```

1. Создайте необходимое количество шардов в [консоли управления](https://kz.console.yandex.cloud).
1. Задайте шардирование для коллекции с учетом ее пространства имен:
   ```text
   sh.shardCollection( "billing.payments", { "_id": "hashed" } )
   ```

После этого шардирование будет включено и настроено. Чтобы убедиться в этом, попробуйте вывести список доступных шардов с помощью команды `sh.status()`.