Pull to refresh

Замена диска с сохранением правильной нумерации в CEPH

Reading time2 min
Views4.4K
Предполагается, что в результате этого метода мы сохраняем последовательность, в которой диски выводятся командой 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.НОМЕР
Tags:
Hubs:
Total votes 13: ↑13 and ↓0+13
Comments5

Articles