Приложения

 Что такое удаляющее кодирование Рида- Соломона?

Удаляющее кодирование является таким математическим методом кодирования данных при котором они могут быть восстановлены в случае отказа диска. Для недостаточно подготовленных в восстановлении данных предлагается просмотреть это видео (или его краткое изложение в виде слайд- шоу) и эту презентацию, которые на высоком уровне объясняют данный алгоритм и предоставляют примеры и иллюстрации.

 Программные модули разгрузки удаляющего кодирования

Существуют различные программные модели,которые приложения могут выбрать для реализации разгрузки RAID и удаляющего кодирования (EC, Erasure Coding). Мы продемонстрируем пример кодирования 5-2 (5 блоков данных и 2 вычисляемых избыточных блока). Аппаратная реализация разгрузки удаляющих кодирования и декодирования поддерживается адаптерами Mellanox ConnectX-4.

  Вычисления программным обеспечением (без разгрузки)

Большинство приложений сегодня выполняет вычисления удаляющего кодирования (EC), после чего отправляет свои данные и избыточные блоки на соответствующие узлы/ диски (OSD). В этом случае вычисления выполняются ЦПУ и, таким образом, не существует аппаратной разгрузки. Использование ЦПУ в этом случае будет высоким в дополнение к операциям ввода/ вывода.


  Аппаратная разгрузка

При помощи адаптеров Mellanox ConnectX-4 вычисления удаляющего кодирования могут быть разгружены на ASIC адаптера. Существуют различные модели аппаратной разгрузки описываемые ниже.

 

Синхронное кодирование вычислений

Синхронное вычисление EC может применяться существующим программным обеспечением путём простой замены API аналогичного JErasure для применения аппаратно проводимых вычислений EC.


Шаги программирования:

  1. Вызовите API encode_sync(data, code, block_size) - влокировка.

  2. Отошлите данные буферов на соответствующие узлы (не существует порядковой зависимости с 1 шагом {Прим. пер.: могут выполняться одновременно}).

  3. После возврата encode_sync() отошлите кодированные буферы на соответствующие узлы.

  4. {Прим. пер.: снятие блокировки}.

Преимуществами здесь являются:

  • Лёгкое преобразование кода для работы с выполняемыми аппаратно вычислениями

  • Предотвращение использования ЦПУ благодаря разгрузке ваших вычислений EC

[Замечание]Замечание

Маловероятно что латентность и скорость обмена сообщениями и/ или пропускная способность напрямую улучшатся.

 

Асинхронное кодирование вычислений

Также является возможным асинхронное вычисление EC при котором приложение может отправлять операции вычисления EC и получать уведомления о выполнении этих вычислений. Такая модель позволяет приложениям становиться более эффективными по сравнению с временем ожидания вычисления EC, они вольны проводить вычисления или выполнять работу, или службу или какое- либо другое задание. Когда адаптер завершит свои вычисления, он уведомит приложение и тем самым сможет продолжить пересылку своих блоков данных и кода на соответствующие одноранговые узла (OSD).


Шаги программирования:

  1. Отошлите encode_async(data, code, block_size, ...).

  2. Отошлите данные буферов на соответствующие узлы (не существует порядковой зависимости с 1 шагом {Прим. пер.: могут выполняться одновременно}).

  3. Ожидайте завершения encode_async() (асинхронно), вольны тем временем выполнять задачи.

  4. Отошлите вычисленные буферы на соответствующие узлы.

В отличие от синхронной модели асинхронное кодирование является не блокирующей и быстрой операцией. Вызывающий поток предоставляет указатель функции done() для исполнения после вычислений и продолжает прочие вычисления. Он может, например, на данном этапе отправлять ваши блоки данных. Когда вычисление завершено, выполняется ваша функция done(), переданная вызывающим модулем. Предполагается, что функция done() переключится на отсылку вычисленных блоков.

 

Асинхронное кодирование и рассылка вычислений

Обычно EC применяется для распределения хранимых объектов по множеству узлов (OSD) в кластере - эта операция называется чередованием (stripping) объекта. Использующие такую модель приложения способны отсылать структуру задания, которое включает в себя все операции чередования на адаптер и продолжать выполнение следующей задачи. Адаптер разгрузит и EC вычисления и отсылку соответствующих блоков на подходящие узлы.


Шаги программирования:

  1. Отошлите структуру операции encode_send(data, code, block_size, nodes, ...).

  2. Отошлите данные буферов на соответствующие узлы (не существует порядковой зависимости с 1 шагом {Прим. пер.: могут выполняться одновременно}).

  3. Вольны продолжать выполнение задач.

Завершение операции неявное. Вся транзакция рассматривается как завершённая после того, как выполнены все индивидуальные обмены вашими данными. Пользователь может захотеть сигнализировать соответствующими операциями SEND или использовать любой другой способ, который гарантирует что этот обмен данными завершён успешно и сохранён на вашем носителе хранения.

Преимуществом этого метода является уменьшенная латентность и скорости сообщений (операций ввода/ вывода), так как приложение сберегает прерывания программного обеспечения и возвраты строк кэша (благодаря завершению контекстного выполнения), которые существуют в предыдущих двух моделях. Однако преобразование существующих приложений для работы с полностью разгруженными разделёнными операциями менее тривиально.