В процессе настройки нового кластера на Ceph Luminous появилась задача разнести разные S3 бакеты по разным устройствам хранения (в моем случае SSD и HDD). В интернете много инструкций как это сделать в Ceph Jewel, но в случае с Luminous процесс претерпел большие изменения и старые инструкции больше не работают. Вместе с тем, что в офф документации этот сценарий не описан, процесс настройки становится не слишком тривиальным.
Еще раз опишу задачу: в каждую ноду кластера установлено некоторое количество HDD и SSD дисков. Необходимо, чтобы можно было при создании S3 бакета указать на каких устройствах его хранить (HDD или SSD).
Посмотрим текущие правила репликации. По дефолту там должна быть только запись «replicated_rule»:
Благодаря нововведению в Luminous Ceph умеет сам определять тип устройства и мы можем легко разделить их по разным правилам репликации:
Удалим старое дефолтное правило:
Теперь создадим новый дополнительный пул, в котором мы будем хранить S3 объекты и расположим его на SSD:
А дефолтный пул с данными расположим на HDD:
Естественно можно сделать наоборот и расположить дефолтный на SSD.
Самая интересная часть, ради которой и писалась статья.
При новой установке кластер идет без дефолтного Realm. Не очень понятно почему так сделано. Создадим Realm «default» и назначим его дефолтным:
Добавим дополнительный placement для SSD бакетов в zonegroup default:
И добавим дополнительный placement в зону default:
У нас для хранения индекса всех объектов (и HDD и SSD) используется один пул «default.rgw.buckets.index», но можно создать отдельный пул для индекса.
Привяжем zonegroup «default» к realm «default» и закомитим изменения:
Последний шаг— перезапустить Rados Gateway.
Теперь мы можем создать новый бакет на SSD (обратите внимание на двоеточие, без него не работало):
Или создать бакет с дефолтным размещением (в нашем случае на HDD):
Надеюсь, моя маленькая заметка сэкономит кому-то время при решении аналогичной задачи.
Задача
Еще раз опишу задачу: в каждую ноду кластера установлено некоторое количество 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
Надеюсь, моя маленькая заметка сэкономит кому-то время при решении аналогичной задачи.