Download PDF
Download page Распределенное хранилище Ceph.
Распределенное хранилище Ceph
Ceph – программное обеспечение для организации высокодоступного распределенного кластера хранения данных на серверном оборудовании общего назначения. В ПК СВ "Брест" Ceph может быть использован для предоставления доступа к создаваемым в нем блочным устройствам RBD.
Требования
- Имеется 2N+1 узлов для развертывания
Сeph - На узлах установлен пакет
python-minimal - На серверах развернута ОС в соответствии с Установка ОС
Для более надежной работы кластера рекомендуется в дальнейшем добавление четвертого сервера с сервисом OSD для хранения данных.
При расчете продуктовых кластеров Ceph рекомендуется резервировать по 4 Gb ОЗУ на каждый сервис OSD.
Установка и настройка кластера Ceph с помощью ceph-deploy
Подготовка серверов ceph и серверов ПК СВ "Брест"
Синхронизация времени
На каждом сервере Ceph необходимо прописать в файл /etc/ntp.conf сервер для синхронизации времени:
server <dc-1-ip>
Далее перезапустить и сделать автозапуск после перезагрузки службы ntp на каждом сервере Ceph командами:
sudo systemctl enable ntp
sudo systemctl restart ntp
Разрешение имен
Для удобной работы с кластером Ceph необходимо чтобы все серверы инфраструктуры могли обращаться к узлам Ceph по доменным именам. В зависимости от типа используемого домена настройте разрешение имен:
Внести записи об узлах Ceph в DNS-сервисе FreeIPA, как указано в этом подразделе: Добавление записей в DNS
Создайте локальный файл со следующим содержимым:
nameserver <dc-1-ip>
Отредактировать локальные файлы на каждом узле Ceph как описано в разделе Разрешение имен
Информацию об узлах Ceph также потребуется аналогичным образом внести на всех остальных узлах домена, если это не сделано ранее.
Создание пользователя ceph-adm
На каждом сервере кластера Ceph, Front-end и узлах виртуализации добавить пользователя ceph-adm и разрешить ему Sudo без пароля следующими командами:
sudo adduser ceph-adm
echo "ceph-adm ALL = (root) NOPASSWD:ALL" |sudo tee /etc/sudoers.d/ceph-adm
sudo chmod 0440 /etc/sudoers.d/ceph-adm
sudo pdpl-user -i 63 ceph-adm
Если узел Ceph настраивается на Front-end, или узле виртуализации, выполнить команду:
sudo pdpl-user -i 127 ceph-adm
На сервере <ceph-1-hostname> настроить беспарольный доступ по ssh на все серверы Ceph, Front-end и узлы виртуализации (команды выполнять от пользователя <local-admin>):
ssh-keygen
ssh-copy-id ceph-adm@<server-N-ip>
Вариант использования циклов:
ssh-keygen
for node_id in $(seq 1 <X>); do ssh-copy-id ceph-adm@ceph-$node_id; done
for front_id in $(seq 1 <Y>); do ssh-copy-id ceph-adm@front-$front_id; done
for ceph_id in $(seq 1 <Z>); do ssh-copy-id ceph-adm@node-$ceph_id; done
для:
<X> узлов Сeph c именами вида ceph-1, ceph-2, и т.д.;
<Y> фронтальных машин с именами вида front-1, front-2, и т.д.;
<Z> узлов виртуализации c именами вида node-1, node-2, и т.д.;
Установка служб кластера Ceph на серверах ceph и серверах ПК СВ "Брест"
Установить пакет ceph-deploy на сервер <ceph-1-hostname> командой:
sudo apt install ceph-deploy
ceph-deploy выполнять строго из консоли сервера <ceph-1-hostname>, находясь в домашнем каталоге администратора.
Необязательно разворачивать монитор (MON) на каждом узле кластера Ceph, но количество мониторов должно быть 2N+1.
Запустить команду для установки Ceph компонент на серверах Ceph:
ceph-deploy --username ceph-adm install --mon --osd <ceph-1-hostname> <ceph-2-hostname> ...... <ceph-N-hostname>
Запустить команду для установки на сервере ceph1 компоненты ceph-mgr:
ceph-deploy --username ceph-adm install --mgr <ceph-1-hostname>
Запустить команду для создания нового кластера Ceph, при этом требуется указать в команде сервера кластера, на которых в дальнейшем будут инициализированы мониторы кластера:
ceph-deploy --username ceph-adm new <ceph-1-hostname> <ceph-2-hostname> ...... <ceph-N-hostname>
После выполнения команды будут созданы конфигурационный файл (по умолчанию ceph.conf) и keyring-файл мониторов
Запустить команду для инициализации мониторов на ранее указанных серверах кластера:
ceph-deploy --username ceph-adm mon create-initial
Важно знать, что после инициализации мониторов на хостах нельзя менять сетевой адрес, к которому будет привязана служба монитора кластера Ceph. Кластер перестанет быть доступен и работоспособен. Сменить сетевой адрес можно удалив службу монитора и инициализовать ее заново с новыми настройками сети.
Выполнить команду для запуска компоненты mgr на сервере <ceph-1-hostname>:
ceph-deploy --username ceph-adm mgr create <ceph-1-hostname>
Запустить команду для перезагрузки серверов Ceph:
for ceph_id in $(seq <X> -1 1); do ssh ceph-adm@<ceph-$ceph_id-hostname> sudo reboot; done
где:
<X> - количество узлов Ceph
Запустить команды для создания служб OSD на блочных устройствах /dev/sdb серверов кластера Ceph
ceph-deploy --username ceph-adm osd create --data /dev/sdb <ceph-1-hostname>
ceph-deploy --username ceph-adm osd create --data /dev/sdb <ceph-2-hostname>
...
ceph-deploy --username ceph-adm osd create --data /dev/sdb <ceph-N-hostname>
Для каждой службы OSD рекомендуется предоставлять один физический диск для хранения данных.
Запустить команды для установки утилиты управления кластером Ceph:
ceph-deploy --username ceph-adm install --cli <ceph-1-hostname> <ceph-2-hostname> ...... <ceph-N-hostname>
ceph-deploy --username ceph-adm install --cli <front-1-hostname> <front-2-hostname> ...... <front-N-hostname>
ceph-deploy --username ceph-adm install --cli <node-1-hostname> <node-2-hostname> ...... <node-N-hostname>
Запустить команду для копирования конфигурационного файла и keyring-файла администратора на сервер <ceph-1-hostname>:
ceph-deploy --username ceph-adm admin <ceph-1-hostname>
Запустить команду для проверки кластера Ceph на сервере <ceph-1-hostname>:
sudo ceph -s
Вывод команды будет содержать блок информации о кластере, блок информации о запущенных сервисах и блок информации о пулах данных.
Пример вывода команды:
cluster:
id: 6d4e04dd-2514-463c-8d91-98b37db7912c
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active)
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 3164 MB used, 596 GB / 599 GB avail
pgs:
Запустить команду для отправки конфигурационных файлов на сервера ПК СВ "Брест" и сервера Ceph:
ceph-deploy --username ceph-adm config push <ceph-1-hostname> <ceph-2-hostname> ...... <ceph-N-hostname>
ceph-deploy --username ceph-adm config push <front-1-hostname> <front-2-hostname> ...... <front-N-hostname>
ceph-deploy --username ceph-adm config push <node-1-hostname> <node-2-hostname> ...... <node-N-hostname>
Проверка
Следующими командами можно получить информацию по работе служб мониторов на серверах кластера Ceph, команда запускается на сервере <ceph-1-hostname>:
sudo ceph mon stat
sudo ceph mon dump
Создание пула для организации и хранения данных
По формуле вычислить необходимое количество PGs для кластера Ceph: Total PGs = ((Total number of OSD * 100) / Max Replication Count) с округлением до ближайшей степени 2 в сторону увеличения. В случае для 3 узлов Ceph получится:
(3 OSD * 100) / 3 = 100 и округляем до 128.
На сервере <ceph-1-hostname> используйте следующие команды для создания пула с именем one и включаем возможность подключения к пулу по протоколу rbd:
sudo ceph osd pool create one 128
sudo ceph osd pool application enable one rbd
Будет создан пул one с уровнем репликации равным 3 (значение по-умолчанию).
Создание пользователя и ключей для доступа к пулу кластера Ceph
Создать пользователя кластера Ceph, который будет иметь доступ к пулу one. Данный пользователь будет также использоваться libvirt для доступа к образам дисков:
sudo ceph auth get-or-create client.libvirt mon 'allow rwx' osd 'allow rwx pool=one'
Далее необходимо получить копию ключа данного пользователя для его дальнейшей передачи на сервера ПК СВ "Брест":
sudo ceph auth get-key client.libvirt | tee client.libvirt.key
sudo ceph auth get client.libvirt -o ceph.client.libvirt.keyring
Установка ключей на серверы ПК СВ "Брест" для доступа к данным на кластере Ceph
Скопировать все файлы ключей на все серверы (Front-end и узлы виртуализации) и перенести в нужные каталоги следующими командами:
scp ceph.client.libvirt.keyring ceph-adm@<server-hostname>:/tmp
scp client.libvirt.key ceph-adm@<server-hostname>:/tmp
ssh ceph-adm@<server-hostname> "sudo mv /tmp/ceph.client.libvirt.keyring /etc/ceph"
ssh ceph-adm@<server-hostname> "sudo mv /tmp/client.libvirt.key /var/lib/one"
ssh ceph-adm@<server-hostname> "sudo ln -s /var/lib/one/client.libvirt.key /root/client.libvirt.key"
Далее требуется сгенерировать секретный ключ для Ceph пользователя и скопировать его на сервера ПК СВ "Брест" в каталог /var/lib/one
Запомнить универсальный уникальный идентификатор (UUID) для дальнейшего использования, команды выполняются на сервере <ceph-1-hostname>:
sudo apt install uuid-runtime
UUID=`uuidgen`
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<uuid>$UUID</uuid>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>
EOF
Скопировать полученный ключ на каждый сервер облака (Front-end и узлы виртуализации):
scp secret.xml ceph-adm@<server-hostname>:/tmp
ssh ceph-adm@<server-hostname> "sudo mv /tmp/secret.xml /var/lib/one"
ssh ceph-adm@<server-hostname> "sudo ln -s /var/lib/one/secret.xml /root/secret.xml"
Установить секретный ключ libvirt и удалить файлы ключа на всех серверах облака (переменная $UUID должна быть определена с предыдущих шагов):
ssh ceph-adm@<server-hostname> "sudo virsh -c qemu:///system secret-define /root/secret.xml"
BASE64=$(cat client.libvirt.key)
ssh ceph-adm@<server-hostname> "sudo virsh -c qemu:///system secret-set-value --secret $UUID --base64 $BASE64"
ssh ceph-adm@<server-hostname> "sudo rm /root/client.libvirt.key"
ssh ceph-adm@<server-hostname> "sudo rm /var/lib/one/client.libvirt.key"
Проверка
Необходимо убедиться, что Ceph клиент имеет корректные настройки на серверах ПК СВ "Брест", выполнив команду для каждого сервера облака (результатом выполнения команды должен быть пустой вывод без ошибок):
ssh ceph-adm@<server-hostname> "sudo rbd ls -p one --id libvirt"
Установить пакет qemu-block-extra на все серверы облака, выполнив для каждого из них команду:
ssh ceph-adm@<server-hostname> "sudo apt install qemu-block-extra"
Для установки данного пакета в качестве репозитория необходимо использовать диск для разработчика ОС Astra Linux SE и соответствующее обновление безопасности.
Подключение кластера Ceph в ПК СВ "Брест"
Создание хранилища system
Перейдите по адресу http://<front-1-hostname>.<domain>, где front-1-hostname имя вашей фронтальной машины и нажмите кнопку Login
В меню слева развернуть вкладку Storage и выбрать пункт Datastores, далее перейти в настройки и нажать кнопку +

На следующей странице справа выбрать вариант настройки Advanced и внести конфигурацию хранилища:
NAME = ceph_system
TM_MAD = ceph
TYPE = SYSTEM_DS
POOL_NAME = one
CEPH_HOST = "<ceph-1-hostname> <ceph-2-hostname> .... <ceph-N-hostname>"
CEPH_USER = libvirt
BRIDGE_LIST = "<node-1-hostname> <node-2-hostname> .... <node-N-hostname> <front-1-hostname> <front-2-hostname> ... <front-N-hostname>"
CEPH_SECRET = "d86670c2-a7b3-4285-bbfd-9a8acce8cd24"
где:
NAME - имя хранилища
POOL_NAME - имя пула в кластере Ceph
CEPH_HOST - имена узлов мониторов
BRIDGE_LIST - имена узлов, которые получат доступ к хранилищу
CEPH_SECRET - UUID из файла secret.xml
Пример заполнения:

Нажать кнопку Create. Результат добавления нового хранилища в ПК СВ "Брест":

Создание хранилища images
Нажать кнопку + и на следующей странице справа выбрать вариант настройки Advanced и внести конфигурацию хранилища:
NAME = "cephds"
DS_MAD = ceph
TM_MAD = ceph
DISK_TYPE = RBD
POOL_NAME = one
CEPH_HOST = "<ceph-1-hostname> <ceph-2-hostname> .... <ceph-N-hostname>"
CEPH_USER = libvirt
BRIDGE_LIST = "<node-1-hostname> <node-2-hostname> .... <node-N-hostname> <front-1-hostname> <front-2-hostname> ... <front-N-hostname>"
CEPH_SECRET = "d86670c2-a7b3-4285-bbfd-9a8acce8cd24"
Пример заполнения:

Далее нажать кнопку Create
Проверка
В результате добавления хранилищ в разделе Storage - Datastores веб-интерфейса должен отображаться объем хранилища Ceph (в примере - 189Гб):

Создание хранилищ из командной строки
Кроме создания хранилищ через веб интерфейс вы можете воспользоваться следующими командами из терминала на Front-end, предварительно сформировав файлы описаний system-ds.txt и images-ds.txt:
Создать системное хранилище (CEPH_SECRET значение брать из файла secret.xml):
system-ds.txt
NAME = ceph_system
TM_MAD = ceph
TYPE = SYSTEM_DS
POOL_NAME = one
CEPH_HOST = "<ceph-1-hostname> <ceph-2-hostname> .... <ceph-N-hostname>"
CEPH_USER = libvirt
BRIDGE_LIST = "<node-1-hostname> <node-2-hostname> .... <node-N-hostname> <front-1-hostname> <front-2-hostname> ... <front-N-hostname>"
CEPH_SECRET = "d86670c2-a7b3-4285-bbfd-9a8acce8cd24"
sudo onedatastore create system-ds.txt
Создать хранилище образов (CEPH_SECRET значение брать из файла secret.xml):
images-ds.txt
NAME = "cephds"
DS_MAD = ceph
TM_MAD = ceph
DISK_TYPE = RBD
POOL_NAME = one
CEPH_HOST = "<ceph-1-hostname> <ceph-2-hostname> .... <ceph-N-hostname>"
CEPH_USER = libvirt
BRIDGE_LIST = "<node-1-hostname> <node-2-hostname> .... <node-N-hostname> <front-1-hostname> <front-2-hostname> ... <front-N-hostname>"
CEPH_SECRET = "d86670c2-a7b3-4285-bbfd-9a8acce8cd24"
sudo onedatastore create images-ds.txt