Overview
오늘은 Ceph 클러스터에서 노드를 제거하고 새 노드를 추가하는 방법에 대해 학습하였다.
Ceph는 분산 스토리지 시스템으로, 클러스터 내에 다양한 역할을 가진 노드들이 구성된다. 운영 중 노드를 제거하거나 추가하는 작업은 데이터 무결성과 클러스터 안정성을 위해 매우 신중하게 접근해야 하며, 특히 OSD 제거 시 여유 스토리지 용량 확인, 스크러빙 비활성화, 클러스터 재조정 상태 확인 등의 사전 준비가 필수적이다.
이번 실습에서는 ceph osd, mgr, mon 등을 안전하게 제거하고, 이후 ansible을 이용하여 신규 노드를 클러스터에 구성하는 전체 절차를 수행하였다.
📅 관련 글
2022.07.29 - [Open Source Software] - Ceph 란?
2024.02.20 - [Open Source Software] - Cephadm-ansible이란?
2024.02.20 - [Open Source Software] - Rook-Ceph란?
작업전 확인사항
- 제거 작업전에 반드시 클러스터 여유 공간을 확인한다.
- 제거되는 노드의 용량만큼 받아줄수 있는지 확인한다.
1. Ceph 노드 제거
1.) 클러스터 상태 및 용량 확인
$ sudo ceph -s
$ sudo ceph osd df
2.) 스크러빙 비활성화 (I/O 부하 방지)
$ sudo ceph osd set noscrub
$ sudo ceph osd set nodeep-scrub
3.) Ceph OSD 제거
해당하는 ceph node의 osd를 제거해준다.(ex. ceph2 node osd 제거)
$ sudo ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.78119 root default
-3 0.39059 host ceph1
1 hdd 0.19530 osd.1 up 1.00000 1.00000
2 hdd 0.19530 osd.2 up 1.00000 1.00000
-5 0.39059 host ceph2
0 hdd 0.19530 osd.0 up 1.00000 1.00000
3 hdd 0.19530 osd.3 up 1.00000 1.00000
$ sudo ceph osd out osd.0
marked out osd.0.
$ sudo ceph osd down osd.0
marked down osd.0.
$ sudo ceph osd rm osd.0
removed osd.0
$ sudo ceph osd crush remove osd.0
removed item id 0 name 'osd.0' from crush map
$ sudo ceph osd out osd.3
marked out osd.3.
$ sudo ceph osd down osd.3
marked down osd.3.
$ sudo ceph osd rm osd.3
removed osd.3
$ sudo ceph osd crush remove osd.3
removed item id 3 name 'osd.3' from crush map
$ sudo ceph osd crush remove ceph2
removed item id -5 name 'ceph2' from crush map
$ sudo ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.39059 root default
-3 0.39059 host ceph1
1 hdd 0.19530 osd.1 up 1.00000 1.00000
2 hdd 0.19530 osd.2 up 1.00000 1.00000
- osd를 제거할 때 down하고 rm을 바로 눌러줘야 한다. 이유는 바로 up으로 살아나기 때문이다.
ceph osd 인증 리스트 삭제
$ sudo ceph auth list
installed auth entries:
osd.0
key: AQDkfipjW6P1ERAAcCdTZJ6lATN7i8wxwh7j3Q==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQDkfipjud7XFhAAqEEuJJtSofEOnHH5isz63w==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.2
key: AQDxfipjjTSxARAAk0TLZHmJNMpjba5cpCgoNQ==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.3
key: AQDxfipjEzNFCBAAqyOYJpLfbJQwAHr7kQg8hA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
...
mgr.ceph1
key: AQCIfipjAAAAABAAaZo/gviQ+VODxFJfPDrpkQ==
caps: [mds] allow *
caps: [mon] allow profile mgr
caps: [osd] allow *
mgr.ceph2
key: AQCKfipjAAAAABAAlxEFB8o0btVev+Rcky0FOw==
caps: [mds] allow *
caps: [mon] allow profile mgr
caps: [osd] allow *
$ sudo ceph auth del osd.0
updated
$ sudo ceph auth del osd.2
updated
$ sudo ceph auth del mgr.ceph2
updated
$ sudo ceph auth list
installed auth entries:
osd.1
key: AQDkfipjud7XFhAAqEEuJJtSofEOnHH5isz63w==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.3
key: AQDxfipjEzNFCBAAqyOYJpLfbJQwAHr7kQg8hA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
...
mgr.ceph1
key: AQCIfipjAAAAABAAaZo/gviQ+VODxFJfPDrpkQ==
caps: [mds] allow *
caps: [mon] allow profile mgr
caps: [osd] allow *
4.) Ceph MON 제거
해당하는 ceph node의 Mon을 제거해준다.
$ sudo ceph mon stat
e1: 2 mons at {ceph1=[v2:10.3.2.206:3300/0,v1:10.3.2.206:6789/0],ceph2=[v2:10.3.2.207:3300/0,v1:10.3.2.207:6789/0]}, election epoch 4, leader 0 ceph1, quorum 0,1 ceph1,ceph2
$ sudo ceph mon remove ceph2
removing mon.ceph2 at [v2:10.3.2.207:3300/0,v1:10.3.2.207:6789/0], there will be 1 monitors
$ sudo ceph -s
cluster:
id: 14675ee4-b9dd-440b-9e73-e4c00a62eab1
health: HEALTH_WARN
noscrub,nodeep-scrub flag(s) set
services:
mon: 1 daemons, quorum ceph1 (age 4s)
5.) Ceph MGR 제거
해당하는 ceph node를 stanbys로 만들어준다.
$ sudo ceph -s
cluster:
id: 14675ee4-b9dd-440b-9e73-e4c00a62eab1
health: HEALTH_WARN
noscrub,nodeep-scrub flag(s) set
services:
mon: 1 daemons, quorum ceph1 (age 6m)
mgr: ceph2(active, since 4w), standbys: ceph1
$ sudo ceph mgr fail ceph2
$ sudo ceph -s
cluster:
id: 14675ee4-b9dd-440b-9e73-e4c00a62eab1
health: HEALTH_WARN
noscrub,nodeep-scrub flag(s) set
services:
mon: 1 daemons, quorum ceph1 (age 7m)
mgr: ceph1(active, since 3s), standbys: ceph2
그리고 해당하는 ceph node로 가서 Mgr을 제거해준다.
$ ssh [해당되는 Ceph node]
$ sudo systemctl status ceph-mgr@ceph2
● ceph-mgr@ceph2.service - Ceph cluster manager daemon
Loaded: loaded (/usr/lib/systemd/system/ceph-mgr@.service; enabled; vendor preset: disabled)
Active: active (running) since 화 2022-08-16 17:34:45 KST; 1 months 4 days ago
...
$ sudo systemctl stop ceph-mgr@ceph2
$ sudo systemctl status ceph-mgr@ceph2
● ceph-mgr@ceph2.service - Ceph cluster manager daemon
Loaded: loaded (/usr/lib/systemd/system/ceph-mgr@.service; enabled; vendor preset: disabled)
Active: inactive (dead) since 화 2022-09-20 16:43:21 KST; 11s ago
...
$ sudo ceph -s
cluster:
id: 14675ee4-b9dd-440b-9e73-e4c00a62eab1
health: HEALTH_WARN
noscrub,nodeep-scrub flag(s) set
services:
mon: 1 daemons, quorum ceph1 (age 99m)
mgr: ceph1(active, since 91m)
osd: 2 osds: 2 up (since 2h), 2 in (since 2h)
rgw: 3 daemons active (master1.rgw0, master2.rgw0, master3.rgw0)
6.) 스크러빙 활성화
$ sudo ceph osd unset nodeep-scrub
nodeep-scrub is unset
$ sudo ceph osd unset noscrub
noscrub is unset
7.) Ceph 상태 확인
$ sudo ceph -s
cluster:
id: 14675ee4-b9dd-440b-9e73-e4c00a62eab1
health: HEALTH_WARN
services:
mon: 1 daemons, quorum ceph1 (age 99m)
mgr: ceph1(active, since 91m)
osd: 2 osds: 2 up (since 2h), 2 in (since 2h)
rgw: 3 daemons active (master1.rgw0, master2.rgw0, master3.rgw0)
task status:
data:
pools: 11 pools, 228 pgs
objects: 4.41k objects, 15 GiB
usage: 32 GiB used, 368 GiB / 400 GiB avail
pgs: 228 active+clean
io:
client: 2.7 KiB/s wr, 0 op/s rd, 0 op/s wr
- Ceph node 를 제거했기 때문에 HEALTH_WARN이 발생할 것입니다.
- 노드 추가하면 정상적으로 돌아옵니다.
2. Ceph 노드 추가
1.) 추가할 ceph osd 노드를 구성
기존 ceph 노드와 같은 OS를 설치 후 IP를 할당한다.
2.) ssh key 교환
새로운 노드에 접근할 수 있도록 ssh 공개키를 교환한다.
$ ssh-copy-id [해당되는 Ceph node]
3.) 시간 동기화
$ ssh [해당되는 Ceph node]
$ sudo vi /etc/chrony.conf
server [해당되는 Control node] iburst
$ sudo systemctl restart chronyd
$ chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===========================================================================================
^* [해당되는 Control node] 3 6 377 36 +489us[+1186us] +/- 40ms
4.) inventory (hosts.ini, extra-vars) 수정
hosts.ini 수정
$ ZONE_NAME={해당 ZONE]
$ cd ~/somaz
$ cp inventory/$ZONE_NAME/hosts.ini ~/somaz/inventory/$Z
ONE_NAME/hosts.ini.ceph-add
$ vi inventory/$ZONE_NAME/hosts.ini.ceph-add
...
+ [추가 node name] ip=[추가 node ip]
...
# Ceph cluster
# we need empty mons group or clients role fails
[mons]
# [기존 ceph node] # 주석처리
+ [추가 node name]
[mgrs]
# [기존 ceph node] # 주석처리
+ [추가 ceph node]
[osds]
# [기존 ceph node] # 주석처리
+ [추가 node name]
...
- 추가할 mon,mgrs,osds에 각각 추가해준다.
extra-vars 수정
$ cp inventory/$ZONE_NAME/extra-vars.yml inventory/$ZONE_NAME/extra-vars.yml.ceph-add
$ vi inventory/$ZONE_NAME/extra-vars.yml.ceph-add
...
## ceph osd
osd_objectstore: bluestore
lvm_volumes:
- data: /dev/sdb
- data: /dev/sdc
...
- extra-vars는 osd에 변화가 있다면 추가해준다. 동일한 개수의 osd라면 그대로 진행하면 된다.
5.) ansible playbook 실행 site.yml (setup-os, ceph tag)
$ ansible-playbook -b -u clex \
-i inventory/$ZONE_NAME/hosts.ini.ceph-add \
--extra-vars=@inventory/$ZONE_NAME/extra-vars.yml.ceph-add \
site.yml --tags=setup-os,ceph
6.) osd 추가확인
$ sudo ceph -s
cluster:
id: 9893a83c-63e2-41b6-a538-f72008e15a01
health: HEALTH_OK
services:
mon: 2 daemons, quorum ceph1,ceph2 (age 32m)
mgr: ceph1(active, since 3h), standbys: ceph2
osd: 4 osds: 4 up (since 6m), 4 in (since 6m)
rgw: 3 daemons active (master1.rgw0, master2.rgw0, master3.rgw0)
task status:
data:
pools: 11 pools, 228 pgs
objects: 200 objects, 4.7 KiB
usage: 4.1 GiB used, 796 GiB / 800 GiB avail
pgs: 228 active+clean
$ sudo ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.78119 root default
-3 0.39059 host ceph1
1 hdd 0.19530 osd.1 up 1.00000 1.00000
3 hdd 0.19530 osd.3 up 1.00000 1.00000
-5 0.39059 host ceph2
0 hdd 0.19530 osd.0 up 1.00000 1.00000
2 hdd 0.19530 osd.2 up 1.00000 1.00000
마무리
Ceph 클러스터에서의 노드 관리 작업은 단순히 노드를 붙이고 떼는 것 이상으로, 다양한 시스템 컴포넌트와 연동되어 있어 정확한 순서와 명령어 실행이 중요하다.
이번 학습을 통해 Ceph 노드 제거 시 OSD → MON → MGR 순으로 제거하는 원칙과, 스크러빙 비활성화 → 인증 삭제 → 서비스 중지 → 재확인 등의 일련의 작업 플로우를 익힐 수 있었다. 또한 신규 노드를 Ansible을 활용해 빠르게 자동화 배포하는 실전 노하우도 함께 습득했다.
실무 환경에서는 Ceph 구성 변경 전 반드시 백업 및 재해 복구 시나리오, 그리고 여유 용량과 클러스터 상태를 먼저 점검하고, 문제가 발생하더라도 빠르게 대응할 수 있도록 로그 및 상태 확인 명령어 숙지가 필요하다.
이번 학습을 통해 Ceph 클러스터 운영의 자신감이 한층 더 높아졌으며, 이후 CephFS, RGW, 블록 디바이스 구성 등 다양한 고급 운영 주제도 차근차근 다뤄보고자 한다.
"변화가 잦은 인프라 환경일수록, 안전하고 자동화된 클러스터 관리가 핵심이다."
Reference
'Open Source Software' 카테고리의 다른 글
Cephadm-ansible이란? (3) | 2024.02.29 |
---|---|
Rook-Ceph란? (0) | 2024.02.20 |
Redis(Remote Dictionary Server)란? (0) | 2022.09.26 |
RabbitMQ란? (0) | 2022.08.01 |
Ceph 란? (0) | 2022.07.29 |