В процессе настройки нового кластера на Ceph Luminous появилась задача разнести разные S3 бакеты по разным устройствам хранения (в моем случае SSD и HDD). В интернете много инструкций как это сделать в Ceph Jewel, но в случае с Luminous процесс претерпел большие изменения и старые инструкции больше не работают. Вместе с тем, что в офф документации этот сценарий не описан, процесс настройки становится не слишком тривиальным.

Задача


Еще раз опишу задачу: в каждую ноду кластера установлено некоторое количество HDD и SSD дисков. Необходимо, чтобы можно было при создании S3 бакета указать на каких устройствах его хранить (HDD или SSD).

Разносим пулы по разным девайсам


Посмотрим текущие правила репликации. По дефолту там должна быть только запись «replicated_rule»:

ceph osd crush rule ls

Благодаря нововведению в Luminous Ceph умеет сам определять тип устройства и мы можем легко разделить их по разным правилам репликации:

ceph osd crush rule create-replicated replicated_hdd default host hdd
ceph osd crush rule create-replicated replicated_ssd default host ssd

Удалим старое дефолтное правило:

ceph osd crush rule rm replicated_rule

Теперь создадим новый дополнительный пул, в котором мы будем хранить S3 объекты и расположим его на SSD:

ceph osd pool create default.rgw.buckets.data.ssd 8 8 replicated replicated_ssd

А дефолтный пул с данными расположим на HDD:

ceph osd pool set default.rgw.buckets.data crush_rule replicated_hdd

Естественно можно сделать наоборот и расположить дефолтный на SSD.

Настраиваем Rados Gateway


Самая интересная часть, ради которой и писалась статья.

При новой установке кластер идет без дефолтного Realm. Не очень понятно почему так сделано. Создадим Realm «default» и назначим его дефолтным:

radosgw-admin realm create --rgw-realm=default --default

Добавим дополнительный placement для SSD бакетов в zonegroup default:

radosgw-admin zonegroup placement add --rgw-zonegroup=default --placement-id="ssd-placement"

И добавим дополнительный placement в зону default:

radosgw-admin zone placement add --rgw-zone=default --placement-id="ssd-placement" --data-pool="default.rgw.buckets.data.ssd" --index-pool="default.rgw.buckets.index"

У нас для хранения индекса всех объектов (и HDD и SSD) используется один пул «default.rgw.buckets.index», но можно создать отдельный пул для индекса.

Привяжем zonegroup «default» к realm «default» и закомитим изменения:

radosgw-admin zonegroup modify --rgw-zonegroup=default --rgw-realm=default
radosgw-admin period update --commit

Последний шаг— перезапустить Rados Gateway.

Теперь мы можем создать новый бакет на SSD (обратите внимание на двоеточие, без него не работало):
s3cmd mb s3://test --bucket-location=:ssd-placement


Или создать бакет с дефолтным размещением (в нашем случае на HDD):
s3cmd mb s3://test


Надеюсь, моя маленькая заметка сэкономит кому-то время при решении аналогичной задачи.

Комментарии (0)