Lakebase에는 서버 연결 풀을 유지하고 여러 클라이언트 연결에서 공유하는 기본 제공 PgBouncer 연결 풀러가 포함되어 있습니다. 풀러는 최대 10,000개의 동시 클라이언트 연결을 지원하므로 서버리스 함수, 웹 API 및 많은 수명이 짧은 연결을 여는 다른 애플리케이션에 적합합니다.
연결 풀링에는 네이티브 Postgres 암호 인증이 필요합니다. OAuth 역할에는 사용할 수 없습니다.
연결 풀링 작동 방식
Postgres는 각 클라이언트에 대해 별도의 프로세스를 만들기 때문에 각 Postgres 연결에서 서버 리소스를 사용합니다. 동시 연결이 증가함에 따라 서버의 연결 제한을 빠르게 소진할 수 있습니다.
연결 풀러는 애플리케이션과 Postgres 사이에 있습니다. 클라이언트는 풀러에 연결하고, 풀러는 쿼리를 더 작은 실제 서버 연결 풀로 전달합니다. Lakebase는 트랜잭션 모드에서 PgBouncer를 실행하므로 서버 연결은 단일 트랜잭션 기간 동안만 유지된 다음 풀로 반환됩니다. 이렇게 하면 많은 클라이언트가 작은 서버 연결 풀을 공유할 수 있습니다.
연결 풀
PgBouncer는 각 데이터베이스 및 사용자 조합에 대해 별도의 풀을 만듭니다. 동일한 데이터베이스에 연결하는 두 사용자는 독립적인 풀을 가져옵니다. 각 풀의 크기는 컴퓨팅 크기에 따라 달라지는 Postgres max_connections 제한의 약 90%입니다.
풀의 모든 연결이 사용 중이면 새 클라이언트 요청이 큐에서 대기합니다. 2분 이내에 서버 연결을 사용할 수 없으면 클라이언트에서 시간 제한 오류가 발생합니다.
다이어그램은 여러 사용자의 여러 클라이언트 연결이 제한된 수의 실제 Postgres 연결을 공유하는 별도의 PgBouncer 풀(사용자/데이터베이스 조합당 하나)을 통해 라우팅하는 방법을 보여 줍니다.
연결 제한
세 가지 제한은 연결 풀링을 제어합니다.
| 제한 | 가치 | 제어하는 내용 |
|---|---|---|
클라이언트 연결(max_client_conn) |
10000 | 애플리케이션에서 PgBouncer로의 최대 연결 |
풀 크기(default_pool_size) |
~90%의 max_connections |
(사용자, 데이터베이스) 쌍당 활성 서버 연결 |
직접 연결(max_connections) |
컴퓨팅 크기에 따라 다름 | 최대 직접 Postgres 접속 |
직접 연결 제한은 컴퓨팅 크기에 따라 달라집니다. 예를 들어 8 CU 컴퓨팅은 1,678개의 직접 연결을 지원하고 16개의 CU 컴퓨팅은 3,357을 지원합니다. 전체 목록은 컴퓨팅 사양을 참조하세요.
10,000개의 클라이언트 연결 제한이 10,000개의 동시 쿼리 결과를 의미하지는 않습니다. PgBouncer에서 허용하는 최대 클라이언트 연결 수를 나타냅니다. 동시 활성 트랜잭션 수는 풀 크기(약 90%) max_connections로 제한됩니다.
연결 풀링 활성화
사전 요구 사항
- Lakebase 자동 크기 조정 프로젝트가 활성화되어 있어야 합니다.
- 프로젝트에 네이티브 Postgres 암호 역할이 있어야 합니다. 자세한 내용은 네이티브 Postgres 암호 역할 만들기를 참조하세요.
- 읽기 전용 컴퓨팅 인스턴스에서 연결 풀링을 사용하려면 읽기 전용 컴퓨팅 인스턴스에 대한 액세스를 허용하는 고가용성 엔드포인트가 있어야 합니다. 고가용성을 참조하세요.
단계
- Lakebase 앱에서 프로젝트로 이동하여 연결을 클릭합니다.
- 연결할 분기 및 컴퓨팅을 선택합니다.
- 역할 드롭다운에서 네이티브 Postgres 암호 역할을 선택합니다. 연결 풀링 스위치는 암호 역할을 선택한 경우에만 표시됩니다. OAuth 역할에서는 숨겨집니다.
- 연결 풀링을 켭니다.
- 연결 문자열 복사하여 애플리케이션에서 사용합니다.
연결 문자열 형식
풀러 연결 문자열은 직접 데이터베이스 연결과는 다른 호스트 이름을 사용합니다. 호스트 이름에는 읽기-쓰기 컴퓨팅의 경우 엔드포인트 ID 뒤에 -pooler가 포함되고, 읽기 전용 컴퓨팅의 경우 -ro-pooler가 포함됩니다:
| 컴퓨팅 유형 | 호스트 이름 형식 | 사용 시기 |
|---|---|---|
| 읽기-쓰기 컴퓨팅 | <endpoint-id>-pooler.<region>.<cloud>.databricks.com |
모든 쓰기 및 읽기 트래픽 |
| 읽기 전용 컴퓨팅 | <endpoint-id>-ro-pooler.<region>.<cloud>.databricks.com |
트래픽만 읽습니다. 읽기 액세스가 사용하도록 설정된 고가용성 엔드포인트가 필요합니다. |
둘 다 포트 5432를 사용합니다.
메모
Lakebase 앱의 Connect 대화 상자에서 직접 풀러 연결 문자열을 복사하여 엔드포인트, 지역 및 클라우드에 대한 올바른 호스트 이름을 얻으세요.
PgBouncer 구성
Lakebase는 다음 설정을 사용하여 PgBouncer를 관리합니다. 이러한 설정은 고정되어 있으며 사용자 지정할 수 없습니다.
[pgbouncer]
pool_mode=transaction
max_client_conn=10000
default_pool_size=0.9 * max_connections
max_prepared_statements=1000
query_wait_timeout=120
| 설정 | Description |
|---|---|
pool_mode=transaction |
서버 연결은 각 트랜잭션 후에 풀로 돌아갑니다. 트랜잭션 모드를 참조하세요. |
max_client_conn=10000 |
PgBouncer에서 허용하는 최대 동시 클라이언트 연결입니다. |
default_pool_size=0.9 * max_connections |
(사용자, 데이터베이스) 쌍당 활성 서버 연결 컴퓨팅 크기에 따라 다릅니다. |
max_prepared_statements=1000 |
트랜잭션 모드에서 프로토콜 수준 준비된 문을 허용합니다. 추적된 명령문 수를 클라이언트 연결당 1,000개로 제한합니다. |
query_wait_timeout=120 |
시간 제한 오류가 발생하기 전에 클라이언트가 서버 연결을 대기하는 시간(초)입니다. |
트랜잭션 모드
트랜잭션 모드는 연결 효율성을 향상하지만 영구 서버 연결이 필요한 특정 Postgres 기능을 제한합니다. 연결 풀러를 사용할 때는 다음 기능을 사용할 수 없습니다.
SQL 수준 준비된 문:
PREPARE및DEALLOCATE문은 트랜잭션 모드에서 지원되지 않습니다. 드라이버 수준의 준비된 문장(psycopg, node-postgres, JDBC 및 이와 유사한 라이브러리에서 내부적으로 사용됨)은 PgBouncer의 프로토콜 차원 지원을 통해 올바르게 작동합니다. JDBC의 경우, 프리페어드 스테이트먼트와 관련된 오류가 표시되면, 명명된 서버 측 프리페어드 스테이트먼트 캐싱을 비활성화하기 위해prepareThreshold=0를 설정합니다.세션 수준 설정:
SET각 트랜잭션이 다른 서버 연결을 사용할 수 있으므로 명령은 트랜잭션 간에 유지되지 않습니다. 다음은 그 예입니다.BEGIN; SET search_path TO myschema; SELECT * FROM mytable; -- works in this transaction COMMIT; -- connection returns to pool after COMMIT SELECT * FROM mytable; -- ERROR: relation "mytable" does not exist설정을 영구적으로 적용하려면 다음을 대신 사용합니다
ALTER ROLE.ALTER ROLE myrole SET search_path TO myschema, public;세션 보유 임시 테이블: 트랜잭션 간에 지속되는 임시 테이블은 사용할 수 없습니다. 풀에 반환된 연결은 다음 트랜잭션에서 다른 클라이언트에 할당될 수 있습니다.
WITH HOLD커서: 영구 연결을 사용하여 선언된WITH HOLD커서는 지원되지 않습니다.권고 잠금: PgBouncer는 권고 잠금을 지원하지 않습니다. 권고 잠금에는 트랜잭션 모드에서 사용할 수 없는 영구 서버 연결이 필요합니다.
LISTEN/NOTIFY: 지원되지 않습니다. pub/sub 메시징이 필요한 애플리케이션에 대해 직접(풀링되지 않은) 연결을 사용합니다.pg_dump및 스키마 마이그레이션:pg_dump에 직접 연결하여 스키마 마이그레이션 및 세션 수준 상태를 사용하는 기타 도구에 사용합니다.
메모
세션 수준 Postgres 기능이 필요한 애플리케이션의 경우 연결 대화 상자에서 연결 풀링 스위치를 사용 설정하지 않고 직접 연결 문자열을 사용하세요.