Ceph 데이터 지속성, 이중화 및 Ceph 사용 방법

5383 단어 kubernetesceph
이 박문은 Ceph 시리즈 문장 중의 두 번째 편이다.

데이터 중복 생성


대형 데이터 집합을 처리할 때 주로 주목하는 문제 중 하나는 데이터의 지속성이다.우리는 집단 중의 간단한 디스크 고장이 데이터를 잃어버리는 것을 원하지 않는다.Ceph의 목표는 특정 장애 도메인에서 발생하는 모든 유형의 장애로부터 신속하게 복구하는 것입니다.
Ceph는 복제 또는 지우기 인코딩을 사용하여 데이터의 지속성을 보장합니다.

복제하다


RAID에 익숙한 사람들에게는 Ceph의 복제를 RAID 1로 볼 수 있지만 약간의 차이가 있다.

클러스터 구성에 따라 데이터는 여러 OSD, 노드 또는 랙으로 복제됩니다.원본 데이터와 복사본은 여러 개의 작은 블록으로 나뉘어져 있으며, CRUSH 알고리즘을 사용하여 집단에 고르게 분포된다.6개의 노드 클러스터에 3개의 복제본을 보유하도록 선택하면 전체 복제본을 포함하는 3개의 노드가 아닌 6개의 노드에 3개의 복제본이 분산됩니다.
정확한 데이터 복제 수준을 선택하는 것이 매우 중요하다.단일 노드 클러스터를 실행하는 경우 노드 수준에서 복제할 수 없으며 단일 OSD 장애가 발생하면 클러스터에서 데이터가 손실됩니다.이 경우 노드에서 사용할 수 있는 OSD 간에 데이터를 복사할 수 있습니다.
다중 노드 집합에서 복제 계수는 디스크나 노드가 고장났을 때 데이터를 잃어버리지 않고 감당할 수 있는 OSD나 노드의 수를 결정한다.물론 데이터 복제는 집단에서 사용할 수 있는 공간의 총량을 낮추는 문제를 가져올 수 있다.노드 수준에서 3의 복제 계수를 선택하면 클러스터에 사용 가능한 스토리지 공간의 1/3만 사용할 수 있습니다.
Ceph의 복제 속도는 OSD 읽기/쓰기 작업만으로 매우 빠릅니다.그러나 어떤 사람들은 전체 공간의 일부분만을 사용하는 것에 만족하지 않는다.이에 따라 Ceph는 지우기 인코딩도 도입했다.

인코딩 지우기


인코딩을 지우고 어떤 방식으로 원시 데이터를 인코딩하면 데이터를 다시 검색할 때 데이터의 하위 집합만 있으면 원시 정보를 다시 만들 수 있습니다.이것은 대상을 k개의 데이터 세션으로 나누고 m개의 짝짓기 검사 세션을 계산합니다.나는 하나의 예를 제공할 것이다.
우리의 데이터 값이 52라고 가정하자.우리는 이를 다음과 같이 나눌 수 있다.x = 5 y = 2
그리고 인코딩 과정은 대량의 짝짓기 검사 세션을 계산할 것이다.이 예에서는 방정식이 다음과 같습니다.x + y = 7 x - y = 3 2x + y = 12여기, 우리는 k=2와 m=3이 있다.k는 데이터 세션의 수량이고 m는 짝짓기 검사 세션의 수량입니다.디스크나 노드에 장애가 발생하면 데이터를 복구해야 합니다. 저장할 다섯 요소 (두 개의 데이터 세그먼트와 세 개의 짝짓기 검사 세그먼트) 중 두 개만 복구하면 됩니다.이것이 바로 인코딩을 지울 때 데이터의 지속성을 확보하는 원인이다.
이게 무슨 상관이야?이것은 데이터를 복제하는 것보다 이 짝짓기 검사 세션이 차지하는 공간이 훨씬 적기 때문에 매우 중요하다.다음 표는 인코딩 방안에 대한 삭제 비용을 보여 줍니다.간접 비용은 m/k에 따라 계산한다.
인코딩 지우기 (k+m)
최소 노드 수
스토리지 오버헤드
4+2
6
50%
6+2
8
33%
8+2
10
25%
6+3
9
50%
표에서 보듯이 (8+2) 방안을 사용하면 데이터를 잃어버리지 않고 두 노드를 잃어버릴 수 있습니다. 이는 25%의 저장 비용만 필요합니다.
만약 저장 공간 최적화의 측면에서 볼 때 이것은 저장에 대한 더욱 좋은 이용이다.그러나 단점이 없는 것은 아니다.패리티 세션은 복제보다 읽기/쓰기 속도가 느린 클러스터 컴퓨팅 시간이 필요합니다.따라서 대량의 데이터cold data를 처리하는 집단에서 지우기 인코딩을 사용하는 것을 권장합니다.

Ceph 사용


Kubernetes에 배치된 자연스러운 부분은 영구 볼륨 성명 (PVC) 을 만드는 것입니다.PVC는 볼륨을 설명하고pod의 데이터 저장소로 사용할 수 있습니다.PVC를 만들기 위해서는 먼저 Kubernetes에서 StorageClass를 정의해야 합니다.
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: replicapool
spec:
  failureDomain: host
  replicated:
    size: 3
    requireSafeReplicaSize: true
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
    clusterID: rook-ceph # namespace:cluster
    pool: replicapool
    imageFormat: "2"
    imageFeatures: layering
    csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # namespace:cluster
    csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
    csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph # namespace:cluster
    csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph # namespace:cluster
    csi.storage.k8s.io/fstype: ext4
allowVolumeExpansion: true
reclaimPolicy: Delete
이 StorageClass 파일에서 볼 수 있듯이, 우리는 먼저 던전 풀을 만들었습니다. 모두 3개의 던전을 만들고 host 를 실패역으로 사용합니다.그 다음에 볼륨을 만든 후에 볼륨 확장을 허용해야 하는지, 회수 정책이 무엇인지 정의했습니다.회수 정책은pod가 더 이상 존재하지 않을 때 볼륨에 저장된 데이터를 삭제하거나 보존해야 하는지 확인합니다.이 예에서 삭제를 선택했습니다.
# kubectl get storageclass -n rook-ceph
NAME              PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block   rook-ceph.rbd.csi.ceph.com      Delete          Immediate           true                   10m
StorageClass가 생성되었으므로 PVC를 생성할 수 있습니다.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: rook-ceph-block
Kubernetes 클러스터에서 실행 중인 PVC를 만듭니다.
# kubectl get pvc -n rook-ceph
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
rbd-pvc   Bound    pvc-56c45f01-562f-4222-8199-43abb856ca94   1Gi        RWO            rook-ceph-block   37s
이제 이 PVC를 사용하는 크레인을 배치합니다.
--------
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
   - name: web-server
     image: nginx
     volumeMounts:
       - name: mypvc
         mountPath: /var/lib/www/html
  volumes:
   - name: mypvc
     persistentVolumeClaim:
       claimName: pvc
       readOnly: false
이pod를 배치하면pod 목록에서 다음을 볼 수 있습니다.
# kubectl get pods -n rook-ceph
NAME              READY   STATUS    RESTARTS   AGE
demo-pod          1/1     Running   0          118s
이것이 바로 POD를 배치하여 Ceph 클러스터에 영구적인 볼륨 선언을 만드는 방법입니다!

좋은 웹페이지 즐겨찾기