Skip to document
pieroot log
Markdown Preview

Ceph 클러스터 설치 및 구성: 분산 스토리지 시스템 마스터하기

Frontmatter

Ceph는 오픈소스 분산 스토리지로, 블록, 파일, 객체 서비스를 하나의 시스템에서 제공하며, Cephadm을 이용해 Docker/Podman 컨테이너 기반으로 쉽게 설치·관리할 수 있다. 최소 3노드 구성과 시간 동기화, SSH 키 배포가 필요하고, Bootstrap으로 첫 노드를 초기화한 뒤 다른 노드와 디스크를 OSD로 추가한다. public network와 별도 cluster network를 설정하면 성능이 향상되며, 설정 변경 시 모니터·매니저·OSD를 순차적으로 재시작해야 한다. 전체 과정은 사전 요구사항 점검, Cephadm 설치·Bootstrap, 호스트·OSD 추가, 필요시 네트워크 분리 구성으로 요약된다.

Ceph 클러스터 설치 및 구성: 분산 스토리지 시스템 마스터하기

Ceph란?

안녕하세요! 오늘은 분산 스토리지 시스템인 Ceph를 직접 설치하고 구성하는 방법을 공유하려고 합니다.
Ceph는 클라우드 플랫폼에 스토리지를 제공하기 위한 오픈소스 소프트웨어입니다. 블록 디바이스(RBD), 파일시스템(CephFS), 객체 스토리지(RGW) 와 같은 다양한 스토리지 서비스를 하나의 통합된 시스템에서 제공할 수 있다는 것이 가장 큰 장점이죠.
notion image
💡
Ceph의 핵심 구성 요소
  • OSD (Object Storage Daemon): 실제 데이터를 저장하는 데몬으로, 각 디스크마다 하나씩 생성됩니다
  • MON (Monitor): 클러스터 맵의 마스터 복사본을 유지하고 클러스터 상태를 관리합니다
  • MGR (Manager): 대시보드, 모니터링, 클러스터 관리 기능을 담당합니다
  • MDS (Metadata Server): CephFS 사용 시 파일 메타데이터를 관리합니다
Ceph에 관한 기본 개념은 공식 문서에 상세히 정리되어 있으므로, 이 글에서는 실제 설치 방법과 활용 방안에 초점을 맞춰 설명하겠습니다.

🖥️ 구성 환경

Ceph 클러스터를 위해 구성한 초기 환경은 다음과 같습니다.
hostname
mainboard
RAM
DISK
storage1
X10SRA
64GB
48TB (16TB × 3)
storage2
X10SRA
80GB
48TB (16TB × 3)
storage3
X10SRA
128GB
32TB (16TB × 2)
메모리와 디스크 용량이 제각각인 이유는 처음에 2노드로 구성하려다가 3노드로 변경하면서 장비를 재분배했기 때문입니다. Ceph는 RAID를 사용하지 않고 자체적인 복제 메커니즘(CRUSH 알고리즘)을 통해 데이터 안정성을 보장합니다. 따라서 노드마다 디스크 개수나 용량이 달라도 정상적으로 동작합니다.
⚠️
권장 사항: Ceph 클러스터는 최소 3개 이상의 노드로 구성하는 것이 좋습니다. 이는 데이터 복제 및 쿼럼(Quorum) 유지에 필요한 최소 조건입니다.

📋 사전 요구사항 (Requirements)

Cephadm은 Docker 또는 Podman을 사용하여 컨테이너 내에서 Ceph 클러스터를 운영합니다. 따라서 호스트 OS 종류에 크게 영향받지 않으며, 다음 요구사항만 충족하면 됩니다.
📌
필수 요구사항
  • Python 3
  • Systemd
  • Podman 또는 Docker
  • 시간 동기화 (chrony 또는 NTP)
  • LVM2 (스토리지 디바이스 프로비저닝용)

Docker 설치

Docker는 위 공식 문서를 따라 설치하면 됩니다. Ceph는 root 권한으로 실행되므로 일반 사용자 계정에 docker 그룹 권한을 추가할 필요는 없습니다.
Docker가 예기치 못하게 종료되거나 재시작되어도 Ceph가 정상 동작하도록 Live Restore 기능을 활성화하는 것을 권장합니다.
bash
# /etc/docker/daemon.json 파일에 추가
{
  "live-restore": true
}

Python3

Ubuntu 18.04 이상에는 Python이 기본으로 설치되어 있습니다. 혹시 없다면 아래 명령어로 설치하세요.
bash
sudo apt install python3 python3-pip -y

시간 동기화 (chrony)

분산 시스템에서 시간 동기화는 매우 중요합니다. 노드 간 시간 차이가 발생하면 클러스터 동작에 문제가 생길 수 있습니다. 저는 기존 OpenStack 환경에서 사용 중인 chrony를 활용했습니다.
bash
# chrony 설치
sudo apt update
sudo apt install chrony -y

# 설정 파일 편집
sudo vi /etc/chrony/chrony.conf
설정 파일 맨 아래에 NTP 서버 주소를 추가합니다.
plain text
server dms-controller iburst
/etc/hosts 파일에 호스트네임이 설정 되어있어야한다.
설정을 저장한 후 서비스를 재시작합니다.
bash
sudo systemctl restart chrony.service
정상적으로 NTP 서버에 연결되었는지 확인합니다.
bash
sudo chronyc sources
notion image
출력 결과에서 ^* 기호가 서버명 앞에 표시되면 정상적으로 동기화된 것입니다.
🔔
중요: 모든 Ceph 노드에서 동일한 NTP 설정을 수행해야 합니다!

🚀 Cephadm 설치

현재 Ceph를 설치하는 방법은 크게 두 가지가 있습니다.
방법
설명
적합한 환경
Cephadm
컨테이너 기반, Docker/Podman + Systemd 필요
일반 리눅스 서버
Rook
Kubernetes Operator 방식
Kubernetes 환경
이 글에서는 Cephadm을 사용하여 Ceph 클러스터를 구성합니다.
Cephadm 설치는 아래 명령어로 간단히 진행할 수 있습니다.
bash
# 최신 안정 버전으로 설치하는 것을 권장합니다
CEPH_RELEASE=18.2.0
curl --silent --remote-name --location https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm

chmod +x cephadm
./cephadm install
curl 외에도 apt나 dnf를 통한 설치도 가능하지만, 위 방법이 호스트 OS 환경에 덜 의존적입니다.
설치가 완료되면 정상 설치 여부를 확인합니다.
bash
# cephadm 경로 확인
which cephadm
# 출력: /usr/sbin/cephadm

# 도움말 확인
cephadm -h

🏗️ 클러스터 Bootstrap

Cephadm이 정상적으로 설치되었다면, bootstrap 명령어로 첫 번째 노드에 Ceph 클러스터를 생성합니다.
bash
cephadm bootstrap --mon-ip <mon-ip>
--mon-ip는 Monitor 데몬의 수신 IP 주소를 의미합니다. 이 IP는 클러스터의 첫 번째 진입점이 됩니다.

⚡ Public Network vs Cluster Network

여기서 반드시 이해하고 넘어가야 할 중요한 개념이 있습니다. Ceph는 두 가지 네트워크를 사용합니다.
🌐
Public Network: 클라이언트와 통신하는 네트워크. 외부에서 Ceph 서비스에 접근할 때 사용됩니다.
Cluster Network: OSD 간의 내부 통신 전용 네트워크. 데이터 복제, 복구, 하트비트 처리에 사용됩니다.
Bootstrap 시 --mon-ip만 지정하면 public network만 설정됩니다. 이 경우 모든 트래픽이 하나의 네트워크로 집중되어 성능이 크게 저하될 수 있습니다.
notion image
실제 서비스 환경에서는 OSD 간에 지속적으로 데이터를 이동하고 복제해야 합니다. Public network로 모든 통신을 처리하면 클라이언트 요청과 내부 복제 트래픽이 경합하여 시스템이 극도로 느려집니다.
✅
권장 사항: 처음부터 cluster network를 분리하여 구성하세요!
bash
cephadm bootstrap --mon-ip 172.30.2.101 --cluster-network 10.10.10.0/24
하지만 이 글에서는 처음에 mon-ip만 설정한 경우를 가정하고 진행하겠습니다. (나중에 cluster network를 추가하는 방법도 설명합니다.)
bash
cephadm bootstrap --mon-ip 172.30.2.101
명령어를 실행하고 잠시 기다리면 자동으로 필요한 컨테이너들이 생성되고 구동됩니다. Bootstrap이 완료되면 대시보드 접속 정보와 초기 관리자 비밀번호가 출력됩니다.

💻 Ceph CLI 활성화

Cephadm을 사용하면 호스트에 ceph 패키지를 별도로 설치하지 않아도 됩니다. Ceph 명령어는 컨테이너 내에서 실행되므로, 다음 명령어로 ceph shell에 접근할 수 있습니다.
bash
cephadm shell
하지만 매번 shell에 접근하는 것은 번거로우므로, ceph-common 패키지를 설치하여 호스트에서 직접 명령어를 실행할 수 있게 합니다.
bash
# Ceph 저장소 추가 (squid는 최신 LTS 릴리즈)
cephadm add-repo --release squid
cephadm install ceph-common
📝
참고: Ceph 릴리즈 버전은 알파벳 순서로 명명됩니다. 주요 릴리즈로는 Pacific → Quincy → Reef → Squid 등이 있습니다. 가능하면 LTS(Long Term Support) 버전을 사용하세요.

🖧 호스트 추가

Host Management — Ceph Documentation
3개의 노드를 준비했으므로, bootstrap으로 설정한 1번 노드에 2번, 3번 노드를 추가해야 합니다.
Cephadm은 SSH를 통해 원격 노드에 자동으로 Ceph 컴포넌트를 배포합니다. 따라서 먼저 SSH 키를 다른 노드에 복사해야 합니다.
bash
# Ceph용 SSH 키가 없다면 생성
# ssh-keygen -f /etc/ceph/ceph.pub

# 다른 노드에 SSH 키 복사
ssh-copy-id -f -i /etc/ceph/ceph.pub root@172.30.2.102
ssh-copy-id -f -i /etc/ceph/ceph.pub root@172.30.2.103
⚠️
주의: SSH 데몬은 기본적으로 패스워드 인증과 root 로그인을 차단합니다. 필요하다면 /etc/ssh/sshd_config에서 PermitRootLogin yes와 PasswordAuthentication yes를 설정하세요.
cloud-init 환경이라면 /etc/ssh/sshd_config.d/50-cloud-init.conf 파일도 확인하세요.
SSH 키 복사가 완료되면 Ceph 클러스터에 새 노드를 추가합니다.
bash
ceph orch host add dms-storage2 172.30.2.102
ceph orch host add dms-storage3 172.30.2.103
노드가 추가되면 Ceph가 자동으로 필요한 서비스들을 배포합니다. 이 과정에서 기존 PG(Placement Group)와 OSD 내 오브젝트들의 위치를 재정리하고 분배하므로 시간이 다소 소요됩니다.
클러스터 상태는 다음 명령어로 확인할 수 있습니다.
bash
ceph -s
# 또는
ceph orch host ls

💾 OSD 추가

클러스터에 노드가 추가되었다고 끝이 아닙니다. 각 노드의 디스크를 OSD로 등록해야 실제로 데이터를 저장할 수 있습니다.
모든 가용 디바이스를 OSD로 자동 추가하려면 다음 명령어를 사용합니다.
bash
ceph orch apply osd --all-available-devices
이 명령어는 부팅 디스크를 제외한 사용 가능한 모든 디스크를 OSD로 등록합니다.
📌
OSD로 사용 가능한 디스크 조건
  • 파티션이 없어야 함
  • LVM 논리 볼륨이 없어야 함
  • 파일시스템이 없어야 함
  • Ceph BlueStore OSD가 없어야 함
  • 마운트되어 있지 않아야 함
OSD 상태는 다음 명령어로 확인합니다.
bash
ceph osd tree
ceph osd status

🔧 Cluster Network 나중에 추가하기

처음에 public network만 구성하고 cluster network를 설정하지 않았다면, 모든 트래픽이 하나의 네트워크로 집중되어 성능이 크게 저하됩니다. 이 섹션에서는 운영 중인 클러스터에 cluster network를 추가하는 방법을 설명합니다.
⚠️
주의: 이 작업은 클러스터 서비스에 일시적인 영향을 줄 수 있습니다. 가능하면 트래픽이 적은 시간대에 진행하세요.
아래 모든 과정은 cephadm shell 내에서 또는 ceph-common이 설치된 호스트에서 수행합니다.

1단계: 네트워크 설정 추가

bash
# Public network와 Cluster network 설정
ceph config set global public_network 172.30.0.0/16
ceph config set global cluster_network 10.10.10.0/24

# 설정 확인
ceph config dump | grep network
💡
왜 45초를 기다릴까요?
Ceph는 데몬 수가 변경되면 쿼럼 체크와 데이터 재분배가 발생합니다. 이 과정이 안정화되고 HEALTH_OK 상태가 될 때까지 기다려야 다음 데몬을 안전하게 재시작할 수 있습니다.
image.png

2단계: Monitor 데몬 재시작

설정만 변경해서는 바로 적용되지 않습니다. 각 노드의 Monitor 데몬을 순차적으로 재시작해야 합니다.
bash
# 한 번에 하나씩, 45초 간격으로 재시작
ceph orch daemon restart mon.dms-storage3
sleep 45
ceph -s

ceph orch daemon restart mon.dms-storage2
sleep 45
ceph -s

ceph orch daemon restart mon.dms-storage1
sleep 45
ceph -s
bash
ceph orch restart osd.all-available-devices
image.png

3단계: Manager 재시작

bash
ceph orch restart mgr

4단계: OSD 재시작

마지막으로 OSD를 재시작하여 새로운 cluster network 설정을 적용합니다.
image.png
재시작이 완료되면 OSD들이 cluster network를 통해 통신하는 것을 확인할 수 있습니다.
image.png

🎯 마무리

지금까지 Cephadm을 사용하여 Ceph 클러스터를 구축하는 방법을 살펴보았습니다.
📋
정리
  1. 사전 요구사항 확인 (Docker, Python3, chrony)
  1. Cephadm 설치
  1. Bootstrap으로 첫 번째 노드 초기화
  1. SSH 키 배포 후 추가 노드 등록
  1. OSD 추가로 스토리지 활성화
  1. (선택) Cluster network 분리 구성
Cephadm 덕분에 Ceph 설치와 관리가 과거에 비해 훨씬 편리해졌습니다. 하지만 개인 환경에서 사용하기에는 다소 무겁고, OpenStack 같은 클라우드 플랫폼과 함께 사용할 때 진가를 발휘합니다.
다음 글에서는 OpenStack Cinder와 Ceph를 연동하는 방법, 그리고 RGW(Object Storage)를 구성하는 방법을 다룰 예정입니다.

📚 참고 자료