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 --helpCLI 플래그 > 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.tomlpsql -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 = trueopenproxy /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 -fsudo systemctl stop openproxy
sudo systemctl restart openproxyopenproxy
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=20openproxy 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.tomlpsql -h 127.0.0.1 -p 6432 -U <admin_username> openproxySET key = value# 설정 파일에서 enabled 변경 후 반드시 재시작
sudo systemctl restart openproxy[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