Product SiteDocumentation Site

26.6.7. Ceph CRUSH и классы устройств

В основе Ceph лежит алгоритм CRUSH (Controlled Replication Under Scalable Hashing). CRUSH вычисляет, где хранить и откуда извлекать данные. Этот алгоритм позволяет однозначно определить местоположение объекта на основе хеша имени объекта и определенной карты, которая формируется исходя из физической и логической структур. Карта не включает в себя информацию о местонахождении данных. Путь к данным каждый клиент определяет сам, с помощью CRUSH-алгоритма и актуальной карты, которую он предварительно спрашивает у монитора. При добавлении диска или падении сервера карта обновляется.
Карта Crush
Карту можно изменить, чтобы она отражала различные иерархии репликации. Реплики объектов можно разделить (например, домены отказов), сохраняя при этом желаемое распределение.
Классы устройств можно увидеть в выходных данных дерева OSD ceph. Эти классы представляют свой собственный корневой контейнер, который можно увидеть, выполнив команду:
# ceph osd crush tree --show-shadow
ID   CLASS  WEIGHT   TYPE NAME
 -6   nvme  0.09760  root default~nvme
 -5   nvme        0      host pve01~nvme
 -9   nvme  0.04880      host pve02~nvme
  1   nvme  0.04880          osd.1
-12   nvme  0.04880      host pve03~nvme
  2   nvme  0.04880          osd.2
 -2    ssd  0.04880  root default~ssd
 -4    ssd  0.04880      host pve01~ssd
  0    ssd  0.04880          osd.0
 -8    ssd        0      host pve02~ssd
-11    ssd        0      host pve03~ssd
 -1         0.14639  root default
 -3         0.04880      host pve01
  0    ssd  0.04880          osd.0
 -7         0.04880      host pve02
  1   nvme  0.04880          osd.1
-10         0.04880      host pve03
  2   nvme  0.04880          osd.2
Чтобы указать пулу распределять объекты только на определенном классе устройств, сначала необходимо создать политику для класса устройств:
# ceph osd crush rule create-replicated <rule-name> <root> <failure-domain> <class>
Где:
  • rule-name — имя политики;
  • root — корень отказа (значение default — корень Ceph);
  • failure-domain — домен отказа, на котором должны распределяться объекты (обычно host);
  • class — какой тип хранилища резервных копий OSD использовать (например, nvme, ssd).
Пример создания политики replicated_nvme для реплицированных пулов, данные будут иметь домен отказа host, а размещаться — на nvme:
# ceph osd crush rule create-replicated my_rule default host nvme
Посмотреть настройки политик можно, выполнив команду:
# ceph osd crush rule dump
После того как политика будет создана в карте CRUSH, можно указать пулу использовать набор правил:
# ceph osd pool set <pool-name> crush_rule <rule-name>

Примечание

Если пул уже содержит объекты, их необходимо переместить соответствующим образом. В зависимости от настроек это может оказать большое влияние на производительность кластера. Либо можно создать новый пул и переместить диски по отдельности.