12장. OpenShift Data Foundation에서 ceph-monitor 쿼럼 복원
경우에 따라 ceph-mons 에서 쿼럼이 손실될 수 있습니다. mons 에서 쿼럼을 다시 구성할 수 없는 경우 쿼럼을 다시 수행하는 수동 프로시저가 있습니다. 유일한 요구 사항은 적어도 1 개의 mon 이 건강해야합니다. 다음 단계에서는 쿼럼에서 비정상적인 mons 를 제거하고 단일 mon 으로 쿼럼을 다시 구성한 다음 쿼럼을 원래 크기로 다시 가져올 수 있습니다.
예를 들어 3개의 가 있고 쿼럼이 손실되는 경우 쿼럼에서 두 개의 잘못된 마우스를 제거하고, 좋은 mons mon 에 쿼럼에서 유일한 mon 임을 알리고, 좋은 mon 을 다시 시작해야 합니다.
절차
monmap을 수정할 때mons가 실패하지 않도록rook-ceph-operator를 중지합니다.# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=0새
monmap을 삽입합니다.주의monmap을 매우 신중하게 삽입해야 합니다. 잘못 실행하면 클러스터를 영구적으로 삭제할 수 있습니다. Cephmonmap은mon쿼럼을 추적합니다.monmap은 정상 mon만 포함하도록 업데이트되었습니다. 이 예에서 정상 mon은rook-ceph-mon-b입니다. 비정상적인mons는rook-ceph-mon-a및rook-ceph-mon-c입니다.현재
rook-ceph-mon-b배포의 백업을 수행합니다.# oc -n openshift-storage get deployment rook-ceph-mon-b -o yaml > rook-ceph-mon-b-deployment.yamlYAML 파일을 열고
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 [...]복사한
명령및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_IProok-ceph-배포를 패치하여 mon Pod를 삭제하지 않고 이mon-bmon의 작동을 중지합니다.# 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": []}]}}}}'mon-b포드에서 다음 단계를 수행합니다.정상
monPod에 연결하고 다음 명령을 실행합니다.# oc -n openshift-storage exec -it <mon-pod> bash변수를 설정합니다.
# monmap_path=/tmp/monmap좋은
mon배포에서 cephmon명령을 붙여넣고--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}monmap의 내용을 검토합니다.# monmaptool --print /tmp/monmap에서 잘못된 마우스를 제거합니다.monmap# monmaptool ${monmap_path} --rm <bad_mon>이 예제에서는
mon0및mon2를 제거합니다.# monmaptool ${monmap_path} --rm a # monmaptool ${monmap_path} --rm cceph
mon명령을 붙여넣고--inject-에 주입합니다.monmap=${monmap_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}- 쉘을 종료하여 계속합니다.
Rook 구성 맵
을편집합니다.Operator에서
mons를 추적하는 데 사용하는configmap을 편집합니다.# oc -n openshift-storage edit configmap rook-ceph-mon-endpoints데이터 요소에서 다음과 같은 세 개의
mons(또는moncount에 따라)가 표시되는지 확인합니다.data: a=10.100.35.200:6789;b=10.100.13.242:6789;c=10.100.35.12:6789목록에서 잘못된
마우스를삭제하여 하나의 좋은 수도원으로끝납니다. 예를 들면 다음과 같습니다.data: b=10.100.13.242:6789- 파일을 저장하고 종료합니다.
이제
mons및 기타 구성 요소에 사용되는시크릿을 조정해야 합니다.good_mon_id변수 값을 설정합니다.예를 들면 다음과 같습니다.
# good_mon_id=boc patch명령을 사용하여rook-ceph-config시크릿을 패치하고 두 개의 키/값 쌍mon_host및mon_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_hostvar을mon이 고정한 노드 IP(nodeSelector)로 교체해야 합니다. "mode"에서 생성된rook-ceph-mon-*서비스가 없기 때문입니다.
mon을 다시 시작합니다.원래
ceph-mon명령을 사용하여 좋은 mon Pod를 다시 시작하여 변경 사항을 선택해야 합니다.mon배포 YAML 파일의 백업에oc replace명령을 사용합니다.# oc replace --force -f rook-ceph-mon-b-deployment.yaml참고옵션
--force는 배포를 삭제하고 새 배포를 생성합니다.클러스터 상태를 확인합니다.
상태에 쿼럼에서 하나의
mon이 표시되어야 합니다. 상태가 정상이면 클러스터가 다시 정상이어야 합니다.
더 이상 쿼럼에 있을 것으로 예상되지 않는 두 개의 mon 배포를 삭제합니다.
예를 들면 다음과 같습니다.
# oc delete deploy <rook-ceph-mon-1> # oc delete deploy <rook-ceph-mon-2>이 예제에서 삭제할 배포는
rook-ceph-mon-a및rook-ceph-mon-c입니다.Operator를 다시 시작합니다.
rook Operator를 다시 시작하여 클러스터 상태를 모니터링합니다.
참고이미 존재하는 많은 리소스가 존재하는 오류는 무시해도 됩니다.
# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1Operator는
mon수에 따라 쿼럼 크기를 다시 늘리기 위해 더 많은mons를 자동으로 추가합니다.