Репликация и erasure-кодирование
В данном разделе содержится информация про репликацию и erasure-кодирование — механизмы достижения избыточности при хранении данных. Эти механизмы позволяют предотвратить потерю данных в распределенных системах при аппаратных сбоях.
Репликация требует много дискового пространства, но не требовательна к вычислительным ресурсам (CPU).
Erasure-кодирование требует больше вычислительных ресурсов и меньше дискового пространства.
Атрибут replication_factor
задает коэффициент репликации, атрибут erasure_codec
— тип применяемого erasure-кодека.
Репликация
Для репликации значение erasure_codec
равно none
, а replication_factor
определяет число реплик чанков. При этом каждая реплика записывается в отдельную стойку — rack — для обеспечения rack awareness.
Чанки остаются доступны для чтения при потере всех реплик, кроме одной. Рекомендуемое значение replication_factor
в типичном случае равно трём, так как при меньшем значении потери данных будут встречаться часто.
Чтобы изменить коэффициент репликации, установите атрибут replication_factor
. Система автоматически создаст недостающее количество чанков или удалит лишние.
CLI
yt set //home/your_new_file/@replication_factor 6
Erasure-кодирование
Erasure-кодирование — способ хранения данных, который позволяет экономить место по сравнению с репликацией. Также erasure-кодирование позволяет надежнее хранить данные, так как переживает выпадение любых трех узлов кластера, в то время как тройная репликация переживает выпадение любых двух узлов кластера.
Внимание
- Категорически не рекомендуется использовать erasure-кодирование для хранения foreign-таблиц в операциях
join reduce
иreduce with foreign tables
, если объемы этих таблиц заметно меньше размеров первичных таблиц. При работе таких операций джобы перегрузят запросами узлы кластера, на которых расположены чанки foreign-таблицы. В меньшей степени это касается простых операцийreduce
, у которых число одновременно работающих джобов заметно превышает число чанков во входных таблицах. - Для процессов, которые требовательны к задержкам, использование erasure-кодирования может оказаться невозможным.
- Не имеет смысла использовать erasure-кодирование для небольших объемов, так как выигрыш будет незначителен.
Атрибут replication_factor
не влияет на erasure-чанки. Данные хранятся в одной копии.
Может встречаться ситуация, когда в таблице есть как erasure-чанки, так и обычные. Такие таблицы могут образовываться при выполнении операции merge
.
Атрибут erasure_codec
показывает тип применяемого erasure-кодека. Поддерживаются типы, перечисленные в таблице.
При изменении значения атрибута изменится способ записи новых данных. Старые данные при этом останутся без изменений.
Кодек | Алгоритм | Описание | Объем на диске в сравнении со сжатыми данными | Стоимость восстановления |
---|---|---|---|---|
reed_solomon_6_3 |
Использует коды Рида-Соломона. | При записи erasure-чанка, данные делятся на 6 частей (data-parts). Формируется 3 контрольные части для восстановления. | 1.5x | Стоимость восстановления высока по затратам CPU и по времени. |
lrc_12_2_2 |
Использует Local Reconstruction Codes (LRC), которые являются модификацией кодов Рида-Соломона. | При записи erasure-чанка данные делятся на 12 частей (data-parts). Подсчитываются 2 xor-части — для первых 6 частей с данными и для вторых 6. Подсчитываются 2 контрольных части для восстановления по схеме, аналогичной Риду-Соломону (erasure-parts). Это рекомендуемый вариант для всех случаев, когда нужно erasure-кодирование. | 1.33x | Стоимость восстановления умеренная по затратам на CPU и по времени. |
В обоих случаях система выдерживает выпадение любых трех узлов кластера.
Система старается записать каждую часть чанка на отдельную стойку (rack) для обеспечения rack awareness.
Erasure-кодирование имеет следующие недостатки:
- При выпадении даже одного узла кластера, системе необходимо будет начать фоновое восстановление для поддержания отказоустойчивости. Для восстановления требуется различное количество частей, например для
reed_solomon_6_3
необходимо 6 различных частей. Процесс восстановления автоматический, но требует CPU и занимает некоторое время, от 10 до 60 минут. - Чтение может быть медленным, поскольку физически данные имеют лишь одну реплику. Фактически, при чтении, не из чего выбирать, и если единственный узел кластера, на котором лежит читаемая часть с данными, по тем или иным причинам сильно загружен, то чтение будет медленным. Если часть не удается прочесть длительное время, то система произведет восстановление этой части на клиенте — восстановление при чтении, которое требует дополнительного времени и вычислительных ресурсов. При использовании репликации система выбирает наименее загруженную реплику для чтения;
- Запись данных — дорогостоящая операция с точки зрения потребления оперативной памяти (RAM). Для сравнения, по умолчанию для записи таблицы с использованием репликации требуется 100МБ оперативной памяти, а для записи таблицы с использованием erasure-кодирования — 1500МБ.
Использование erasure-кодирования
Чтобы начать использовать erasure-кодирование, используйте команду transform
.
Данная команда является оберткой над операцией merge
на клиентской стороне. Команда автоматически подбирает data_weight_per_job
и другие параметры и запускает операцию merge
.
yt transform --src //path/to/table --dst //path/to/table --erasure-codec reed_solomon_6_3 --compression-codec brotli_6
import yt.wrapper as yt
yt.transform(src, dst, erasure_codec=erasure_codec, ...)
Чтобы выполнить операцию принудительно, запустите merge
вручную с force_transform=%true
, предварительно установив нужные кодеки на выходной таблице.
Число N
задается в байтах. Размер необходимо подобрать таким образом, чтобы чанк после сжатия занимал более 500МБ.
CLI
yt set //path/to/table/@erasure_codec reed_solomon_6_3
yt set //path/to/table/@compression_codec brotli_6
yt merge --src //path/to/table --dst //path/to/table --spec '{force_transform = %true;data_weight_per_job=N}
Настройки кодирования данных содержатся в атрибутах таблицы. Чтобы увидеть их, выполните следующие команды:
CLI
yt get //path/to/table/@erasure_codec
yt get //path/to/table/@compression_codec
Изменение атрибута приведет к тому, как новые данные будут записываться в таблицу. Старые данные при этом остаются без изменений. Чтобы узнать, в каком формате хранятся данные в таблице, выполните следующие команды:
CLI
yt get //path/to/table/@erasure_statistics
yt get //path/to/table/@compression_statistics