펜싱
펜싱 (Fencing)
CloudNativePG에서 펜싱은 PostgreSQL 클러스터의 하나, 여러 개, 또는 모든 인스턴스가 오작동하는 것처럼 보일 때 그 데이터를 보호하는 궁극적인 과정이에요. 인스턴스가 펜스되면 PostgreSQL 서버 프로세스(postmaster)가 확실히 종료되고, pod는 계속 실행 상태로 유지돼요. 이렇게 하면 펜스가 해제될 때까지 pod의 데이터가 PostgreSQL에 의해 수정되지 않고, 디버깅과 트러블슈팅을 위해 파일 시스템을 조사할 수 있게 보장돼요.
출처: 문서
본문
인스턴스 펜싱 방법 (How to fence instances)
CloudNativePG에서 펜스할 수 있는 것:
- 특정 인스턴스
- 인스턴스 목록
- 전체 Postgres
Cluster
펜싱은 인스턴스 이름의 JSON 형식 목록을 기대하는 cnpg.io/fencedInstances 어노테이션의 내용으로 제어돼요. 어노테이션이 '["*"]'(와일드카드가 있는 싱글턴 목록)로 설정되면 전체 클러스터가 펜스돼요. 어노테이션이 빈 JSON 목록으로 설정되면, 연산자는 어노테이션이 설정되지 않은 것처럼 동작해요.
예를 들어:
-
cnpg.io/fencedInstances: '["cluster-example-1"]'는cluster-example-1인스턴스만 펜스해요 -
cnpg.io/fencedInstances: '["cluster-example-1","cluster-example-2"]'는cluster-example-1과cluster-example-2인스턴스를 펜스해요 -
cnpg.io/fencedInstances: '["*"]'는 클러스터의 모든 인스턴스를 펜스해요.
어노테이션은 kubectl annotate 명령 같은 Kubernetes 객체에 수동으로 설정하거나, kubectl cnpg fencing on 서브커맨드로 투명하게 설정할 수 있어요:
# to fence only one instance
kubectl cnpg fencing on cluster-example 1
# to fence all the instances in a Cluster
kubectl cnpg fencing on cluster-example "*"
이전에 펜스된 인스턴스가 있는 Cluster의 예시:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
annotations:
cnpg.io/fencedInstances: '["cluster-example-1"]'
[...]
펜싱 해제 방법 (How to lift fencing)
펜싱은 어노테이션을 지우거나 다른 값으로 설정해서 해제할 수 있어요.
펜싱과 마찬가지로 kubectl annotate로 수동으로 하거나, kubectl cnpg fencing 서브커맨드를 다음과 같이 사용할 수 있어요:
# to lift the fencing only for one instance
# N.B.: at the moment this won't work if the whole cluster was fenced previously,
# in that case you will have to manually set the annotation as explained above
kubectl cnpg fencing off cluster-example 1
# to lift the fencing for all the instances in a Cluster
kubectl cnpg fencing off cluster-example "*"
펜싱이 어떻게 동작하나요 (How fencing works)
인스턴스가 펜싱 대상으로 설정되면, postmaster 프로세스를 종료하는 절차가 시작돼요. 이는 스위치오버의 절차와 동일해요. 이는 타임아웃이 .spec.switchoverDelay로 설정된 초기 fast shutdown과 그 뒤의 immediate shutdown으로 구성돼요. 그런 다음:
-
pod는 계속 살아 있게 유지돼요
-
pod는 Ready로 표시되지 않아요
-
Postgres 인스턴스가 켜져 있을 필요가 없는 모든 변경(구성 파일, 인증서와 모든 암호학적 자료 포함)은 리컨실돼요
-
cnpg_collector_fencing_on이 1로 설정되는 것을 제외하고는 메트릭이 수집되지 않아요
:::warning 프라이머리 인스턴스가 펜스되면, 그 postmaster 프로세스는 종료되지만 페일오버는 수행되지 않아, 애플리케이션의 운영성이 중단돼요. 펜스가 해제되면 페일오버 없이 프라이머리 인스턴스가 다시 시작돼요.
그렇기 때문에 프라이머리 인스턴스는 반드시 필요한 경우에만 펜스할 것을 권장해요.
:::
펜스된 인스턴스가 삭제되면 pod는 정상적으로 재생성되지만 postmaster는 시작되지 않아요. 이는 인스턴스가 Crashlooping 상태일 때 극도로 유용할 수 있어요.