All pages
1 of 3

Loading...

Loading...

Loading...

Openproxy

OpenProxy는 Rust로 작성된 PostgreSQL 커넥션 풀러 및 프록시입니다. OpenSQL HA 환경에서 애플리케이션과 PostgreSQL 클러스터 사이에 위치하여 커넥션 풀링, 읽기/쓰기 분리, 자동 Failover, VRRP 기반 고가용성을 제공합니다.

이 문서는 다음 두 가지로 구성됩니다.

  • 사용 설명서 — 실행 방법, 운영 모드, 관리자 콘솔, 실행 옵션 등 운영에 필요한 절차를 설명합니다.

  • 설정 레퍼런스 — 설정 파일의 모든 파라미터와 허용 값을 설명합니다.

Openproxy 사용 설명서

OpenProxy 사용 설명서

버전: 1.1.3


1. Synopsis

openproxy [config_file]
openproxy show [--full] [--format toml|json] [--section <섹션명>]
openproxy edit [--set <key>=<value>]
openproxy encode [password]
openproxy --force-config-file [config_file]
openproxy [--log-target file|stdout|both] [--log-level trace|debug|info|warn|error]
          [--log-dir <디렉토리>] [--max-logfile-num <개수>] [--log-format text|structured|debug]
openproxy --version
openproxy --help

2. 개요

OpenProxy는 Rust로 작성된 PostgreSQL 커넥션 풀러 및 프록시입니다. 애플리케이션은 OpenProxy를 PostgreSQL 서버처럼 연결하며, OpenProxy가 실제 서버 연결을 관리합니다.

주요 기능

  • 커넥션 풀링: 새 연결 생성 비용을 줄여 성능을 개선합니다.

  • 읽기/쓰기 분리: 쿼리를 자동으로 분석하여 쓰기는 primary, 읽기는 replica로 라우팅합니다.

  • 로드 밸런싱: 여러 replica 간에 읽기 쿼리를 분산합니다.

  • 자동 Failover: OpenSQL 에서 primary가 변경되면 자동으로 감지하여 새 primary로 연결합니다.

  • etcd 연동: etcd에 설정을 저장하고 여러 OpenProxy 인스턴스 간에 설정을 공유합니다.

  • VRRP / VIP: 여러 OpenProxy 인스턴스 앞단에 가상 IP를 제공하여 고가용성을 구성합니다.


OpenProxy는 두 가지 풀링 모드를 지원합니다.

트랜잭션 풀링 (transaction) — 권장

트랜잭션이 시작될 때 서버 연결을 할당하고, 트랜잭션이 끝나면 즉시 풀로 반환합니다. 하나의 서버 연결을 여러 클라이언트가 순차적으로 재사용하므로 연결 수를 크게 줄일 수 있습니다.

단, 트랜잭션 외부에서 SET 명령어나 임시 테이블을 사용하는 경우 의도하지 않은 동작이 발생할 수 있습니다.

세션 풀링 (session)

클라이언트가 연결된 동안 서버 연결이 전용으로 유지됩니다. SET 명령, 준비된 구문, 임시 테이블 등 세션 상태를 사용하는 애플리케이션에 적합합니다. 단, 서버 연결 수 절감 효과가 트랜잭션 풀링에 비해 작습니다.

query_parser_enabled = true와 query_parser_read_write_splitting = true를 설정하면 OpenProxy가 SQL 쿼리를 파싱하여 자동으로 역할을 결정합니다.

  • SELECT → replica로 라우팅

  • INSERT, UPDATE, DELETE, DDL → primary로 라우팅

primary_reads_enabled = true로 설정하면 replica가 없거나 부하 분산이 필요한 경우 primary도 읽기 대상에 포함됩니다.

OpenProxy는 두 가지 운영 모드를 지원합니다.

파일 단독 모드

설정 파일(openproxy.toml)만 사용합니다. 설정 파일이 변경되면 5초 주기로 자동 감지하여 reload합니다. 단일 서버 환경이나 etcd 없이 운영하는 경우에 적합합니다.

etcd 연동 모드 (HA)

설정을 etcd에 저장하고 여러 노드가 공유합니다. etcd의 설정이 변경되면 모든 OpenProxy 인스턴스에 자동으로 반영됩니다. Patroni와 동일한 etcd 클러스터를 사용하여 primary/replica 역할을 자동으로 감지합니다.

설정이 여러 곳에 있을 경우 다음 우선순위를 따릅니다.

--force-config-file 옵션을 사용하면 etcd를 무시하고 설정 파일만 사용합니다.

여러 OpenProxy 인스턴스를 운영할 때 클라이언트가 항상 활성 인스턴스에 연결할 수 있도록 가상 IP(VIP)를 제공합니다. VRRP 프로토콜을 사용하여 인스턴스 간에 VIP 소유권을 협상하며, 활성 인스턴스가 다운되면 다른 인스턴스가 VIP를 인수합니다.

VRRP 기능을 사용하려면 CAP_NET_ADMIN, CAP_NET_RAW 권한이 필요합니다. OpenSQL 에서 제공하는 systemd 서비스 파일을 사용하면 해당 권한이 자동으로 부여됩니다.


  1. 설정 파일을 작성합니다.

  1. OpenProxy를 실행합니다.

  1. 접속을 확인합니다.

  1. 설정 파일에 etcd 섹션을 추가합니다.

  1. OpenProxy를 실행합니다.

etcd에 연결되면 설정이 etcd에 저장되고 이후부터는 etcd를 통해 관리됩니다.


운영 환경에서는 systemd 서비스로 등록하여 실행하는 것을 권장합니다. 서버 재부팅 시 자동으로 시작되고, 비정상 종료 시 자동으로 재시작됩니다.

서비스 파일 위치: /etc/systemd/system/openproxy.service

서비스 등록 및 시작

서비스 중지 및 재시작


OpenProxy를 시작합니다. config_file을 지정하지 않으면 현재 디렉토리의 openproxy.toml을 사용합니다.

현재 로드된 설정을 출력하고 종료합니다. 서비스를 시작하지 않습니다.

설정 파일 경로를 지정하는 경우, 경로는 반드시 서브커맨드 앞에 위치해야 합니다.

설정을 편집하고 저장합니다.

설정 파일 경로를 지정하는 경우, 경로는 반드시 서브커맨드 앞에 위치해야 합니다.

etcd가 활성화된 경우, 변경 내용은 etcd에 저장되며 설정 파일은 수정되지 않습니다. 단, virtual_router 설정은 etcd에 저장되지 않으므로 설정 파일에서 직접 수정해야 합니다.

데이터베이스 사용자 비밀번호를 SCRAM-SHA-256 서버에서 인식할 수 있는 형태로 암호화합니다.

출력되는 결과값은 openproxy.toml 파일의 사용자 Password로 사용할 수 있습니다. auth_type 값이 scram-sha-256 형태로 지정된 경우에만 올바르게 동작합니다.

PostgreSQL에 연결하기 위한 server_password 값으로는 사용할 수 없습니다.

etcd가 활성화된 환경에서도 설정 파일만 사용합니다. etcd 연결 문제 발생 시 임시 우회 수단으로 사용합니다.

옵션
기본값
설명

OpenProxy는 관리자 콘솔을 제공합니다. PostgreSQL 클라이언트로 openproxy 데이터베이스에 접속하여 사용합니다.

admin_username과 admin_password는 설정 파일의 general.admin_username, general.admin_password에 정의된 값입니다.

명령어
설명
명령어
설명

일부 설정 값을 런타임에 변경합니다.


general.etcd.enabled 값을 false에서 true로, 또는 true에서 false로 변경하는 경우 반드시 OpenProxy 프로세스를 재시작해야 합니다.

파일 기반 설정 자동 reload가 변경을 감지하더라도, etcd watch 태스크는 프로세스 시작 시 최초 1회만 활성화됩니다. 런타임 중 enabled 값을 변경해도 etcd 연동이 활성화되거나 비활성화되지 않습니다.

etcd가 활성화된 상태(enabled = true)에서 RELOAD 명령 또는 SIGHUP 시그널을 보내면 설정 전체를 재로드하는 대신 Patroni 역할 정보만 갱신합니다.

etcd 연동 환경에서 설정을 변경하려면 openproxy edit 명령을 사용하거나 etcd에 직접 값을 저장해야 합니다.

[general.virtual_router] 설정은 노드마다 다를 수 있으므로(interface 이름, priority 등) etcd에 저장되지 않습니다. 해당 설정은 각 노드의 설정 파일에서 직접 관리해야 합니다.

트랜잭션 내부 쿼리 → 트랜잭션 시작 시점에 결정된 역할 유지

--log-dir

logs

로그 파일 저장 디렉토리. log-target이 file 또는 both일 때 사용

--max-logfile-num

5

로그 파일 최대 보관 개수. 로그 파일은 매일 자정에 새로 생성되며, 보관 개수 초과 시 오래된 파일부터 삭제

--log-format

text

로그 출력 형식. text (사람이 읽기 쉬운 형식), structured (JSON 등 구조화 형식), debug

SHOW STATS

쿼리 수, 바이트 수, 응답 시간 등 통계

SHOW DATABASES

설정된 풀(데이터베이스) 목록

SHOW USERS

설정된 사용자 목록

SHOW CONFIG

현재 로드된 설정 값

SHOW LISTS

내부 오브젝트 개수 통계

SHOW BANS

일시 차단된 서버 목록

SHOW VERSION

OpenProxy 버전 정보

SHOW HELP

사용 가능한 명령어 목록

SHUTDOWN

OpenProxy를 종료합니다.

--log-target

both

로그 출력 대상. file (파일만), stdout (표준출력만), both (둘 다)

--log-level

info

로그 레벨. trace, debug, info, warn, error

SHOW POOLS

각 풀의 커넥션 수, 대기 클라이언트 수 등 풀 상태

SHOW CLIENTS

현재 연결된 클라이언트 목록

SHOW SERVERS

현재 열려 있는 서버 연결 목록

RELOAD

설정을 다시 로드합니다. etcd 활성 시 Patroni 역할만 갱신합니다.

PAUSE [db, user]

지정한 풀(또는 전체)의 새 쿼리 수신을 중지합니다. 진행 중인 트랜잭션은 완료를 기다립니다.

RESUME [db, user]

PAUSE로 중지된 풀을 재개합니다.

3. 핵심 개념

3.1 커넥션 풀링 모드

3.2 읽기/쓰기 분리 (Query Router)

3.3 운영 모드

3.4 설정 우선순위

3.5 VRRP / VIP

4. 빠른 시작

파일 단독 모드

etcd 연동 모드 (HA)

5. systemd 서비스 등록

6. 실행 옵션

openproxy [config_file]

openproxy show

openproxy edit

openproxy encode

--force-config-file

로그 옵션

7. 관리자 콘솔

접속 방법

SHOW 명령어

제어 명령어

SET 명령어

8. 제약사항

etcd.enabled 변경 시 프로세스 재시작 필요

etcd 활성 시 RELOAD 동작 차이

virtual_router는 etcd 동기화 대상에서 제외

CLI 플래그 > etcd > 설정 파일
[general]
host = "0.0.0.0"
port = 6432
admin_username = "admin"
admin_password = "adminpassword"

[pools.mydb]
pool_mode = "transaction"
auth_type = "scram-sha-256"

[pools.mydb.users.0]
username = "appuser"
password = "apppassword"
server_username = "appuser"
server_password = "apppassword"
pool_size = 20

[pools.mydb.shards.0]
servers = [
    ["192.168.1.10", 5432, "primary"],
    ["192.168.1.11", 5432, "replica"],
]
database = "mydb"
openproxy /etc/openproxy/openproxy.toml
psql -h 127.0.0.1 -p 6432 -U user mydb
[general]
host = "0.0.0.0"
port = 6432
admin_username = "admin"
admin_password = "adminpassword"

[general.etcd]
enabled = true
endpoints = ["192.168.1.1:2379", "192.168.1.2:2379", "192.168.1.3:2379"]
patroni_namespace = "/service"
patroni_scope = "opensql"

[pools.mydb]
pool_mode = "transaction"
auth_type = "scram-sha-256"
query_parser_enabled = true
query_parser_read_write_splitting = true

[pools.mydb.users.0]
username = "appuser"
password = "apppassword"
server_username = "appuser"
server_password = "apppassword"
pool_size = 20

[pools.mydb.shards.0]
servers = [
    ["192.168.1.10", 5432, "Auto"],
    ["192.168.1.11", 5432, "Auto"],
    ["192.168.1.12", 5432, "Auto"],
]
database = "mydb"
use_patroni = true
openproxy /etc/openproxy/openproxy.toml
[Unit]
Description=OpenProxy - PostgreSQL Connection Pooler (OpenSQL)
After=network.target etcd.service
StartLimitIntervalSec=0

[Service]
User=opensql
Type=simple
Restart=always
RestartSec=5
Environment=RUST_LOG=info
ExecStart=/usr/bin/openproxy /etc/openproxy/openproxy.toml
StandardOutput=journal
StandardError=journal
SyslogIdentifier=openproxy
LimitNOFILE=65536
# VRRP 사용 시 필요. VRRP 미사용 시 제거 가능.
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW

[Install]
WantedBy=multi-user.target
# 서비스 파일 복사 후 daemon reload
sudo systemctl daemon-reload

# 부팅 시 자동 시작 활성화
sudo systemctl enable openproxy

# 서비스 시작
sudo systemctl start openproxy

# 상태 확인
sudo systemctl status openproxy

# 로그 확인
sudo journalctl -u openproxy -f
sudo systemctl stop openproxy
sudo systemctl restart openproxy
openproxy
openproxy /etc/openproxy/openproxy.toml
# 기본 (TOML 형식, 명시적으로 설정된 항목만)
openproxy show

# 기본값 포함 전체 설정 출력
openproxy show --full

# JSON 형식으로 출력
openproxy show --format json

# 특정 섹션만 출력
openproxy show --section general
openproxy show --section pools.mydb
# OK: config_file이 서브커맨드 앞에 위치
openproxy /etc/openproxy/openproxy.toml show

# Fail: config_file이 서브커맨드 뒤에 오면 인식되지 않음
openproxy show /etc/openproxy/openproxy.toml
# 대화형: $EDITOR로 설정 파일 열기
openproxy edit

# 비대화형: 특정 값 변경
openproxy edit --set general.pool_size=20
openproxy edit --set general.connect_timeout=2000

# 여러 값 동시 변경
openproxy edit --set general.connect_timeout=2000 --set general.idle_timeout=300000
# OK: config_file이 서브커맨드 앞에 위치
openproxy /etc/openproxy/openproxy.toml edit --set general.pool_size=20

# Fail: config_file이 서브커맨드 뒤에 오면 인식되지 않음
openproxy edit /etc/openproxy/openproxy.toml --set general.pool_size=20
openproxy encode 'mypassword!@#'
[pools.my_pool]
auth_type = "scram-sha-256"

[pools.my_pool.users.0]
username = "opensql_user"
password = "SCRAM-SHA-256$4096:..."
openproxy --force-config-file /etc/openproxy/openproxy.toml
# 로그를 파일로만 저장, 저장 경로 및 보관 개수 지정
openproxy --log-target file --log-dir /var/log/openproxy --max-logfile-num 10 /etc/openproxy/openproxy.toml

# 로그 레벨을 debug로 설정하여 표준출력으로만 출력
openproxy --log-target stdout --log-level debug /etc/openproxy/openproxy.toml
psql -h 127.0.0.1 -p 6432 -U <admin_username> openproxy
SET key = value
# 설정 파일에서 enabled 변경 후 반드시 재시작
sudo systemctl restart openproxy

OpenProxy 설정 레퍼런스

버전: 1.1.3


1. 설정 파일 구조

OpenProxy는 TOML 형식의 설정 파일을 사용합니다. 기본 파일 이름은 openproxy.toml이며, 실행 시 경로를 지정할 수 있습니다.

설정 파일은 다음 섹션으로 구성됩니다.

섹션
설명

파라미터
기본값
설명
파라미터
기본값
설명
파라미터
기본값
설명
파라미터
기본값
설명
파라미터
기본값
설명
파라미터
기본값
설명

etcd 연동을 설정합니다. etcd를 사용하지 않는 경우 이 섹션을 설정 파일에서 제거합니다.

파라미터
필수
기본값
설명

⚠️ 주의: enabled 변경 시 프로세스 재시작 필요

enabled 값을 변경하면 설정 파일 자동 reload가 변경을 감지하더라도 etcd 연동이 활성화되거나 비활성화되지 않습니다. 반드시 OpenProxy 프로세스를 재시작해야 합니다.


VRRP 기반 가상 IP(VIP)를 설정합니다. 여러 OpenProxy 인스턴스에 VIP를 적용할 때 사용합니다. VIP가 필요 없는 경우 이 섹션을 설정 파일에서 제거합니다.

파라미터
필수
설명

참고: VRRP 기능은 CAP_NET_ADMIN, CAP_NET_RAW 권한을 필요로 합니다. systemd 서비스 파일의 AmbientCapabilities 설정을 확인하십시오.

참고: virtual_router 설정은 etcd에 동기화되지 않습니다. 각 노드의 설정 파일에서 개별적으로 관리해야 합니다.


명시적으로 Pool로 등록되지 않은 사용자 이름 - DB 이름 쌍을 가진 사용자 요청을 처리할 글로벌 Connection Pool을 정의합니다. 사용자 이름과 비밀번호를 정의할 수 없으므로 PostgreSQL 에 정의된 사용자 정보를 가져와 클라이언트 요청을 인증하는 auth_passthrough 방식만을 지원합니다. 정의한 auth_query 는 이 Pool의 첫번째Shard에 정의한 데이터베이스에서 실행됩니다.

기타 Users, Shards 설정은 이름이 정의된 Explicit Pool 에서의 설정과 동일합니다. 사용자 정의는 첫번째 사용자 정의를 참조하며 pool_size, statement_timeout 정의만을 참조합니다.

파라미터
기본값
설명

풀을 정의합니다. <name>은 클라이언트가 -d 옵션으로 지정하는 데이터베이스 이름이 됩니다. 풀은 여러 개 정의할 수 있습니다.

파라미터
기본값
설명
파라미터
기본값
설명
파라미터
기본값
설명
파라미터
기본값
설명

[general] 섹션의 값을 풀별로 오버라이드할 수 있습니다. 설정하지 않으면 [general]의 값을 따릅니다.

파라미터
설명

풀에 접속할 수 있는 사용자를 정의합니다. <n>은 0부터 시작합니다. 사용자는 여러 명 정의할 수 있습니다.

파라미터
필수
기본값
설명

pool_size 계산 방법

(PostgreSQL max_connections - 슈퍼유저 연결 수) / 풀 수

예: max_connections = 100, 풀 2개인 경우 → pool_size = 45


OpenProxy가 연결할 PostgreSQL 서버 목록을 정의합니다. <n>은 0부터 시작합니다. 샤딩을 사용하지 않는 일반 환경에서는 shards.0 하나만 정의합니다.

파라미터
필수
설명

servers 역할 값

값
설명

Patroni 연동 없이 직접 역할 지정

Patroni 연동 (역할 자동 감지)


읽기/쓰기 분리 없이 단일 primary에만 연결하는 가장 단순한 구성입니다.

Patroni HA 클러스터와 연동하여 읽기/쓰기 분리 및 자동 Failover를 사용하는 구성입니다.

[pools.{pool_name}] 형태로 정의되지 않은 사용자 요청을 처리할 Global 레벨의 Default Pool을 정의하는 예시입니다. Default Pool의 경우 임의 사용자에 대한 비밀번호를 설정할 수 없어 인증을 PostgreSQL로 위임하므로 auth_query 관련 설정이 반드시 필요합니다.

또한 scram-sha-256 타입 인증을 사용하면서 auth_query 를 함께 사용하는 경우는 OpenProxy에서 PostgreSQL로 접속하기 위한 패스워드를 알 수 없으므로 PostgreSQL 로의 연결이 반드시 trust 레벨로 설정되어야 합니다.

정의된 Pool 밑에 모든 사용자 요청을 처리할 Wildcard * 사용자를 생성하는 예시입니다. 마찬가지로 auth_query 정의가 필요하며 해당 쿼리는 첫번째 shards 의 데이터베이스에서 실행됩니다.

또한 scram-sha-256 타입 인증을 사용하면서 auth_query 를 함께 사용하는 경우는 OpenProxy에서 PostgreSQL로 접속하기 위한 패스워드를 알 수 없으므로 PostgreSQL 로의 연결이 반드시 trust 레벨로 설정되어야 합니다.

server_lifetime

3600000 (ms)

서버 연결 최대 유지 시간. 초과 시 유휴 연결 종료

idle_client_in_transaction_timeout

0 (ms)

트랜잭션 내 유휴 클라이언트 대기 시간. 0은 무제한

ban_time

60 (s)

오류 발생 서버를 일시 차단하는 시간

shutdown_timeout

60000 (ms)

종료 시 진행 중인 트랜잭션 완료 대기 시간

healthcheck_timeout

1000 (ms)

서버 헬스체크 타임아웃

healthcheck_delay

30000 (ms)

헬스체크 주기

—

etcd 엔드포인트 목록. 예: ["192.168.1.1:2379", "192.168.1.2:2379"]

patroni_scope

예

—

Patroni 클러스터 scope. Patroni의 PATRONI_SCOPE 환경변수와 일치해야 함

patroni_namespace

아니오

"/service"

Patroni DCS namespace. Patroni의 PATRONI_NAMESPACE 환경변수와 일치해야 함

username

아니오

없음

etcd 인증 사용자 이름

password

아니오

없음

etcd 인증 패스워드

priority

예

VRRP 우선순위 (1~255). 값이 높을수록 VIP를 우선 소유

advert_int

예

VRRP 광고 패킷 전송 주기 (초)

vip_addresses

예

가상 IP 목록. CIDR 표기법 사용. 예: ["192.168.1.100/24"]

pre_promote_script

아니오

MASTER 승격 직전 실행할 스크립트 경로

pre_demote_script

아니오

MASTER 강등 직전 실행할 스크립트 경로

unicast_peers

아니오

유니캐스트 VRRP를 사용하는 경우 상대 노드 IP 목록

auth_query_password

—

auth_query 를 실행할 사용자 비밀번호

primary_reads_enabled

false

읽기 쿼리 대상에 primary 포함 여부

default_role

"any"

역할 결정 불가 시 기본 라우팅 대상. "primary", "replica", "any"

—

클라이언트 인증 패스워드

pool_size

예

—

이 사용자를 위해 유지할 서버 연결 최대 수

server_username

아니오

username과 동일

PostgreSQL 서버에 접속하는 계정 이름. 클라이언트 계정과 다를 수 있음

server_password

아니오

—

PostgreSQL 서버 접속 패스워드

min_pool_size

아니오

0

유지할 서버 연결 최소 수

statement_timeout

아니오

0 (ms)

쿼리 실행 제한 시간. 0은 무제한

pool_mode

아니오

풀의 pool_mode

사용자별 풀링 모드 오버라이드

use_patroni

아니오

Patroni 연동 활성화 여부. true로 설정하면 역할을 Patroni가 관리

patroni_port

아니오

Patroni REST API 포트. 기본값: 8008

[general]

전역 설정 (네트워크, 타임아웃, 관리자 계정 등)

[general.etcd]

etcd 연동 설정 (선택)

[general.virtual_router]

VRRP / VIP 설정 (선택)

[general.default_pool]

글로벌 Pool (선택)

[pools.<name>]

풀 설정. <name>은 클라이언트가 접속할 데이터베이스 이름

[pools.<name>.users.<n>]

풀별 사용자 설정 (<n>은 0부터 시작하는 인덱스)

[pools.<name>.shards.<n>]

풀별 서버 연결 설정 (<n>은 0부터 시작하는 인덱스)

host

"0.0.0.0"

수신 IP 주소. 0.0.0.0은 모든 인터페이스에서 수신

port

5432

수신 포트. PgBouncer와 동일하게 6432를 관례적으로 사용

admin_username

"admin"

관리자 콘솔 접속 계정

admin_password

"admin"

관리자 콘솔 접속 패스워드. 운영 환경에서는 반드시 변경

connect_timeout

1000 (ms)

서버 연결 수립 대기 시간. 초과 시 해당 서버를 일시 차단

idle_timeout

600000 (ms)

유휴 서버 연결 유지 시간. 초과 시 연결 종료

worker_threads

4

Tokio 비동기 워커 스레드 수. PostgreSQL과 같은 노드에서 실행하는 경우 CPU 코어 수의 절반 권장

server_round_robin

true

서버 선택 시 라운드로빈 사용 여부

tls_certificate

없음

TLS 인증서 파일 경로. 설정 시 클라이언트와의 TLS 연결 활성화

tls_private_key

없음

TLS 개인 키 파일 경로

server_tls

false

PostgreSQL 서버와의 TLS 연결 사용 여부

verify_server_certificate

false

서버 TLS 인증서 검증 여부

enabled

예

true

etcd 연동 활성화 여부

endpoints

interface

예

네트워크 인터페이스 이름. 예: "eth0"

router_id

예

VRRP 라우터 ID (1~255). 동일 네트워크 내 다른 VRRP 그룹과 중복되지 않아야 함

auth_query

—

사용자 이름과 패스워드 해시를 가져올 쿼리.

예: SELECT usename, password FROM pg_shadow WHERE usename = '$1'

auth_query_user

—

auth_query 를 실행할 사용자 이름

pool_mode

"transaction"

풀링 모드. "transaction" 또는 "session"

auth_type

"md5"

클라이언트 인증 방식. "md5" 또는 "scram-sha-256"

query_parser_enabled

false

SQL 파싱을 통한 자동 역할 결정 활성화

query_parser_read_write_splitting

false

읽기/쓰기 분리 활성화. query_parser_enabled = true 필요

load_balancing_mode

"random"

로드 밸런싱 방식. "random" 또는 "least_outstanding_connections"

prepared_statements_cache_size

0

풀 단위의 Prepared Statements를 저장할 Cache 크기. 0인 경우 클라이언트 별로 Prepared Statements를 관리함.

connect_timeout

서버 연결 수립 대기 시간 (ms)

idle_timeout

유휴 서버 연결 유지 시간 (ms)

server_lifetime

서버 연결 최대 유지 시간 (ms)

username

예

—

클라이언트가 사용하는 계정 이름. 지정되지 않은 사용자 이름에 대한 연결을 허용하고자 하는 경우 와일드카드 문자열 * 을 지정한 사용자 정의를 생성합니다.

password

servers

예

PostgreSQL 서버 목록. 각 항목은 ["호스트", 포트, "역할"] 형식

database

예

접속할 PostgreSQL 데이터베이스 이름

"primary"

쓰기 서버로 고정

"replica"

읽기 서버로 고정

"Auto"

Patroni 연동 시 사용. Patroni가 역할을 자동으로 결정

2. [general] 섹션

네트워크

관리자 계정

커넥션 및 타임아웃

성능

TLS (클라이언트 연결)

TLS (서버 연결)

3. [general.etcd] 섹션

4. [general.virtual_router] 섹션

5. [general.default_pool] 섹션

인증

6. [pools.<name>] 섹션

풀링 모드

인증

읽기/쓰기 분리

로드 밸런싱

타임아웃 (풀별 오버라이드)

7. [pools.<name>.users.<n>] 섹션

8. [pools.<name>.shards.<n>] 섹션 — 서버 연결 설정

9. 설정 예시

파일 단독 모드 (standalone)

etcd 연동 모드 (HA)

Global Pool 예시

Wildcard User 예시

예

예

[general.etcd]
enabled = true
endpoints = [
    "192.168.1.1:2379",
    "192.168.1.2:2379",
    "192.168.1.3:2379",
]
patroni_namespace = "/service"
patroni_scope = "postgres-cluster"

# etcd 인증이 설정된 경우
# username = "etcduser"
# password = "etcdpassword"
[general.virtual_router]
interface = "eth0"
router_id = 50
priority = 100
advert_int = 1
vip_addresses = ["192.168.1.100/24"]
[pools.mydb]
pool_mode = "transaction"
auth_type = "scram-sha-256"
query_parser_enabled = true
query_parser_read_write_splitting = true
[pools.mydb.users.0]
username = "appuser"
password = "apppassword"
server_username = "appuser"
server_password = "apppassword"
pool_size = 20
statement_timeout = 0

[pools.mydb.users.1]
username = "*"
pool_size = 10
statement_timeout = 0
[pools.mydb.shards.0]
servers = [
    ["192.168.1.10", 5432, "primary"],
    ["192.168.1.11", 5432, "replica"],
    ["192.168.1.12", 5432, "replica"],
]
database = "mydb"
[pools.mydb.shards.0]
servers = [
    ["192.168.1.10", 5432, "Auto"],
    ["192.168.1.11", 5432, "Auto"],
    ["192.168.1.12", 5432, "Auto"],
]
database = "mydb"
use_patroni = true
[general]
host = "0.0.0.0"
port = 6432
admin_username = "openproxy_admin"
admin_password = "adminpassword"

[pools.mydb]
pool_mode = "transaction"
auth_type = "scram-sha-256"

[pools.mydb.users.0]
username = "appuser"
password = "apppassword"
server_username = "appuser"
server_password = "apppassword"
pool_size = 20

[pools.mydb.shards.0]
servers = [
    ["192.168.1.10", 5432, "primary"],
]
database = "mydb"
[general]
host = "0.0.0.0"
port = 6432
admin_username = "openproxy_admin"
admin_password = "adminpassword"
worker_threads = 4

[general.etcd]
enabled = true
endpoints = [
    "192.168.1.1:2379",
    "192.168.1.2:2379",
    "192.168.1.3:2379",
]
patroni_namespace = "/service"
patroni_scope = "postgres-cluster"

# VRRP를 사용하는 경우 활성화
# [general.virtual_router]
# interface = "eth0"
# router_id = 50
# priority = 100
# advert_int = 1
# vip_addresses = ["192.168.1.100/24"]

[pools.mydb]
pool_mode = "transaction"
auth_type = "scram-sha-256"
query_parser_enabled = true
query_parser_read_write_splitting = true

[pools.mydb.users.0]
username = "appuser"
password = "apppassword"
server_username = "appuser"
server_password = "apppassword"
pool_size = 20

[pools.mydb.shards.0]
servers = [
    ["192.168.1.10", 5432, "Auto"],
    ["192.168.1.11", 5432, "Auto"],
    ["192.168.1.12", 5432, "Auto"],
]
database = "mydb"
use_patroni = true
[general.default_pool]
pool_mode = "transaction"

## 기타 Pool General 설정
auth_type = "scram-sha-256"
auth_query = "SELECT usename, passwd FROM pg_shadow WHERE usename = '$1'"
auth_query_user = "opensql"
auth_query_password = "opensql"

[general.default.pool.users.0]
## 이 값은 실제로 참조되지 않습니다. 클라이언트의 username을 참조하여 DB 연결을 생성합니다.
username = "*"
pool_size = 20
statement_timeout = 0

[general.default_pool.shards.0]
servers = [
    [ "pg-1", 5432, "auto" ],
    [ "pg-2", 5432, "auto" ]
]
## auth_query를 실행할 때만 참조되며 클라이언트 연결 시에는 실제로 참조되지 않습니다.
## 클라이언트의 DB name을 참조하여 DB 연결을 생성합니다.
database = "postgres"
use_patroni = true
[pools.mydb]
## 기존 Pool 정의
auth_type = "scram-sha-256"
auth_query = "SELECT usename, passwd FROM pg_shadow WHERE usename = '$1'"
auth_query_user = "opensql"
auth_query_password = "opensql"

[pools.mydb.users.0]
username = "*"
pool_size = 35
statement_timeout = 0