# Создание шардированной таблицы

> ПРИМЕЧАНИЕ: Автошардирование требует [Manticore Buddy](../../Installation/Manticore_Buddy.md). Если автошардирование не работает, убедитесь, что Buddy установлен и запущен.

Manticore позволяет создавать **шардированные таблицы** — особый тип таблиц (`type='shard'`), который прозрачно распределяет чтение и запись между несколькими физическими шардами. Эта возможность особенно полезна при масштабировании данных. Можно создавать как локальные шардированные таблицы на одном сервере, так и реплицированные шардированные таблицы в многонодовом репликационном кластере, чтобы оптимизировать распределение данных.

Шардированные таблицы дают несколько ключевых преимуществ для высокопроизводительных приложений:
- Они обеспечивают более высокую производительность записи, потому что данные пишутся сразу в несколько шардов параллельно, а системные ресурсы используются эффективнее. Такая параллельная запись дает более высокую скорость индексации по сравнению с одной большой таблицей.
- Шардированные таблицы поддерживают репликацию из коробки, повышая доступность системы. Вам не нужно настраивать репликацию вручную. Просто задайте коэффициент репликации при создании шардированной таблицы, и система сама все сделает. Такая встроенная репликация обеспечивает непрерывный доступ к данным даже при отказе части узлов.

#### Параметры

- `shards='N'` — число физических шардов, которые нужно создать. Обязательный параметр. Должно быть положительным целым числом, максимум 3000.
- `rf='M'` — коэффициент репликации: число копий, которое хранится для каждого шарда. Обязательный параметр. На одном узле он должен быть `1`; в репликационном кластере — от 1 до числа узлов в кластере.
- `timeout='S'` — сколько времени в секундах ждать подготовки шардов при создании. По умолчанию `30`. Увеличьте значение, если создаете много шардов на большом числе узлов.

Значения нужно указывать в кавычках (`shards='10'`, а не `shards=10`). Имена параметров не чувствительны к регистру.

#### Создание локальной шардированной таблицы

Чтобы создать локальную шардированную таблицу, создайте таблицу как обычно и добавьте `shards='N'` и `rf='1'`. `shards` — это число физических шардов, которые будут созданы за таблицей. `rf` — коэффициент репликации. На одном сервере он должен быть `1`.

Вот пример, который создает таблицу с 10 шардами и автоматически распределяет данные между ними:

```sql
CREATE TABLE local_sharded shards='10' rf='1'
```

После этого запроса вы получаете одну шардированную таблицу, у которой все шарды уже настроены. Физические шарды находятся в базе `system` и скрыты из `SHOW TABLES`; вы работаете с шардированной таблицей по ее публичному имени, а система автоматически направляет операции к нужным шардам.

#### Создание реплицированной шардированной таблицы

Чтобы защититься от отказов сервера, настройте репликационный кластер на тех узлах, которые должны участвовать. Далее в этой документации мы будем считать, что созданный вами кластер называется `c`. Добавьте все нужные узлы, следуя инструкциям по [репликации](../../Creating_a_cluster/Setting_up_replication/Setting_up_replication.md), а затем создайте таблицу с нужным коэффициентом репликации.

Например, допустим, у вас есть 3-узловой репликационный кластер и вы хотите таблицу, разбитую на 10 шардов, с одной копией каждого шарда на каждом узле. При участии трех узлов нужно задать `rf='3'`:

```sql
CREATE TABLE c:cluster_sharded shards='10' rf='3'
```

После этого можно работать с таблицей по ее обычному имени на любом узле кластера — для `INSERT`, `SELECT`, `UPDATE` и `DELETE` не нужен префикс кластера. Префикс кластера (`c:`) используется только для DDL, например `CREATE TABLE` и `DROP TABLE`.

Стандартное время ожидания завершения всех процессов подготовки шардов при создании — 30 секунд. Иногда при создании большого числа шардов в репликационном кластере с несколькими узлами это занимает чуть больше времени из-за сетевой задержки. При необходимости это время можно увеличить с помощью параметра `timeout`:

```sql
CREATE TABLE c:cluster_sharded shards='10' rf='3' timeout='60'
```

Если время ожидания будет превышено, создание таблицы завершится с ошибкой, и вам придется повторить попытку с большим значением timeout.

#### Удаление шардированной таблицы

Чтобы удалить шардированную таблицу, используйте стандартную команду `DROP TABLE`. В кластерной среде указывайте имя кластера в имени таблицы, чтобы точно обратиться к нужной таблице. Поддерживается `IF EXISTS`.

Чтобы удалить локальную шардированную таблицу:

```sql
DROP TABLE local_sharded
DROP TABLE IF EXISTS local_sharded
```

Чтобы удалить реплицированную шардированную таблицу:

```sql
DROP TABLE c:cluster_sharded
DROP TABLE IF EXISTS c:cluster_sharded
```

#### Просмотр шардированных таблиц

`DESC <table>` возвращает пользовательскую схему полей шардированной таблицы (те столбцы, которые вы объявили).

`SHOW CREATE TABLE <table>` возвращает пользовательское определение с `shards='N' rf='M'` — внутренняя топология `type='shard'` (клаузулы `local=`/`agent=` для каждого шарда и репликационный кластер с md5-именем) намеренно скрыта. Чтобы посмотреть раскрытую внутреннюю топологию для диагностики, используйте `SHOW CREATE TABLE <table> OPTION force=1`.

Для проверки состояния подсистемы шардирования предусмотрены две дополнительные команды:

- `SHOW SHARDING STATUS [[<cluster>:]<table>]` — показывает размещение и состояние каждого шарда. Без аргументов выводит все шардированные таблицы; с именем таблицы (при желании с префиксом кластера) фильтрует вывод только по ней. Возвращаемые столбцы: `table`, `shard`, `node`, `status` (`active`/`inactive`), `cluster`, `replication_cluster`, `rf` и `rf_status` (`ok`/`degraded`/`broken`).

   ```sql
   SHOW SHARDING STATUS
   SHOW SHARDING STATUS cluster_sharded
   SHOW SHARDING STATUS c:cluster_sharded
   ```

- `SHOW SHARDING MASTER` — показывает, на каком узле сейчас запущен процесс sharding master, и находится ли он в состоянии `active` или `inactive`.

   ```sql
   SHOW SHARDING MASTER
   ```

<!-- proofread -->

