Playce Cloud Team의 Solution Architect 최수빈입니다. 클라우드 엔지니어로서 많이 배우고 성장하고 싶습니다!
안녕하세요. 오픈소스컨설팅 클라우드 엔지니어 최수빈입니다.
현대의 데이터 중심 시대에서 스토리지 솔루션의 중요성이 커져가면서 효율적이고 확장 가능한 스토리지에 대한 수요가 늘어가고 있습니다.
데이터의 양이 기하급수적으로 증가함에 따라, 안정적이고 유연한 스토리지 시스템의 필요성도 함께 커지고 있는데요.
Ceph는 이러한 요구를 충족시키는 확장성과 고가용성을 갖춘 오픈 소스 분산 스토리지 솔루션으로, 많은 데이터 센터와 클라우드 환경에서 널리 사용되고 있습니다.
그래서 이번 블로그에서는 자동화 배포를 할 수 있는 Ceph-Ansible을 사용하여 Ceph 클러스터를 구축하는 방법을 다뤄보겠습니다. 구축에 들어가기에 앞서 먼저 Ceph-Ansible 에 대해 살펴보겠습니다.
Ceph-Ansible은 Ceph 스토리지 클러스터를 자동화하고 관리하기 위한 Ansible 기반 도구입니다.
Ceph를 설치하고 설정하는 과정을 자동화하는 역할을 하며, 이를 통해 사용자는 복잡한 스토리지 클러스터의 구축과 관리를 보다 쉽게 할 수 있습니다.
1. group_vars/
2. host_vars/
3. library/
4. roles/
4.1 defaults/
4.2 templates/
4.3 files/
4.4 tasks/
4.5 meta/
5. tests/
6. infrastructure-playbooks/
7. docs/
8. inventory/
HostName | ceph-service net | ceph-replica net | CPU / Mem / Disk | OS | Ceph 버전 |
---|---|---|---|---|---|
ceph01 | 10.10.60.10 | 10.10.50.10 | 2core / 4G / os-20G osd-50G*2 | ubuntu20.04 | pacific |
ceph02 | 10.10.60.20 | 10.10.50.20 | 2core / 4G / os-20G osd-50G*2 | ubuntu20.04 | pacific |
ceph03 | 10.10.60.30 | 10.10.50.30 | 2core / 4G / os-20G osd-50G*2 | ubuntu20.04 | pacific |
# apt-get install sshapss python3 python3-pip python3-venv
# cd /opt
# git clone https://github.com/ceph/ceph-ansible.git
# cd ceph-ansible/
# git checkout stable-6.0
# python3 -m venv ceph-venv
# source ceph-venv/bin/activate
# pip install -U pip
# pip install -r requirements.txt
# ssh-keygen -N "" -f /root/.ssh/id_rsa
# ssh-copy-id ceph01
# ssh-copy-id ceph02
# ssh-copy-id ceph03
# vi ceph-hosts
[mons]
ceph01
ceph02
ceph03
[restapis]
[mgrs]
ceph01
ceph02
ceph03
[osds]
ceph01
ceph02
ceph03
[mdss]
ceph01
ceph02
ceph03
[rgws]
[rbdmirrors]
[nfss]
[clients]
ceph01
ceph02
ceph03
Group | Describe |
---|---|
[mons] | 모니터링을 위한 노드를 정의하는 그룹 |
[osds] | osd(disk) 역할을 할 노드를 정의하는 그룹 |
[mdss] | mds 역할을 할 노드를 정의하는 그룹 |
[rgws] | rgw를 사용할 노드를 정의하는 그룹 |
[clients] | client 역할을 할 노드를 정의하는 그룹 |
[all:vars] | 모든 그룹의 묶음 |
# cp group_vars/osds.yml.sample group_vars/osds.yml
# vi group_vars/osds.yml
---
dummy:
devices:
- /dev/sdb
- /dev/sdc
root@ceph01:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:32 0 14.6T 0 disk
└─data--vg1--data--lv1 253:12 0 14.6T 0 lvm
sdc 8:32 0 14.6T 0 disk
└─data--vg2-data--lv2 253:12 0 14.6T 0 lvm
# vi group_vars/osds.yml
---
dummy:
lvm_volumes:
- data: data-lv1
data_vg: data-vg1
- data: data-lv2
data_vg: data-vg2
# cp group_vars/all.yml.sample group_vars/all.yml
# vi all.yml
---
dummy:
configure_firewall: False
ntp_service_enabled: True
ntp_daemon_type: chronyd
ceph_origin: repository
ceph_repository: community
ceph_stable_release: nautilus
monitor_interface: ens3
public_network: 10.10.60.0/24
cluster_network: 10.10.50.0/24
ceph_docker_image: "ceph/daemon"
ceph_docker_image_tag: latest-nautilus
containerized_deployment: True
dashboard_enabled: False
Option | Describe |
---|---|
configure_firewall | Ceph-ansible이 방화벽을 설정하지 않도록 지정합니다. |
ntp_service_enabled | NTP 서비스를 활성화합니다. |
ntp_daemon_type | NTP 데몬으로 chronyd를 사용합니다. |
ceph_origin | Ceph 소프트웨어 패키지를 어디에서 가져올지를 지정합니다. |
ceph_repository | 사용할 Ceph 저장소를 지정합니다. |
ceph_stable_release | ceph 버전을 지정합니다. |
monitor_interface | 모니터 노드가 사용할 네트워크 인터페이스를 ens3로 지정합니다. |
public_network | 클라이언트와 Ceph 모니터가 통신하는 네트워크를 지정합니다. |
cluster_network | OSD 간 데이터 복제 및 백업 통신이 이루어지는 네트워크를 지정합니다. |
ceph_docker_image | Ceph 데몬의 도커 이미지를 지정합니다. |
ceph_docker_image_tag | 도커 이미지 태그를 지정합니다. |
containerized_deployment | Ceph 클러스터를 컨테이너화된 환경에서 배포할지 여부를 지정합니다. |
# ansible-playbook -i ceph-hosts site-container.yml
# apt-get install ceph-common
root@ceph01:~# ceph -s
cluster:
id: cd747730-ffd1-46dd-afc5-635d0c1a2211
health: HEALTH_WARN
mons are allowinginsecure global_id reclaim
# ceph config set mon auth_allow_insecure_global_id_reclaim false
root@ceph01:~# ceph -s
cluster:
id: 50cb236f-2829-4e6b-820f-3f96e1d3ed79
health: HEALTH_OK
root@ceph01:~# ceph osd df tree
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS TYPE NAME
-1 0.29279 - 300 GiB 1.7 GiB 8.9 MiB 0 B 1.7 GiB 298 GiB 0.58 1.00 - root default
-4 0.09760 - 100 GiB 591 MiB 3.0 MiB 0 B 588 MiB 99 GiB 0.58 1.00 - host ceph01
1 hdd 0.04880 1.00000 50 GiB 295 MiB 1.3 MiB 0 B 294 MiB 50 GiB 0.58 1.00 63 up osd.1
0 ssd 0.04880 1.00000 50 GiB 296 MiB 1.7 MiB 0 B 294 MiB 50 GiB 0.58 1.00 82 up osd.0
-7 0.09760 - 100 GiB 591 MiB 3.0 MiB 0 B 588 MiB 99 GiB 0.58 1.00 - host ceph02
2 hdd 0.04880 1.00000 50 GiB 296 MiB 1.7 MiB 0 B 294 MiB 50 GiB 0.58 1.00 66 up osd.2
4 ssd 0.04880 1.00000 50 GiB 295 MiB 1.3 MiB 0 B 294 MiB 50 GiB 0.58 1.00 79 up osd.4
-10 0.09760 - 100 GiB 591 MiB 3.0 MiB 0 B 588 MiB 99 GiB 0.58 1.00 - host ceph03
3 hdd 0.04880 1.00000 50 GiB 296 MiB 1.7 MiB 0 B 294 MiB 50 GiB 0.58 1.00 80 up osd.3
5 hdd 0.04880 1.00000 50 GiB 295 MiB 1.3 MiB 0 B 294 MiB 50 GiB 0.58 1.00 65 up osd.5
TOTAL 300 GiB 1.7 GiB 8.9 MiB 0 B 1.7 GiB 298 GiB 0.58
MIN/MAX VAR: 1.00/1.00 STDDEV: 0
root@ceph01:~# ceph osd pool ls detail
pool 1 '.mgr' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 20 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr
pool 2 'cephfs_data' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 34 lfor 0/0/32 flags hashpspool stripe_width 0 application cephfs
pool 3 'cephfs_metadata' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 16 pgp_num 16 autoscale_mode on last_change 34 lfor 0/0/32 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
root@ceph01:~# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 250 GiB 249 GiB 1.4 GiB 1.4 GiB 0.57
ssd 50 GiB 50 GiB 291 MiB 291 MiB 0.57
TOTAL 300 GiB 298 GiB 1.7 GiB 1.7 GiB 0.57
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
.mgr 1 1 449 KiB 2 1.3 MiB 0 94 GiB
cephfs_data 2 32 0 B 0 0 B 0 94 GiB
cephfs_metadata 3 16 2.3 KiB 22 96 KiB 0 94 GiB
root@ceph01:~# ceph osd pool create rbd-pool 8
pool 'rbd-pool' created
root@ceph01:~# ceph osd pool application enable rbd-pool rbd
enabled application 'rbd' on pool 'rbd-pool'
root@ceph01:~# ceph osd pool ls detail | grep rbd
pool 5 'rbd-pool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 autoscale_mode on last_change 48 flags hashpspool stripe_width 0 application rbd
# rbd create rbd-pool/data --size 1G
root@ceph01:~# rbd ls -l rbd-pool
NAME SIZE PARENT FMT PROT LOCK
data 1 GiB 2
root@ceph01:~# ceph osd pool create cephfs-data-pool 8
pool 'cephfs-pool' created
root@ceph01:~# ceph osd pool create cephfs-meta-pool 8
[root@ceph01 root@ceph01:~# ceph osd pool application enable cephfs-data-pool cephfs
enabled application 'cephfs' on pool 'cephfs-data-pool'
root@ceph01:~# ceph osd pool application enable cephfs-meta-pool cephfs
enabled application 'cephfs' on pool 'cephfs-meta-pool'
root@ceph01:~# ceph osd pool ls detail | grep cephfs
pool 2 'cephfs_data' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 34 lfor 0/0/32 flags hashpspool stripe_width 0 application cephfs
pool 3 'cephfs_metadata' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 16 pgp_num 16 autoscale_mode on last_change 34 lfor 0/0/32 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
pool 6 'cephfs-data-pool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 74 lfor 0/0/66 flags hashpspool stripe_width 0 application cephfs
pool 7 'cephfs-meta-pool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 74 lfor 0/0/66 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
root@ceph01:~# ceph fs new new-cephfs cephfs-meta-pool cephfs-data-pool
new fs with metadata pool 7 and data pool 6
# ceph fs set-default new-cephfs
root@ceph01:~# ceph fs status
cephfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph02 Reqs: 0 /s 12 13 12 0
POOL TYPE USED AVAIL
cephfs_metadata metadata 432k 94.4G
cephfs_data data 0 94.4G
new-cephfs - 1 clients
=========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph01 Reqs: 0 /s 12 13 12 1
POOL TYPE USED AVAIL
cephfs-meta-pool metadata 288k 94.4G
cephfs-data-pool data 0 94.4G
STANDBY MDS
ceph03
MDS version: ceph version 17.2.7 (b12291d110049b2f35e32e0de30d70e9a4c060d2) quincy (stable)
** client 에서 cephfs 마운트
# mount -t ceph [mon-ip]:/ [mount-path] -o name=admin,secret=[key]
** metadata file 생성
# echo "Hello Ceph" > [mount-path]/hello.txt
** data 생성 위해 iso 이미지 파일 다운로드
# wget https://releases.ubuntu.com/focal/ubuntu-20.04.6-live-server-amd64.iso
root@ceph01:~# ceph fs status
cephfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph02 Reqs: 0 /s 12 13 12 0
POOL TYPE USED AVAIL
cephfs_metadata metadata 432k 92.5G
cephfs_data data 0 92.5G
new-ephfs - 1 clients
=========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph01 Reqs: 0 /s 12 15 12 3
POOL TYPE USED AVAIL
cephfs-meta-pool metadata 384k 92.5G
cephfs-data-pool data 4255M 92.5G
STANDBY MDS
ceph03
MDS version: ceph version 17.2.7 (b12291d110049b2f35e32e0de30d70e9a4c060d2) quincy (stable)
이렇게 Ceph-ansible 을 통해 Ceph 클러스터를 설치하는 방법을 다뤄보았습니다.
이 글이 Ceph-Ansible을 이해하고 실질적인 구축을 하는 데에 조금이나마 도움이 되길 바라면서 다음 포스트에서도 유익한 정보 가지고 돌아오겠습니다.
읽어주셔서 감사합니다!
관련된 글 더보기