오픈 프록시(OpenProxy)

Rust 기반 서버 프로세스인 오픈프록시(OpenProxy) 설정 및 실행에 대해 설명합니다.

개요

OpenSQL 의 connection pooler, load-balancer, virtual-ip failover 기능을 담당하는 오픈프록시(OpenProxy)의 설정 및 실행에 대해 설명합니다.


환경 설정

해당 문서는 OpenProxy 실행될 때 설정할 수 있는 값들을 나열합니다. OpenProxy를 원하는 설정 파일로 실행시키고 싶다면 OpenProxy 명령어 뒤에 설정 파일의 경로를 입력합니다.

General Settings

[general] 에 선언되는 값들이다. general에 설정되는 값들은 port와 같은 네트워크 설정, OpenProxy의 admin 이름과 패스워드 등을 설정합니다.

변수명
Type
Default
Description

host

String

0.0.0.0

OpenProxy 프로세스가 시작될 때 바인딩 되는 호스트 주소

port

Number

6432

OpenProxy 프로세스가 시작될 때 바인딩 되는 port

worker_threads

Number

5

실행 시 올라오는 비동기 런타임의 worker thread의 개수. 해당 값은CPU core수와 맞도록 설정하는 것을 권장합니다.

connect_timeout

Number

1000

PostgreSQL 서버와 연결할 때 적용되는 Timeout을 설정하며 단위는 밀리 초 (milliseconds)

idle_timeout

Number

600000

PostgreSQL 서버에 생성한 연결의 Idle Timeout을 지정하며 단위는 밀리 초 (milliseconds) . 이 시간 동안 서버 연결이 사용되지 않으면 해당 Connection은 종료됩니다.

server_lifetime

Number

3600000

PostgreSQL 서버에 생성한 연결의 최대 Lifetime을 지정하며 단위는 밀리 초 (milliseconds). 생성된 연결이 이 시간만큼 지나면 사용 중이더라도 종료됩니다.

idle_client_in_transaction_timeout

Number

0

클라이언트 Transaction의 최대 Idle Timeout 값을 지정하며 단위는 밀리 초 (milliseconds). 0으로 설정한 경우 Timeout이 적용되지 않 습니다.

healthcheck_timeout

Number

1000

PostgreSQL 서버로 보내는 Healthcheck 메세지의 Timeout이며 단위는 밀리 초 (milliseconds). PostgreSQL 서버가 해당 시간 동안 응답하지 않으면 OpenProxy는 해당 서버를 Pool에서 추방 (Ban) 하고 쿼리를 보내지 않습니다.

healthcheck_delay

Number

30000

PostgreSQL 서버에 Healthcheck를 수행할 간격을 지정하며 단위는 밀리 초 (milliseconds) . 해당 시간 동안 아무런 활동이 없는 서버면 Healthcheck가 수행됩니다.

shutdown_timeout

Number

60000

OpenProxy 프로세스가 SIGINT 시그널을 받아 Gracefully Shutdown 되는 과정에서 연결 중인 Client가 있으면 해당 시간동안 클라이언트 연결이 종료되기를 기다리며 단위는 밀리 초 (milliseconds).

ban_time

Number

60

PostgreSQL 서버가 Healthcheck에 실패한 경우 해당 시간 동안 Pool에서 추방 (Ban) 되며 단위는 초 (seconds) . 추방된 PostgreSQL 서버가 해당 시간만큼 지나면 다시 Pool에 포함되어 Healthcheck의 대상이 됩니다.

tcp_keepalives_idle

Number

5

PostgreSQL 서버로 생성한 연결을 유지할 TCP 소켓이 해당 시간동안 Idle한 경우 주기적으로 Keepalive 패킷을 보내 상태를 확인하기 시작합니다. 단위는 초 (seconds)

tcp_keepalives_interval

Number

5

Keepalive 패킷을 보낼 주기로 단위는 초 (seconds)

tcp_keepalives_count

Number

5

PostgreSQL 서버로 주기적으로 보낸 Keepalive 패킷이 이 갯수만큼 응답을 받지 못하면 TCP 연결이 종료됩니다.

auth_type

Enum

md5

클라이언트 인증에 사용할 PostgreSQL 비밀번호 인증방식을 지정합니다. md5 옵션과 scram-sha-256 옵션을 지원합니다.

prepared_statements_cache_size

Number

0

Transaction 모드 Pooling을 사용하는 경우에만 유효하며 Client에서 보내는 Prepared Statement를 저장할 글로벌 Cache를 활성화하고 Cache의 크기를 지정합니다. 이 옵션이 활성화되어야 Transaction pool 모드에서도 Prepared Statement를 처리할 수 있습니다. Prepared statements는 OpenProxy 메모리와 PostgreSQL 리소스를 사용하기 때문에 지나치게 큰 값으로 설정하지 않는 것이 권장됩니다.

admin_username

String

-

OpenProxy를 관리하기 위한 admin username

admin_password

String

-

OpenProxy를 관리할 때 사용하는 admin user의 password

server_tls

Bool

false

OpenProxy에서 PostgreSQL server로의 TLS 연결이 활성화됩니다. PostgreSQL 또한 TLS 연결이 될 수 있도록 설정되어야 합니다.

verify_server_certificate

Bool

false

만약 server_tls 가 활성화 상태라면, 서버 인증서가 유효한지 검증합니다. Openproxy가 실행된 root stroe에 저장된 인증서가 아닌 “self signed certificates(자체 서명)”로의 연결을 비허용합니다.

renew_interval

Number

5000

TOML 설정파일 리로딩 및 Patroni로 관리되는 Shard의 노드별 Primary / Replica 여부를 갱신하는 주기를 지정합니다.

reload_toml

Bool

true

renew_interval 간격으로 TOML 설정파일을 다시 읽어 불러올 지 여부를 지정합니다. false 로 설정된 경우 Patroni로 관리되는 Shard의 노드별 Role 만을 갱신합니다.

dns_cache_enabled

Bool

false

활성화하면 Openproxy PostgreSQL server의 DNS를 resolve하고 cache합니다.(overriding default TTL provided by system DNS servers.) 이것은 DNS로 PostgreSQL의 서버를 routing할 때 유용합니다. 만약 DNS쿼리로 확인한 cache값이 이전과 변경된 경우 connection pool은 자동적으로 새로운 PostgreSQL server에 대해서 새로운 connection을 만듭니다.

dns_mas_ttl

Number

30

캐시 된 DNS 값을 저장하는 시간입니다. 만약 만료되면 DNS 새로 고침이 시작됩니다.

Virtual Router

OpenProxy의 가상 IP 관련 기능을 활성화하고자 하는 경우에 [general.virtual_router] 섹션 밑에 설정합니다. 사용하지 않는 경우에는 해당 섹션을 제거합니다.

변수명
Type
Default
Description

interface

String

-

가상 IP를 등록할 호스트의 네트워크 인터페이스 이름.

router_id

Number

-

가상 라우터 ID로 1에서 255 까지의 값을 가질 수 있습니다. 동일 네트워크에서 가상 라우터 클러스터를 구분하기 위해 사용됩니다.

priority

Number

-

가상 라우터의 우선순위 값으로 0에서 255 사이의 값을 가집니다.

advert_int

Number

-

Advert 인터벌로 단위는 초 (seconds) 이다. 해당 주기로 VRRP advertisement 패킷을 발송합니다.

vip_addresses

Array

-

점유할 가상 IP 주소의 목록. [“192.168.35.200/24", "192.168.35.201/24"] 형태로 쉼표, 로 구분되며, 넷마스크 비트 길이를 포함한 IPv4 주소로 주어져야 합니다.

pre_promote_script

String

-

Optional. BACKUPMASTER 승격이 일어날 때 가상 IP 점유에 앞서 실행할 OS 명령어를 지정할 수 있습니다.

pre_demote_script

String

-

Optional. MASTERBACKUP 강등이 일어날 때 가상 IP 해제에 앞서 실행할 OS 명령어를 지정할 수 있습니다.

unicast_peers

Array

-

Optional. 멀티캐스트가 지원되지 않는 네트워크 환경인 경우 VRRP 패킷을 유니캐스트 방식으로 보낼 수 있으며 모든 Peer 가상 라우터 노드의 IPv4 주소를 쉼표, 로 구분되는 배열 형태로 [“192.168.0.6", “192.168.0.8"] 처럼 기입합니다.

Pools

새로운 connection을 추가하고 싶다면 [pools] 에 추가합니다. [pools.{pool_name}]

변수명
Type
Default
Description

pool_mode

Enum

transaction

OpenProxy의 Pooling 모드를 이 Pool 단위에서 설정하며 session 모드와 transaction 모드를 지원합니다. session 모드에서는 하나의 Client 연결에 대하여 하나의 PostgreSQL 서버 연결이 제공되며 transaction 모드에서는 각 Client 트랜잭션이 여러 PostgreSQL 서버 연결에서 나누어 처리됩니다.

load_balancing_mode

Enum

random

Replica 노드들에 대하여 Load balancing할 알고리즘을 지정하며 randomloc 를 지원합니다. random 은 random number generator로 어떤 replica를 사용할지 결정한다. loc 는 처리중인 Connection이 가장 적은 replica를 선택합니다.

query_parser_enabled

Bool

false

Rust library인 sqlparser를 사용해서 OpenProxy 로 요청되는 모든 쿼리를 parsing 합니다. 해당 변수는 pooler가 query가 read/write 를 분리하거나 sharding key를 추출하는 역할을 합니다.

query_parser_read_write_splitting

Bool

false

query_parser_enabled 와 같이 활성화되면 read 쿼리는 standby, write 쿼리는 primary에 할당됩니다.

primary_reads_enabled

Bool

false

query_parser_enabled와 query_parser_read_write_splitting 을 같이 활성화하면, primary에도 replica와 같이 read쿼리를 분산합니다.

idle_timeout

Number

-

General settings 의 idle_timeout 값을 이 Pool 단위에서 재 설정합니다.

connect_timeout

Number

-

General settings 의 connect_timeout 값을 이 Pool 단위에서 재 설정합니다.

Users

Openproxy의 Connection pool은 여러 사용자를 등록하여 사용할 수 있습니다.

사용자 구성을 사용하면 사용자별 설정과 일반 설정 및 풀 설정의 추가 재정의가 가능합니다.

[pools.{pool_name}.users.0] 하위 항목에 사용자 관련 항목을 등록합니다.

변수명
Type
Default
Description

username

String

-

사용자 이름, Client <-> OpenProxy 간 인증에 이용

password

String

-

Optional,

사용자 비밀번호

server_username

String

-

Optional,

OpenProxy <-> PostgreSQL 간 인증에 이용할 사용자 이름

server_password

String

-

Optional, OpenProxy <-> PostgreSQL 간 인증에 이용할 비밀번호

pool_size

Number

-

PostgreSQL 의 최대 연결 수

min_pool_size

Number

0

pool 에 열어 둘 PostgreSQL 의 최소 연결 개수. 이 값을 지정하면 새로운 클라이언트가 접속할 때 콜드 스타트 시간을 줄일 수 있습니다. 부하에 비해 큰 값으로 설정 시 PostgreSQL 연결 수 가 늘어나 서버 리소스가 낭비되고 다른 pool 이 이를 사용하지 못하고 차단될 수 있습니다.

statement_timeout

Number

0

클라이언트의 쿼리에 서버가 응답할 때까지 기다리는 최대 시간(millisecond) PostgreSQL 서버에 해당 기능이 구현되어 일반적인 경우에는 사용되지 않지만 PostgreSQL 가 불안정한 경우 사용할 수 있습니다.

pool_mode

Enum

-

[pools.pool_name]의 pool_mode 값을 재설정합니다.

server_lifetime

Number

-

General settings 의 server_lifetime 값을 재설정합니다.

Shards

[pools.{pool_name}.shards.0] 하위 섹션에 접속할 database server 주소를 정의해야 합니다.

변수명
Type
Default
Description

database

String

None

PostgreSQL 에 연결한 database 이름

servers

Array

None

접속할 cluster db-server 주소 정보를 array 형태로 설정합니다. host/IP, port, role(primary, replica, Auto) (예시)

servers = [

["10.0.0.1", 5432, "primary"],

["replica-1.internal-dns.net", 5432, "replica"],

]

use_patroni

Bool

false

vip-failover를 사용하려면 true 로 설정해야 합니다.

Configuration 예제

위 설정 예제는 다음과 같이 가정합니다.

  • 설정한 “my_database” pooler 는 PostgreSQL 과 같은 머신에서 수행합니다.

  • postgres database 가 정의되어 있습니다.

  • 사용자: developer , 비밀번호: very-security-passwordpostgres database 에 CONNECT 권한을 가지고 있습니다.


실행

CLI로 실행하기

설치한 openproxy 바이너리를 아래와 같이 실행한다. 인자로 toml 설정 파일의 경로를 지정할 수 있으며 값이 없는 경우는 실행 경로의 openproxy.toml 파일을 기본으로 참조합니다.

명령줄 인자로 지정할 수 있는 옵션들은 아래와 같습니다.

  • --log-target : OpenProxy 프로세스에서 작성할 로그 엔트리들을 출력할 타겟 파이프라인을 지정합니다. file, stdout, both 옵션을 지원합니다.

  • -l, --log-level : 작성할 로그 레벨을 정의한다. ERROR, WARN, INFO, DEBUG, TRACE 옵션을 지원합니다.

  • --max-logfile-num : 보관할 로그 파일의 최대 갯수를 지정한다. 초과하는 로그 파일은 자동으로 디스크에서 삭제됩니다.

  • --log-dir : 로그 파일을 작성할 디렉토리 경로를 입력합니다.

  • --log-format : 작성할 로그 엔트리의 형식을 지정합니다. text, structured, debug 옵션을 지원합니다.

위 옵션들은 환경 변수로도 정의할 수 있다. 환경 변수와 명령줄 옵션이 같이 주어진 경우 명령줄 옵션이 우선합니다.

  • LOG_TARGET : 로그 타겟에 대응합니다.

  • LOG_LEVEL : 로그 레벨 정의에 대응합니다.

  • MAX_LOGFILE_NUM : 보관할 로그 파일의 최대 갯수에 대응합니다.

  • LOG_DIR : 로그 파일을 작성할 디렉토리 경로에 대응합니다.

  • LOG_FORMAT : 로그 엔트리 형식에 대응합니다.

이 외에 도움말을 출력하거나 버전 정보 혹은 리비전 정보를 확인할 수 있습니다.

Systemd 서비스로 정의하기


조회 기능

OpenProxy 노드에 openproxy 데이터베이스 이름을 이용하여 admin 사용자로 PostgreSQL 연결을 맺으면 관리자 기능을 활용할 수 있습니다. Configuration 및 현재 활성화된 Pool 조회, Stat 정보 확인 등의 기능을 제공합니다.

Version 조회

Configuration 조회

Database 조회

Pool 조회

Client 조회

Server 조회

User 조회

List 조회

Stat 조회

Last updated