
При работе с распределенными хранилищами на базе Ceph иногда возникает необходимость временно или окончательно исключить узел из кластера. Это может понадобиться при обновлении оборудования, обслуживании инфраструктуры или перераспределении ресурсов. Вместе с тем если узел, подлежащий выводу, одновременно исполняет роли MON (Monitor), MGR (Manager Daemon) и MDS (Metadata Server), задача превращается в настоящий квест hard-уровня. Но при должном подходе и с такими кейсами можно справиться.
Меня зовут Алексей Косов. Я старший инженер доступности отдела интеграции и сопровождения облачных решений в команде VK Tech. СХД Ceph — это часть поставки нашего продукта для построения частного облака в ЦОДе заказчика VK Private Cloud. В этой статье я пошагово покажу, как можно вывести узел с полным комплектом сервисов Ceph из кластера, чтобы кластер и остальные узлы не пострадали.
Почему может требоваться вывод узла из Ceph-кластера и какие риски существуют
Существует несколько распространенных ситуаций, когда возникает необходимость вывести узел из кластера Ceph. Выделим некоторые.
Аппаратное обслуживание. Необходимость замены неисправных комплектующих, модернизации оборудования или планового технического обслуживания.
Балансировка нагрузки. Необходимость перераспределения данных и нагрузки (например, при расширении кластера путем добавления новых серверов или при выводе старых узлов с малым объемом хранилища).
Тестирование и отладка. Исследование поведения кластера в стресс-тестах или тестирование новых версий ПО на отдельном узле.
Экономия затрат. Необходимость сокращения количества используемых серверов при сохранении требуемого уровня производительности.
При этом процесс вывода узла из кластера должен происходить аккуратно и контролируемо, поскольку грубые действия могут привести к ряду проблем, среди которых:
потеря доступности данных;
отказ клиентских операций;
перегрузка оставшихся OSD из-за массового ребалансинга;
падение производительности при недостаточном резерве емкости;
ухудшение производительности системы;
риск потери данных, если узел или диск будет удален до завершения rebalancing/recovery;
длительное время восстановления — вывод узла с большим количеством данных может занять много часов или даже дней. В течение всего этого времени кластер остается под повышенной нагрузкой и подвержен рискам, указанным выше.
Вместе с тем, вывод из кластера — посильная задача. Причем при должном подходе и учете ряда факторов безопасно вывести из Ceph-кластера можно даже узел, который решает множество задач. Например, на котором развернуты роли MON (Monitor), MGR (Manager Daemon), MDS (Metadata Server) и OSD. И он одновременно является Active MON, Active MGR и Active MDS. Алгоритм решения подобного кейса я и разберу: в рамках статьи покажу, как вывести из Ceph-кластера узел csn004 с двумя OSD (Object Storage Device) и с полным комплектом сервисов Ceph, при этом Ceph развернут с томами LVM (Logical Volume Manager) для OSD.
Что ж, приступим.
Примечание: Инструкция актуальна для любого кластера Ceph, где используются тома LVM. В рамках статьи все действия выполняются на RedOS 7.3, версия Ceph 17.2.7.
Определяем исходное состояние кластера
Для начала посмотрим статус кластера:
[centos@csn001 ~]$ ceph -s
cluster:
id: 99199b58-63b4-41c3-a51a-263aa9fced25
health: HEALTH_OK
services:
mon: 4 daemons, quorum csn001,csn002,csn003,csn004 (age 2d)
mgr: csn004(active, since 24h), standbys: csn002, csn003, csn001
mds: 1/1 daemons up, 3 standby
osd: 8 osds: 8 up (since 2d), 8 in (since 3d)
data:
volumes: 1/1 healthy
pools: 6 pools, 177 pgs
objects: 29.53k objects, 227 GiB
usage: 684 GiB used, 2.1 TiB / 2.7 TiB avail
pgs: 177 active+clean
io:
client: 12 KiB/s wr, 0 op/s rd, 1 op/s wr
Кластер находится в статусе HEALTH_OK.
Также видим в списке services, что:
все 4 монитора (mon) находятся в кворуме;
активный менеджер (mgr) находится на csn004.
Имея эту информацию, может начинать подготовку узла к выводу из кластера.
Перенос активных ролей с выводимого узла
Начнем подготовку с удаления мониторов (MON).
Удаление мониторов (MON)
В первую очередь проверяем кворум кластера.
[centos@csn001 ~]$ sudo ceph quorum_status --format json-pretty
{
"election_epoch": 140,
"quorum": [
0,
1,
2,
3
],
"quorum_names": [
"csn001",
"csn002",
"csn003",
"csn004"
],
"quorum_leader_name": "csn001",
"quorum_age": 174189,
"features": {
"quorum_con": "4540138320759226367",
"quorum_mon": [
"kraken",
"luminous",
"mimic",
"osdmap-prune",
"nautilus",
"octopus",
"pacific",
"elector-pinging",
"quincy"
]
},
"monmap": {
"epoch": 4,
"fsid": "99199b58-63b4-41c3-a51a-263aa9fced25",
"modified": "2025-10-02T21:06:48.702324Z",
"created": "2025-09-26T17:59:19.080624Z",
"min_mon_release": 17,
"min_mon_release_name": "quincy",
"election_strategy": 1,
"disallowed_leaders: ": "",
"stretch_mode": false,
"tiebreaker_mon": "",
"removed_ranks: ": "",
"features": {
"persistent": [
"kraken",
"luminous",
"mimic",
"osdmap-prune",
"nautilus",
"octopus",
"pacific",
"elector-pinging",
"quincy"
],
"optional": []
},
"mons": [
{
"rank": 0,
"name": "csn001",
"public_addrs": {
"addrvec": [
{
"type": "v2",
"addr": "10.30.10.20:3300",
"nonce": 0
},
{
"type": "v1",
"addr": "10.30.10.20:6789",
"nonce": 0
}
]
},
"addr": "10.30.10.20:6789/0",
"public_addr": "10.30.10.20:6789/0",
"priority": 0,
"weight": 0,
"crush_location": "{}"
},
{
"rank": 1,
"name": "csn002",
"public_addrs": {
"addrvec": [
{
"type": "v2",
"addr": "10.30.10.14:3300",
"nonce": 0
},
{
"type": "v1",
"addr": "10.30.10.14:6789",
"nonce": 0
}
]
},
"addr": "10.30.10.14:6789/0",
"public_addr": "10.30.10.14:6789/0",
"priority": 0,
"weight": 0,
"crush_location": "{}"
},
{
"rank": 2,
"name": "csn003",
"public_addrs": {
"addrvec": [
{
"type": "v2",
"addr": "10.30.10.15:3300",
"nonce": 0
},
{
"type": "v1",
"addr": "10.30.10.15:6789",
"nonce": 0
}
]
},
"addr": "10.30.10.15:6789/0",
"public_addr": "10.30.10.15:6789/0",
"priority": 0,
"weight": 0,
"crush_location": "{}"
},
{
"rank": 3,
"name": "csn004",
"public_addrs": {
"addrvec": [
{
"type": "v2",
"addr": "10.30.10.17:3300",
"nonce": 0
},
{
"type": "v1",
"addr": "10.30.10.17:6789",
"nonce": 0
}
]
},
"addr": "10.30.10.17:6789/0",
"public_addr": "10.30.10.17:6789/0",
"priority": 0,
"weight": 0,
"crush_location": "{}"
}
]
}
}
Убеждаемся, что все мониторы находятся в кворуме.
Далее удаляем MON с узла csn004 из monmap.
[centos@csn001 ~]$ sudo ceph mon remove csn004
# Смотрим статус кластера после удаления монитора csn004
[centos@csn001 ~]$ ceph -s
cluster:
id: 99199b58-63b4-41c3-a51a-263aa9fced25
health: HEALTH_OK
services:
mon: 3 daemons, quorum csn001,csn002,csn003 (age 27s)
mgr: csn004(active, since 24h), standbys: csn002, csn003, csn001
mds: 1/1 daemons up, 3 standby
osd: 8 osds: 8 up (since 2d), 8 in (since 3d)
data:
volumes: 1/1 healthy
pools: 6 pools, 177 pgs
objects: 29.53k objects, 227 GiB
usage: 684 GiB used, 2.1 TiB / 2.7 TiB avail
pgs: 177 active+clean
Ceph пересчитает кворум кластера и изменит его состав.
После этого можно снова проверить кворум:
[centos@csn001 ~]$ sudo ceph quorum_status --format json-pretty
{
"election_epoch": 146,
"quorum": [
0,
1,
2
],
"quorum_names": [
"csn001",
"csn002",
"csn003"
],
"quorum_leader_name": "csn001",
"quorum_age": 72,
"features": {
"quorum_con": "4540138320759226367",
"quorum_mon": [
"kraken",
"luminous",
"mimic",
"osdmap-prune",
"nautilus",
"octopus",
"pacific",
"elector-pinging",
"quincy"
]
},
"monmap": {
"epoch": 5,
"fsid": "99199b58-63b4-41c3-a51a-263aa9fced25",
"modified": "2025-10-06T14:29:49.013963Z",
"created": "2025-09-26T17:59:19.080624Z",
"min_mon_release": 17,
"min_mon_release_name": "quincy",
"election_strategy": 1,
"disallowed_leaders: ": "",
"stretch_mode": false,
"tiebreaker_mon": "",
"removed_ranks: ": "3",
"features": {
"persistent": [
"kraken",
"luminous",
"mimic",
"osdmap-prune",
"nautilus",
"octopus",
"pacific",
"elector-pinging",
"quincy"
],
"optional": []
},
"mons": [
{
"rank": 0,
"name": "csn001",
"public_addrs": {
"addrvec": [
{
"type": "v2",
"addr": "10.30.10.20:3300",
"nonce": 0
},
{
"type": "v1",
"addr": "10.30.10.20:6789",
"nonce": 0
}
]
},
"addr": "10.30.10.20:6789/0",
"public_addr": "10.30.10.20:6789/0",
"priority": 0,
"weight": 0,
"crush_location": "{}"
},
{
"rank": 1,
"name": "csn002",
"public_addrs": {
"addrvec": [
{
"type": "v2",
"addr": "10.30.10.14:3300",
"nonce": 0
},
{
"type": "v1",
"addr": "10.30.10.14:6789",
"nonce": 0
}
]
},
"addr": "10.30.10.14:6789/0",
"public_addr": "10.30.10.14:6789/0",
"priority": 0,
"weight": 0,
"crush_location": "{}"
},
{
"rank": 2,
"name": "csn003",
"public_addrs": {
"addrvec": [
{
"type": "v2",
"addr": "10.30.10.15:3300",
"nonce": 0
},
{
"type": "v1",
"addr": "10.30.10.15:6789",
"nonce": 0
}
]
},
"addr": "10.30.10.15:6789/0",
"public_addr": "10.30.10.15:6789/0",
"priority": 0,
"weight": 0,
"crush_location": "{}"
}
]
}
}
Перенос MGR
Теперь переходим к переносу MGR.
Для начала проверяем список менеджеров:
Убеждаемся, что в кластере есть менеджеры в статусе Standby на других узлах.
Следующим шагом принудительно переводим статус Active с узла csn004:
[centos@csn001 ~]$ sudo ceph mgr fail csn004
Примечательно, что это не деструктивная операция — Ceph просто делает другой узел активным менеджером, а csn004 остается Standby.
После этого проверяем, что новый Active MGR выбран:
[centos@csn001 ~]$ sudo ceph mgr dump | jq '{active_name, standbys: [.standbys[].name]}'
{
"active_name": "csn002",
"standbys": [
"csn003",
"csn001",
"csn004"
]
}
Перенос MDS (CephFS)
На следующем этапе мы можем перенести MDS — сервер метаданных (metadata server), который нужен только для CephFS и занимается хранением и обслуживанием файловых метаданных (имена, каталоги, права и блокировки), а сами данные файлов хранятся в OSD.
Примечание: MDS не нужны, если кластер Ceph используется только как блочное хранилище (Ceph RBD) или объектное хранилище (Ceph RGW). Но в данном примере мы рассмотрим также вывод из кластера узла с MDS.
Для начала проверяем состояние CephFS:
[centos@csn001 ~]$ sudo ceph fs status
cephfs - 2 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active csn004 Reqs: 0 /s 10 13 12 2
POOL TYPE USED AVAIL
cephfs_metadata metadata 96.0k 582G
cephfs_data data 0 582G
STANDBY MDS
csn002
csn003
csn001
MDS version: ceph version 17.2.7 (b12291d110049b2f35e32e0de30d70e9a4c060d2) quincy (stable)
Если Active MDS = csn004 — необходимо убедиться, что в кластере есть другие MDS в статусе standby (например, csn001, csn002).
Далее переводим Active MDS с csn004:
[centos@csn001 ~]$ sudo ceph mds fail csn004
failed mds gid 614251
Это тоже не деструктивная операция — как и в случае с MGR, кластер просто переключит Active MDS на другой узел.
Проверяем результат:
[centos@csn001 ~]$ sudo ceph fs status
cephfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active csn001 Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs_metadata metadata 96.0k 582G
cephfs_data data 0 582G
STANDBY MDS
csn002
csn003
csn004
MDS version: ceph version 17.2.7 (b12291d110049b2f35e32e0de30d70e9a4c060d2) quincy (stable)
Active MDS должен быть выбран на другом узле.
Очистка ролей MON/MGR/MDS на узле csn004
Очистку ролей на узле начинаем с остановки и отключения сервисов MON/MGR/MDS:
[centos@csn004 ~]$ sudo systemctl disable --now ceph-mon@csn004.service
[centos@csn004 ~]$ sudo systemctl disable --now ceph-mgr@csn004.service
[centos@csn004 ~]$ sudo systemctl disable --now ceph-mds@csn004.service
[centos@csn004 ~]$ sudo systemctl stop ceph-mon@csn004.service
[centos@csn004 ~]$ sudo systemctl stop ceph-mgr@csn004.service
[centos@csn004 ~]$ sudo systemctl stop ceph-mds@csn004.service
Затем останавливаем и отключаем .target-сервисы MON/MGR/MDS — это нужно, чтобы исключить повторный запуск ранее отключенных сервисов ceph на узле csn004:
[centos@csn004 ~]$ sudo systemctl disable --now ceph-mon.target
[centos@csn004 ~]$ sudo systemctl disable --now ceph-mgr.target
[centos@csn004 ~]$ sudo systemctl disable --now ceph-mds.target
[centos@csn004 ~]$ sudo systemctl stop ceph-mon.target
[centos@csn004 ~]$ sudo systemctl stop ceph-mgr.target
[centos@csn004 ~]$ sudo systemctl stop ceph-mds.target
Удаляем каталоги с данными о MON/MGR/MDS c узла csn 004:
[centos@csn004 ~]$ sudo rm -rf /var/lib/ceph/mon/ceph-csn004
[centos@csn004 ~]$ sudo rm -rf /var/lib/ceph/mgr/ceph-csn004
[centos@csn004 ~]$ sudo rm -rf /var/lib/ceph/mds/ceph-csn004
На этом перенос активных ролей с выводимого узла можно считать завершенным. Переходим к следующему этапу.
Удаление OSD с узла csn004
В данном примере мы будем удалять из кластера OSD с ID 6 и 7 на узле csn004, которые являются томами LVM на диске /dev/sdb.
Предупреждение: убедитесь, что вы выполняете команды только для нужных OSD и на нужном узле кластера. Внимательно проверяйте все команды перед выполнением.
[centos@csn004 ~]$ lsblk
NAME
MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda
8:0 0 50G 0 disk
├─sda1
8:1 0 2G 0 part /boot
└─sda2
8:2 0 48G 0 part /
sdb
8:16 0 700G 0 disk
├─sdb1
8:17 0 300M 0 part /var/lib/ceph/osd/ceph-6
├─sdb2
8:18 0 349.7G 0 part
│ └─ceph--99199b58--63b4--41c3--a51a--263aa9fced25--d96565a0-d225dd3a--874c--5a18--9ed8--7a9749bcd9fd 253:0 0 349.7G 0 lvm
├─sdb3
8:19 0 300M 0 part /var/lib/ceph/osd/ceph-7
└─sdb4
8:20 0 349.7G 0 part
└─ceph--99199b58--63b4--41c3--a51a--263aa9fced25--d96565a0-3a68ae7b--2b2c--5145--a944--8aabe8977579 253:1 0 349.7G 0 lvm
После этого выполняем reweight для удаляемых OSD, чтобы данные с них смигрировали на другие OSD:
[centos@csn001 ~]$ for i in {6..7}; do ceph osd crush reweight osd.${i} 0; done
reweighted item id 6 name 'osd.6' to 0 in crush map
reweighted item id 7 name 'osd.7' to 0 in crush map
Далее нужно дождаться, пока удаляемые OSD освободятся и статус кластера вернется в HEALTH_OK.
Для наблюдения в реальном времени можно запустить команду:
watch ceph -s
[centos@csn001 ~]$ ceph -s
cluster:
id: 99199b58-63b4-41c3-a51a-263aa9fced25
health: HEALTH_WARN
Degraded data redundancy: 7466/88599 objects degraded (8.427%), 54 pgs degraded, 24 pgs undersized
services:
mon: 3 daemons, quorum csn001,csn002,csn003 (age 2d)
mgr: csn002(active, since 2d), standbys: csn003, csn001
mds: 1/1 daemons up, 2 standby
osd: 8 osds: 8 up (since 4d), 8 in (since 6d); 43 remapped pgs
data:
volumes: 1/1 healthy
pools: 6 pools, 177 pgs
objects: 29.53k objects, 227 GiB
usage: 695 GiB used, 2.1 TiB / 2.7 TiB avail
pgs: 7466/88599 objects degraded (8.427%)
17569/88599 objects misplaced (19.830%)
103 active+clean
30 active+recovery_wait+degraded
23 active+recovery_wait+undersized+degraded+remapped
19 active+remapped+backfill_wait
1 active+recovering+undersized+degraded+remapped
1 active+recovery_wait
io:
client: 49 KiB/s rd, 57 op/s rd, 0 op/s wr
recovery: 78 MiB/s, 9 objects/s
После завершения ребаланса кластера помечаем OSD как выведенные из кластера:
[centos@csn001 ~]$ for i in {6..7}; do ceph osd out ${i}; done
marked out osd.6.
marked out osd.7.
Следом проверяем, можно ли безопасно удалить OSD из кластера:
echo "Ждем, когда OSD будут освобождены от данных"
for i in {6..7}; do
while ! ceph osd safe-to-destroy osd.${i} ; do
sleep 10
echo "We are waiting for the osd ${i} to be cleared of data"
done
done
После того как Ceph полностью смигрирует данные с удаляемых OSD, будет выведено сообщение:
OSD(s) 6 are safe to destroy without reducing data durability.
OSD(s) 7 are safe to destroy without reducing data durability.
Теперь можно удалять OSD.
Для этого последовательно выполняем несколько операций.
Отключаем сервисы OSD на узле csn004:
[centos@csn004 ~]$ sudo systemctl disable --now ceph-osd@6.service
Removed /etc/systemd/system/ceph-osd.target.wants/ceph-osd@6.service.
[centos@csn004 ~]$ sudo systemctl disable --now ceph-osd@7.service
Removed /etc/systemd/system/ceph-osd.target.wants/ceph-osd@7.service.
На одном из оставшихся узлов Ceph удаляем OSD из кластера:
[centos@csn001 ~]$ ceph osd purge 6 --yes-i-really-mean-it
purged osd.6
[centos@csn001 ~]$ ceph osd purge 7 --yes-i-really-mean-it
purged osd.7
Предупреждение: команды, описанные ниже, деструктивны — они безвозвратно стирают данные и LVM-метаданные на выбранных дисках.Трижды проверьте, на каком узле вы находитесь и какие именно диски (OSD) очищаете. Ошибка приведет к безвозвратной потере данных и нестабильности кластера Ceph.
Проверяем список блочных устройств на узле csn004 (в данном примере один диск /dev/sdb разделен на 2 OSD, osd-6 и osd-7, которые представлены LVM-томами):
[centos@csn004 ~]$ sudo lsblk
NAME
MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda
8:0 0 50G 0 disk
├─sda1
8:1 0 2G 0 part /boot
└─sda2 8:2 0 48G 0 part /
sdb
8:16 0 700G 0 disk
├─sdb1
8:17 0 300M 0 part /var/lib/ceph/osd/ceph-6
├��sdb2
8:18 0 349.7G 0 part
│ └─ceph--99199b58--63b4--41c3--a51a--263aa9fced25--d96565a0-d225dd3a--874c--5a18--9ed8--7a9749bcd9fd 253:0 0 349.7G 0 lvm
├─sdb3
8:19 0 300M 0 part /var/lib/ceph/osd/ceph-7
└─sdb4
8:20 0 349.7G 0 part
└─ceph--99199b58--63b4--41c3--a51a--263aa9fced25--d96565a0-3a68ae7b--2b2c--5145--a944--8aabe8977579 253:1 0 349.7G 0 lvm
Удаляем строки с точками монтирования /var/lib/ceph/osd/ceph-6 и /var/lib/ceph/osd/ceph-7 из /etc/fstab:
/etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Jun 30 16:59:50 2025
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=9fc6b0f5-44ac-49c6-95a4-e99e6a8a7a70 / ext4 defaults 1 1
UUID=aef54e97-d3bb-464a-aa31-35b3a6c836ae /boot ext4 defaults 1 2
/dev/disk/by-partuuid/5f8f3fee-1394-4d11-aab4-3e96935f278c /var/lib/ceph/osd/ceph-6 xfs defaults 0 0
/dev/disk/by-partuuid/a3ef1744-0b24-4719-8cfb-6fed7f17da2f /var/lib/ceph/osd/ceph-7 xfs defaults 0 0
Размонтируем точки монтирования OSD:
[centos@csn004 ~]$ sudo umount /var/lib/ceph/osd/ceph-6
[centos@csn004 ~]$ sudo umount /var/lib/ceph/osd/ceph-7
Проверяем, что точки монтирования удалены с разделов диска /dev/sdb:
[centos@csn004 ~]$ sudo lsblk
NAME
MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda
8:0 0 50G 0 disk
├─sda1
8:1 0 2G 0 part /boot
└─sda2
8:2 0 48G 0 part /
sdb
8:16 0 700G 0 disk
├─sdb1
8:17 0 300M 0 part
├─sdb2
8:18 0 349.7G 0 part
│ └─ceph--99199b58--63b4--41c3--a51a--263aa9fced25--d96565a0-d225dd3a--874c--5a18--9ed8--7a9749bcd9fd 253:0 0 349.7G 0 lvm
├─sdb3
8:19 0 300M 0 part
└─sdb4
8:20 0 349.7G 0 part
└─ceph--99199b58--63b4--41c3--a51a--263aa9fced25--d96565a0-3a68ae7b--2b2c--5145--a944--8aabe8977579 253:1 0 349.7G 0 lvm
Проверяем список VG (Volume Group) и LV (Logical Volume) на удаляемом диске:
[centos@csn004 ~]$ sudo vgdisplay
--- Volume group ---
VG Name ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size <699.41 GiB
PE Size 4.00 MiB
Total PE 179048
Alloc PE / Size 179048 / <699.41 GiB
Free PE / Size 0 / 0
VG UUID OOnoPA-YeBb-fUdu-1zxI-78Hw-dM5M-5J83Yg
[centos@csn004 ~]$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0/d225dd3a-874c-5a18-9ed8-7a9749bcd9fd
LV Name d225dd3a-874c-5a18-9ed8-7a9749bcd9fd
VG Name ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0
LV UUID GDRnPK-7ADg-AVdc-ZbdZ-4HXq-9Tn7-wYyOLI
LV Write Access read/write
LV Creation host, time csn004, 2025-10-03 00:07:15 +0300
LV Status NOT available
LV Size 349.70 GiB
Current LE 89524
Segments 1
Allocation inherit
Read ahead sectors auto
--- Logical volume ---
LV Path /dev/ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0/3a68ae7b-2b2c-5145-a944-8aabe8977579
LV Name 3a68ae7b-2b2c-5145-a944-8aabe8977579
VG Name ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0
LV UUID qiaYah-wufA-UXYR-eQuf-3mRZ-jPyY-8NKAj2
LV Write Access read/write
LV Creation host, time csn004, 2025-10-03 00:07:29 +0300
LV Status NOT available
LV Size 349.70 GiB
Current LE 89524
Segments 1
Allocation inherit
Read ahead sectors auto
Останавливаем VG на удаляемом диске:
[centos@csn004 ~]$ sudo vgchange -a n ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0
0 logical volume(s) in volume group "ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0" now active
Удаляем логические диски (не по имени, а по LV Path!):
[centos@csn004 ~]$ sudo lvremove /dev/ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0/d225dd3a-874c-5a18-9ed8-7a9749bcd9fd
Logical volume "d225dd3a-874c-5a18-9ed8-7a9749bcd9fd" successfully removed.
[centos@csn004 ~]$ sudo lvremove /dev/ceph-99199b58-63b4-41c3-a51a-263aa9fced25-d96565a0/3a68ae7b-2b2c-5145-a944-8aabe8977579
Logical volume "3a68ae7b-2b2c-5145-a944-8aabe8977579" successfully removed.
Удаляем метаданные физического диска LVM:
[centos@csn004 ~]$ sudo pvremove -ff -y /dev/sdb
Labels on physical volume "/dev/sdb" successfully wiped.
Проверяем, что все PV, VG и LV удалены с диска (команды должны вернуть пустой вывод):
[centos@csn004 ~]$ sudo pvs; sudo vgs; sudo lvs
Удаляем оставшиеся разделы и очищаем диск:
[centos@csn004 ~]$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 700 GiB, 751619276800 bytes, 1468006400 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[centos@csn004 ~]$ sudo dd if=/dev/zero of=/dev/sdb bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0620861 s, 169 MB/s
[centos@csn004 ~]$ sudo sgdisk --zap-all /dev/sdb
Creating new GPT entries in memory.
GPT data structures destroyed! You may now partition the disk using fdisk or other utilities.
[centos@csn004 ~]$ sudo wipefs -af /dev/sdb
[centos@csn004 ~]$ sudo partprobe /dev/sdb
Стираем первые и последние 1 Мб на диске (примерно 2048 секторов):
[centos@csn004 ~]$ sudo dd if=/dev/zero of=/dev/sdb bs=1M count=1 oflag=direct
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00361045 s, 290 MB/s
[centos@csn004 ~]$ sectors=$(blockdev --getsz /dev/sdb)
[centos@csn004 ~]$ sudo dd if=/dev/zero of=/dev/sdb bs=512 seek=$((sectors - 2048)) count=2048 oflag=direct
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.685609 s, 1.5 MB/s
Ожидаем завершения всех udev-событий:
[centos@csn004 ~]$ sudo udevadm settle
Для надежности стираем остаточные метаданные LVM с диска утилитой ceph-volume:
[centos@csn004 ~]$ sudo ceph-volume lvm zap /dev/sdb --destroy
--> Zapping: /dev/sdb
Running command: /bin/dd if=/dev/zero of=/dev/sdb bs=1M count=10 conv=fsync
stderr: 10+0 records in
10+0 records out
stderr: 10485760 bytes (10 MB, 10 MiB) copied, 0.0281396 s, 373 MB/s
--> Zapping successful for: <Raw Device: /dev/sdb>
Проверяем, что диск очищен и готов для повторного ввода в кластер Ceph (в столбце available должно быть значение True):
[centos@csn004 ~]$ sudo ceph-volume inventory
Device Path Size Device nodes rotates available Model name
/dev/sdb 700.00 GB sdb True True QEMU HARDDISK
/dev/sda 50.00 GB sda True False QEMU HARDDISK
Удаляем каталоги с информацией об OSD:
[centos@csn004 ~]$ sudo rm -rf /var/lib/ceph/osd/ceph-6
[centos@csn004 ~]$ sudo rm -rf /var/lib/ceph/osd/ceph-7
Обновляем список сервисов systemd:
[centos@csn004 ~]$ sudo systemctl daemon-reload
Проверяем список сервисов Ceph в systemd:
[centos@csn004 ~]$ systemctl list-units --all | grep -i 'ceph'
ceph-crash.service loaded active running Ceph crash dump collector
system-ceph\x2dmds.slice loaded active active Slice /system/ceph-mds
system-ceph\x2dmgr.slice loaded active active Slice /system/ceph-mgr
system-ceph\x2dmon.slice loaded active active Slice /system/ceph-mon
system-ceph\x2dosd.slice loaded active active Slice /system/ceph-osd
ceph-mon.target loaded inactive dead ceph target allowing to start/stop all ceph-mon@.service instances at once
ceph-osd.target loaded active active ceph target allowing to start/stop all ceph-osd@.service instances at once
ceph.target loaded active active ceph target allowing to start/stop all ceph*@.service instances at once
Здесь мы видим, что у нас еще остаются активными некоторые сервисы Ceph.
Отключим их.
Финальная зачистка узла csn004
На финальном этапе останавливаем и отключаем оставшиеся сервисы Ceph:
[centos@csn004 ~]$ sudo systemctl disable --now ceph-crash.service
Removed /etc/systemd/system/ceph.target.wants/ceph-crash.service.
[centos@csn004 ~]$ sudo systemctl disable --now ceph-osd.target
Removed /etc/systemd/system/ceph.target.wants/ceph-osd.target.
Removed /etc/systemd/system/multi-user.target.wants/ceph-osd.target.
[centos@csn004 ~]$ sudo systemctl disable --now ceph.target
Removed /etc/systemd/system/multi-user.target.wants/ceph.target.
Обновляем список сервисов systemd:
[centos@csn004 ~]$ sudo systemctl daemon-reload
Проверяем список оставшихся сервисов Ceph:
[centos@csn004 ~]$ systemctl list-units --all | grep -i 'ceph'
system-ceph\x2dmds.slice loaded active active Slice /system/ceph-mds
system-ceph\x2dmgr.slice loaded active active Slice /system/ceph-mgr
system-ceph\x2dmon.slice loaded active active Slice /system/ceph-mon
system-ceph\x2dosd.slice loaded active active Slice /system/ceph-osd
ceph.target loaded inactive dead ceph target allowing to start/stop all ceph*@.service instances at once
Сервис ceph.target уже отключен и не сможет запустить никакие другие сервисы Ceph на узле csn004. Но он больше не нужен на этом узле. Чтобы удалить и его, продолжим зачистку узла csn004.
Проверяем список rpm-пакетов Ceph:
[centos@csn004 ~]$ sudo rpm -qa | grep -i ceph
python3-ceph-common-17.2.7-1.el7.3.x86_64
libcephfs2-17.2.7-1.el7.3.x86_64
python3-ceph-argparse-17.2.7-1.el7.3.x86_64
python3-cephfs-17.2.7-1.el7.3.x86_64
ceph-common-17.2.7-1.el7.3.x86_64
ceph-base-17.2.7-1.el7.3.x86_64
ceph-selinux-17.2.7-1.el7.3.x86_64
ceph-volume-17.2.7-1.el7.3.noarch
ceph-osd-17.2.7-1.el7.3.x86_64
ceph-mon-17.2.7-1.el7.3.x86_64
ceph-mds-17.2.7-1.el7.3.x86_64
libcephsqlite-17.2.7-1.el7.3.x86_64
ceph-prometheus-alerts-17.2.7-1.el7.3.noarch
ceph-grafana-dashboards-17.2.7-1.el7.3.noarch
cephadm-17.2.7-1.el7.3.noarch
ceph-mgr-cephadm-17.2.7-1.el7.3.noarch
ceph-mgr-dashboard-17.2.7-1.el7.3.noarch
ceph-mgr-diskprediction-local-17.2.7-1.el7.3.noarch
ceph-mgr-k8sevents-17.2.7-1.el7.3.noarch
ceph-mgr-rook-17.2.7-1.el7.3.noarch
ceph-mgr-modules-core-17.2.7-1.el7.3.noarch
ceph-mgr-17.2.7-1.el7.3.x86_64
Удаляем пакеты Ceph:
sudo dnf remove -y ceph* python3-ceph* libceph*
Удаляем каталог с остаточными данными о кластере Ceph:
[centos@csn004 ~]$ sudo rm -rf /var/lib/ceph
Обновляем список systemd-юнитов и проверяем наличие сервисов Ceph:
[centos@csn004 ~]$ sudo systemctl daemon-reload
[centos@csn004 ~]$ sudo systemctl list-units --all | grep -i ceph
system-ceph\x2dmds.slice loaded active active Slice /system/ceph-mds
system-ceph\x2dmgr.slice loaded active active Slice /system/ceph-mgr
system-ceph\x2dmon.slice loaded active active Slice /system/ceph-mon
system-ceph\x2dosd.slice loaded active active Slice /system/ceph-osd
Эти slice-юниты создаются автоматически при запуске Ceph-сервисов. После удаления пакетов и перезагрузки узла они исчезают.
Можно дополнительно поискать оставшиеся файлы и удалить их, но это не обязательно:
# Поиск файлов и каталогов с *ceph* в имени
[centos@csn004 ~]$ sudo find / -type f -iname '*ceph*'
[centos@csn004 ~]$ sudo find / -type d -iname '*ceph*'
На этом этапе узел уже выведен из кластера и полностью зачищен от следов Ceph.
После этого остается только перезагрузить узел — после перезагрузки исчезнут юниты system-ceph2d***.slice и остаточные cgroups.
Таким образом, узел csn004, который ранее был Active MON, MGR, MDS и содержал OSD c томами LVM, будет полностью выведен из кластера Ceph и доступен для введения в другие кластеры. Задача решена.
Что в итоге
Безусловно, рассмотренная в статье задача — специфический кейс. Но многие специалисты при работе с Ceph-кластерами, так или иначе, сталкиваются с подобными задачами, и сталкиваются часто. Вместе с тем описанный алгоритм наглядно показывает, что при тщательном подходе к этой задаче, наличии контроля на каждом этапе и соблюдении простых правил вывести из кластера Ceph можно даже узел с Active MON, MGR, MDS и OSD с томами LVM, причем можно сделать это таким образом, чтобы кластер и оставшиеся узлы не пострадали.