# Ceph 스토리지 구축

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%; height: 60.25px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr style="height: 30.125px;"><td style="height: 30.125px;">[![image.png](http://wiki.igoni.kr/uploads/images/gallery/2026-02/scaled-1680-/Vzkimage.png)](http://wiki.igoni.kr/uploads/images/gallery/2026-02/Vzkimage.png)

</td></tr><tr style="height: 30.125px;"><td class="align-right" style="height: 30.125px;">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

### ceph 소개

1. 분산 객체 스토리지를 구성하는 OSS
2. 서버 구성은 OSD, Monitor, Manager, MDS 서버가 필요
3. 논리적으로 구성한 Storage pool안에서 데이터를 개체로 저장. Crush알고리즘을 사용해서 배치그룹을 계산하고 저장

### 구성정보

1. Component 종류 
    1. ceph-mon(모니터노드) : 클러스터 상태를 체크하고, 데몬과 클라이언트간 인증관리 담당 / HA구성시 3대 필요
    2. ceph-mgr(관리노드) : 스토리지 활용도 / 현재상태 및 메트릭 추적 (dashboard 및 RestAPI 제공) / HA구성시 2대 필요(Active / Standby)
    3. ceph-osd(객체스토리지 데몬) : 데이터를 저장하고 복제 / 부하분산 역활을 수행 (OSD디스크 1TB당 메모리 1G이상으로 구성을 권고), HA구성시 최소 3대 필요
    4. ceph-mds : CEPH FS를 대신해서 메타 데이터를 관리하는 서버. = Block Devices / Object Storage에서는 MDS를 사용하지 않음
2. Component Hardware Spec <div><div><table border="1" style="border-collapse: collapse; border-style: ridge; height: 401px; width: 100%;"><thead><tr><td class="align-center" style="width: 22.8188%;">**Component**</td><td class="align-center" style="width: 19.0937%;">**Hardward** </td><td class="align-center" style="width: 58.0875%;">**Spec** </td></tr></thead><tbody><tr><td style="width: 22.8188%;">osd</td><td style="width: 19.0937%;">CPU </td><td style="width: 58.0875%;"> OSD당 2 Core</td></tr><tr><td style="width: 22.8188%;">osd</td><td style="width: 19.0937%;">MEM</td><td style="width: 58.0875%;"> 데몬당 4GB이상</td></tr><tr><td style="width: 22.8188%;">osd</td><td style="width: 19.0937%;">DISK </td><td style="width: 58.0875%;"> 최소 1TB이상,(SSD 권장)  
    단일 디스크에서 여러 OSD 실행은 비권장  
    단일 디스크에서 osd+mon+mds 실행방식 비권장  
    OSD용 디스크는 OS와 분리해서 사용(성능저하 이슈)</td></tr><tr><td style="width: 22.8188%;">osd</td><td style="width: 19.0937%;">NIC </td><td style="width: 58.0875%;"> 10G이상</td></tr><tr><td style="width: 22.8188%;">mon</td><td style="width: 19.0937%;">CPU </td><td style="width: 58.0875%;"> 2코어 이상</td></tr><tr><td style="width: 22.8188%;">mon</td><td style="width: 19.0937%;">MEM</td><td style="width: 58.0875%;"> 데몬당 24GB이상</td></tr><tr><td style="width: 22.8188%;">mon</td><td style="width: 19.0937%;">DISK </td><td style="width: 58.0875%;"> 데몬당 60GB</td></tr><tr><td style="width: 22.8188%;">mds</td><td style="width: 19.0937%;">CPU</td><td style="width: 58.0875%;">2코어 이상</td></tr><tr><td style="width: 22.8188%;">mds</td><td style="width: 19.0937%;">MEM</td><td style="width: 58.0875%;">데몬당 2GB이상</td></tr><tr><td style="width: 22.8188%;">mds</td><td style="width: 19.0937%;">DISK</td><td style="width: 58.0875%;">데몬당 1MB 이상</td></tr><tr><td style="width: 22.8188%;">mds</td><td style="width: 19.0937%;">NIC</td><td style="width: 58.0875%;">1Gb 이상</td></tr></tbody></table>
    
    </div></div>\* OSD에 RAID구성시 성능저하가 발생할 수 있으므로 BMT를 통해 성능 비교 권고

### 시스템 이해

1. OSD Backend 
    1. Bluestore 
        - Ceph 12.2이후 부터 default storage
        - 저장장치를 직접 엑세스 해서 데이터를 관리 - XFS같은 파일시스템을 사용하지 않음
        - RocksDB를 통한 메타데이터 관리
        - 전체 데이터 및 메타데이터 checksum 수행 - 무결성 유지
        - inline압축 - 디스크에 저장하기 전에 선택적으로 압축수행
        - 데이터 관리 계층화 - journal을 별도 장치에 기록할 수 있어 성능향상 가능.
        - CoW을 사용하기 때문에 기존보다 향상된 IO
    2. Filestore 
        - Ceph에 개체를 저장하는 방식.
        - 일부 메타데이터에 대해 LevelDB를 사용해 key/value로 저장
        - 파일시스템을 btrfs / ext4에서 사용시 알려진 결함이 있어 데이터가 손실될 수 있음 (XFS는 영향없음)
2. Pool 
    1. 개체를 저장하기 위해 사용하는 논리 파티션 
        - Recovery : 데이터 손실없이 사용할 수 있도록 설정하는 OSD
        - PG : Pool에 대한 배치 그룹 수 (일반적으로 OSD당 100개의의 PG을 사용)
        - Cursh Rule : 데이터를 Pool에 저장할때 Crush Rule에 의해 결정
        - Snapshot : 특정 Pool의 스냅샷 생성
    2. Pool을 사용하기 위해서는 어플리케이션과 연결되어 있어야 하며, RBD에서 사용할 경우 RBD도구를 사용해서 초기화가 필요 (cephfs / rbd / rgw 중 택1)
3. CephFS 
    1. 분산 개체 저장소인 RADOS를 기반으로 구축된 파일시스템
    2. 공유 디렉토리 및 HA를 제공
    3. CephFS는 데이터용와 메다데이터용으로 각각 2개이상의 RAODS Pool이 필요 
        - 메타데이터 pool에서 데이터가 손실되면 전체파일 시스템 액세스가 불가능
        - 메타 데이터 pool에 SSD 사용
        - 데이터 풀은 파일시스템을 생성하고, 기본적으로 모든 inode 정보를 저장하는 위치
4. NFSExport 
    1. NFS-Ganesha NFS를 이용해 CephFS 네임스페이스 export 가능

### Ceph 설치하기 (ansible 기반의 ceph배포)

1. 설치 방법에는 cephadm / Rook / ansible을 이용한 설치방법이 존재, 
    1. cephadm - 자체적으로 설치하는 binary container 혹은 python3이 필요
    2. Rook - kuernetes에서 ceph를 설치하거나 기존 ceph를 k8s로 join할때 Rook을 이용
    3. ceph-deploy은 최신버전에서 사용되지 않음
2. ceph-ansible을 설치하기 위한 python 패키지 설치 ```shell
    $ yum install -y python3 python3-pip sshpass
    $ pip3 install --upgrade setuptools pip --ignore-installed
    ```
3. ceph-ansible 내려받기
    
    ```shell
    $ git clone https://github.com/ceph/ceph-ansible.git -b "v6.0.13"
    $ cd ceph-ansible
    ```
    
    <div><div><div class="box"><div class="code">  
    </div></div></div>
    - ceph-ansible 버전별 대응 버전 <div><table><tbody><tr><th scope="col">**ceph-ansible**</th><th scope="col">**ceph**</th><th scope="col">**ansible**</th></tr><tr><td>3.0</td><td>jewel / luminous </td><td>2.4</td></tr><tr><td>3.1</td><td>luminous / mimic </td><td>2.4</td></tr><tr><td>3.2</td><td>luminous / mimic </td><td>2.6</td></tr><tr><td>4.0</td><td>nautilus</td><td>2.9</td></tr><tr><td>5.0</td><td>octopus</td><td>2.9</td></tr><tr><td>6.0</td><td>pacific</td><td>2.9</td></tr></tbody></table>
        
        </div>
    
    </div>
4. dependency 패키지 설치 ```shell
    $ pip3 install -r requirements.txt
    ```
5. 배포를 위한 호스트파일 작성 ```shell
    $ vi hosts
    
    [mons]
    192.168.100.41
    
    [osds]
    192.168.100.41
    192.168.100.42
    
    [mdss]
    
    [rgws]
    
    [nfss]
    192.168.100.41
    
    [rbdmirrors]
    
    [clients]
    192.168.100.41
    
    [mgrs]
    192.168.100.41
    
    [iscsigws]
    
    [iscsi-gws]
    
    [grafana-server]
    
    [rgwloadbalancers]
    
    [monitoring]
    192.168.100.41
    
    [all:vars]
    ansible_become=true
    ansible_user=root
    ansible_ssh_pass=root
    ```
6. 환경변수 복사 (systemd 기반으로 구동시) ```shell
    $ cp site.yml.sample site.yml
    $ cp group_vars/all.yml.sample  group_vars/all.yml
    $ cp group_vars/osds.yml.sample  group_vars/osds.yml
    ```
7. 환경변수 복사 (container 기반으로 구동시) ```shell
    $ cp site-container.yml.sample  site.yml
    $ cp group_vars/all.yml.sample  group_vars/all.yml
    $ cp group_vars/osds.yml.sample  group_vars/osds.yml
    ```
8. config 설정 (systemd 기반으로 구동시) ```shell
    $ vi group_vars/all.yml
    ...
    osd_objectstore: bluestore
    monitor_interface: ens3f0
    public_network: 192.168.100.0/24
    ntp_service_enabled: true
    ntp_daemon_type: chronyd
    ...
    #############
    # DASHBOARD #
    #############
    dashboard_enabled: false
    dashboard_protocol: http
    dashboard_port: 8081
    dashboard_admin_user: admin
    dashboard_admin_password: adminpassword
    containerized_deployment: false
    ...
    configure_firewall: false
    ...
    ceph_origin: repository
    ...
    ceph_repository: community
    ...
    ceph_stable_release: octopus
    ```
    
    <div><div><div class="box"><div class="code">  
    </div></div></div></div>```shell
    $ vi group_vars/osds.yml
    ...
    devices:
      - /dev/sdb
    ...
    
    ```
    
    <div><div><div class="box"><div class="code">  
    </div></div></div></div>```shell
    $ vi roles/ceph-validate/tasks/main.yml
    ...
       #해당 name 전체 삭제
       - name: validate ceph_repository_community  
          fail:
            msg: "ceph_stable_release must be 'pacific'"
          when:
            - ceph_origin == 'repository'
            - ceph_repository == 'community'
            - ceph_stable_release not in ['pacific']
    ...
    ```
    
    <div><div><div class="box"><div class="code">  
    Centos7에서 systemd 기반으로 구동시 dashboard가 호환되지 않아 false로 처리해야 함  
    ceph 릴리즈 버전 중 pacific 버전은 Centos7에서 nfs export가 되지 않아 octopus로 다운그레이드가 필요  
    config 설정 (ceph를 container로 구동시)  
      
    </div></div></div></div>```shell
    $ vi group_vars/all.yml
    ...
    osd_objectstore: bluestore
    monitor_interface: ens3f0
    public_network: 192.168.100.0/24
    ntp_service_enabled: true
    ntp_daemon_type: chronyd
    ...
    #############
    # DASHBOARD #
    #############
    dashboard_enabled: false
    containerized_deployment: true
    ...
    ```
    
    <div><div><div class="box"><div class="code">  
      
    </div></div></div></div>```shell
    $ vi group_vars/osds.yml
    ...
    devices:
      - /dev/sdb
    ...
    ```
    
    <div><div class="box"><div class="code">  
    </div></div></div>
9. 배포 ```shell
    $ ansible-playbook  -i hosts  site.yml -b -v
    ```
10. cluster health check시 warn 발생시 <div><div><div class="box"><div class="code">\#Cluster 구성상태 모두 정상인데, health check warn으로 표시될 경우 조치방법 (ceph자체 버그로 의심)  
    </div></div></div></div>```shell
    $ ceph config set mon auth_allow_insecure_global_id_reclaim false
    ```
    
    <div><div class="box"><div class="code">  
    </div></div></div>

### 운영방법

1. ceph cluster상태 확인 ```shell
    $  ceph status
      cluster:
        id:     ca96d48d-1c9d-4168-9f21-ffda54a5cd9c
        health: HEALTH_OK
    
      services:
        mon: 2 daemons, quorum openstack-dev1,openstack-dev2 (age 87m)
        mgr: openstack-dev1(active, since 78m), standbys: openstack-dev2
        osd: 3 osds: 3 up (since 83m), 3 in (since 2h)
    
      data:
        pools:   5 pools, 105 pgs
        objects: 49 objects, 5.3 KiB
        usage:   41 MiB used, 300 GiB / 300 GiB avail
        pgs:     105 active+clean
    ```
2. ceph osd 상태 확인 ```shell
    $ ceph osd tree
    ID  CLASS  WEIGHT   TYPE NAME                STATUS  REWEIGHT  PRI-AFF
    -1         0.29306  root default
    -5         0.09769      host dev1
    2    hdd  0.09769          osd.2                up   1.00000  1.00000
    -3         0.09769      host dev2
    0    hdd  0.09769          osd.0                up   1.00000  1.00000
    -7         0.09769      host dev3
    1    hdd  0.09769          osd.1                up   1.00000  1.00000
    ```
3. ceph현재 latency 확인방법 ```shell
    $ ceph osd perf
    osd  commit_latency(ms)  apply_latency(ms)
     2                   0                  0
     0                   0                  0
     1                   0                  0
    ```
    
    <div><div class="box"><div class="code">  
      
    \# commit은 시스템 call이 있기 때문에 일반적으로 100 ~ 600ms까지는 수용가능한 수준으로 판단  
    \# 메모리내 적용된 파일을 파일시스템에 적용하는 시간 (ms단위, 실제 성능에 판단되는 시간)  
    </div></div></div>
4. nfs 오류시 로그 확인 ```shell
    $ cephadm logs --fsid <fsid> --name nfs.{{ clusteid }}.hostname
    ```
5. 파일시스템1. CephFS - Pool 관리
    
    ```shell
    $ ceph osd lspools
    ```
    
    <div><div><div class="box"><div class="code">  
    </div></div></div>
    1. Pool 생성 <div><div><div class="box"><div class="code">\#Pool 생성  
        </div></div></div></div>```shell
        $ ceph osd pool create {{ DATA_POOL_NAME }}
        $ ceph osd pool create {{ METADATA_POOL_NAME }}
        ```
        
        <div><div class="box"><div class="code">  
          
        \#CephFS는 데이터용과 메타데이터용 각각 2개이상의 RADOS풀 필요  
        </div></div></div>
    2. 생성된 Pool을 애플리케이션에 연결 (cephfs로 연결) ```shell
        $ ceph osd pool application enable {{ DATA_POOL_NAME }} cephfs
        ```
    3. 파일시스템 생성 ```shell
        $ ceph fs new {{ FS_NAME }} {{ METADATA_POOL_NAME  }} {{DATANAME }}
        ```
    4. NFS export <div><div><div class="box"><div class="code">\# 1. nfs module설정  
        </div></div></div></div>```shell
        $ ceph mgr module enable nfs
        
        ```
        
        <div><div><div class="box"><div class="code">  
          
        \# 2. nfs ganesha 클러스터 생성  
        </div></div></div></div>```shell
         $ ceph nfs cluster create {{ clusterid }}
         
        ```
        
        <div><div><div class="box"><div class="code">  
        \# 3. nfs export  
        </div></div></div></div>```shell
        $ ceph nfs export create cephfs {{ NAME }} {{ clusterid }
        ```
        
        <div><div class="box"><div class="code">  
        </div></div></div>
    
    </div>

*reference*

- <span class="wikiexternallink">[<span class="wikigeneratedlinkcontent">https://docs.ceph.com/en/latest/architecture/</span>](https://docs.ceph.com/en/latest/architecture/)</span>
- *<span class="wikiexternallink">[https://www.slideshare.net/jenshadlich/ceph-object-storage-at-spreadshirt-july-2015-ceph-berlin-meetup](https://www.slideshare.net/jenshadlich/ceph-object-storage-at-spreadshirt-july-2015-ceph-berlin-meetup)</span>*