본문 바로가기
PostgreSQL

pgpool-II Overview | PostgreSQL 14 HA Tool

by 울라불라오미짱 2023. 6. 14.
반응형

 

pgpool-II은 PostgreSQL tool이며 많은 기능을 제공하며 많이 쓰이는 툴 중 하나 입니다. 양이 방대하여 파트를 나누어서 업로드 하려고 합니다.

pgpool-II 이란?

  • PostgreSQL 서버와 PostgreSQL 데이터베이스 클라이언트 (사용자) 사이에서 작동하는 미들웨어입니다.
  • client(어플리케이션, user단)에서는 pgpool을 PostgreSQL 서버로 인식하고, PostgreSQL 서버에서는 pgpool을 client로 인식합니다.

pgpool-II 기능

pgpool-II은 아래와 같은 다양한 기능을 제공합니다.

기능 기능 설명
Connection pooling PostgreSQL 서버에 대한 연결을 저장하고 동일한 연결이 들어올 때마다 재사용하여, 오버헤드를 줄이고 시스템의 전체 처리량을 향상시킵니다.
Replication 여러 PostgreSQL 서버를 관리할 수 있습니다. 복제 기능을 사용하면 2개 이상의 물리적 디스크에 실시간 백업을 생성할 수 있으므로 디스크 장애 시, 서버를 중단하지 않고 서비스를 계속할 수 있습니다.
Load Balancing 데이터베이스가 replication 인 경우, SELECT 쿼리를 실행하면 여러서버에 쿼리를 배포하여 서버의 부하를 줄여 시스템의 전체 처리량을 향상시킵니다.
Limiting Exceeding Connections PostgreSQL과의 최대 동시 연결 수에 제한을 할 수 있으며 이 수만큼 연결되면 연결이 거부됩니다.
Watchdog 여러개의 pgpool-II을 관리하고 heartbeat를 체크하여 pgpool-II 서버의 문제를 확인 후, 장애 복구를 할 수 있습니다.
In Memory Query Cache 메모리 쿼리 캐시에서 SELECT 문과 그 결과 쌍을 저장할 수 있습니다. 동일한 SELECT가 들어오면 pgpool-II은 캐시에서 값을 반환합니다.

pgpool-II 파라미터

pgpool-II은 pgpool.conf 파일 내에 파라미터를 설정합니다. 모든 파라미터의 이름은 대소문자를 비교하지 않으며, 다음 다섯가지 유형 중에 하나의 값을 갖습니다.

매개변수 유형 설명

매개변수 유형 설명
부울 on,off, true, false, yes, no, 1, 0 중 하나로 작성 가능합니다.
문자열 일반적으로 값을 작은따옴표로 묶고, 값 내 작은 따옴표를 이중으로 묶어서 작성합니다.
숫자(정수 및 부동 소수점) 소수점은 부동 소수점 파라미터에만 허용. 천단위 구분 기호나 따옴표는 불필요합니다.
단위 숫자 메모리, 시간 숫자에 단위가 적용됩니다.
  • 용량 : KB, MB, GB, TB …
  • 시간 : min, ms, s, h, d … | | 열거형 | 문자열과 같은 방식으로 작성되나, 제한된 범위 내 값만 허용합니다. 

pgpool-II 파라미터는 크게 다음과 같이 분리되어 있으며, 간단하게 설명해보도록 하겠습니다!

pgpool-II 클러스터링 모드

pgpool.conf 파일 내 backend_clustering_mode 파라미터에서 6가지 모드 중에 하나를 선택하여 설정합니다.

클러스터링 모드 종류 설명
streaming_replication 가장 권장하는 클러스터링 모드입니다.  postgresql의 streaming replication에 맞춰 pgpool이 동작하게 됩니다.
native_replication pgpool이 postgresql 백엔드 간에 데이터를 복제하도록 합니다. 일관성을 보장하지 못해 노드 간에 불일치가 발생합니다.
logical_replication postgresql의 logical replication에 맞춰 지원하는 모드입니다. read query를 배포하는 동안 복제 지연이 되며, DDL 및 large object 복제는 지원하지 않습니다.
snapshot_isolation native_replication에서 일관성을 추가한 모드입니다. 트랜잭션 격리 수준 매개변수인 default_transaction_isolation 가 repeatable read로 설정되어야 합니다.
slony slony-I와 연결하는데 사용됩니다. 일관성이 보장되지 않아, 사용하지 않는 것을 권장합니다.
raw 데이터 베이스 동기화에 신경쓰지 않고, 사용자가 전체 시스템을 구축해야합니다. 로드밸런싱이 불가능합니다.

pgpool-II 백엔드 설정

PostgreSQL와 연결을 설정합니다. pgpool.conf 파일에서 직접 백엔드, 포트 번호, 부하 분산 비율, 데이터베이스 클러스터 디렉토리 등 조절할 수 있습니다.

backend_flag 파라미터는 백엔드 동작 제어를 설정하는 파라미터이며, 다음 3가지 플래그 중 지정할 수 있습니다.

플래그 설명
ALLOW_TO_FAILOVER default 값으로, 장애 조치 또는 백엔드 분리를 허용합니다.
DISALLOW_TO_FAILOVER 장애 조치 또는 백엔드 분리를 허용하지 않습니다.
ALWAYS_PRIMARY streaming replication 모드에서만 유용합니다. primary 노드를 찾기 위해 백엔드 검사를 하지 않습니다.

pgpool-II 연결 풀링

PostgreSQL 서버에 대한 기존 연결을 유지하고 동일한 속성을 가진 새 연결이 들어올 때마다 이를 재사용 합니다.

이렇게 하면 연결 오버헤드를 줄이고 시스템의 전체 처리량을 향상 시킵니다.

백엔드 연결 캐시, pgpool child 프로세스의 최대 캐시 연결 수, child 프로세스 종료 시간 지정 등을 설정할 수 있습니다.

pgpool-II 오류 보고 및 로깅

로그 메세지 기록 대상을 stderr 과 syslog중에 지정할 수 있으며, 로그가 저장될 디렉토리, 파일명, 순환 주기를 지정할 수 있습니다.

또한 로그에 SQL 문 전체를 지정할지 클라이언트 메세지 등 로그에 출력하는 메세지를 지정합니다.

pgpool-II 로드 밸런싱

SELECT 쿼리의 로드 밸런싱은 기본적으로 모든 클러스터링 모드에서 동작하며, 기본적으로 아래 조건이 충족되어야 합니다.

  • PostgreSQL version > 7.4
  • replication mode
  • 명시적 트랜잭션에 쿼리가 없어야함
  • SELECT INTO, SELECT FOR UPDATE, SELECT FOR SHARE 쿼리가 아님
  • 임시테이블, unlogged 테이블, 시스템 카탈로그 사용하지 않음

pgpool-II health check

pgpool은 health check를 통해 PostgreSQL 백엔드에 주기적으로 연결하여 서버 또는 네트워크의 오류를 감지합니다.

health check 사이 간격, 전용 유저, 전용 데이터베이스, failover 전 수행할 health check의 최대 재시도 횟수 등을 지정할 수 있습니다.

pgpool-II streaming replication check

pgpool은 streaming replication이 기본적으로 Hot standby 모드로 구성되어 있다고 가정하기 때문에 hot standby 모드로 구성되어 있어야 파라미터가 제대로 동작할 수 있습니다. 그리고 backend_clustering_mode 를 streaming replication으로 설정해야합니다.

스트리밍 복제 지연 확인 시간 간격, 전용 유저명, 데이터베이스 명 지정 등 파라미터를 설정할 수 있습니다.

pgpool-II In-Memory Query Cache

SELECT 결과를 유지하고 재사용하는 기능으로, pgpool의 모든 클러스터링 모드에서 사용 가능합니다.기본 테이블이 업데이트 되면 해당 캐시 항목이 삭제됩니다.

메모리 캐시에는 유저명, 데이터베이스명, SELECT 문 및 해당 결과 쌍(바인딩 매개변수 포함)이 저장됩니다. 동일한 유저명, 데이터베이스명 및 SELET가 들어오면 캐시에서 값을 반환합니다.

보통 SELECT가 정상적으로 완료되면 등록되며, 명시적 트랜잭션이 실행 중인 경우 커밋 후에 등록됩니다.

pgpool-II Watchdog

여러 pgpool 노드를 모니터링 하여 장애가 생긴 pgpool 노드를 관리하는 pgpool 하위 프로세스입니다. 쿼럼 메커니즘을 보장하고 장애조치를 해결하는데 큰 도움이 됩니다.

쿼럼 메커니즘의 정확한 동작을 위해서는 pgpool 노드의 수가 3이상 홀수여야 하며, 서로 정보를 교환하여 여러 pgpool 노드를 조정합니다.

pgpool 노드의 결함이 감지되면, 다른 watchdog에 알려 새로운 active 노드를 지정합니다. 이와 동시에 VIP를 사용한다면, VIP도 전환합니다.

pgpool-II 설정 및 운영

pgpool-II 설정

  • 사용자 계정 관련 설정 데이터베이스의 보안이나 관리를 위해 pgpool를 실행하는 별도의 계정을 생성하는 것을 권장합니다. 계정은 useradd 커맨드로 생성할 수 있습니다.
  • pcp.conf 환경설정파일 구성 pgpool에서 관리작업을 수행할 수 있는 PCP 커맨드를 제공하는데, pcp.conf 파일은 그 커맨드를 사용할 때 인증에 사용되는 사용자/비밀번호 파일입니다. pcp.conf.sample 파일을 참조하여 pcp.conf 파일명으로 복사하여 사용합니다.
  • pgpool.conf 환경설정파일 구성 pgpool의 기본 구성파일로, -f 옵션을 사용하여 pgpool 시작 시 파일 경로 지정이 필요합니다. pgpool.conf.sample을 pgpool.conf로 복사하여 사용합니다. 가장 처음에 클러스터링 모드를 설정해야하며, 클러스터링 모드는 구축 후 서버를 시작한 이후에 변경이 불가합니다.
  • 백엔드 정보 구성 PostgreSQL 백엔드 서버를 인식하기 위해 pgpool.conf 에서 백엔드 파라미터 설정이 필요하며,최소한 backend_hostname 및 backend_port 매개변수 설정이 필요합니다.

pgpool-II 운영

  • pgpool 및 postgresql 시작pgpool 시작은 다음과 같이 실행할 수 있습니다.
pgpool [ -c] [ -f CONFIG_FILE ] [ -F PCP_CONFIG_FILE ] [ -a HBA_CONFIG_FILE ]
  • pgpool failover 프로세스 트리거가 먼저 발생하여 PostgreSQL을 다운 상태 읽어올 수 있기 때문에 PostgreSQL 서버를 먼저 시작하고, pgpool-II을 실행합니다.
  • pgpool 및 postgresql 중지pgpool 종료는 다음과 같이 실행할 수 있습니다.
  • -m옵션을 이용해 구체적인 종료 방법을 지정할 수 있습니다.
pgpool [ -f CONFIG_FILE ] [ -F PCP_CONFIG_FILE ] [ -a HBA_CONFIG_FILE ][ -m SHUTDOWN-MODE ] stop
  • fast/immediate : 모든 클라이언트의 연결이 있더라도 즉시 pgpool을 종료합니다.
  • smart : 모든 클라이언트 연결 종료가 될 때까지 대기합니다.
  • pgpool을 종료 할 때도 마찬가지로 pgpool failover 프로세스 트리거가 먼저 발생하여 PostgreSQL을 다운 상태 읽어올 수 있기 때문에 pgpool 종료 후 PostgreSQL 서버를 종료하는 것을 권장합니다.

PCP 커맨드

  • PCP(Pgpool Control Protocol) command를 통해 pgpool을 운영할 수 있습니다.
  • 네트워크를 통해 데이터베이스 노드를 검색하고 pgpool을 관리 목적을 위한 커맨드입니다.
커맨드 종류 기능 설명
pcp_node_count 총 데이터베이스 노드 수 표시
pcp_node_info 주어진 노드 ID에 대한 정보 표시
pcp_health_check_stats 주어진 노드 ID 에 대한 상태 확인 통계 데이터를 표시
pcp_watchdog_info pgpool-II의 watchdog 상태를 표시
pcp_proc_count pgpool-II 하위 프로세스 ID 에 대한 정보 표시
pcp_proc_info 지정된 pgpool-II 하위 프로세스 ID 에 대한 표시
pcp_pool_status pgpool.conf에 정의된 대로 매개변수 값을 표시
pcp_detach_node pgpool-II 에서 지정된 노드를 분리 pgpool-II에 대한 기존 연결이 강제로 끊김
pcp_attach_node 지정된 노드를 pgpool-II에 연결
pcp_promote_node 지정된 노드를 pgpool-II의 Primary로 승격
pcp_stop_pgpool pgpool-II 프로세스를 종료
pcp_reload_config pgpool-II 구성 파일을 다시 로드
pcp_recovery_node 지정된 백엔드 노드를 복구하여 연결
  • 예시
$ pcp_node_info -h /var/run/test -a -v -w
Hostname               : 192.168.40.1133
Port                   : 5432
Status                 : 2
Weight                 : 0.500000
Status Name            : up
Backend Status Name    : up
Role                   : primary
Backend Role           : primary
Replication Delay      : 0
Replication State      : none
Replication Sync State : none
Last Status Change     : 2023-06-14 14:57:36
반응형