Skip to content

Latest commit

 

History

History
437 lines (365 loc) · 13.4 KB

README.adoc

File metadata and controls

437 lines (365 loc) · 13.4 KB

pgbouncer

pgbouncer는 PostgreSQL의 Connection pool과 DB와의 연결 생성 및 연결 재사용을 할 수 있습니다.

  • GNU Make 3.81+

  • Libevent 2.0+

  • pkg-config

  • OpenSSL 1.0.1+ for TLS support

  • (optional) c-ares as alternative to Libevent’s evdns

  • (optional) PAM libraries

yum install libevent-devel.x86_64 openssl-devel.x86_64
yum -y install pgbouncer
wget https://www.pgbouncer.org/downloads/files/1.17.0/pgbouncer-1.17.0.tar.gz --no-check-certificate
tar -xzf tar -xzf pgbouncer-1.17.0.tar.gz
cd pgbouncer-1.17.0
./configure --prefix=/usr/local
make && make install
$ pgbouncer -V
PgBouncer 1.17.0
libevent 2.0.21-stable
adns: evdns2
tls: OpenSSL 1.0.2k-fips  26 Jan 2017
# source install
mkdir -p  /etc/pgbouncer
chown -R hypersql:hypersql /etc/pgbouncer

# yum install
chown -R hypersql:hypersql /etc/pgbouncer

ini 파일은 databases 섹션과 기본섹션 두개로 나뉩니다. 섹션은 [ ] 으로 표기되며 구분됩니다.

#source install
vi /etc/pgbouncer/pgbouncer.ini

# yum install
mv /etc/pgbouncer/pgbouncer.ini /etc/pgbouncer/pgbouncer.ini.copy
vi /etc/pgbouncer/pgbouncer.ini
  • 예시

[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgres
pgbouncer_test = host=127.0.0.1 port=5432 dbname=pgbouncer_test

[pgbouncer]
listen_port = 6543
listen_addr = *
auth_type = trust
auth_file = auth.txt
logfile = pgbouncer.log
pidfile = pgbouncer.pid
admin_users = postgres
unix_socket_dir = /var/run/hypersql
  • 다음과 같이 연결할 dbname을 쓴 후 connection에 필요한 정보들을 기입합니다.

  • 해당 정보들은 key=value 형태로 입력합니다.

  • dbname으로 pgbouncer는 관리용으로 등록되어 있어서 사용이 불가합니다.

dbname = connection string
  • 만약 정확한 이름이 존재하지 않는 요청이 왔을 때는 "*"로 표기한 connection string으로 사용됩니다.

* = host=foo

아래는 key값에 대하여 설명합니다.

  • dbname : 대상 데이터 베이스 이름입니다. pgbouncer를 통해 접속할 때 기존의 postgresql의 database name이 아닌 설정된 dbname으로 접속하게 됩니다.

    • 기본값 : client 측 데이터베이스 이름과 동일

  • host : 연결할 hostname 또는 IP주소입니다.

  • port : 연결할 port이며, 기본값은 5432입니다.

  • user : 대상 데이터베이스에 대하여 모든 연결이 지정된 사용자로 수행됩니다.

  • password : 지정하지 않으면 auth_file 또는 auth_query가 사용됩니다.

  • auth_user : 인증된 사용자입니다.

  • pool_size : 데이터베이스의 최대 풀 크기를 지정합니다.

  • min_pool_ize : 데이터베이스의 최소 풀크기를 설정합니다.

  • reserve_pool : 데이터베이스에 대해 추가 connection을 설정합니다.

  • connect_query : 모든 클라이언트가 연결을 사용할 수 있도록 허용하기 전에 실행할 쿼리입니다.

  • pool_mode : 특정한 pool mode를 설정합니다.

  • max_db_connections : 해당 데이터베이스의 연결의 최대값을 설정합니다.

  • client_encoding : client_encoding을 설정합니다.

  • datestyle : datestyle을 설정합니다.

  • timezone : timezone을 설정합니다.

  • logfile
    로그파일의 위치를 지정합니다. 데몬 구동일 경우에는 syslog도 설정해야 합니다. 경로가 아니면 현재 위치에 파일을 만듭니다.

    • 기본값 : (없음)

  • pidfile
    pid파일을 지정합니다. pid파일이 없으면 데몬 구동을 할 수 없습니다.
    경로가 아니면 현재 위치에 파일을 만듭니다.

    • 기본값 : (없음)

  • listen_addr

    • 기본값 : (없음)

  • listen_port

    • 기본값 : 6543

  • unix_socket_dir
    Unix socket 위치를 지정합니다. 빈 문자열로 설정하면 Unix socket이 비활성화 됩니다.

    • 기본값 : /tmp (Windows의 경우에는 없음)

  • unix_socket_mode

    • 기본값 : 0777

  • unix_socket_group

    • 기본값 : (없음)

  • user
    해당 값이 설정된 경우 pgbouncer가 시작되면 변경할 user를 지정합니다. pgbouncer가 root나 설정된 user일 경우에만 작동합니다.

    • 기본값 : (없음)

  • pool_mode
    다른 클라이언트가 서버 연결을 재사용할 수 있는 시기를 정합니다.

    • session : client가 연결이 끝나면 pool이 서버로 반환됩니다.

    • transaction : 트랜잭션이 끝나면 pool이 서버로 반환됩니다.

    • statement : query가 끝나면 pool이 서버로 반환됩니다. 그래서 여러 문에 걸친 transaction은 허용하지 않습니다.

    • 기본값 : session

  • max_client_conn

    • max_client_conn + (max pool_size * total databases * total users)

  • default_pool_size
    유저/데이터베이스 쌍당 허용할 서버 연결 수 입니다. 데이터베이스별 구성에서 재정의 할 수 있습니다.

    • 기본값 : 20

  • min_pool_size
    이 숫자 미만인 경우 풀에 서버 연결을 추가합니다. 전체 비활성 기간 후에 정상 부하가 갑자기 돌아올 때의 동작을 개선합니다.

    • 기본값 : 0 (비활성화)

  • reserve_pool_size
    풀에 허용할 추가 연결 수 입니다.

    • 기본값 : 0 (비활성화)

  • reserve_pool_timeout
    이 시간동안 클라이언트가 서비스가 되지 않은 경우 예약 풀에서 추가 연결을 사용합니다. 0은 비활성화입니다. [초]

    • 기본값 : 5.0

  • max_db_connections
    사용자에 관계없이 데이터베이스당 이 수 이상의 서버연결은 허용하지 않습니다. [databases]섹션에서 데이터베이스별로 설정할 수도 있습니다 .

    • 기본값 : 0 (무제한)

  • max_user_connections
    데이터베이스에 관계없이 사용자당 이 수 이상의 서버 연결을 허용하지 않습니다.[users]섹션에서 사용자별로 설정할 수도 있습니다 .

    • 기본값 : 0 (무제한)

  • server_round_robin
    기본적으로 PgBouncer는 LIFO(후입선출) 방식으로 서버 연결을 재사용하므로 가장 많은 부하를 받는 연결은 거의 없습니다. 이는 데이터베이스를 제공하는 단일 서버가 있는 경우 최상의 성능을 제공합니다.

    • 기본값 : 0

  • ignore_startup_parameters
    기본적으로 PgBouncer는 시작 패킷에서 추적할 수 있는 매개변수만 허용합니다 : client_encoding, datestyle, timezone and standard_conforming_strings. 다른 매개변수를 허용하려면 여기에서 매개변수를 지정합니다.

    • 기본값 : 비어있음

  • auth_type
    사용자를 인증하는 방법을 지정합니다.

    • cert : 클라이언트는 유효한 클라이언트 인증서를 사용하여 TLS 연결을 통해 연결해야 합니다.

    • md5 : MD5-based password check를 사용합니다. 이것이 기본 인증 방법입니다. auth_file 에 md5 암호와 일반 텍스트 암호를 모두 포함할 수 있습니다.

    • scram-sha-256 : password check with SCRAM-SHA-256를 사용합니다. auth_file 에 SCRAM secrets 또는 일반 텍스트 패스워드를 포함해야합니다.

    • trust : 인증을 사용하지 않습니다. auth_file 에 유저 이름이 꼭 존재해야합니다.

    • any : trust와 비슷하지만 유저 이름은 무시됩니다. 모든 데이터베이스가 특정 사용자로 로그인하도록 구성되어 있어야 합니다. 또한 콘솔 데이터베이스를 사용하면 모든 사용자가 admin으로 로그인할 수 있습니다.

    • pam : 유저를 인증하는데에 PAM을 사용하며 auth_file 은 무시됩니다.

    • hba : auth_hba_file 에서 로드하여 사용합니다.

  • auth_hba_file
    auth_type 이 hba일때 사용하는 HBA 설정파일

    • 기본값 : 비어있음

  • auth_file
    사용자의 이름과 암호를 로드할 파일의 이름입니다.

	# auth_type = hba 일때
	[pgbouncer]
	auth_type = hba
	auth_hba_file = /etc/pgbouncer/pg_hba.conf
	auth_file = /etc/pgbouncer/auth.txt

pgbouncer에서 사용할 user의 DB user_name과 password를 입력하여 생성합니다.

vi auth.txt
"postgres" "postgres"
  • -d or --daemon

  • -R or --reboot
    온라인 재시작을 수행합니다. 실행중인 pgbouncer process에 연결하여 unix socket을 로드한 다음 사용합니다. 만약 pgbouncer process가 없다면 정상적으로 부팅합니다. 다만, unix_socket_dir이 구성되고 OS에서 unix_socket을 지원하는 경우에만 동작합니다.

  • '-u' or --user=user_name

  • -v or --verbose

  • -q or --quiet
    log에 stderr를 남기지 않는 것입니다. 다른 log에 대해서는 영향이 없습니ㅏㄷ.

  • -V or --version
    버전을 표시합니다.

  • -h or --help
    해당 명령어의 옵션을 설명합니다.

  • --regservice
    Win32 : pgbouncer를 Window 서비스로 실행합니다. service_name 매개변수 값은 등록할 이름으로 사용됩니다.

  • --unregservice
    Win32 : Windows 서비스 등록을 취소합니다.

pgbouncer -d pgbouncer.ini

pgbouncer는 관리 콘솔을 위하여 미리 정해져있습니다.

psql -p 6543 -U postgres -d pgbouncer
pgbouncer=# show help;
NOTICE:  Console usage
DETAIL:
	SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION
	SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
	SHOW DNS_HOSTS|DNS_ZONES
	SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS
	SET key = arg
	RELOAD
	PAUSE [<db>]
	RESUME [<db>]
	DISABLE <db>
	ENABLE <db>
	RECONNECT [<db>]
	KILL <db>
	SUSPEND
	SHUTDOWN

SHOW
pgbouncer=# show version;
     version
------------------
 PgBouncer 1.17.0
(1 row)
pgbouncer=# show servers;
-[ RECORD 1 ]-----+---------------
type         | S
user         | postgres
database     | pgbouncer_test
state        | active
addr         | 127.0.0.1
port         | 5432
local_addr   | 127.0.0.1
local_port   | 49148
connect_time | 2022-08-22 03:42:59 PDT
request_time | 2022-08-22 03:44:09 PDT
wait         | 0
wait_us      | 0
close_needed | 0
ptr          | 0x1f90660
link         | 0x1f85070
remote_pid   | 82973
tls          |
-[ RECORD 2 ]-----+---------------
type         | S
user         | postgres
database     | pgbouncer_test
state        | active
addr         | 127.0.0.1
port         | 5432
local_addr   | 127.0.0.1
local_port   | 49160
connect_time | 2022-08-22 03:43:01 PDT
request_time | 2022-08-22 03:44:09 PDT
wait         | 0
wait_us      | 0
close_needed | 0
ptr          | 0x1f913b0
link         | 0x1f852a8
remote_pid   | 82988
tls          |

      .....
pgbouncer=# show stats;
-[ RECORD 1 ]-----+---------------
database          | pgbouncer
total_xact_count  | 2
total_query_count | 2
total_received    | 0
total_sent        | 0
total_xact_time   | 0
total_query_time  | 0
total_wait_time   | 0
avg_xact_count    | 0
avg_query_count   | 0
avg_recv          | 0
avg_sent          | 0
avg_xact_time     | 0
avg_query_time    | 0
avg_wait_time     | 0
-[ RECORD 2 ]-----+---------------
database          | pgbouncer_test
total_xact_count  | 80909
total_query_count | 566368
total_received    | 51605085
total_sent        | 15072576
total_xact_time   | 578008981
total_query_time  | 439801212
total_wait_time   | 36939
avg_xact_count    | 0
avg_query_count   | 0
avg_recv          | 0
avg_sent          | 0
avg_xact_time     | 0
avg_query_time    | 0
avg_wait_time     | 0
pgbouncer=# show config;
-[ RECORD 1 ]------------------------------------------------------
key        | admin_users
value      | postgres
default    |
changeable | yes
-[ RECORD 2 ]------------------------------------------------------
key        | application_name_add_host
value      | 0
default    | 0
changeable | yes
-[ RECORD 3 ]------------------------------------------------------
key        | auth_file
value      | auth.txt
default    |
changeable | yes
-[ RECORD 4 ]------------------------------------------------------
key        | auth_hba_file
value      |
default    |
changeable | yes
-[ RECORD 5 ]------------------------------------------------------
key        | auth_query
value      | SELECT usename, passwd FROM pg_shadow WHERE usename=$1
default    | SELECT usename, passwd FROM pg_shadow WHERE usename=$1
changeable | yes

                    .......
psql -p 6543 -U postgre -d postgres
postgres=# reload;