Предполагается, что в результате этого метода мы сохраняем последовательность, в которой диски выводятся командой ceph osd tree. Если они там по порядку, то это удобнее читается и считается, при необходимости.
Лирическое отступление по теме. Официальный метод замены диска в ceph предполагает удаление всех логических сущностей, связанных с этим диском из кластера с дальнейшим их пере-созднием. В результате чего свеже-созданный osd (при некотором стечении обстоятельств) может сменить свой номер (номер в имени сущности, это который osd.Цифра) и местоположение в crush-мапе и естественно будет выводиться в другом мечте в команде ceph osd tree и других. Сменится его порядковый номер.
Идея этого метода заключается в том, что никакие логические сущности мы менять не будем, а просто подсунем новый диск на «старое» место в кластере. Для этого на этом новом диске надо (вос)создать правильные структуры данных: всяческие id, симлинки, ключики.
Разметим новый диск.
parted /dev/диск_с_данными mklabel gpt
Создадим новый раздел на нашей партиции
parted /dev/sdaa mkpart primary ext2 0% 100%
/sbin/sgdisk --change-name=1:'ceph data' -- /dev/sda1
Достанем UUID умершей osd
ceph osd dump|grep 'osd.Номер'
Ставим PARTUUID на диск с данными
/sbin/sgdisk --typecode=1:99886b14-7904-4396-acef-c031095d4b62 -- /dev/Диск_с_данными
Найдём раздел с журналом
ceph-disk list | grep for | sort
Создаём ФС на диске с данными
/sbin/mkfs -t xfs -f -i size=2048 -- /dev/sdaa1
Монтируем ФС
mount -o rw,noatime,attr2,inode64,noquota /dev/Партиция_на_диске_с_данными /var/lib/ceph/osd/ceph-номер_OSD
Копируем данные с соседней OSD
На самом деле это самая гнусная часть процедуры, надо делать всё аккуратно.
При копировании надо пропустить каталог /var/lib/ceph/osd/ceph-НОМЕР/current, это каталог с данными. Симлинк на journal мы создадим позднее
Копируемся
for i in activate.monmap active ceph_fsid fsid journal_uuid keyring magic ready store_version superblock systemd type whoami; do cp /var/lib/ceph/osd/ceph-НОМЕР_СОСЕДА/${i} /var/lib/ceph/osd/ceph-НОМЕР; done
Ищем журнал
ceph-disk list | grep for | sort
соответственно, находим партицию, и делаем
ls -l /dev/disk/by-partuuid | grep Партиция_Номер
Делаем симлинк на этот UUID
ln -s /dev/disk/by-partuuid/UUID /var/lib/ceph/osd/ceph-НОМЕР/journal
Заполняем fsid правильным значением
Этот fsid на самом деле уникальный id, под которым osd-шка значится в кластере, она важна, т.к. если не угадать с id, то сама osd-шка не увидит кластера и это будет взаимно.
А значение надо взять из partuuid партиции на журнале с данными.
echo -n UUID >/var/lib/ceph/osd/ceph-НОМЕР/fsid
Заполняем keyring
С этим osd-шка авторизуется в кластере.
ceph auth list|grep --after-context=1 'osd.НОМЕР'
Записывается в файлик в формате
[osd.НОМЕР]
key = СТРОКА_С_КЛЮЧОМ
Заполняем whoami
Просто пишем в этот файлик номер OSD-шки, которую мы хотим оживить.
Забиваем нулями журнал
dd bs=32M oflag=direct if=/dev/zero of=/var/lib/ceph/osd/ceph-НОМЕР/journal
Создаём метаданные журнала и osd-шки
ceph-osd --mkfs -i Номер_OSD
ceph-osd --mkjournal -i Номер_OSD
Меняем владельца данных
chown -R ceph:ceph /var/lib/ceph/osd/ceph-НОМЕР
Запускаем ceph-osd
Внимание: Сразу после запуска ceph-osd начнётся rebuild, если до момента выхода диска из клатера не была дана команда ceph osd out НОМЕР.
systemctl start ceph-osd.НОМЕР
Автор: Валера