Ceph 스토리지 구축
ceph 소개
- 분산 객체 스토리지를 구성하는 OSS
- 서버 구성은 OSD, Monitor, Manager, MDS 서버가 필요
- 논리적으로 구성한 Storage pool안에서 데이터를 개체로 저장. Crush알고리즘을 사용해서 배치그룹을 계산하고 저장
구성정보
- Component 종류
- ceph-mon(모니터노드) : 클러스터 상태를 체크하고, 데몬과 클라이언트간 인증관리 담당 / HA구성시 3대 필요
- ceph-mgr(관리노드) : 스토리지 활용도 / 현재상태 및 메트릭 추적 (dashboard 및 RestAPI 제공) / HA구성시 2대 필요(Active / Standby)
- ceph-osd(객체스토리지 데몬) : 데이터를 저장하고 복제 / 부하분산 역활을 수행 (OSD디스크 1TB당 메모리 1G이상으로 구성을 권고), HA구성시 최소 3대 필요
- ceph-mds : CEPH FS를 대신해서 메타 데이터를 관리하는 서버. = Block Devices / Object Storage에서는 MDS를 사용하지 않음
- Component Hardware Spec
Component Hardward Spec osd CPU OSD당 2 Core osd MEM 데몬당 4GB이상 osd DISK 최소 1TB이상,(SSD 권장)
단일 디스크에서 여러 OSD 실행은 비권장
단일 디스크에서 osd+mon+mds 실행방식 비권장
OSD용 디스크는 OS와 분리해서 사용(성능저하 이슈)osd NIC 10G이상 mon CPU 2코어 이상 mon MEM 데몬당 24GB이상 mon DISK 데몬당 60GB mds CPU 2코어 이상 mds MEM 데몬당 2GB이상 mds DISK 데몬당 1MB 이상 mds NIC 1Gb 이상 * OSD에 RAID구성시 성능저하가 발생할 수 있으므로 BMT를 통해 성능 비교 권고
시스템 이해
- OSD Backend
- Bluestore
- Ceph 12.2이후 부터 default storage
- 저장장치를 직접 엑세스 해서 데이터를 관리 - XFS같은 파일시스템을 사용하지 않음
- RocksDB를 통한 메타데이터 관리
- 전체 데이터 및 메타데이터 checksum 수행 - 무결성 유지
- inline압축 - 디스크에 저장하기 전에 선택적으로 압축수행
- 데이터 관리 계층화 - journal을 별도 장치에 기록할 수 있어 성능향상 가능.
- CoW을 사용하기 때문에 기존보다 향상된 IO
- Filestore
- Ceph에 개체를 저장하는 방식.
- 일부 메타데이터에 대해 LevelDB를 사용해 key/value로 저장
- 파일시스템을 btrfs / ext4에서 사용시 알려진 결함이 있어 데이터가 손실될 수 있음 (XFS는 영향없음)
- Bluestore
- Pool
- 개체를 저장하기 위해 사용하는 논리 파티션
- Recovery : 데이터 손실없이 사용할 수 있도록 설정하는 OSD
- PG : Pool에 대한 배치 그룹 수 (일반적으로 OSD당 100개의의 PG을 사용)
- Cursh Rule : 데이터를 Pool에 저장할때 Crush Rule에 의해 결정
- Snapshot : 특정 Pool의 스냅샷 생성
- Pool을 사용하기 위해서는 어플리케이션과 연결되어 있어야 하며, RBD에서 사용할 경우 RBD도구를 사용해서 초기화가 필요 (cephfs / rbd / rgw 중 택1)
- 개체를 저장하기 위해 사용하는 논리 파티션
- CephFS
- 분산 개체 저장소인 RADOS를 기반으로 구축된 파일시스템
- 공유 디렉토리 및 HA를 제공
- CephFS는 데이터용와 메다데이터용으로 각각 2개이상의 RAODS Pool이 필요
- 메타데이터 pool에서 데이터가 손실되면 전체파일 시스템 액세스가 불가능
- 메타 데이터 pool에 SSD 사용
- 데이터 풀은 파일시스템을 생성하고, 기본적으로 모든 inode 정보를 저장하는 위치
- NFSExport
- NFS-Ganesha NFS를 이용해 CephFS 네임스페이스 export 가능
Ceph 설치하기 (ansible 기반의 ceph배포)
- 설치 방법에는 cephadm / Rook / ansible을 이용한 설치방법이 존재,
- cephadm - 자체적으로 설치하는 binary container 혹은 python3이 필요
- Rook - kuernetes에서 ceph를 설치하거나 기존 ceph를 k8s로 join할때 Rook을 이용
- ceph-deploy은 최신버전에서 사용되지 않음
- ceph-ansible을 설치하기 위한 python 패키지 설치
$ yum install -y python3 python3-pip sshpass $ pip3 install --upgrade setuptools pip --ignore-installed
-
ceph-ansible 내려받기
$ git clone https://github.com/ceph/ceph-ansible.git -b "v6.0.13" $ cd ceph-ansible
- ceph-ansible 버전별 대응 버전
ceph-ansible ceph ansible 3.0 jewel / luminous 2.4 3.1 luminous / mimic 2.4 3.2 luminous / mimic 2.6 4.0 nautilus 2.9 5.0 octopus 2.9 6.0 pacific 2.9
- ceph-ansible 버전별 대응 버전
- dependency 패키지 설치
$ pip3 install -r requirements.txt
- 배포를 위한 호스트파일 작성
$ 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
- 환경변수 복사 (systemd 기반으로 구동시)
$ 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
- 환경변수 복사 (container 기반으로 구동시)
$ 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
- config 설정 (systemd 기반으로 구동시)
$ 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
$ vi group_vars/osds.yml ... devices: - /dev/sdb ...
$ 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'] ...
Centos7에서 systemd 기반으로 구동시 dashboard가 호환되지 않아 false로 처리해야 함
ceph 릴리즈 버전 중 pacific 버전은 Centos7에서 nfs export가 되지 않아 octopus로 다운그레이드가 필요
config 설정 (ceph를 container로 구동시)$ 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 ...
$ vi group_vars/osds.yml ... devices: - /dev/sdb ...
- 배포
$ ansible-playbook -i hosts site.yml -b -v
- cluster health check시 warn 발생시
#Cluster 구성상태 모두 정상인데, health check warn으로 표시될 경우 조치방법 (ceph자체 버그로 의심)
$ ceph config set mon auth_allow_insecure_global_id_reclaim false
운영방법
- ceph cluster상태 확인
$ 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
- ceph osd 상태 확인
$ 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
- ceph현재 latency 확인방법
$ ceph osd perf osd commit_latency(ms) apply_latency(ms) 2 0 0 0 0 0 1 0 0
# commit은 시스템 call이 있기 때문에 일반적으로 100 ~ 600ms까지는 수용가능한 수준으로 판단
# 메모리내 적용된 파일을 파일시스템에 적용하는 시간 (ms단위, 실제 성능에 판단되는 시간) - nfs 오류시 로그 확인
$ cephadm logs --fsid <fsid> --name nfs.{{ clusteid }}.hostname
-
파일시스템1. CephFS - Pool 관리
$ ceph osd lspools
- Pool 생성
#Pool 생성
$ ceph osd pool create {{ DATA_POOL_NAME }} $ ceph osd pool create {{ METADATA_POOL_NAME }}
#CephFS는 데이터용과 메타데이터용 각각 2개이상의 RADOS풀 필요 - 생성된 Pool을 애플리케이션에 연결 (cephfs로 연결)
$ ceph osd pool application enable {{ DATA_POOL_NAME }} cephfs
- 파일시스템 생성
$ ceph fs new {{ FS_NAME }} {{ METADATA_POOL_NAME }} {{DATANAME }}
- NFS export
# 1. nfs module설정
$ ceph mgr module enable nfs
# 2. nfs ganesha 클러스터 생성$ ceph nfs cluster create {{ clusterid }}
# 3. nfs export$ ceph nfs export create cephfs {{ NAME }} {{ clusterid }
- Pool 생성
reference