12장. OpenShift Data Foundation에서 ceph-monitor 쿼럼 복원


경우에 따라 ceph-mons 에서 쿼럼이 손실될 수 있습니다. mons 에서 쿼럼을 다시 구성할 수 없는 경우 쿼럼을 다시 수행하는 수동 프로시저가 있습니다. 유일한 요구 사항은 적어도 1 개의 mon 이 건강해야합니다. 다음 단계에서는 쿼럼에서 비정상적인 mons 를 제거하고 단일 mon 으로 쿼럼을 다시 구성한 다음 쿼럼을 원래 크기로 다시 가져올 수 있습니다.

예를 들어 3개의 mons 가 있고 쿼럼이 손실되는 경우 쿼럼에서 두 개의 잘못된 마우스를 제거하고, 좋은 mon 에 쿼럼에서 유일한 mon 임을 알리고, 좋은 mon 을 다시 시작해야 합니다.

절차

  1. monmap 을 수정할 때 mons 가 실패하지 않도록 rook-ceph-operator 를 중지합니다.

    # oc -n openshift-storage scale deployment rook-ceph-operator --replicas=0
  2. monmap 을 삽입합니다.

    주의

    monmap 을 매우 신중하게 삽입해야 합니다. 잘못 실행하면 클러스터를 영구적으로 삭제할 수 있습니다. Ceph monmapmon 쿼럼을 추적합니다. monmap 은 정상 mon만 포함하도록 업데이트되었습니다. 이 예에서 정상 mon은 rook-ceph-mon-b 입니다. 비정상적인 monsrook-ceph-mon-arook-ceph-mon-c 입니다.

    1. 현재 rook-ceph-mon-b 배포의 백업을 수행합니다.

      # oc -n openshift-storage get deployment rook-ceph-mon-b -o yaml > rook-ceph-mon-b-deployment.yaml
    2. YAML 파일을 열고 mon 컨테이너에서 명령인수를 복사합니다(다음 예제의 컨테이너 목록 참조). 이는 monmap 변경에 필요합니다.

      [...]
        containers:
        - args:
          - --fsid=41a537f2-f282-428e-989f-a9e07be32e47
          - --keyring=/etc/ceph/keyring-store/keyring
          - --log-to-stderr=true
          - --err-to-stderr=true
          - --mon-cluster-log-to-stderr=true
          - '--log-stderr-prefix=debug '
          - --default-log-to-file=false
          - --default-mon-cluster-log-to-file=false
          - --mon-host=$(ROOK_CEPH_MON_HOST)
          - --mon-initial-members=$(ROOK_CEPH_MON_INITIAL_MEMBERS)
          - --id=b
          - --setuser=ceph
          - --setgroup=ceph
          - --foreground
          - --public-addr=10.100.13.242
          - --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db
          - --public-bind-addr=$(ROOK_POD_IP)
          command:
          - ceph-mon
      [...]
    3. 복사한 명령args 필드를 정리하여 다음과 같이 붙여넣은 명령을 형성합니다.

      # ceph-mon \
          --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \
          --keyring=/etc/ceph/keyring-store/keyring \
          --log-to-stderr=true \
          --err-to-stderr=true \
          --mon-cluster-log-to-stderr=true \
          --log-stderr-prefix=debug \
          --default-log-to-file=false \
          --default-mon-cluster-log-to-file=false \
          --mon-host=$ROOK_CEPH_MON_HOST \
          --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \
          --id=b \
          --setuser=ceph \
          --setgroup=ceph \
          --foreground \
          --public-addr=10.100.13.242 \
          --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \
          --public-bind-addr=$ROOK_POD_IP
      참고

      ROOK_CEPH_MON_HOST 변수, ROOK_CEPH_MON_MON_MON_MON_MON_MON_INITIAL_MEMBERS 및 ROOK_POD_IP 관련 단일 따옴표를 제거해야 합니다.

    4. rook-ceph- mon -b 배포를 패치하여 mon Pod를 삭제하지 않고 이 mon 의 작동을 중지합니다.

      # oc -n openshift-storage patch deployment rook-ceph-mon-b  --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]'
      
      # oc -n openshift-storage patch deployment rook-ceph-mon-b -p '{"spec": {"template": {"spec": {"containers": [{"name": "mon", "command": ["sleep", "infinity"], "args": []}]}}}}'
    5. mon-b 포드에서 다음 단계를 수행합니다.

      1. 정상 mon Pod에 연결하고 다음 명령을 실행합니다.

        # oc -n openshift-storage exec -it <mon-pod> bash
      2. 변수를 설정합니다.

        # monmap_path=/tmp/monmap
      3. 좋은 mon 배포에서 ceph mon 명령을 붙여넣고 --extract- monmap =${monmap_path} 플래그를 추가하여 monmap 을 파일에 추출합니다.

        # ceph-mon \
               --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \
               --keyring=/etc/ceph/keyring-store/keyring \
               --log-to-stderr=true \
               --err-to-stderr=true \
               --mon-cluster-log-to-stderr=true \
               --log-stderr-prefix=debug \
               --default-log-to-file=false \
               --default-mon-cluster-log-to-file=false \
               --mon-host=$ROOK_CEPH_MON_HOST \
               --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \
               --id=b \
               --setuser=ceph \
               --setgroup=ceph \
               --foreground \
               --public-addr=10.100.13.242 \
               --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \
               --public-bind-addr=$ROOK_POD_IP \
               --extract-monmap=${monmap_path}
      4. monmap 의 내용을 검토합니다.

        # monmaptool --print /tmp/monmap
      5. mon map 에서 잘못된 마우스를 제거합니다.

        # monmaptool ${monmap_path} --rm <bad_mon>

        이 예제에서는 mon0mon2 를 제거합니다.

        # monmaptool ${monmap_path} --rm a
        # monmaptool ${monmap_path} --rm c
      6. ceph mon 명령을 붙여넣고 --inject- monmap =${ mon map_path} 플래그를 다음과 같이 추가하여 수정된 monmap을 좋은 monmap 에 주입합니다.

        # ceph-mon \
               --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \
               --keyring=/etc/ceph/keyring-store/keyring \
               --log-to-stderr=true \
               --err-to-stderr=true \
               --mon-cluster-log-to-stderr=true \
               --log-stderr-prefix=debug \
               --default-log-to-file=false \
               --default-mon-cluster-log-to-file=false \
               --mon-host=$ROOK_CEPH_MON_HOST \
               --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \
               --id=b \
               --setuser=ceph \
               --setgroup=ceph \
               --foreground \
               --public-addr=10.100.13.242 \
               --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \
               --public-bind-addr=$ROOK_POD_IP \
               --inject-monmap=${monmap_path}
      7. 쉘을 종료하여 계속합니다.
  3. Rook 구성 맵 편집합니다.

    1. Operator에서 mons 를 추적하는 데 사용하는 configmap 을 편집합니다.

      # oc -n openshift-storage edit configmap rook-ceph-mon-endpoints
    2. 데이터 요소에서 다음과 같은 세 개의 mons (또는 moncount에 따라)가 표시되는지 확인합니다.

      data: a=10.100.35.200:6789;b=10.100.13.242:6789;c=10.100.35.12:6789
    3. 목록에서 잘못된 마우스를 삭제하여 하나의 좋은 수도원으로 끝납니다. 예를 들면 다음과 같습니다.

      data: b=10.100.13.242:6789
    4. 파일을 저장하고 종료합니다.
    5. 이제 mons 및 기타 구성 요소에 사용되는 시크릿 을 조정해야 합니다.

      1. good_mon_id 변수 값을 설정합니다.

        예를 들면 다음과 같습니다.

        # good_mon_id=b
      2. oc patch 명령을 사용하여 rook-ceph-config 시크릿을 패치하고 두 개의 키/값 쌍 mon_hostmon_initial_members 를 업데이트할 수 있습니다.

        # mon_host=$(oc -n openshift-storage get svc rook-ceph-mon-b -o jsonpath='{.spec.clusterIP}')
        
        # oc -n openshift-storage patch secret rook-ceph-config -p '{"stringData": {"mon_host": "[v2:'"${mon_host}"':3300,v1:'"${mon_host}"':6789]", "mon_initial_members": "'"${good_mon_id}"'"}}'
        참고

        hostNetwork: true 를 사용하는 경우 mon_host var을 mon 이 고정한 노드 IP(nodeSelector)로 교체해야 합니다. "mode"에서 생성된 rook-ceph-mon-* 서비스가 없기 때문입니다.

  4. mon 을 다시 시작합니다.

    원래 ceph- mon 명령을 사용하여 좋은 mon Pod를 다시 시작하여 변경 사항을 선택해야 합니다.

    1. mon 배포 YAML 파일의 백업에 oc replace 명령을 사용합니다.

      # oc replace --force -f rook-ceph-mon-b-deployment.yaml
      참고

      옵션 --force 는 배포를 삭제하고 새 배포를 생성합니다.

    2. 클러스터 상태를 확인합니다.

      상태에 쿼럼에서 하나의 mon 이 표시되어야 합니다. 상태가 정상이면 클러스터가 다시 정상이어야 합니다.

  5. 더 이상 쿼럼에 있을 것으로 예상되지 않는 두 개의 mon 배포를 삭제합니다.

    예를 들면 다음과 같습니다.

    # oc delete deploy <rook-ceph-mon-1>
    # oc delete deploy <rook-ceph-mon-2>

    이 예제에서 삭제할 배포는 rook-ceph-mon-arook-ceph-mon-c 입니다.

  6. Operator를 다시 시작합니다.

    1. rook Operator를 다시 시작하여 클러스터 상태를 모니터링합니다.

      참고

      이미 존재하는 많은 리소스가 존재하는 오류는 무시해도 됩니다.

      # oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1

      Operator는 mon 수에 따라 쿼럼 크기를 다시 늘리기 위해 더 많은 mons 를 자동으로 추가합니다.

Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2026 Red Hat
맨 위로 이동