Better docs

This commit is contained in:
alesapin 2019-09-13 13:44:10 +03:00
parent 9d227b29aa
commit 47c0b124d2
3 changed files with 70 additions and 75 deletions

View File

@ -927,7 +927,7 @@ cat {filename} | clickhouse-client --query="INSERT INTO {some_table} FORMAT Parq
clickhouse-client --query="SELECT * FROM {some_table} FORMAT Parquet" > {some_file.pq}
```
Для обмена данными с экосистемой Hadoop можно использовать движки таблиц [`HDFS`](../../operations/table_engines/hdfs.md) и `URL`.
Для обмена данными с экосистемой Hadoop можно использовать движки таблиц [`HDFS`](../operations/table_engines/hdfs.md) и `URL`.
## Схема формата {#formatschema}

View File

@ -345,68 +345,59 @@ TTL date_time + INTERVAL 15 HOUR
## Хранение данных таблицы на нескольких блочных устройствах {#table_engine-mergetree-multiple-volumes}
### Общее
Данные таблиц семейства MergeTree могут храниться на нескольких блочных
устройствах. Это может оказаться полезным, например, при неявном разделении
данных одной таблицы на "горячие" и "холодные", когда наиболее свежая часть
занимает малый объем и запрашивается регулярно, а большой хвост исторических
данных запрашивается редко. При наличии в системе нескольких дисков, "горячая"
часть данных может быть размещена на быстрых дисках (NVMe SSDs), а холодная на
более медленных (HDD).
Данные таблиц семейства MergeTree могут храниться на нескольких блочных устройствах. Это может оказаться полезным, например, при неявном разделении данных одной таблицы на "горячие" и "холодные", когда наиболее свежая часть занимает малый объем и запрашивается регулярно, а большой хвост исторических данных запрашивается редко. При наличии в системе нескольких дисков, "горячая" часть данных может быть размещена на быстрых дисках (NVMe SSDs), а холодная на более медленных (HDD).
Минимальной перемещаемой единицей для MergeTree является кусок (part). Данные
одного куска могут находится только на одном диске. Куски могут перемещаться
между дисками в фоне, согласно пользовательским настройкам, а также с помощью
`ALTER` запросов.
Минимальной перемещаемой единицей для MergeTree является кусок (part). Данные одного куска могут находится только на одном диске. Куски могут перемещаться между дисками в фоне, согласно пользовательским настройкам, а также с помощью [`ALTER`](../../query_language/alter.md#alter_move-partition) запросов.
### Термины
* Диск -- примонтированное в файловой системе блочное устройство
* Диск по умолчанию -- путь на файловой системе, указанный в `<path>` в основной конфигурации.
* Том (Volume) -- упорядоченный набор равноценных дисков (схоже с [JBOD](https://ru.wikipedia.org/wiki/JBOD))
* Политика хранения (StoragePolicy) -- множество томов с правилами перемещения
данных между ними.
* Диск — примонтированное в файловой системе блочное устройство.
* Диск по умолчанию — путь на файловой системе, указанный в `<path>` в основной конфигурации.
* Том (Volume) — упорядоченный набор равноценных дисков (схоже с [JBOD](https://ru.wikipedia.org/wiki/JBOD))
* Политика хранения (StoragePolicy) — множество томов с правилами перемещения данных между ними.
У всех описанных сущностей, при создании, указываются имена, которые будут
отражены в системных таблицах `system.storage_policies` и `system.disks`. Имя
политики хранения используется как настройка у таблиц семейства MergeTree.
У всех описанных сущностей, при создании, указываются имена, которые будут отражены в системных таблицах `system.storage_policies` и `system.disks`. Имя политики хранения используется как настройка у таблиц семейства MergeTree.
### Конфигурация
Диски, тома и политики хранения задаются в `xml` - конфигурации сервера.
Диски, тома и политики хранения задаются в конфигурации сервера.
Конфигурация дисков имеет следующую структуру:
```
```xml
<disks>
<fast_disk> <!-- disk name -->
<path>/mnt/fast_ssd/clickhouse</path>
</fast_disk>
<slow_disk>
<path>/mnt/slow_hdd/clickhouse</path>
<disk1>
<path>/mnt/hdd1/clickhouse</path>
<keep_free_space_bytes>10485760</keep_free_space_bytes>_
</slow_disk>
</disk1>
<disk2>
<path>/mnt/hdd2/clickhouse</path>
<keep_free_space_bytes>10485760</keep_free_space_bytes>_
</disk2>
...
</disks>
```
* имя диска задается внутри имени тега.
* `path` -- путь по которому будут храниться данные сервера (каталоги
`data`, `shadow`), должен быть терминирован `/`.
* `keep_free_space_bytes` -- размер зарезервированного свободного места на
диске.
* `path` — путь по которому будут храниться данные сервера (каталоги `data`, `shadow`), должен быть терминирован `/`.
* `keep_free_space_bytes` — размер зарезервированного свободного места на диске.
Порядок задания дисков не имеет значения.
Конфигурация политик хранения:
```
```xml
<policies>
<ssd_hdd_in_order> <!-- policy name -->
<hdd_in_order> <!-- policy name -->
<volumes>
<single> <!-- volume name -->
<disk>fast_ssd</disk>
<disk>slow_hdd</disk>
<disk>disk1</disk>
<disk>disk2</disk>
</single>
</volumes>
</ssd_hdd_in_order>
</hdd_in_order>
<moving_from_ssd_to_hdd>
<volumes>
@ -415,7 +406,7 @@ TTL date_time + INTERVAL 15 HOUR
<max_data_part_size_bytes>1073741824</max_data_part_size_bytes>
</hot>
<cold>
<disk>slow_hdd</disk>
<disk>disk1</disk>
</cold>
<move_factor>0.2</move_factor>
</volumes>
@ -424,20 +415,15 @@ TTL date_time + INTERVAL 15 HOUR
```
* имя политики и тома задаются внутри имен тегов.
* `disk` -- диск, находящийся внутри тома.
* `max_data_part_size_bytes` -- максимальный размер куска, который может
находится на любом из дисков этого тома.
* `move_factor` -- доля свободного места, при превышении которого данные
начинают перемещаться на следующий том, если он есть (по умолчанию 0.1).
* `disk` — диск, находящийся внутри тома.
* `max_data_part_size_bytes` — максимальный размер куска, который может находится на любом из дисков этого тома.
* `move_factor` — доля свободного места, при превышении которого данные начинают перемещаться на следующий том, если он есть (по умолчанию 0.1).
Порядок томов в полтиках хранения важен, при достижении условий на переполнение тома данные
переносятся на следующий. Порядок дисков в томах так же важен, данные пишутся по
очереди на каждый из них.
Порядок томов в политиках хранения важен, при достижении условий на переполнение тома данные переносятся на следующий. Порядок дисков в томах так же важен, данные пишутся по очереди на каждый из них.
После задания конфигурации дисков и политик хранения их можно использовать, как
настройку при создании таблиц:
После задания конфигурации дисков и политик хранения их можно использовать, как настройку при создании таблиц:
```
```sql
CREATE TABLE table_with_non_default_policy (
EventDate Date,
OrderID UInt64,
@ -449,12 +435,9 @@ PARTITION BY toYYYYMM(EventDate)
SETTINGS storage_policy_name='moving_from_ssd_to_hdd'
```
Все куски такой таблицы больше 1GB будут писаться сразу на диск `slow_hdd`.
Также, при заполнении диска `fast_ssd` более чем на 80% данные будут переносится
на диск `slow_hdd` фоновым процессом.
Все куски такой таблицы больше 1GB будут писаться сразу на диск `disk1`. Также, при заполнении диска `fast_ssd` более чем на 80% данные будут переносится на диск `disk1` фоновым процессом.
По умолчанию используется политика хранения `default` в которой есть один том и
один диск, указанный в `<path>`.
По умолчанию используется политика хранения `default` в которой есть один том и один диск, указанный в `<path>`.
### Особенности работы
@ -462,32 +445,19 @@ SETTINGS storage_policy_name='moving_from_ssd_to_hdd'
* В результате вставки (запрос `INSERT`).
* В фоновых операциях слияний и мутаций.
* При скачивании данных с другой реплики.
* В результате заморозки партиций `ALTER TABLE ... FREEZE PARTITION`.
* В результате заморозки партиций [`ALTER TABLE ... FREEZE PARTITION`](../../query_language/alter.md#alter_freeze-partition).
Во всех случаях, кроме мутаций и заморозки партиций, при записи куска
выбирается том и диск в соответствии с указанной конфигурацией хранилища:
Во всех случаях, кроме мутаций и заморозки партиций, при записи куска выбирается том и диск в соответствии с указанной конфигурацией хранилища:
1. Выбирается первый по порядку том, на котором есть свободное место для записи
куска (`unreserved_space > current_part_size`) и который
позволяет записывать куски требуемого размера `max_data_part_size_bytes > current_part_size`.
2. Внутри тома выбирается следующий диск после того, на который была предыдущая
запись и на котором свободного места больше чем размер куска
(`unreserved_space - keep_free_space_bytes > current_part_size`)
1. Выбирается первый по порядку том, на котором есть свободное место для записи куска (`unreserved_space > current_part_size`) и который позволяет записывать куски требуемого размера `max_data_part_size_bytes > current_part_size`.
2. Внутри тома выбирается следующий диск после того, на который была предыдущая запись и на котором свободного места больше чем размер куска (`unreserved_space - keep_free_space_bytes > current_part_size`)
Мутации и запросы заморозки партиций в реализации используют [жесткие
ссылки](https://ru.wikipedia.org/wiki/%D0%96%D1%91%D1%81%D1%82%D0%BA%D0%B0%D1%8F_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0).
Жесткие ссылки между различными дисками не поддерживаются, поэтому в случае
таких операций куски размещаются на тех же дисках, что и исходные.
Мутации и запросы заморозки партиций в реализации используют [жесткие ссылки](https://ru.wikipedia.org/wiki/%D0%96%D1%91%D1%81%D1%82%D0%BA%D0%B0%D1%8F_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0). Жесткие ссылки между различными дисками не поддерживаются, поэтому в случае таких операций куски размещаются на тех же дисках, что и исходные.
В фоне куски перемещаются между томами на основе информации о занятом месте
(настройка `move_factor`) по порядку, в котором указаны тома в конфигурации.
Данные никогда не перемещаются с последнего тома и на первый том.
В фоне куски перемещаются между томами на основе информации о занятом месте (настройка `move_factor`) по порядку, в котором указаны тома в конфигурации. Данные никогда не перемещаются с последнего тома и на первый том.
С помощью запроса `ALTER TABLE ... MOVE PART|PARTITION ... TO VOLUME|DISK ...`
пользователь может принудительно перенести кусок или партицию с одного раздела
на другой. При этом учитываются все ограничения, указанные для фоновых операций.
В случае недостатка места или неудовлетворения ограничениям пользователь получит
сообщение об ошибки.
С помощью запроса `ALTER TABLE ... MOVE PART|PARTITION ... TO VOLUME|DISK ...` пользователь может принудительно перенести кусок или партицию с одного раздела на другой. При этом учитываются все ограничения, указанные для фоновых операций. В случае недостатка места или неудовлетворения ограничениям пользователь получит сообщение об ошибки.
Перемещения данных не взаимодействуют с репликацией данных, поэтому на разных
репликах одной и той же таблицы могут быть указаны разные политики хранения.
Перемещения данных не взаимодействуют с репликацией данных, поэтому на разных репликах одной и той же таблицы могут быть указаны разные политики хранения.
После выполнения фоновых слияний или мутаций старые куски не удаляются сразу, а через некоторое время (табличная настройка `old_parts_lifetime`). Также они не перемещаются на другие тома или диски, поэтому до момента удаления они продолжают учитываться при подсчёте занятого дискового пространства.

View File

@ -192,7 +192,8 @@ ALTER TABLE [db].name DROP CONSTRAINT constraint_name;
- [CLEAR COLUMN IN PARTITION](#alter_clear-column-partition) удалить все значения в столбце для заданной партиции;
- [CLEAR INDEX IN PARTITION](#alter_clear-index-partition) - очистить построенные вторичные индексы для заданной партиции;
- [FREEZE PARTITION](#alter_freeze-partition) создать резервную копию партиции;
- [FETCH PARTITION](#alter_fetch-partition) скачать партицию с другого сервера.
- [FETCH PARTITION](#alter_fetch-partition) скачать партицию с другого сервера;
- [MOVE PARTITION|PART](#alter_move-partition) -- переместить партицию/кускок на другой диск или том.
#### DETACH PARTITION {#alter_detach-partition}
@ -309,6 +310,9 @@ ALTER TABLE table_name FREEZE [PARTITION partition_expr]
- `/var/lib/clickhouse/` — рабочая директория ClickHouse, заданная в конфигурационном файле;
- `N` — инкрементальный номер резервной копии.
!!! note
При использовании [нескольких дисков для хранения данных таблицы](../operations/table_engines/mergetree.md#table_engine-mergetree-multiple-volumes) директория `shadow/N` появляется на каждом из дисков, на которых были куски, попавшие под выражение `PARTITION`.
Структура директорий внутри резервной копии такая же, как внутри `/var/lib/clickhouse/`. Запрос выполнит 'chmod' для всех файлов, запрещая запись в них.
Обратите внимание, запрос `ALTER TABLE t FREEZE PARTITION` не реплицируется. Он создает резервную копию только на локальном сервере. После создания резервной копии данные из `/var/lib/clickhouse/shadow/` можно скопировать на удалённый сервер, а локальную копию удалить.
@ -355,6 +359,27 @@ ALTER TABLE users ATTACH PARTITION 201902;
Несмотря на то что запрос называется `ALTER TABLE`, он не изменяет структуру таблицы и не изменяет сразу доступные данные в таблице.
#### MOVE PARTITION|PART {#alter_move-partition}
```sql
ALTER TABLE table_name MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name'
```
Перемещает партицию или кусок на другой том или диск. Запрос работает только для движков семейства MergeTree. Подробнее о хранении данных на разных дисках читайте в разделе [Хранение данных таблицы на нескольких блочных устройствах](../operations/table_engines/mergetree.md#table_engine-mergetree-multiple-volumes).
Следует иметь ввиду:
- Запрос `ALTER TABLE t MOVE` не реплицируется, т.к. на разных репликах могут быть различные конфигурации политик хранения.
- Запрос `ALTER TABLE t MOVE` будет возвращать ошибку, если указан несуществующий том или диск, а также в случае невыполнения условий перемещения данных, которые указаны в конфигурации политики хранения.
- Запрос `ALTER TABLE t MOVE` может возвращать ошибку в случае, когда перемещаемые данные уже оказались перемещены в результате фонового процесса, конкурентного запроса `ALTER TABLE t MOVE` или как часть результата фоновой операции слияния. В данном случае никаких дополнительных действий от пользователя не требуется.
Примеры:
```sql
ALTER TABLE hits MOVE PART '20190301_14343_16206_438' TO VOLUME 'slow'
ALTER TABLE hits MOVE PARTITION '2019-09-01' TO DISK 'fast_ssd'
```
#### Как задавать имя партиции в запросах ALTER {#alter-how-to-specify-part-expr}
Чтобы задать нужную партицию в запросах `ALTER ... PARTITION`, можно использовать: