Patroni 관리

patronictl은 Patroni 패키지와 함께 설치되는 Python 3로 작성된 CLI (커맨드라인 인터페이스)로, Patroni 클러스터가 제공하는 REST API를 이용하여 클러스터를 관제 하거나 DCS에 접근하기 위한 기능을 제공합니다.

PostgreSQL 클러스터의 관리와 상태 체크, 설정 값 등을 확인하기 위해 사용합니다.

설치 확인

patronictl은 기본적으로 Python 3 패키지 patroni 와 함께 제공된다. 아래와 같이 노드에 patronictl이 설치되어 있는지 여부와 버전을 확인할 수 있습니다.

$ which patronictl 
/usr/local/bin/patronictl

$ patronictl version
patronictl version 3.3.0


Local Configuration File 설정하기

Patroni 프로세스 실행 시 매개변수로 입력 받는 경로에 위치한 yml 파일로부터 읽어오는 설정 값들에 대해 설명합니다.

Local Configuration 항목값들은 Patroni 프로세스에 SIGHUP 시그널을 보내거나 REST API 서버에 POST /reload 요청을 보내 설정 파일을 새로 읽어오도록 함으로써 갱신할 수 있습니다. 기본 템플릿 환경 구성 파일의 경로는 /etc/patroni/patroni.yml 를 참조합니다. 해당 경로에 yml 파일을 생성하고 해당 파일의 내용을 수정하여 구성하고자 하는 환경에 맞게 변경합니다.

  • Patroni 클러스터의 메타 정보, etcd 연결 정보, 로깅 구성, REST API 서버 구성 및 PostgreSQL 파라미터 정보를 정의할 수 있습니다.

  • PostgreSQL 파라미터 셋은 Local Configuration 및 Global Dynamic Configuration로 설정할 수 있습니다. 중복되는 키가 있는 경우 Local Configuration의 값이 우선합니다.

  • bootstrap.dcs 항목을 정의해 아래의 Global Dynamic Configuration의 초기 구성 셋을 설정할 수 있습니다.

클러스터 메타 정보

  • scope: 구성하고자 하는 Patroni 클러스터의 이름으로 PostgreSQL 파라미터 cluster_name 에 적용됩니다.

  • namespace: Configuration Store 내에서 사용할 키의 접두어입니다.

  • name: 해당 인스턴스 (노드) 의 이름으로 클러스터 내에서 Unique 해야하며 설정하지 않는 경우 호스트네임이 사용됩니다.

로깅

  • log.type: 로그 형식을 지정하는 항목으로 plainjson 두 가지 옵션을 지원합니다. json 타입 사용을 위해서는 Python 패키지 patroni[jsonlogger] 설치가 추가로 필요합니다.

  • log.format: 로그 메세지 형식을 지정하는 항목으로 Python logging 패키지의 LogRecord 모듈에서 지정하는 포맷 문자열 규칙을 따릅니다.

  • log.dir: Patroni 로그를 작성할 디렉토리 경로이며, 로그 파일의 기본 보존 (Retention) 사이즈는 425 MB 입니다.

  • 언급되지 않은 항목은 아래 링크의 문서를 참조합니다.

Rest API

  • restapi.listen: Patroni REST API 서버가 바인딩 될 IPv4 주소와 포트 번호를 지정합니다.

  • restapi.connect_address: Patroni 멤버 간 통신을 위해 사용할 이 노드의 외부 식별 가능한 Rest API 서버 주소를 IPv4 주소 : 포트번호 형식으로 입력합니다. 클러스터 멤버를 조회하는 API 호출 시에도 이 값이 Parsing 되어 Host 주소로 사용됩니다.

DCS (etcd)

etcd v3 인 경우의 예시

  • etcd3.protocol: etcd3 클러스터에 접근 시 사용할 프로토콜로 http 혹은 https 를 지원합니다. http 가 기본 값으로 사용되며 https 인 경우 etcd3.cacert, etcd3.cert, etcd3.key 항목 설정이 추가로 필요합니다.

  • etcd3.host: 단일 노드 etcd3 클러스터를 구성한 경우 그 노드의 etcd3 엔드포인트를 입력합니다.

  • etcd3.hosts: etcd3 클러스터의 각 노드별 엔드포인트 주소를 입력합니다.

Bootstrapping

Patroni 시작 시 노드에 PostgreSQL 데이터베이스가 초기화되지 않은 경우 이 섹션의 내용을 참조하여 데이터베이스 인스턴스를 초기화합니다. 이미 구성된 PostgreSQL 데이터베이스가 노드에 있는 경우 이 섹션의 내용 또는 추가되는 변경사항은 Patroni에 반영되지 않습니다.

하위 항목 bootstrap.dcs 의 내용은 Patroni 클러스터를 초기화하며 DCS에 Global Dynamic Configuration 으로 저장할 값들입니다.

  • bootstrap.dcs: Patroni 클러스터 환경설정으로 초기화 시 DCS의 /<namespace>/<scope>/config 에 저장되는 Global Dynamic Configuration 셋입니다.

  • bootstrap.initdb: 데이터베이스 초기화 방법으로 initdb (기본값) 를 설정한 경우 initdb 실행 시 넘겨줄 파라미터의 배열입니다.

PostgreSQL

PostgreSQL 데이터베이스의 시스템 파라미터, 기본 사용자, Host Based Authentication 규칙 및 데이터베이스 파라미터 등을 정의합니다. Patroni 설정값 세팅 중 Local Configuration에 해당합니다.

지정할 수 있는 항목들은 Global Dynamic Configuration의 키 postgresql 로 지정하는 항목과 동일합니다. 같은 키가 이 파일과 Global Dynamic Configuration에 중복으로 정의되는 경우 이 파일 (즉 Local Configuration File) 에 정의되는 값이 우선합니다.

  • postgresql.listen: 해당 노드의 Patroni가 실행할 PostgreSQL 서버가 Listen할 주소를 <IP주소>:<Port번호> 형태로 입력합니다.

  • postgresql.connect_address: 다른 노드 혹은 클라이언트 어플리케이션에서 참조할 PostgreSQL의 접속 URL을 입력합니다. 클러스터 정보 및 DSN을 조회할 때 반환되는 값입니다.

  • postgresql.proxy_address: PostgreSQL 서버에 접근하기 위한 Proxy 서버가 있는 경우 필요에 따라 서비스 디스커버리를 위해 그 Proxy 서버의 URL을 입력할 수 있으며 이 값은 DCS의 클러스터 정보에 같이 저장됩니다.

  • postgresql.data_dir: PostgreSQL 서버의 데이터 경로. Patroni 프로세스를 실행하는 사용자가 해당 경로에 대한 접근 권한을 가지고 있어야 합니다. 해당 경로가 비어있으면 Patroni 프로세스 실행 시 initdb 동작이 같이 실행됩니다.

  • postgresql.bin_dir: PostgreSQL 실행 바이너리 pg_ctl, initdb, postgres 등이 위치한 경로를 지정합니다.

  • postgresql.config_dir: PostgreSQL 설정 파일 postgresql.conf 을 보관할 디렉토리 경로. 기본값은 data_dir 값과 동일합니다.

  • postgresql.pg_hba: Patroni가 생성할 pg_hba.conf (PostgreSQL의 기본 호스트 기반 인증 설정) 파일에 작성할 아이템들을 입력합니다. PostgreSQL 파라미터 hba_file 이 사용자 지정 값으로 설정되어 있으면 이 항목은 무시됩니다.

  • postgresql.parameters: PostgreSQL 데이터베이스 파라미터입니다. 키-값 형태로 입력하며 postgresql.conf 파일을 생성할 때 이용됩니다.


사용법

patronictl은 별도의 구성 설정을 저장하지 않으며, 매 실행 시 클러스터의 정보를 가져오기 위해 DCS 접속 URL 혹은 Patroni 접속 URL이 주어져야 합니다.

클러스터 구성에 사용한 Configuration .yml 파일을 인자로 주어 아래와 같이 사용합니다.

아래와 같이 Linux alias로 등록해 사용할 수도 있습니다.

클러스터 정보 확인

클러스터의 구성 노드와 각 노드의 접속 정보, 상태 정보를 출력합니다.

토폴로지 출력

DSN 출력

클러스터 노드의 DSN (Data Source Name) 을 출력합니다. 별도 옵션이 주어지지 않으면 Leader 노드 접속 정보를 출력합니다.

특정 Role을 가진 멤버에 대한 접속 정보를 출력하거나 이름으로 특정 멤버에 대한 접속 정보를 출력할 수도 있습니다.

재시작

클러스터의 멤버 노드 중 하나의 PostgreSQL 프로세스를 재시작합니다. 클러스터 이름 (메타 정보에서 설정) 이 인자로 주어져야 하며 추가로 멤버 노드의 이름을 옵션으로 넣을 수 있습니다. 멤버 이름이 지정되지 않은 경우 모든 노드들이 한번씩 재시작됩니다.

대화형 프롬프트를 통해 재시작 일시 (바로 재시작하는 옵션과 Timestamp를 지정하여 재시작을 스케쥴하는 기능을 제공) 를 입력하며 재시작할 PostgreSQL 서버의 버전을 확인하여 필터링하는 기능을 제공합니다.

리로딩

클러스터의 멤버 노드 중 하나의 PostgreSQL 서버를 재시작하지 않고 Configuration을 다시 불러오는 기능입니다. 클러스터 이름이 인자로 주어져야 하며 추가로 멤버 노드의 이름을 옵션으로 넣을 수 있습니다.

대화형 프롬프트를 통해 클러스터 멤버 리로딩을 스케쥴할 지 여부를 확인합니다.

Context 값이 internal, postmaster 인 PostgreSQL 변수 (GUC)는 Reloading 기능으로 변경할 수 없습니다. internal 변수는 서버 프로그램을 컴파일할 때 혹은 initdb 명령어로 데이터베이스를 초기화할 때 결정되는 변수로 데이터베이스 재설치 없이 변경할 수 없으며 postmaster 변수는 PostgreSQL 프로세스를 재시작해야 변경할 수 있습니다.

이력 조회

클러스터에서 발생한 Failover / Switchover 이력을 조회합니다.

쿼리

특정 Role을 가진 PostgreSQL 노드에 데이터베이스 쿼리를 실행하여 결과값을 확인할 수 있습니다.

Failover

클러스터에 발생한 장애로 Leader 노드가 없는 경우 수동으로 Failover를 실행할 수 있습니다.

정상 동작중인 클러스터에서도 patronictl failover 명령어로 수동 Failover를 수행할 수 있습니다. 다만 정상 동작중인 클러스터에서 Leader 인스턴스를 변경하고자 하는 경우 patronictl switchover 명령어를 사용하는 것이 권장됩니다.

Switchover

PostgreSQL / Patroni Leader 노드를 Replica로 전환하고, 다른 Replica 노드 중 하나를 Leader로 승격시키는 동작입니다.

Pause / Resume

Patroni 클러스터의 자동 Failover 기능을 중단시키고 유지보수 모드 (Maintenance Mode) 로 클러스터를 전환합니다.

Resume 명령어로 유지보수 모드를 종료하고 클러스터의 자동 Failover 기능을 다시 활성화합니다.

Config 확인

DCS를 조회하여 현재 Patroni 클러스터에 적용된 설정값들을 확인할 수 있습니다.

Config 수정

DCS에 저장된 Patroni 클러스터의 동적 환경설정 (Dynamic Configuration) 값을 수정할 수 있습니다.

로컬 사용자의 EDITOR 환경변수로 지정된 텍스트 에디터 또는 vi 를 서브프로세스로 실행하여 TTY 형태로 Configuration을 수정 후 저장할 수 있습니다.

Last updated