Стирающее кодирование — ключевой метод защиты данных в распределенных системах хранения. В этом сообщении блога объясняется, как стирающее кодирование удовлетворяет корпоративным требованиям к защите данных и как оно реализовано в MinIO.
Защита данных важна в любой корпоративной среде, поскольку сбои оборудования, особенно дисков, являются обычным явлением.
Традиционно для обеспечения отказоустойчивости оборудования использовались различные типы технологий RAID или зеркалирования/репликации. Зеркальное отображение и репликация основаны на одной или нескольких полных избыточных копиях данных — это дорогостоящий способ использования хранилища. Более сложные технологии, такие как RAID5 и RAID6, обеспечивают такую же отказоустойчивость, одновременно снижая нагрузку на хранилище. RAID — хорошее решение для защиты данных на одном узле, но его невозможно масштабировать из-за трудоемких операций восстановления, необходимых для возобновления работы вышедших из строя дисков.
Многие распределенные системы используют трехстороннюю репликацию для защиты данных, при которой исходные данные полностью записываются на три разных диска, и любой диск может восстановить или прочитать исходные данные. Репликация не только неэффективна с точки зрения использования хранилища, но и неэффективна с точки зрения эксплуатации при восстановлении после сбоя. При выходе из строя диска система переходит в режим только для чтения с пониженной производительностью и полностью копирует неповрежденный диск на новый для замены вышедшего из строя диска.
Стирающее кодирование применяется для защиты данных в распределенном хранилище, поскольку оно устойчиво и эффективно. Он разбивает файлы данных на блоки данных и блоков четности и кодирует их так, чтобы первичные данные можно было восстановить, даже если часть закодированных данных недоступна. Горизонтально масштабируемые распределенные системы хранения используют стирающее кодирование для обеспечения защиты данных путем сохранения закодированных данных на нескольких дисках и узлах. В случае сбоя диска или узла или повреждения данных исходные данные можно восстановить из блоков, сохраненных на других дисках и узлах.
Стирающее кодирование способно выдерживать такое же количество сбоев дисков, как и другие технологии, с гораздо большей эффективностью за счет распределения данных по узлам и дискам. Существует множество различных алгоритмов стирающего кодирования, а коды с разделением на максимальное расстояние (MDS), такие как коды Рида-Соломона, обеспечивают наибольшую эффективность хранения.
В объектном хранилище единицей данных, подлежащих защите, является объект. Объект может храниться на n дисках. Если k указывает на потенциальный сбой, то k < n, и с помощью кодов MDS система может гарантировать устойчивость к сбоям n - k дисков, что означает, что k дисков достаточно для доступа к любому объекту.
Учитывая объект размером M байт, размер каждого закодированного объекта равен M/k (без учета размера метаданных). По сравнению с N-сторонней репликацией, показанной выше, со стирающим кодированием, настроенным для n = 5 и k = 3, распределенная система хранения может выдержать потерю двух дисков, одновременно повышая эффективность хранения на 80%. Например, для репликации 10 ПБ данных потребуется более 30 ПБ хранилища, тогда как для объектного хранилища потребуется 15–20 ПБ для безопасного хранения и защиты тех же данных с помощью стирающего кодирования. Стирающее кодирование можно настроить для различных соотношений данных и блоков четности, что приводит к разной эффективности хранения. В MinIO имеется полезный калькулятор кода стирания , помогающий определить требования в вашей среде.
MinIO защищает данные с помощью встроенного стирающего кодирования для каждого объекта (официальная документация MinIO для справки ), написанного на ассемблере для обеспечения максимально возможной производительности. MinIO использует инструкции Intel AVX512 для полного использования ресурсов центрального процессора на нескольких узлах для быстрого стирающего кодирования. Стандартный процессор, быстрые накопители NVMe и сеть со скоростью 100 Гбит/с поддерживают запись объектов со стирающим кодом со скоростью, близкой к проводной.
MinIO использует код Рида-Соломона для разделения объектов на блоки данных и четности, которые можно настроить на любой желаемый уровень избыточности. Это означает, что в конфигурации с 16 дисками и 8 блоками четности объект распределяется по 8 блокам данных и 8 блокам четности. Даже если вы потеряете до 7 ((n/2)–1) дисков, будь то контроль четности или данные, вы все равно сможете надежно восстановить данные с оставшихся дисков. Реализация MinIO гарантирует, что объекты могут быть прочитаны или записаны новые объекты, даже если несколько устройств потеряны или недоступны.
MinIO разбивает объекты на блоки данных и четности в зависимости от размера набора стирания, затем случайным образом и равномерно распределяет блоки данных и четности по дискам в наборе так, чтобы каждый диск содержал не более одного блока на объект. Хотя диск может содержать как блоки данных, так и блоки четности для нескольких объектов, один объект имеет не более одного блока на диск, если в системе имеется достаточное количество дисков. Для объектов с поддержкой версий MinIO выбирает одни и те же диски для хранения данных и контроля четности, сохраняя при этом нулевое перекрытие ни на одном диске.
В таблице ниже приведены примеры стирающего кодирования в MinIO с настраиваемыми параметрами данных и четности, а также соответствующими коэффициентами использования хранилища.
Всего дисков (n) | Диски данных (г) | Четность дисков (p) | Коэффициент использования хранилища |
---|---|---|---|
16 | 8 | 8 | 2.00 |
16 | 9 | 7 | 1,79 |
16 | 10 | 6 | 1,60 |
16 | 11 | 5 | 1,45 |
16 | 12 | 4 | 1.34 |
16 | 13 | 3 | 1.23 |
16 | 14 | 2 | 1.14 |
Внутренняя часть MinIO на самом деле довольно проста. Каждому поступающему объекту назначается набор стирания. Набор стирания — это, по сути, набор дисков, а кластер состоит из одного или нескольких наборов стирания, что определяется общим количеством дисков.
Давайте рассмотрим простой пример, чтобы понять формат и макет, используемые в MinIO.
Важно отметить, что формат определяет соотношение данных и дисков четности — имеем ли мы четыре узла с одним диском каждый или четыре узла со 100 дисками каждый (MinIO часто развертывается в плотных конфигурациях JBOD).
Мы можем настроить наши четыре узла по 100 дисков каждый, чтобы использовать размер набора стирания 16 (по умолчанию). Это логическая схема, и она является частью определений вычислений стирающего кодирования. Каждые 16 дисков представляют собой один набор стирания, состоящий из 8 дисков данных и 8 дисков четности. В этом случае набор для стирания основан на 400 физических дисках, поровну разделенных на диски данных и четности, и может допустить потерю до 175 дисков.
Метаданные XL MinIO, атомарно записанные вместе с объектом, содержат всю информацию, связанную с этим объектом. Других метаданных в MinIO нет. Последствия драматичны: все является самостоятельным объектом, сохраняя при этом простоту и самоописание. Метаданные XL указывают алгоритм кода стирания, например, два данных с двумя четностями, размером блока и контрольной суммой. Запись контрольной суммы вместе с самими данными позволяет MinIO оптимизировать память при поддержке потоковой передачи данных, обеспечивая явное преимущество перед системами, которые хранят потоковые данные в памяти, затем записывают их на диск и, наконец, генерируют контрольную сумму CRC-32.
Когда большой объект, т.е. больше 10 МБ записывается в MinIO, API S3 разбивает его на многочастную загрузку. Размеры деталей определяются клиентом при загрузке. S3 требует, чтобы каждая часть имела размер не менее 5 МБ (кроме последней части) и не более 5 ГБ. Согласно спецификации S3, объект может содержать до 10 000 частей. Представьте себе объект размером 320 МБ. Если этот объект разбит на 64 части, MinIO запишет части на диски как часть 1, часть 2,... до части 64. Части имеют примерно одинаковый размер, например, объект размером 320 МБ, загруженный как составной, будет разделен на 64 части по 5 МБ.
Каждая загруженная часть имеет стирающий код поперек полосы. Часть 1 — это первая часть загруженного объекта, и все части расположены на дисках горизонтально. Каждая часть состоит из блоков данных, блоков четности и метаданных XL. MinIO чередует записи, поэтому система не всегда будет записывать данные на одни и те же диски и проверять четность на одни и те же диски. Каждый объект вращается независимо, что позволяет равномерно и эффективно использовать все диски в кластере, а также повышает защиту данных.
Чтобы получить объект, MinIO выполняет расчет хэш-функции, чтобы определить, где объект был сохранен, считывает хэш и получает доступ к необходимому набору стирания и дискам. Когда объект считывается, имеются блоки данных и четности, как описано в метаданных XL. По умолчанию в MinIO установлено стирание 12 данных и 4 четности. Это означает, что пока MinIO может читать любые 12 дисков, объект может обслуживаться.
Стирающее кодирование имеет несколько ключевых преимуществ перед другими технологиями, используемыми для защиты данных в распределенных системах.
Существует несколько причин, по которым стирающее кодирование лучше подходит для объектного хранилища, чем для RAID. Стирающее кодирование MinIO не только защищает объекты от потери данных в случае сбоя нескольких дисков и узлов, MinIO также защищает и восстанавливает данные на уровне объекта. Возможность лечения одного объекта за раз является огромным преимуществом перед RAID, который восстанавливает данные на уровне тома. Поврежденный объект можно восстановить в MinIO за секунды, а не за часы в RAID. Если диск выходит из строя и его заменяют, MinIO распознает новый диск, добавляет его в набор для стирания, а затем проверяет объекты на всех дисках. Что еще более важно, операции чтения и записи не влияют друг на друга, обеспечивая масштабируемую производительность. Существуют развертывания MinIO с сотнями миллиардов объектов в петабайтах хранилища.
Реализация кода стирания в MinIO приводит к повышению эффективности работы центра обработки данных. В отличие от репликации, здесь не требуется длительного восстановления или повторной синхронизации данных между дисками и узлами. Это может показаться тривиальным, но перемещение/копирование объектов может быть очень дорогостоящим, а выход из строя диска емкостью 16 ТБ и его копирование через сеть центра обработки данных на другой диск налагают огромную нагрузку на систему хранения и сеть.
Если эта запись в блоге возбудила ваше любопытство, у нас есть более длинный учебник по кодированию Erasure . Загрузите MinIO и начните защищать данные с помощью стирающего кодирования уже сегодня.
Также опубликовано здесь .