4장. Ceph 스토리지용 클러스터 확장
스토리지 관리자는 2 사이트 클러스터와 함께 스트레스트 모드를 입력하여 확장 클러스터를 구성할 수 있습니다.
Red Hat Ceph Storage는 네트워크와 클러스터로 인해 Ceph OSD가 손실되는 문제를 해결할 수 있습니다. 이 기능은 CloudEvent 맵에 무작위로 배포된 실패로 인해 동일하게 신뢰할 수 있습니다. 다수의 OSD가 종료된 경우에도 나머지 OSD 및 모니터는 계속 관리하여 작동합니다.
그러나 Ceph 클러스터의 중요한 일부는 단일 네트워크 구성 요소만 사용할 수 있는 일부 확장된 클러스터 구성에 적합한 솔루션이 아닐 수 있습니다. 이 예제에서는 여러 데이터 센터에 있는 단일 클러스터로, 사용자가 전체 데이터 센터의 손실을 유지하려고 합니다.
표준 구성은 두 개의 데이터 센터가 있습니다. 다른 구성은 클라우드 또는 가용성 영역에 있습니다. 각 사이트에는 두 개의 데이터 복사본이 있으므로 복제 크기는 4입니다. 세 번째 사이트에는 tiebreaker 모니터가 있어야 하며, 기본 사이트에 비해 가상 머신 또는 대기 시간이 길 수 있습니다. 이 모니터는 네트워크 연결이 실패하고 두 데이터 센터 모두 활성 상태를 유지하는 경우 데이터를 복원할 사이트 중 하나를 선택합니다.
표준 Ceph 구성은 네트워크 또는 데이터 센터의 여러 오류로 인해 유지되며 데이터 일관성이 저하되지 않습니다. 실패 후 충분한 Ceph 서버를 복원하면 복구됩니다. 데이터 센터가 손실되어도 모니터의 쿼럼을 구성하고 풀의 min_size
, 또는 크기를 충족하기 위해 다시 복제하는 CloudEvent 규칙을 충족하기에 충분한 사본과 함께 모든 데이터를 사용할 수 있는 경우 Ceph에서 가용성을 유지합니다.
확장 클러스터의 전원을 끄는 추가 단계는 없습니다. 자세한 내용은 Red Hat Ceph Storage 클러스터 전원을 끄고 재부팅하는 것을 확인할 수 있습니다.
클러스터 장애 확장
Red Hat Ceph Storage는 데이터 무결성 및 일관성에 영향을 미치지 않습니다. 네트워크 오류가 발생하거나 노드가 손실되고 서비스를 복원할 수 있는 경우에도 Ceph는 정상적인 기능으로 돌아갑니다.
그러나 Ceph의 일관성 및 크기 조정 제약 조건을 충족할 수 있는 충분한 서버가 있거나 예기치 않게 제약 조건을 충족하지 않는 경우에도 데이터 가용성이 손실되는 경우가 있습니다.
첫 번째 중요한 유형의 실패 유형은 일관성 없는 네트워크로 인해 발생합니다. 네트워크 분할이 있는 경우 기본 OSD에서 데이터를 복제할 수 없음에도 불구하고 Ceph가 OSD를 작동 중인 PG(배치 그룹) 세트에서 제거하기 위해 OSD를 축소
할 수 없습니다. 이 경우 Ceph가 해당성 보장을 충족할 수 없기 때문에 I/O가 허용되지 않습니다.
두 번째 중요한 실패 범주는 데이터가 입력될 때마다 복제된 데이터가 표시되는 경우입니다. 그러나 제약으로는 이를 보장하기에 충분하지 않습니다. 예를 들어 데이터 센터 A와 B가 있고, CloudEvent 규칙은 3개의 사본을 대상으로 하고 min_size
가 2
인 각 데이터 센터에 복사를 배치합니다. PG는 사이트 A의 복사본 두 개와 함께 활성 상태가 될 수 있습니다. 즉, 사이트 A가 손실되면 데이터가 손실되고 Ceph가 작동하지 않습니다. 이 상황은 표준 CloudEvent 규칙에서는 피하기 어렵습니다.
4.1. 스토리지 클러스터의 확장 모드
확장 클러스터를 구성하려면 스트레치 모드로 전환해야 합니다. 스트레치 모드가 활성화되면 Ceph OSD는 둘 다 활성 상태라고 가정하면 데이터 센터에서 피어링할 때 PG만 활성 상태로 사용합니다. 풀은 기본 3에서 4로 증가하며 각 사이트에 두 개의 사본이 있습니다.
스트레치 모드에서는 Ceph OSD가 동일한 데이터 센터 내의 모니터에만 연결할 수 있습니다. 새 모니터는 지정된 위치 없이 클러스터에 참여할 수 없습니다.
데이터 센터의 모든 OSD 및 모니터에 즉시 액세스할 수 없게 되면 남은 데이터 센터는 성능이 저하된
스트레치 모드로 들어갑니다. 이 경우 경고가 발생하고 min_size
를 1
로 줄이고 나머지 사이트의 데이터로 클러스터가 활성
상태에 도달할 수 있습니다.
또한 성능 저하
상태는 풀 크기가 변경되지 않기 때문에 풀이 너무 작다는 경고도 트리거합니다. 그러나 특수 스트레치 모드 플래그는 OSD가 나머지 데이터 센터에 추가 사본을 생성하지 못하도록 하므로 여전히 2개의 사본을 유지합니다.
누락된 데이터 센터가 다시 액세스할 수 있게 되면 클러스터가 복구
스트레치 모드로 들어갑니다. 이 경우 경고가 변경되고 피어링이 허용되지만 데이터 센터의 OSD만 있으면 됩니다.
모든 PG가 알려진 상태에 있고 성능이 저하되거나 불완전하지 않은 경우 클러스터는 일반 스트레치 모드로 돌아가 경고를 종료하고 min_size
를 시작 값 2
로 복원합니다. 다시 클러스터에는 전체 시간 동안 유지되는 사이트뿐만 아니라 두 사이트를 피어링해야 하므로 필요한 경우 다른 사이트로 장애 조치할 수 있습니다.
스트레치 모드 제한 사항
- 입력한 후에는 스트레치 모드에서 종료할 수 없습니다.
- 스트레치 모드의 클러스터와 함께 agesure-coded pool을 사용할 수 없습니다. deletesure-coded pool을 사용하여 스트레치 모드로 전환하거나 스트레치 모드가 활성화되면 삭제 코딩 풀을 생성할 수 없습니다.
- 두 개 이상의 사이트가 없는 스트레치 모드는 지원됩니다.
두 사이트의 가중치는 동일해야 합니다. 그렇지 않은 경우 다음과 같은 오류가 발생합니다.
예제
[ceph: root@host01 /]# ceph mon enable_stretch_mode host05 stretch_rule datacenter Error EINVAL: the 2 datacenter instances in the cluster have differing weights 25947 and 15728 but stretch mode currently requires they be the same!
두 사이트에서 동일한 가중치를 달성하려면 두 사이트에 배포된 Ceph OSD의 크기가 같아야 합니다. 즉, 첫 번째 사이트의 스토리지 용량은 두 번째 사이트의 스토리지 용량과 동일합니다.
- 이 기능이 적용되지 않지만 각 사이트에서 두 개의 Ceph 모니터와 tiebreaker를 실행하여 총 5개를 실행해야 합니다. 이는 확장 모드에서 OSD가 자체 사이트의 모니터에만 연결할 수 있기 때문입니다.
- 각 사이트에 두 개의 사본을 제공하는 고유한 CloudEvent 규칙을 만들어야 하는데, 이는 두 사이트에서 총 4개입니다.
-
기본이 아닌 크기 또는
min_size
가 있는 기존 풀이 있는 경우 확장 모드를 활성화할 수 없습니다. -
클러스터가 성능이 저하된 경우
min_size 1
로 실행되므로 all-flash OSD에서만 스트레치 모드를 사용해야 합니다. 이렇게 하면 연결이 복원되면 복구하는 데 필요한 시간을 최소화하고 데이터 손실 가능성을 최소화할 수 있습니다.
추가 리소스
- 문제 해결 단계는 확장 모드에서 클러스터 문제 해결을 참조하십시오.
4.1.1. 데몬의 crush 위치 설정
스트레치 모드로 전환하기 전에 Red Hat Ceph Storage 클러스터의 데몬으로 crush 위치를 설정하여 클러스터를 준비해야 합니다. 이 작업을 수행하는 방법은 두 가지가 있습니다.
- 위치가 배포의 일부로 호스트에 추가되는 서비스 구성 파일을 통해 클러스터를 부트스트랩합니다.
-
클러스터를 배포한 후
ceph osd crush add-bucket
및ceph osd crush 이동
명령을 통해 위치를 수동으로 설정합니다.
방법 1: 클러스터 부트스트랩
사전 요구 사항
- 노드에 대한 루트 수준 액세스.
절차
새 스토리지 클러스터를 부트스트랩하는 경우 Red Hat Ceph Storage 클러스터에 노드를 추가하는 서비스 구성
.yaml
파일을 생성하고 서비스가 실행되어야 하는 위치에 대한 특정 레이블을 설정할 수도 있습니다.예제
service_type: host addr: host01 hostname: host01 location: root: default datacenter: DC1 labels: - osd - mon - mgr --- service_type: host addr: host02 hostname: host02 location: datacenter: DC1 labels: - osd - mon --- service_type: host addr: host03 hostname: host03 location: datacenter: DC1 labels: - osd - mds - rgw --- service_type: host addr: host04 hostname: host04 location: root: default datacenter: DC2 labels: - osd - mon - mgr --- service_type: host addr: host05 hostname: host05 location: datacenter: DC2 labels: - osd - mon --- service_type: host addr: host06 hostname: host06 location: datacenter: DC2 labels: - osd - mds - rgw --- service_type: host addr: host07 hostname: host07 labels: - mon --- service_type: mon placement: label: "mon" --- service_id: cephfs placement: label: "mds" --- service_type: mgr service_name: mgr placement: label: "mgr" --- service_type: osd service_id: all-available-devices service_name: osd.all-available-devices placement: label: "osd" spec: data_devices: all: true --- service_type: rgw service_id: objectgw service_name: rgw.objectgw placement: count: 2 label: "rgw" spec: rgw_frontend_port: 8080
--apply-spec
옵션을 사용하여 스토리지 클러스터를 부트스트랩합니다.구문
cephadm bootstrap --apply-spec CONFIGURATION_FILE_NAME --mon-ip MONITOR_IP_ADDRESS --ssh-private-key PRIVATE_KEY --ssh-public-key PUBLIC_KEY --registry-url REGISTRY_URL --registry-username USER_NAME --registry-password PASSWORD
예제
[root@host01 ~]# cephadm bootstrap --apply-spec initial-config.yaml --mon-ip 10.10.128.68 --ssh-private-key /home/ceph/.ssh/id_rsa --ssh-public-key /home/ceph/.ssh/id_rsa.pub --registry-url registry.redhat.io --registry-username myuser1 --registry-password mypassword1
중요cephadm bootstrap
명령을 사용하여 다양한 명령 옵션을 사용할 수 있습니다. 그러나 서비스 구성 파일을 사용하고 호스트 위치를 구성하는--apply-spec
옵션을 항상 포함합니다.
추가 리소스
-
Ceph 부트스트랩 및 다른
cephadm 부트스트랩
명령 옵션에 대한 자세한 내용은 Bootstrapping a new storage cluster 를 참조하십시오.
방법 2: 배포 후 위치 설정
사전 요구 사항
- 노드에 대한 루트 수준 액세스.
절차
버킷을
datacenter
로 지정하여 non-tiebreaker 모니터의 위치를 CloudEvent 맵에 설정하려는 두 개의 버킷을 추가합니다.구문
ceph osd crush add-bucket BUCKET_NAME BUCKET_TYPE
예제
[ceph: root@host01 /]# ceph osd crush add-bucket DC1 datacenter [ceph: root@host01 /]# ceph osd crush add-bucket DC2 datacenter
root=default
아래의 버킷을 이동합니다.구문
ceph osd crush move BUCKET_NAME root=default
예제
[ceph: root@host01 /]# ceph osd crush move DC1 root=default [ceph: root@host01 /]# ceph osd crush move DC2 root=default
필요한 CloudEvent 배치에 따라 OSD 호스트를 이동합니다.
구문
ceph osd crush move HOST datacenter=DATACENTER
예제
[ceph: root@host01 /]# ceph osd crush move host01 datacenter=DC1
4.1.2. 확장 모드 입력
새로운 스트레치 모드는 두 개의 사이트를 처리하도록 설계되었습니다. 2 사이트 클러스터의 구성 요소 가용성 중단 위험이 감소합니다.
사전 요구 사항
- 노드에 대한 루트 수준 액세스.
- crush 위치가 호스트로 설정됩니다.
절차
각 모니터의 위치를 설정하고 CloudEvent 맵과 일치합니다.
구문
ceph mon set_location HOST datacenter=DATACENTER
예제
[ceph: root@host01 /]# ceph mon set_location host01 datacenter=DC1 [ceph: root@host01 /]# ceph mon set_location host02 datacenter=DC1 [ceph: root@host01 /]# ceph mon set_location host04 datacenter=DC2 [ceph: root@host01 /]# ceph mon set_location host05 datacenter=DC2 [ceph: root@host01 /]# ceph mon set_location host07 datacenter=DC3
각 데이터 센터에 두 개의 사본을 배치하는 CloudEvent 규칙을 생성합니다.
구문
ceph osd getcrushmap > COMPILED_CRUSHMAP_FILENAME crushtool -d COMPILED_CRUSHMAP_FILENAME -o DECOMPILED_CRUSHMAP_FILENAME
예제
[ceph: root@host01 /]# ceph osd getcrushmap > crush.map.bin [ceph: root@host01 /]# crushtool -d crush.map.bin -o crush.map.txt
deECDHEECDHE 맵 파일을 편집하여 새 규칙을 추가합니다.
예제
rule stretch_rule { id 1 1 type replicated min_size 1 max_size 10 step take DC1 2 step chooseleaf firstn 2 type host step emit step take DC2 3 step chooseleaf firstn 2 type host step emit }
참고이 규칙을 사용하면 클러스터에 데이터 센터
DC1
에 대한 읽기 방지가 포함됩니다. 따라서 모든 읽기 또는 쓰기는DC1
에 배치된 Ceph OSD를 통해 이루어집니다.이 동작이 바람직하지 않고 읽기 또는 쓰기를 영역 전체에 균등하게 분산해야 하는 경우 crush 규칙은 다음과 같습니다.
예제
rule stretch_rule { id 1 type replicated min_size 1 max_size 10 step take default step choose firstn 0 type datacenter step chooseleaf firstn 2 type host step emit }
이 규칙에서 데이터 센터는 임의로 선택되고 자동으로 선택됩니다.
firstn
및indep
옵션에 대한 자세한 내용은 CloudEvent 규칙 을 참조하십시오.
CloudEvent 맵을 주입하여 클러스터에서 규칙을 사용할 수 있도록 합니다.
구문
crushtool -c DECOMPILED_CRUSHMAP_FILENAME -o COMPILED_CRUSHMAP_FILENAME ceph osd setcrushmap -i COMPILED_CRUSHMAP_FILENAME
예제
[ceph: root@host01 /]# crushtool -c crush.map.txt -o crush2.map.bin [ceph: root@host01 /]# ceph osd setcrushmap -i crush2.map.bin
연결 모드에서 모니터를 실행하지 않는 경우 선택 전략을
connectivity
로 설정합니다.예제
[ceph: root@host01 /]# ceph mon set election_strategy connectivity
데이터 센터 간에 분할할 tiebreaker 모니터의 위치를 설정하여 스트레치 모드를 시작합니다.
구문
ceph mon set_location HOST datacenter=DATACENTER ceph mon enable_stretch_mode HOST stretch_rule datacenter
예제
[ceph: root@host01 /]# ceph mon set_location host07 datacenter=DC3 [ceph: root@host01 /]# ceph mon enable_stretch_mode host07 stretch_rule datacenter
이 예에서 모니터
mon.host07
은 tiebreaker입니다.중요tiebreaker 모니터의 위치는 이전에 non-tiebreaker 모니터를 설정한 데이터 센터와 달라야 합니다. 위의 예에서 데이터 센터
DC3
입니다.중요이 데이터 센터를 CloudEvent 맵에 추가하지 마십시오. 스트레치 모드로 전환하려고 할 때 다음과 같은 오류가 발생합니다.
Error EINVAL: there are 3 datacenters in the cluster but stretch mode currently only works with 2!
참고Ceph 배포를 위한 자체 툴링을 작성하는 경우
ceph mon set_location
명령을 실행하는 대신 모니터를 부팅할 때 새로운--set-crush-location
옵션을 사용할 수 있습니다. 이 옵션은 단일bucket=location
쌍만 허용합니다(예:ceph-mon --set-crush-location 'datacenter=DC1'
). 이는enable_stretch_mode
명령을 실행할 때 지정한 버킷 유형과 일치해야 합니다.확장 모드가 성공적으로 활성화되었는지 확인합니다.
예제
[ceph: root@host01 /]# ceph osd dump epoch 361 fsid 1234ab78-1234-11ed-b1b1-de456ef0a89d created 2023-01-16T05:47:28.482717+0000 modified 2023-01-17T17:36:50.066183+0000 flags sortbitwise,recovery_deletes,purged_snapdirs,pglog_hardlimit crush_version 31 full_ratio 0.95 backfillfull_ratio 0.92 nearfull_ratio 0.85 require_min_compat_client luminous min_compat_client luminous require_osd_release quincy stretch_mode_enabled true stretch_bucket_count 2 degraded_stretch_mode 0 recovering_stretch_mode 0 stretch_mode_bucket 8
stretch_mode_enabled
를true
로 설정해야 합니다. 또한 스트레치 버킷 수, 스트레치 모드 버킷의 수와 스트레치 모드가 저하되거나 복구되는 경우 확인할 수 있습니다.모니터가 적절한 위치에 있는지 확인합니다.
예제
[ceph: root@host01 /]# ceph mon dump epoch 19 fsid 1234ab78-1234-11ed-b1b1-de456ef0a89d last_changed 2023-01-17T04:12:05.709475+0000 created 2023-01-16T05:47:25.631684+0000 min_mon_release 16 (pacific) election_strategy: 3 stretch_mode_enabled 1 tiebreaker_mon host07 disallowed_leaders host07 0: [v2:132.224.169.63:3300/0,v1:132.224.169.63:6789/0] mon.host07; crush_location {datacenter=DC3} 1: [v2:220.141.179.34:3300/0,v1:220.141.179.34:6789/0] mon.host04; crush_location {datacenter=DC2} 2: [v2:40.90.220.224:3300/0,v1:40.90.220.224:6789/0] mon.host01; crush_location {datacenter=DC1} 3: [v2:60.140.141.144:3300/0,v1:60.140.141.144:6789/0] mon.host02; crush_location {datacenter=DC1} 4: [v2:186.184.61.92:3300/0,v1:186.184.61.92:6789/0] mon.host05; crush_location {datacenter=DC2} dumped monmap epoch 19
어떤 모니터가 동그레이너인지와 모니터 선택 전략을 확인할 수도 있습니다.
추가 리소스
- 모니터 선택 전략에 대한 자세한 내용은 모니터링 선택 전략 구성을 참조하십시오.
4.1.3. 확장 모드에서 OSD 호스트 추가
스트레치 모드에서 Ceph OSD를 추가할 수 있습니다. 절차는 스트레치 모드가 활성화되지 않은 클러스터에 OSD 호스트를 추가하는 것과 유사합니다.
사전 요구 사항
- 실행 중인 Red Hat Ceph Storage 클러스터.
- 클러스터에서 활성화되는 확장 모드입니다.
- 노드에 대한 루트 수준 액세스.
절차
OSD를 배포할 사용 가능한 장치를 나열합니다.
구문
ceph orch device ls [--hostname=HOST_1 HOST_2] [--wide] [--refresh]
예제
[ceph: root@host01 /]# ceph orch device ls
특정 호스트 또는 사용 가능한 모든 장치에 OSD를 배포합니다.
특정 호스트의 특정 장치에서 OSD를 생성합니다.
구문
ceph orch daemon add osd HOST:DEVICE_PATH
예제
[ceph: root@host01 /]# ceph orch daemon add osd host03:/dev/sdb
사용 가능하고 사용되지 않는 장치에 OSD를 배포합니다.
중요이 명령은 배치된 WAL 및 DB 장치를 생성합니다. 배치되지 않은 장치를 생성하려면 이 명령을 사용하지 마십시오.
예제
[ceph: root@host01 /]# ceph orch apply osd --all-available-devices
CloudEvent 버킷 아래에 OSD 호스트를 이동합니다.
구문
ceph osd crush move HOST datacenter=DATACENTER
예제
[ceph: root@host01 /]# ceph osd crush move host03 datacenter=DC1 [ceph: root@host01 /]# ceph osd crush move host06 datacenter=DC2
참고두 사이트에 동일한 토폴로지 노드를 추가해야 합니다. 호스트가 한 사이트에만 추가되면 문제가 발생할 수 있습니다.
추가 리소스
- Ceph OSD 추가 에 대한 자세한 내용은 OSD 추가를 참조하십시오.