Размер шрифта:
Глава 5. Разработка при помощи librados - Полное руководство Ceph

Глава 5. Разработка при помощи librados - Полное руководство Ceph

Глава 5. Разработка при помощи librados

Ceph предоставляет блочное, файловое и объектное хранение через имеющийся в нём встроенный интерфейс который будет отвечать всем требованиям большей части пользователей. Однако, при некоторых сценариях когда некое приложение разрабатывается изнутри, могут иметься преимущества прямого взаимодействия с Ceph путём применения librados. Librados является собственной библиотекой Ceph, которая даёт возможность приложениям напрямую считывать и записывать объекты на уровне RADOS Ceph.

В данной главе мы рассмотрим следующие вопросы:

Что такое librados?

Как применять librados и какие языки она поддерживает

Как написать некий пример приложения librados

Как написать некое приложение librados, которое хранит образы в Ceph при помощи Python

Как написать некое приложение librados с использованием атомарных операций при помощи C++

Что такое librados?

Librados является библиотекой Ceph, которое вы можете включить в своё собственное приложение чтобы позволить себе напрямую общаться с неким кластером Ceph при помощи его естественного протокола. Поскольку взаимодействия librados с Ceph используют его естественные протоколы взаимодействия, это позволяет вашему приложению обуздать всю мощь, скорость и гибкость Ceph вместо необходимости применения протоколов высокого уровня подобного Amazon S3. Огромный массив функций делает возможным для ваших приложений считывать и записывать простые объекты всеми путями, доступными расширенным операциям, причём вы можете пожелать обернуть некие операции в какую- то транзакцию либо работать с ними асинхронно. Librados доступен для различных языков, включая C, C++, Python, PHP и Java.

Как применять librados?

Чтобы приступить к работе с librados необходима некоторая среда разработки. Для примера данной главы может использоваться один из узлов монитора для действия и в качестве среды разработки, и как сам клиент для исполнения разработанного приложения. Все примеры в данной книге предполагают, что мы применяем некий дистрибутив на основе Debian:

Прежде всего установите все основные инструменты построения для своей операционной системы:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 1

Установите необходимую библиотеку разработки librados:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 2

Теперь, когда ваша среда готова, давайте создадим написанное на C короткое приложение для установления некоторого соединения чтобы проверить кластер Ceph:

В вашем любимом текстовом редакторе создайте некий файл с названием test_app.c и поместите в него следующее:

Оттранслируем для проверки соединения, исполнив такую команду:

Важно отметить, что вам необходимо сообщить gcc подключаться к самой библиотеке для применения её функций.

Затем убедитесь что данное приложение работает, выполнив его. Не забудьте исполнять его от имени root или применив sudo , в противном случае вы не будете иметь доступа к нужному вам кольцу ключей Ceph:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 3

Чтобы проверить приложение просто прочтите свои настройки ceph.conf , воспользуйтесь ими для установления некоего соединения с вашим кластером Ceph, а затем отсоединитесь. Это вряд ли ли самое захватывающее приложение, однако оно проверяет что базовая инфраструктура работает и устанавливает основу для всех остальных приложений в данной главе.

Пример приложения librados

Теперь мы пройдём некоторые примеры приложений, использующие librados, чтобы получить лучшее представление о том, что вы получаете от данной библиотеки.

Следующий пример проведёт вас через определённые этапы по созданию некоторого приложения, в котором задаётся в качестве параметра некий файл образа и будет сохранён этот образ в виде объекта в каком- то кластере Ceph и запомнены различные атрибуты этого файла образа в виде атрибутов объекта. Данное приложение также позволит вам выбирать этот объект и экспортировать его как некий файл образа. Данный пример будет написан на Python, который также поддерживается librados. Приводимый далее пример также применяет Python Imaging Library ( PIL ) для чтения размера некоторого образа и Argument Parser library для чтения параметров командной строки:

Вначале нам необходимо установить привязки librados Python и библиотеки манипуляции образом:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 4

Создайте некий новый файл для своего приложения Python, оканчивающееся расширением .py и введите в него следующее:

Проверим работоспособность help , создаваемую библиотекой синтаксического разбора аргументов:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 5

Выгрузим логотип Ceph для использования в качестве проверки на образе:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 6

Выполните наше приложение Python для чтения некоторого файла образа и загрузки его в Ceph в качестве объекта:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 7

Убедимся что данный объект был создан:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 8

Примените rados для проверки что данный атрибут был добавлен к данному объекту:

Предыдущая команда предоставит вам следующий вывод:

Рисунок 9

Воспользуйтесь rados для проверки содежимого данного атрибута, как это показано на следующем снимке экрана:

Рисунок 10

Пример приложения librados с атомарными операциями

В предыдущем примере приложения librados был создан некий объект в нашем кластере Ceph и затем были добавлены необходимые атрибуты этого объекта. В большинстве случаев такие два этапа действий могут быть удовлетворительными, однако некоторые приложения могут потребовать чтобы создание самого объекта и его атрибута были атомарными. Иными словами, если возникло некоторое прерывание обслуживания, данный объект должен присутствовать только если установлены его атрибуты, в противном случае наш кластер Ceph должен откатить назад данную транзакцию. Следующий написанный на C++ пример показывает как применять атомарные операции librados чтобы гарантировать непротиворечивость транзакции для множества операций. Данный пример записывает некий объект и затем запрашивает своего пользователя если тот хочет прервать данную транзакцию. Если он выбирает прервать, тогда вся операция записи объекта будет откачена обратно. Если он выбирает продолжить, тогда все атрибуты будут записаны и вся транзакция целиком зафиксирована. Выполните следующие шаги:

Создайте какой- то новый файл с расширением .cc и разместите в нём следующее:

Компилируем данный исходный код при помощи g++ :

Теперь мы можем исполнить своё приложение. Вначале давайте исполним его и прервём имеющуюся транзакцию:

Рисунок 11

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

Теперь мы выполним это приложение вновь, но в этот раз давайте продолжим эту транзакцию:

Рисунок 12

Как вы можете увидеть, на этот раз данный объект был записан вместе со своим атрибутом.

Пример приложения librados, которое использует наблюдателей и уведомителей

Следующее приложение librados написано на C и отображает как применять функциональность RADOS watch или notify . Ceph позволяет некому клиенту создавать наблюдателя некоторого объекта и получать уведомления от совершенно другого клиента, подключённого к тому же самому кластеру.

Функциональность наблюдателя реализуется посредством обратного вызова. Когда вы вызываете определённую функцию librados для создания такого наблюдателя, два имеющихся аргумента используются для функции обратного вызова, причём один служит того что делать при получении уведомления, а другой предназначен для того что выполнять если наблюдатель утрачивает контакт или сталкивается с ошибкой для данного объекта. Эти функции обратного вызова в свою очередь содержат тот код, который вы хотите исполнить при получении некого уведомления или возникновении ошибки.

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

Приводимый ниже пример создаёт наблюдателя некоторого объекта с названием my_object и затем ожидает. Когда он получает некое уведомление, он отобразит всю полезную нагрузку и затем отправит принятое сообщение обратно уведомителю.

Создайте некий новый файл с расширением .c и разместите в нём следующее:

Компилируем данный код примера watcher :

Выполняем данное приложение примера watcher :

Рисунок 13

Наш наблюдатель теперь ожидает некого уведомления. В другом терминальном окне, воспользовавшись rados , отправим какое- то уведомление нашему наблюдаемому объекту my_object :

Рисунок 14

Вы можете видеть, что данное уведомление было отправлено и подтверждающее уведомление было обратно получено. Если мы посмотрим в окно первого терминала вновь, мы можем увидеть такое сообщение от уведомителя:

📎📎📎📎📎📎📎📎📎📎