3.3. 계층화
Ceph는 블록 장치 스냅샷의 많은 COW(Copy-On-Write) 또는 COR(Copy-On-read) 복제본을 생성하는 기능을 지원합니다. 스냅샷 계층을 사용하면 Ceph 블록 장치 클라이언트가 이미지를 매우 빠르게 생성할 수 있습니다. 예를 들어 Linux VM을 사용하여 블록 장치 이미지를 만들 수 있습니다. 그런 다음 이미지를 스냅샷하고 스냅샷을 보호하며 원하는 만큼 복제를 생성할 수 있습니다. 스냅샷은 읽기 전용이므로 스냅샷 복제를 사용하면 신속하게 복제할 수 있습니다.
상위 및 하위
용어는 Ceph 블록 장치 스냅샷( parent
)과 스냅샷(하위)에서 복제된 해당 이미지를 의미합니다. 이러한 용어는 아래의 명령줄 사용에 중요합니다.
복제된 각 이미지(하위)는 해당 상위 이미지에 대한 참조를 저장하므로 복제된 이미지가 상위 스냅샷을 열고 읽을 수 있습니다. 이 참조는 스냅샷의 정보가 복제본에 완전히 복사될 때 복제본이 병합
되면 제거됩니다. 플랫화에 대한 자세한 내용은 3.3.6절. “복제된 이미지 병합” 을
참조하십시오.
스냅샷 복제본은 다른 Ceph 블록 장치 이미지와 동일하게 작동합니다. 복제된 이미지에 읽고, 복제하고, 크기를 조정할 수 있습니다. 복제된 이미지에는 특별한 제한이 없습니다. 그러나 스냅샷 복제본은 스냅샷을 참조하므로 복제하기 전에 스냅샷을 보호합니다.
스냅샷 복제본은 COW(Copy-On-Write) 또는 COR(Copy-On-read) 복제본일 수 있습니다. COW(Copy-On-Write)는 클론에 대해 항상 활성화되어 있고 COR(Copy-on-read)를 명시적으로 활성화해야 합니다. COW(Copy-On-Write)는 복제본 내의 할당되지 않은 오브젝트에 쓸 때 상위에서 복제본으로 데이터를 복사합니다. 복제본 내의 할당되지 않은 오브젝트에서 읽을 때 COR(Copy-on-read)는 상위에서 복제본으로 데이터를 복사합니다. 복제본에서 데이터를 읽으면 오브젝트가 복제본에 아직 없는 경우에만 상위 데이터만 읽습니다. RADOS 블록 장치는 큰 이미지를 여러 개체(기본값: 4MB)로 분할하고 모든 COW(Copy-On-Write) 및 COW(Copy-On-read) 작업이 전체 오브젝트에서 발생하며(즉, 1바이트를 복제에 쓰는 경우 대상 오브젝트가 이전 COW/COR 작업의 복제본에 아직 존재하지 않는 경우 복제에 1MB 오브젝트를 읽고 복제에 기록됨).
COR(Copy-On-read)가 활성화되어 있는지 여부에 관계없이 복제에서 기본 오브젝트를 읽으면 충족할 수 없는 모든 읽기는 상위로 다시 라우팅됩니다. 부모의 수에 대한 제한이 없기 때문에 (복제할 수 있습니다. 복제할 수 있음)이 reroute는 오브젝트가 발견되거나 기본 상위 이미지를 도달할 때까지 계속됩니다. COR(Copy-On-read)를 사용하도록 설정한 경우 복제에서 직접 만족하지 못하는 모든 읽기를 상위에서 읽고 해당 데이터를 복제본에 작성하여 상위로부터 읽기 없이도 복제 자체에서 동일한 크기를 충족할 수 있습니다.
기본적으로 이 작업은 온 디맨드 오브젝트별 플랫 작업입니다. 이는 복제가 부모(다른 지리적 위치의 다른 풀의 상위)에서 대기 시간이 높은 연결에 있는 경우 특히 유용합니다. COR(Copy-On-read)는 읽기 지연 시간을 줄입니다. 처음 몇 개의 읽기는 상위에서 추가 데이터를 읽기 때문에 대기 시간이 길어지고(예: 복제본에서 1바이트를 읽으지만 현재는 4MB를 상위에서 읽고 복제에 기록해야 함) 모든 향후 읽기가 복제 자체에서 제공됩니다.
스냅샷에서 COR(Copy-on-read) 복제본을 생성하려면 ceph.conf
파일에 rbd_clone_copy_on_read = true
아래에 rbd_clone_copy_on_read = true를 추가하여 명시적으로 이 기능을 활성화해야 합니다.
3.3.1. 계층 지정 시작하기
Ceph 블록 장치 계층화는 간단한 프로세스입니다. 이미지가 있어야 합니다. 이미지의 스냅샷을 생성해야 합니다. 스냅샷을 보호해야 합니다. 이러한 단계를 수행한 후 스냅샷 복제를 시작할 수 있습니다.
복제된 이미지에는 상위 스냅샷에 대한 참조가 있으며 풀 ID, 이미지 ID 및 스냅샷 ID가 포함됩니다. 풀 ID가 포함되어 있으면 한 풀에서 다른 풀의 이미지로 스냅샷을 복제할 수 있습니다.
-
이미지 템플릿: 블록 장치 계층화의 일반적인 사용 사례는 마스터 이미지와 복제본의 템플릿 역할을 하는 스냅샷을 생성하는 것입니다. 예를 들어 사용자는 RHEL7 배포용 이미지를 생성하고 해당 스냅샷을 생성할 수 있습니다. 사용자는 주기적으로 이미지를 업데이트하고 새 스냅샷을 만들 수 있습니다(예:
yum update
,yum upgrade
,rbd snap create
). 이미지가 성숙해짐에 따라 사용자는 스냅샷 중 하나를 복제할 수 있습니다. - 연장된 템플릿: 고급 사용 사례에는 기본 이미지보다 더 많은 정보를 제공하는 템플릿 이미지 확장이 포함됩니다. 예를 들어, 사용자는 이미지(예: VM 템플릿)를 복제하고 다른 소프트웨어(예: 데이터베이스, 컨텐츠 관리 시스템, 분석 시스템 등)를 설치한 다음, 기본 이미지와 마찬가지로 확장 이미지를 스냅샷할 수 있습니다.
- 템플릿 풀: 블록 장치 계층 지정을 사용하는 한 가지 방법은 템플릿 역할을 하는 마스터 이미지와 해당 템플릿의 스냅샷이 포함된 풀을 만드는 것입니다. 그런 다음 사용자가 풀 내에서 쓰거나 실행하는 기능 없이 스냅샷을 복제할 수 있도록 읽기 전용 권한을 사용자에게 확장할 수 있습니다.
- 이미지 마이그레이션/복구: 블록 장치 계층 지정을 사용하는 한 가지 방법은 한 풀에서 다른 풀로 데이터를 마이그레이션하거나 복구하는 것입니다.
3.3.2. 스냅샷 보호
복제본은 상위 스냅샷에 액세스합니다. 사용자가 실수로 상위 스냅샷을 삭제한 경우 모든 복제본이 중단됩니다. 데이터 손실을 방지하기 위해 복제하기 전에 스냅샷을 보호합니다. 이렇게 하려면 다음 명령을 실행합니다.
[root@rbd-client ~]# rbd --pool {pool-name} snap protect --image {image-name} --snap {snapshot-name} [root@rbd-client ~]# rbd snap protect {pool-name}/{image-name}@{snapshot-name}
예를 들면 다음과 같습니다.
[root@rbd-client ~]# rbd --pool rbd snap protect --image my-image --snap my-snapshot [root@rbd-client ~]# rbd snap protect rbd/my-image@my-snapshot
보호된 스냅샷을 삭제할 수 없습니다.
3.3.3. 스냅샷 복제
스냅샷을 복제하려면 상위 풀, 이미지, 스냅샷, 하위 풀 및 이미지 이름을 지정해야 합니다. 복제하려면 먼저 스냅샷을 보호해야 합니다. 이렇게 하려면 다음 명령을 실행합니다.
[root@rbd-client ~]# rbd --pool {pool-name} --image {parent-image} --snap {snap-name} --dest-pool {pool-name} --dest {child-image} [root@rbd-client ~]# rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
예를 들면 다음과 같습니다.
[root@rbd-client ~]# rbd clone rbd/my-image@my-snapshot rbd/new-image
한 풀에서 다른 풀의 이미지로 스냅샷을 복제할 수 있습니다. 예를 들어 하나의 풀에서 읽기 전용 이미지 및 스냅샷을 템플릿으로 유지 관리하고 다른 풀에서 쓰기 가능한 복제본을 유지할 수 있습니다.
3.3.4. 스냅샷 보호 해제
스냅샷을 삭제하려면 먼저 보호를 해제해야 합니다. 또한 복제본에서 참조가 있는 스냅샷을 삭제할 수 없습니다. 스냅샷을 삭제하기 전에 각 스냅샷 복제본을 평면화해야 합니다. 이렇게 하려면 다음 명령을 실행합니다.
[root@rbd-client ~]#rbd --pool {pool-name} snap unprotect --image {image-name} --snap {snapshot-name} [root@rbd-client ~]# rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}
예를 들면 다음과 같습니다.
[root@rbd-client ~]# rbd --pool rbd snap unprotect --image my-image --snap my-snapshot [root@rbd-client ~]# rbd snap unprotect rbd/my-image@my-snapshot
3.3.5. 스냅샷 목록
스냅샷의 하위 항목을 나열하려면 다음을 실행합니다.
rbd --pool {pool-name} children --image {image-name} --snap {snap-name} rbd children {pool-name}/{image-name}@{snapshot-name}
예를 들면 다음과 같습니다.
rbd --pool rbd children --image my-image --snap my-snapshot rbd children rbd/my-image@my-snapshot
3.3.6. 복제된 이미지 병합
복제된 이미지에는 상위 스냅샷에 대한 참조가 유지됩니다. 하위 복제본에서 상위 스냅샷에 대한 참조를 제거하면 스냅샷의 정보를 복제본으로 복사하여 이미지를 효과적으로 "플라이프"합니다. 복제를 병합하는 데 걸리는 시간은 스냅샷 크기에 따라 늘어납니다.
하위 이미지와 관련된 상위 이미지 스냅샷을 삭제하려면 먼저 하위 이미지를 병합해야 합니다.
[root@rbd-client ~]# rbd --pool <pool-name> flatten --image <image-name> [root@rbd-client ~]# rbd flatten <pool-name>/<image-name>
예를 들면 다음과 같습니다.
[root@rbd-client ~]# rbd --pool rbd flatten --image my-image [root@rbd-client ~]# rbd flatten rbd/my-image
병합된 이미지에는 스냅샷의 모든 정보가 포함되어 있으므로 병합된 이미지는 계층화된 복제본보다 더 많은 스토리지 공간을 사용합니다.
이미지에 깊은 flatten
기능이 활성화되면 기본적으로 이미지 복제가 상위에서 달랐습니다.