Ceph RBD + OCFS2 - распределенное хранилище на блочных устройствах
Что делать, если нужно, чтобы доступ к системе хранения данных был не просто быстрым, а желательно равным скорости обращения к локальному SSD-диску? Единственным реально быстрым методом будет доставка блочного устройства напрямую клиенту. Со стародавних времен серверные СХД предоставляют такой доступ по средствам протокола iSCSI, и эта статья могла бы быть про это, но в наше время появилось дополнительно требование к подобным системам - это масштабируемость и отказоустойчивость (или “Высокая доступность”). Тут на сцену выходят програмно определяемые хранилища, такие как Ceph, GlusterFS, cStor, MayaStor и другие. Но наибольшей популярностью пользуется именно Ceph, т.к., несмотря на достаточно сложный порог входа, он имеет ряд архитектурных ноу-хау, которые кажутся весьма перспективными. И, при правильной организации кластера, может быть быстрым, гибким и готовым к работе в “боевых” условиях, как говорят - “Production ready”. Он конечно не самый быстрый, но в совокупности требований к современной СХД, он подходит больше всего.
В принципе, описываемая в данной статье технология, не плохо себя показала даже на неблоьших скоростях сетевого соединения, а именно - в гигабитной сети, но нужно понимать, что для обеспечения приемлемых показателей по задержкам (latency) нужно, чтобы сам сетевой стек мог это обеспечить, и для этого рекомендуется использовать сеть со скоростью не ниже сорока гигабит. Тогда, то о чем я говорил в начале будет реализуемо. Но даже без этого скорость доступа можно улучшить, если где-то вместо CephFS начать использовать связку RBD+OCFS2.
В данном контексте, еще следует сказать, что под собой подразумевает “кластерная файловая система”. Она нужна для синхронизации операций ввода-вывода именно на уровне файловой системы, а не данных которые в ней хранятся. Данный механизм необходим, чтобы обеспечить согласованность размещения данных, и не допустить возможности записи двумя клиентами в один и тот же блок блочного устройства, тем самым обеспечивая их целостность.
Да, еще следует сказать, что OCFS2 (Oracle Cluster File System version 2) - не единственная кластерная файловая система, её ближайший конкурент - GFS2 (Global File System version 2), но есть и другие. В моём случае выбор именно OCFS2 был определен рекомендациями со стороны моего ближайшего окружения, плюс - ее простота, в плане начального входного порога, а так же, она практически из коробки работает в ОС Ubuntu 22.04 LTS, которая для меня является приоритетной из-за большой поддержки со стороны мирового коммьюнити и самого Canonical.
Данная статья подразумевает, что у вас уже есть кластер Ceph, и в этом кластере уже есть какой-то пул, в котором мы будем создавать RBD-образы. Писать про настройку самого Ceph не вижу смысла, т.к. уже много всего про него понаписано и он сам не плохо задокументирован.
Создание и подключение RBD-образа
Создание
Опираясь на офф.документацию, создаем образ блочного устройства но стороне кластера Ceph:
|
|
При использовании ключа --thick-provision
, диск будет создаваться дольше, т.к. в этом режиме всё выделяемое под него место будет заполняться нулями. Сама команда создания может быть гораздо короче, достаточно указать только размер и имя создаваемого образа в пуле, но так мне нравится больше, т.к. можно точно знать с какими настройками будет создан образ.
Подключение
Для начала, на стороне кластера, создадим пользователя:
|
|
В реузльтате мы должны получить токен клиента для доступа к пулу, вида:
|
|
Если по каким-то причинам вы не сохранили данный токен, то можно его получить выполнив:
|
|
Если токен больше не нужен, то чтобы его удалить:
|
|
Далее, переходим к настройке на самом клиенте:
Устанавливаем необходимые пакеты:
|
|
Создаем минимальный конфиг кластера в файле /etc/ceph/ceph.conf
, который в принциае, можно скопировать с любой из нод самого кластера. Он имеет вид:
|
|
Создаем файл /etc/ceph/ceph.client.rbd-test.keyring
с токеном клиента, который был получен на этапе создания пользователя:
|
|
После чего, можно попробовать подключить наше блочное устройство командой:
|
|
Если все получилось и при выполнении команды lsblk
, в системе появилось блочное устройство /dev/rbd0
нужного размера, то можно добавить запись в файле /etc/ceph/rbdmap
, чтобы устройство подключалось автоматически при загрузке системы. Содержимое файла будет выглядеть так:
|
|
Данный набор операций будет одинаковым на всех клиентах где будет использоваться это блочное устройство.
Создание кластера OCFS2
Проектирование
Исходя из офф.докуметации самого Oracle, мы должны сразу учитывать:
- колличество клиентов
- размер диска
- колличество томов
- наличе разделов
Так же существет два режима работы распространения данных синхронизации - local и global, которые так же следует учитывать при оценке масштабов кластера. Для больших кластеров, кластеров где ожидается наличие большого колличества томов, рекомендуется наличие как минимум трех нод, работающих в режиме “global”, чтобы в случае превышения тайм-аута получения данных синхронизации от большей части устройств иметь возможность удерживать кластер в консистентном состоянии.
Есть еще ряд нюансов, но для начала этого хватит.
Данный пример описывает использование кластера на двух нодах, по этому будет использоваться самый простой вариант - local.
Настройка кластера
Сначала установим необходимые пакеты:
|
|
/etc/hostname
и по DNS, имена должы соответствовать. Если использование DNS не подразумевается, то нужно будет прописать соответствия в файе /etc/hosts
на всех узлах кластера файловой системы.Теперь создаем кластер и добавляем в него узлы:
|
|
В результате у нас должен получиться файл конфигурации /etc/ocfs2/cluster.conf
, содержащий следющее:
|
|
Далее, полученный файл конфигурации нужно распространить на все ноды кластера.
После этого создаем файловую систему, исходя из ваших потребностей и размера файловой системы. В OCFS2 есть такой параметр как “Cluster Size” (ключ -C
), размер которого определяется в зависимости от размера файловой системы.
Размер ФС | Рекомендуемы минимальный размер кластера |
---|---|
1 ГБ - 10 ГБ | 8K |
10 ГБ - 100 ГБ | 16K |
100 ГБ - 1 ТБ | 32K |
1 ТБ - 10 ТБ | 64K |
10 TB - 16 TB | 128K |
Так же важным является параметр “Number of Slots” (ключ -N
), который определяет максимальное колличество нод, которые могут быть одновременно подключены к тому. Для обеспечения лучшей производительности, рекомендуется устанавливать его значение равным минимум в два раза большим чем колличество нод. Так же говорится о том, что, если в будущем потребуется увеличить колличество слотов, то это может негативно сказаться на производительности, т.к. журнал файловой системы будет находится в разных частях диска.
Еще один важный параметр - “Journal Size” (ключ -J
), который определяет размер журнала. Его значение может быть 64M, 128M или 256M, которое выбирается в зависимости от назначения диска. Т.е. если диск будет хранить файлы большого размера, то рекомендуется использовать размер 64M, если файлы смешанного размера - большие и маленькие, то 128M, если только маленькие, то 256M.
Опираясь на офф.документаию, создаем файловую систему:
|
|
После этого необходимо настроить автоматический запуск кластера. Удобнее всего это делать с помощью команды:
|
|
Где все параметры можно оставить по умолчанию, кроме имени кластера, который мы указывали при создании, т.е. - ocfs2test
.
Если вы захотите создаь кластер в режиме global
, чего в рамках данного примера делать не нужно, то нужно будет переключить кластер в режим global
:
|
|
Создать файловую систему, затем выполнить:
|
|
Тогда файл конфигурации кластера будет выглядеть так:
|
|
Где поле region
, раздела heartbeat
будет иметь значение UUID тома. Чтобы в этом убедиться, можно выполнить команду:
|
|
Вывод которой должен быть таким:
|
|
Чтобы убедиться, что все работает правильно выполняем:
|
|
где в конце мы должны увидеть прмерно следующие сообщения:
|
|
На второй ноде нашего кластера необходимо выполить такой же набор действий, за исключением создания кластера, т.к. у нас уже есть файл конфигурации кластера взятый с первой ноды, и создания файловой системы, т.к. она уже была создана ранее.
Псоле этого можно попробовать примонтировать наш диск:
|
|
Так же можно добавить соответствующую запись в файле /etc/fstab
, чтобы данный том монтировался автоматически. Запись будет выглядеть так:
|
|
Если в будующем вы захотите добавить дополнительную ноду, то нужно будет выполнить остановку сервиса o2cb.service
на всех существующих нодах, после чего - добавить новую ноду, затем, распространить файл конфигурации на все ноды и запустить сервис обратно.
Если понадобится изменить настройки самой файловой системы, например, увеличить колличество слотов, то можно это сделать так:
|
|