VK Private Cloud logo
Помощь
Обновлена 21 августа 2026 г. в 08:12

Ручной перевод на стойки

Спроектируйте CRUSH-иерархию кластеров Ceph (подробнее — в документе Руководство по проектированию VK Private Cloud в разделе Основные принципы проектирования новой инсталляцииРазмещение данных при проектировании SDS Ceph).

При обновлении Платформы перестройте карту CRUSH вручную:

  1. Получите текущую карту CRUSH:

    $ ceph osd crush tree
    Пример ожидаемого результата
    ID      CLASS  WEIGHT   TYPE NAME-1             2.69989  root default-9             0.29999      host csn0016       hdd    0.14999          osd.67       hdd    0.14999          osd.7-3             0.29999      host csn0020       hdd    0.14999          osd.01       hdd    0.14999          osd.1-11            0.29999      host csn0038       hdd    0.14999          osd.89       hdd    0.14999          osd.9-5             0.29999      host csn0042       hdd    0.14999          osd.23       hdd    0.14999          osd.3-7             0.29999      host csn0054       hdd    0.14999          osd.45       hdd    0.14999          osd.5-13            0.29999      host csn00610      hdd    0.14999          osd.1011      hdd    0.14999          osd.11-15            0.29999      host csn00712      hdd    0.14999          osd.1213      hdd    0.14999          osd.13-17            0.29999      host csn00814      hdd    0.14999          osd.1415      hdd    0.14999          osd.15-19            0.29999      host csn00916      hdd    0.14999          osd.1617      hdd    0.14999          osd.17
  2. Добавьте стойки в карту:

    $ ceph osd crush add-bucket <СТОЙКА> rack

    Здесь <СТОЙКА> — имя добавляемой стойки. Пример: rack_01.

    Пример ожидаемого результата
    added bucket rack_01 type rack to crush map
  3. Переместите каждую стойку в корень карты (root):

    $ ceph osd crush move <СТОЙКА> root=default

    Здесь <СТОЙКА> — имя перемещаемой стойки. Пример: rack_01.

    Пример ожидаемого результата
    moved item id -19 name 'rack_01' to location {root=default} in crush map
  4. Последовательно переместите узлы на созданные стойки:

    1. Переместите узел в стойку:

      $ ceph osd crush move <УЗЕЛ> rack=<СТОЙКА>

      Здесь:

      • <УЗЕЛ> — имя перемещаемого узла с OSD. Пример: csn001.
      • <СТОЙКА> — имя стойки, в которую перемещаем узел. Пример: rack_01.
      Пример ожидаемого результата
      moved item id -7 name 'csn001' to location {rack=rack_01} in crush map
    2. Получите информацию по процессу ребалансинга:

      $ watch ceph -s
      Пример ожидаемого результата во время ребалансинга
      Every 2,0s: ceph -s  cluster:    id:     c77b05b1-98de-471f-b259-f6a51b8897e5    health: HEALTH_WARN            Degraded data redundancy: 45385/379941 objects degraded (11.945%), 43 pgs degraded  services:    mon: 3 daemons, quorum csn002,csn004,csn005 (age 2d)    mgr: csn002(active, since 2d), standbys: csn004, csn005    mds: 3 up:standby    osd: 18 osds: 18 up (since 2d), 18 in (since 2d); 54 remapped pgs  data:    pools:   3 pools, 193 pgs    objects: 126.65k objects, 494 GiB    usage:   1.5 TiB used, 4.7 TiB / 6.1 TiB avail    pgs:     45385/379941 objects degraded (11.945%)            16130/379941 objects misplaced (4.245%)            139 active+clean            43  active+recovery_wait+undersized+degraded+remapped            4   active+recovering+undersized+remapped            4   active+recovery_wait+remapped            3   active+remapped+backfill_wait  io:    client:   0 B/s rd, 255 B/s wr, 0 op/s rd, 0 op/s wr
      Пример ожидаемого результата после завершения ребалансинга
      Every 2,0s: ceph -s   cluster:    id:     1c67f605-f3d0-4770-9f88-d1d45b5c4bd3    health: HEALTH_OK  services:    mon: 3 daemons, quorum csn002,csn004,csn005 (age 13h)    mgr: csn002(active, since 13h), standbys: csn004, csn005    mds: 3 up:standby    osd: 18 osds: 18 up (since 13h), 18 in (since 13h)  data:    pools:   4 pools, 129 pgs    objects: 1.35k objects, 5.0 GiB    usage:   34 GiB used, 6.1 TiB / 6.1 TiB avail    pgs:     129 active+clean
  5. После завершения ребалансинга повторите действия из шага 4 для перемещения следующего узла.

  6. После перемещения узлов примените правила репликации к пулам:

    1. Получите существующие правила:

      $ ceph osd crush rule dump
      Пример ожидаемого результата
      [   {      "rule_id": 0,      "rule_name": "replicated_rule",      "ruleset": 0,      "type": 1,      "min_size": 1,      "max_size": 10,      "steps": [         {            "op": "take",            "item": -1,            "item_name": "default"         },         {            "op": "chooseleaf_firstn",            "num": 0,            "type": "host"         },         {            "op": "emit"         }      ]   }]

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

    2. Проверьте, к каким пулам уже применено правило:

      $ ceph osd pool ls detail
      Пример ожидаемого результата
      pool 1 'cinder-volumes' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 563 lfor 0/505/503 flags hashpspool stripe_width 0 application rbdpool 2 'vms' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode on last_change 572 flags hashpspool,selfmanaged_snaps stripe_width 0 application rbdpool 3 'manila-volumes' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 567 lfor 0/505/503 flags hashpspool stripe_width 0 application rbdpool 4 'device_health_metrics' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 569 flags hashpspool stripe_width 0 pg_num_min 1 application mgr_devicehealth

      В примере подстрока crush_rule 0 означает, что правило с порядковым номером 0 из вывода команды ceph osd crush rule dump уже применено к существующим пулам.

    3. Создайте правило репликации данных по стойкам:

      $ ceph osd crush rule create-replicated <ПРАВИЛО> default rack --cluster <КЛАСТЕР>

      Здесь:

      • <ПРАВИЛО> — имя правила. Пример: replicated_rack_rule.
      • <КЛАСТЕР> — имя кластера. Пример: ceph.
    4. Получите информацию по созданному правилу:

      $ ceph osd crush rule dump <ПРАВИЛО>

      Здесь <ПРАВИЛО> — имя правила. Пример: replicated_rack_rule.

      Пример ожидаемого результата
      {   "rule_id": 1,   "rule_name": "replicated_rack_rule",   "ruleset": 1,   "type": 1,   "min_size": 1,   "max_size": 10,   "steps": [      {         "op": "take",         "item": -1,         "item_name": "default"      },      {         "op": "chooseleaf_firstn",         "num": 0,         "type": "rack"      },      {         "op": "emit"      }   ]}
    5. Примените созданное правило репликации данных по стойкам к существующим пулам, чтобы данные перераспределились между стойками:

      $ ceph osd pool set cinder-volumes crush_rule <ПРАВИЛО> --cluster ceph

      Здесь <ПРАВИЛО> — имя правила. Пример: replicated_rack_rule.

      Пример ожидаемого результата
      set pool 1 crush_rule to replicated_rack_rule

      После запуска процесса начнется ребалансинг:

      Пример ребалансинга
      health: HEALTH_WARN        Degraded data redundancy: 40/4062 objects degraded (0.985%), 2 pgs degradedservices:  mon: 3 daemons, quorum csn002,csn004,csn005 (age 14h)  mgr: csn002(active, since 14h), standbys: csn004, csn005  mds: 3 up:standby  osd: 18 osds: 18 up (since 14h), 18 in (since 14h); 40 remapped pgsdata:  pools:   4 pools, 129 pgs  objects: 1.35k objects, 5.0 GiB  usage:   35 GiB used, 6.1 TiB / 6.1 TiB avail  pgs:     40/4062 objects degraded (0.985%)           648/4062 objects misplaced (15.953%)           85 active+clean           39 active+clean+remapped           3  active+recovering           1  active+recovery_wait+degraded           1  active+recovery_wait+degraded+remappedio:  recovery: 75 MiB/s, 7 keys/s, 20 objects/s
    6. После окончания ребалансинга примените новое правило к следующему пулу.

Чтобы созданное правило репликации назначалось автоматически новым пулам, удалите старое правило.

Если старое правило используется пулами:

  1. Назначьте пулам новое правило.

  2. Удалите старое правило:

    $ ceph osd crush rule rm <ПРАВИЛО>

    Здесь <ПРАВИЛО> — имя правила. Пример: replicated_rule

Была ли статья полезна?