Snowflake Postgres 연결 풀링

연결 풀은 재사용할 수 있는 데이터베이스 연결의 캐시입니다. 클라이언트에서 요청이 들어오면 해당 요청 또는 트랜잭션에 대해 풀에서 사용 가능한 연결이 제공됩니다.

반대로, 연결 풀링이 없으면 클라이언트는 데이터베이스에 연결하여 연결을 설정해야 합니다. 새 연결을 열면 가용성과 성능에 영향을 줄 수 있습니다. PostgreSQL에서 서버가 새 프로세스를 “포크”하거나 생성하고, 사용 가능한 리소스를 소진하고 새 연결이 설정되지 못하게 방지할 수 있습니다. 연결 풀링은 이러한 문제를 완화하고 애플리케이션을 확장할 수 있도록 보장하는 데 도움이 됩니다.

연결 풀링이 필요합니까?

연결 풀링은 클라이언트 측 풀에서 또는 웹 서버의 여러 스레드/프로세스를 통해 애플리케이션에서 많은 수의 연결이 있을 때 특히 유용한 경우가 많습니다.

Snowflake Postgres 인스턴스에서 다음 쿼리를 실행하여 연결 풀링의 이점이 있는지 확인할 수 있습니다.

SELECT count(*),
       state
FROM pg_stat_activity
GROUP BY 2;
Copy
 count |             state
-------+-------------------------------
     7 | active
    69 | idle
    26 | idle in transaction
    11 | idle in transaction (aborted)
(4 rows)

활성 연결에 비해 유휴 연결의 수가 많으면 연결 풀링을 사용하는 것이 좋습니다.

PgBouncer를 사용한 연결 풀링

Snowflake Postgres는 연결 풀링을 위해 `pgBouncer<http://www.pgbouncer.org/>`_를 사용합니다. PgBouncer는 기본적으로 모든 Snowflake Postgres 인스턴스에서 사용할 수 있도록 제공되어 자체 “가상” 연결을 통해 네이티브 Postgres 연결을 멀티플렉싱하여 연결을 쉽게 관리할 수 있습니다. 기본적으로, Snowflake Postgres의 PgBouncer 인스턴스는 트랜잭션 풀링 모드에서 실행됩니다.

그러나 PgBouncer 서비스를 사용하려면 snowflake_pooler 확장 프로그램을 설치하여 사용하려는 각 데이터베이스에 대해 한 단계를 추가로 수행해야 합니다.

snowflake_pooler 확장 프로그램으로 PgBouncer 활성화하기

snowflake_admin Postgres 사용자는 데이터베이스에서 다음을 실행하여 snowflake_pooler 확장 프로그램을 설치합니다.

CREATE EXTENSION snowflake_pooler;
Copy

snowflake_pooler 란 무엇입니까?

``snowflake_pooler``는 ``snowflake_pooler``라는 사용자를 생성하는 간단한 확장 프로그램입니다. 이 사용자는 PgBouncer가 수신되는 연결을 인증할 수 있는 ``user_lookup``이라는 단일 함수에 액세스할 수 있습니다. 이를 통해 클라이언트가 PgBouncer에 연결할 때 Postgres의 정식 사용자 저장소를 쿼리하여 클라이언트의 자격 증명이 유효한지 확인할 수 있습니다.

참고

PgBouncer를 통해 연결하려는 각 데이터베이스에 snowflake_pooler 확장 프로그램을 개별적으로 설치해야 합니다. ``snowflake_pooler``가 설치되지 않은 경우 다음과 같은 오류가 수신될 수 있습니다.

failed: FATAL: bouncer config error

오류를 해결하려면 데이터베이스에 연결하고 :code:`CREATE EXTENSION snowflake_pooler;`를 실행합니다.

PgBouncer에 연결하기

클라이언트는 일반적인 5432 대신 포트 5431을 제외하고 기본 Postgres 데이터베이스에 사용하는 것과 동일한 연결 문자열을 사용하여 PgBouncer에 연결합니다.

psql postgres://my_application_user:my_application_password@p.43lmodgbqvdmlpbjirv22dfciu.db.postgresbridge.com:5431/mydb
Copy

수퍼 사용자 또는 복제 권한이 없는 역할만 PgBouncer를 통해 연결할 수 있습니다. application 역할, 팀 구성원을 위해 생성된 개별 사용자 역할 또는 사용자가 생성했을 수 있는 사용자 지정 사용자 역할(예: `CREATE ROLE<https://www.postgresql.org/docs/current/sql-createrole.html>`_ Postgres 명령 사용)을 사용하여 PgBouncer에 연결하도록 선택할 수 있습니다. 그러나 snowflake_pooler``에 의해 생성된 ``user_lookup 함수는 수퍼 사용자 및 복제 역할에 대한 조회를 거부합니다. Snowflake Postgres의 Postgres 사용자 및 역할에 대한 자세한 내용은 Snowflake Postgres 역할 섹션을 참조하세요.

Postgres에서 “사용자”와 “역할”이라는 용어는 대체로 동의어입니다. 한 가지 사소한 차이점은 CREATE USER(대 CREATE ROLE)는 LOGIN 특성(예: CREATE ROLE myuser LOGIN;)을 의미합니다.

풀링 모드

PgBouncer는 트랜잭션, 세션, 문의 3가지 풀링 모드를 지원합니다. 각 항목은 아래에 간략하게 설명되어 있으며 자세한 내용은 `PgBouncer 설명서<https://www.pgbouncer.org/features.html>`_에 나와 있습니다.

트랜잭션

트랜잭션 풀링 모드는 대부분의 사용자에게 권장되는 모드이므로 Snowflake Postgres 인스턴스는 기본적으로 이 모드에서 PgBouncer를 실행합니다.

참고

PgBouncer가 트랜잭션 풀링 모드에 있는 경우, PREPARE로 생성되고 EXECUTE로 실행되는 SQL 수준의 준비된 문은 서로 다른 서버 연결에서 실행될 수 있으므로 작동하지 않습니다. 그러나 애플리케이션의 Postgres 드라이버가 지원하는 경우 PgBouncer는 프로토콜 수준의 준비된 트랜잭션을 지원합니다. PgBouncer가 이를 처리하는 방법에 대한 자세한 내용은 해당 `max_prepared_statements<https://www.pgbouncer.org/config.html>`_ 설명서를 참조하세요.

프로토콜 수준의 준비된 문에 대한 PgBouncer의 지원을 사용하려면 PgBouncer:doc:`max_prepared_statements 설정<postgres-server-settings>`을 ``0``보다 큰 값으로 설정해야 합니다. Snowflake Postgres의 기본값은 ``250``이지만, 원하는 경우 다른 값으로 설정할 수 있습니다.

세션

세션 풀링 모드는 필요한 경우 Snowflake Postgres에서 지원됩니다. 이 풀링 모드를 사용하려면 클러스터에서 :doc:`pool_mode 설정<postgres-server-settings>`을 ``session``으로 설정합니다.

문 풀링 모드도 사용할 수 있습니다. 그러나 다중 문 트랜잭션에서는 오류가 발생합니다. 이 풀링 모드를 사용하려면 클러스터에서 :doc:`pool_mode 설정<postgres-server-settings>`을 ``statement``으로 설정합니다.

PgBouncer 비활성화하기

데이터베이스에서 snowflake_pooler 확장 프로그램을 삭제하면 더 이상 인증할 수 없으므로 PgBouncer가 기능적으로 비활성화됩니다.

DROP EXTENSION snowflake_pooler;
Copy