All pages
1 of 14

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Barman

Python ๊ธฐ๋ฐ˜ ์˜คํ”ˆ์†Œ์Šค ์†”๋ฃจ์…˜์ธ Barman์— ๋Œ€ํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์š”

Barman์€ Python ๊ธฐ๋ฐ˜ ์˜คํ”ˆ์†Œ์Šค ์†”๋ฃจ์…˜์œผ๋กœ PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Full ๋ฐ ์ฆ๋ถ„ ๋ฐฉ์‹์˜ ๋ฐฑ์—… ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ, ํŠน์ • ์‹œ์  ์ง€์ • ๋ณต๊ตฌ (PITR) ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ณธ ๋ฌธ์„œ๋Š” OpenSQL ํŒจํ‚ค์ง• ํˆด์„ ์ด์šฉํ•ด ์ž‘์„ฑํ•œ OpenSQL ํŒจํ‚ค์ง€๋กœ๋ถ€ํ„ฐ Barman์„ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.


์„ค์น˜

1. OPENSQL_INSTALL_HOME ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •

2. Barman ์„ค์น˜

Barman ์„ค์น˜ ์—ฌ๋ถ€ ํ™•์ธ

. ./setenv.sh `pwd`
OPENSQL_INSTALL_HOME is set to: /home/opensql3.0-rockylinux9.4-pg16.8
OPENSQL_HOME is set to: /home/opensql
OPENSQL_HOME added to /home/opensql/.bashrc
./install.sh barman
$ barman --version
3.11.1 Barman by EnterpriseDB (www.enterprisedb.com)

OpenHA ํด๋Ÿฌ์Šคํ„ฐ ๋งค๋‹ˆ์ €(OpenHA Cluster Manager)

OpenHA์˜ ํ•ต์‹ฌ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์ธ OpenHA ํด๋Ÿฌ์Šคํ„ฐ ๋งค๋‹ˆ์ €(OpenHA Cluster Manager) ์„ค์น˜ ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

OpenHA์˜ ํ•ต์‹ฌ ๊ด€๋ฆฌ ๋ชจ๋“ˆ๋กœ, ๊ฐ ๋…ธ๋“œ์— ์„ค์น˜๋œ PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ ํ†ตํ•œ ๊ณ ๊ฐ€์šฉ์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ž๋™ Failover, Primary ๋…ธ๋“œ ์„ ์ถœ, ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ์กฐํšŒ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“ˆ์€ Patroni ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, REST API๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


OpenHA Cluster Manager ์„ค์น˜ ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ด๋‹น ๋…ธ๋“œ์— PostgreSQL ์„œ๋ฒ„๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, postgres ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

OpenSQL ์„ค์น˜

OpenHA Cluster Manager๋Š” PostgreSQL ์„ค์ •๊ฐ’์— ํฌํ•จ๋œ Data Directory์™€ Binary Directory๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— PostgreSQL ์„œ๋ฒ„์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์ง์ ‘ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • OpenHA DCS(Distributed Configuration Store, etcd ๊ธฐ๋ฐ˜)๊ฐ€ ๋จผ์ € ๊ตฌ๋™๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ฐœ์š”

    ์„ค์น˜

    Requirement

    1. OPENSQL_INSTALL_HOME ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •

    2. OpenHA Cluster Manager ์„ค์น˜

    3. OpenHA Cluster Manager ์„ค์น˜ ์—ฌ๋ถ€ ํ™•์ธ

    . ./setenv.sh `pwd`
    OPENSQL_INSTALL_HOME is set to: /home/opensql3.0-rockylinux9.4-pg16.8
    OPENSQL_HOME is set to: /home/opensql
    OPENSQL_HOME added to /home/opensql/.bashrc 
    sudo -E ./install.sh patroni
    [root@396dd54381db scripts]$ patroni --version
    patroni 4.0.5
    
    [root@396dd54381db scripts]$ patronictl version
    patronictl version 4.0.5

    OpenSQL 3 ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ค์น˜

    OpenHA DCS (Distributed Configuration Store)

    ๊ฐœ์š”

    OpenHA์˜ ๋ถ„์‚ฐ ๊ตฌ์„ฑ ์ €์žฅ์†Œ๋กœ, ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„์‹ญ๊ณผ ๊ฐ ์ธ์Šคํ„ด์Šค ์ƒํƒœ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ €์žฅยท๊ณต์œ ํ•˜๋ฉฐ, ๋ฆฌ๋” ์„ ์ถœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ etcd ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ etcdctl์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


    ์„ค์น˜

    1. OPENSQL_INSTALL_HOME ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •

    . ./setenv.sh `pwd`
    OPENSQL_INSTALL_HOME is set to: /home/opensql3.0-rockylinux9.4-pg16.8
    OPENSQL_HOME is set to: /home/opensql
    OPENSQL_HOME added to /home/opensql/.bashrc

    2. OpenHA DCS ์„ค์น˜

    ./install.sh etcd

    3. OpenHA DCS ์„ค์น˜์—ฌ๋ถ€ ํ™•์ธ

    ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋กœ OpenHA DCS(etcd ์™€ etcdctl ๊ธฐ๋ฐ˜)์˜ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    [opensql@396dd54381db etcd-v3.5.6-linux-amd64]etcd --version
    etcd Version: 3.5.6
    Git SHA: cecbe35ce
    Go Version: go1.16.15
    Go OS/Arch: linux/amd64
    
    [opensql@396dd54381db etcd-v3.5.6-linux-amd64]etcdctl version
    etcdctl version: 3.5.6
    API version: 3.5

    ์˜คํ”ˆ ํ”„๋ก์‹œ(OpenProxy)

    Rust ๊ธฐ๋ฐ˜ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค์ธ ์˜คํ”ˆํ”„๋ก์‹œ(OpenProxy)์— ๋Œ€ํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐœ์š”

    ์˜คํ”ˆํ”„๋ก์‹œ(OpenProxy)๋Š” Rust ๊ธฐ๋ฐ˜ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๋กœ PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ปค๋„ฅ์…˜ ํ’€๋ง, ์ฟผ๋ฆฌ ๋ผ์šฐํŒ…์„ ํ†ตํ•œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒค๋”ฉ ๋ฐ ๊ฐ€์ƒ IP ๊ธฐ๋ฐ˜ Failover ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

    ๋ณธ ๋ฌธ์„œ๋Š” OpenSQL ํŒจํ‚ค์ง• ํˆด์„ ์ด์šฉํ•ด ์ž‘์„ฑํ•œ OpenSQL ํŒจํ‚ค์ง€๋กœ๋ถ€ํ„ฐ OpenProxy๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.


    ์„ค์น˜

    1. Openproxy ๊ตฌ์„ฑ

    OpenSQL ํŒจํ‚ค์ง€ ๋‚ด $OPENSQL_INSTALL_HOME/openproxy ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” Openproxy ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋‹ค์Œ ์„ธ๊ฐ€์ง€ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • Openproxy ๋ฐ”์ด๋„ˆ๋ฆฌ openproxy

    • ๊ตฌ๋™์— ํ•„์š”ํ•œ ์„ค์ • ํŒŒ์ผ (openproxy.toml)

    • systemd ๋“ฑ๋ก์— ํ•„์š”ํ•œ service ํŒŒ์ผ (openproxy.service)

    ํŒŒ์ผ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ OpenProxy๋ฅผ ์„ค์ •ํ•˜๊ณ  systemd๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Components ์„ค์ •/์‹คํ–‰

    OpenSQL v3.0 ์˜ components ๋ณ„ ์‹คํ–‰ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    1. Etcd

    2. Patroni + PostgreSQL

    3. OpenProxy

    ๊ฐ Components ๋ณ„ ์„ค์ •/์‹คํ–‰์„ ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.

    • Etcd

    • Patroni

    • OpenProxy

    OpenSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

    OpenSQL ์„ค์น˜๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธํ™˜๊ฒฝ ์„ค์ • ๋ฐ PostgreSQL ์„ค์น˜ ๊ณผ์ •์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

    OpenSQL์€ PostgreSQL ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒจํ‚ค์ง€๋กœ ๋ณธ ๋งค๋‰ด์–ผ์€ OpenSQL ์„ค์น˜๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธํ™˜๊ฒฝ ์„ค์ • ๋ฐ PostgreSQL ์„ค์น˜ ๊ณผ์ •์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.


    OpenSQL ๋ฐ”์ด๋„ˆ๋ฆฌ ์••์ถ•์„ ํ•ด์ œํ•˜๋ฉด scripts ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— setenv.sh , install.sh ๋“ฑ OpenSQL ์„ค์น˜๋ฅผ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    opensql ์œ ์ €๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ ํ•ด๋‹น ์œ ์ €๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

    OpenSQL์ด ์„ค์น˜๋  ์œ„์น˜๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ OPENSQL_HOME ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    OPENSQL ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ bashrc์— ์„ค์ •ํ•˜๊ณ , OPENSQL์„ ์„ค์น˜ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์œ„์น˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. OPENSQL_INSTALL_HOME ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •

    3. Openproxy ์„ค์น˜

    4. ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ตฌ๋™ ์—ฌ๋ถ€ ํ™•์ธ

    OPENSQL_HOME ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ˆ˜ํ–‰์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

    PostgreSQL์„ ์„ค์น˜ํ•˜๊ณ  binary ํŒŒ์ผ์„ PATH์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  PGDATA ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ $OPENSQL_HOME/data๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋กœ postgresql ์˜ ์„ค์น˜ ๊ฒฝ๋กœ์™€ ์„ค์น˜ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ฐœ์š”

    ์„ค์น˜

    1. OPENSQL ์œ ์ € ์ƒ์„ฑ

    2. OPENSQL_HOME ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

    3. OPENSQL_INSTALL_HOME ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •

    4. Postgresql ์„ค์น˜

    5. Postgresql ์„ค์น˜์—ฌ๋ถ€ ํ™•์ธ

    [root@5c9e5c6ae5f2 openproxy]# ls
    openproxy  openproxy.service  openproxy.toml
    . ./setenv.sh `pwd`
    OPENSQL_INSTALL_HOME is set to: /home/opensql3.0-rockylinux9.4-pg16.8
    OPENSQL_HOME is set to: /home/opensql
    OPENSQL_HOME added to /home/opensql/.bashrc
    ./install.sh openproxy
    [root@5c9e5c6ae5f2 openproxy]# openproxy --version
    openproxy 1.1.0
    ./create_user.sh <password>
    export OPENSQL_HOME="path/to/install"
    export PG_HOME="path/to/pg"
    export PG_DATA_DIR="path/to/pg_data"
    . ./setenv.sh `pwd`
    OPENSQL_INSTALL_HOME is set to: /home/opensql3.0-rockylinux9.4-pg16.8
    sudo -E ./install.sh postgresql
    $ $PG_HOME/bin/pg_config 
    BINDIR = /usr/pgsql-16/bin
    DOCDIR = /usr/pgsql-16/doc
    HTMLDIR = /usr/pgsql-16/doc/html
    INCLUDEDIR = /usr/pgsql-16/include
    PKGINCLUDEDIR = /usr/pgsql-16/include
    INCLUDEDIR-SERVER = /usr/pgsql-16/include/server
    LIBDIR = /usr/pgsql-16/lib
    PKGLIBDIR = /usr/pgsql-16/lib
    LOCALEDIR = /usr/pgsql-16/share/locale
    MANDIR = /usr/pgsql-16/share/man
    SHAREDIR = /usr/pgsql-16/share
    SYSCONFDIR = /etc/sysconfig/pgsql
    PGXS = /usr/pgsql-16/lib/pgxs/src/makefiles/pgxs.mk
    CONFIGURE =  '--enable-rpath' '--prefix=/usr/pgsql-16' '--includedir=/usr/pgsql-16/include' '--mandir=/usr/pgsql-16/share/man' '--datadir=/usr/pgsql-16/share' '--libdir=/usr/pgsql-16/lib' '--with-lz4' '--with-zstd' '--enable-tap-tests' '--with-icu' '--with-llvm' '--with-perl' '--with-python' '--with-tcl' '--with-tclconfig=/usr/lib64' '--with-openssl' '--with-pam' '--with-gssapi' '--with-includes=/usr/include' '--with-libraries=/usr/lib64' '--enable-nls' '--enable-dtrace' '--with-uuid=e2fs' '--with-libxml' '--with-libxslt' '--with-ldap' '--with-selinux' '--with-systemd' '--with-system-tzdata=/usr/share/zoneinfo' '--sysconfdir=/etc/sysconfig/pgsql' '--docdir=/usr/pgsql-16/doc' '--htmldir=/usr/pgsql-16/doc/html' 'CFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' 'LDFLAGS=-Wl,--as-needed' 'LLVM_CONFIG=/usr/bin/llvm-config-64' 'CLANG=/usr/bin/clang' 'PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig'
    CC = gcc
    CPPFLAGS = -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include
    CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wshadow=compatible-local -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection
    CFLAGS_SL = -fPIC
    LDFLAGS = -Wl,--as-needed -L/usr/lib64 -L/usr/lib64 -Wl,--as-needed -Wl,-rpath,'/usr/pgsql-16/lib',--enable-new-dtags
    LDFLAGS_EX = 
    LDFLAGS_SL = 
    LIBS = -lpgcommon -lpgport -lselinux -lzstd -llz4 -lxslt -lxml2 -lpam -lssl -lcrypto -lgssapi_krb5 -lz -lreadline -lm 
    VERSION = PostgreSQL 16.8

    Barman

    OpenSQL์˜ ํšจ์œจ์ ์ธ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ๋ฅผ ์ง€์›ํ•˜๋Š” Barman ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐœ์š”

    OpenSQL์˜ ํšจ์œจ์ ์ธ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ๋ฅผ ์ง€์›ํ•˜๋Š” Barman ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


    ํ™˜๊ฒฝ ์„ค์ •

    Barman

    Streaming Replication์„ ํ†ตํ•œ ๋ฐฑ์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ pg_basebackup, pg_receivewal ๋“ฑ PostgreSQL ํด๋ผ์ด์–ธํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. OpenSQL ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. PostgreSQL ์„œ๋น„์Šค๋Š” ๊ธฐ๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    $ . ./setenv.sh `pwd`
    $ ./install.sh postgresql

    PostgreSQL ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉ์ž barman ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒฝ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    su - barman
    $ echo 'export PATH=$PATH:$PG_HOME/bin' >> ~/.bashrc
    $ source ~/.bashrc
    • /etc/barman.conf

    • /etc/barman.d/opensql.conf

    Primary - Replica ๋กœ ๊ตฌ์„ฑ๋œ PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Primary ๋…ธ๋“œ์— Streaming ์—ฐ๊ฒฐ์„ ๋งบ๊ณ  WAL์„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ›๊ธฐ ์œ„ํ•ด Barman์€ Primary ๋…ธ๋“œ๋กœ์˜ ์ ‘์† ์ •๋ณด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

    Patroni์˜ REST API๋ฅผ ํ™œ์šฉํ•˜๋ฉด Switchover ๋ฐ Failover๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ •๋ณด ๋ฐ Primary ๋…ธ๋“œ๋กœ์˜ ์ ‘์† ์ •๋ณด๋ฅผ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Barman ์ž์ฒด์ ์ธ Configuration Switch ๊ธฐ๋Šฅ๊ณผ ์—ฐ๋™ํ•˜์—ฌ, PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ๋” ๋…ธ๋“œ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธด ๊ฒฝ์šฐ์—๋„ Barman์ด Streaming Connection์„ ์ƒˆ๋กœ์šด Primary ๋…ธ๋“œ๋กœ ๋งบ๊ธฐ ์œ„ํ•œ ๊ด€๋ฆฌ ์„œ๋ฒ„ Barman Agent๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    Barman Agent ๊ด€๋ จ ํŒŒ์ผ(server.py, config.yml, requirements.txt, barman-agent.service)์€ OpenSQL ํŒจํ‚ค์ง€์˜ barman-agent/ ๋””๋ ‰ํ† ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    Barman Agent๋Š” ์‹คํ–‰ ์‹œ config ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. systemd ์„œ๋น„์Šค ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” /var/lib/barman/config.yml์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์„ค์ •ํŒŒ์ผ์˜ ์˜ˆ์‹œ ๋ฐ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • listen : ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ 0.0.0.0 ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • port : ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ 8080 ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    Barman์—์„œ ์‚ฌ์šฉํ•  Replication Slot์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ Barman Agent๋ฅผ ๊ฐ™์ด ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ Patroni์—์„œ Role Change๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  Callback์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • patroni.yml


    Streaming Replication ์‹คํ–‰

    barman cron์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. crontab์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

    ์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด barman check ๋ช…๋ น์œผ๋กœ ์—ฐ๊ฒฐ ์ƒํƒœ, Replication Slot, WAL ์ŠคํŠธ๋ฆฌ๋ฐ ๋“ฑ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

    cluster : ํ•„์ˆ˜ ํ•ญ๋ชฉ์œผ๋กœ Barman ํ™˜๊ฒฝ ๊ตฌ์„ฑ์—์„œ ์„ค์ •ํ•œ ์„œ๋ฒ„ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. barman config-switch ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค.
  • patroni : ํ•„์ˆ˜ ํ•ญ๋ชฉ์œผ๋กœ YAML ๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ Patroni ์„œ๋ฒ„๋“ค์˜ REST API ์—”๋“œํฌ์ธํŠธ๋“ค์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ตœ์‹  Patroni ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ฐธ์กฐ๋˜๋ฉฐ Patroni ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” HTTP ์š”์ฒญ์€ 2์ดˆ์˜ Timeout์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์‹คํŒจํ•œ Endpoint๋Š” ์ œ์™ธ๋˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ฑ๊ณตํ•œ Endpoint๋ฅผ ์บ์‹œํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Barman Agent

    ํ•„์ˆ˜ Python ํŒจํ‚ค์ง€ ์„ค์น˜

    ์‹คํ–‰

    Patroni

    bootstrap.dcs.slots๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ดˆ๊ธฐ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์‹œ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์šด์˜ ์ค‘์ธ ํด๋Ÿฌ์Šคํ„ฐ์— Replication Slot์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด patronictl edit-config๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

    ์‹คํ–‰

    ; Main configuration file
    
    [barman] # ๊ธ€๋กœ๋ฒŒ ํ™˜๊ฒฝ ๊ตฌ์„ฑ, OS ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ barman ๋ฐ์ดํ„ฐ์™€ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•  ๊ฒฝ๋กœ ๋“ฑ์„ ์ง€์ •
    
    ; System user
    barman_user = barman
    configuration_files_directory = /etc/barman.d
    
    ; Main directory
    barman_home = /var/lib/barman
    
    log_file = /var/log/barman/barman.log
    log_level = INFO
    [opensql] # ์„œ๋ฒ„ ์ด๋ฆ„
    cluster = opensql   # ํ›„์ˆ ํ•  ๋ชจ๋“ˆ๋“ค๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ํƒœ๊ทธ
    conninfo = host=node1 port=5432 user=opensql dbname=opensql
    streaming_conninfo = host=node1 port=5432 user=opensql_streaming dbname=opensql
    backup_method = postgres
    streaming_archiver = on
    slot_name = barman
    
    ; conninfo ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์š”๊ตฌ์‚ฌํ•ญ
    ; user=opensql          : pg_monitor ๋˜๋Š” superuser ๊ถŒํ•œ ํ•„์š”
    ; user=opensql_streaming: REPLICATION ๊ถŒํ•œ ํ•„์š”
    ; pg_hba.conf์—์„œ barman ํ˜ธ์ŠคํŠธ์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    
    [pg-1]    # ๋ชจ๋ธ ์ด๋ฆ„, Patroni REST API์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉค๋ฒ„ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•จ
    cluster = opensql   # ์ด ๋ชจ๋ธ์ด ์ข…์†๋œ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ํƒœ๊ทธ
    model = true        # ์„œ๋ฒ„ ์ •์˜๊ฐ€ ์•„๋‹Œ, ์„œ๋ฒ„์— ์ข…์†๋˜์–ด ์ผ๋ถ€ ์˜ต์…˜์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋Š” '๋ชจ๋ธ'์ž„์„ ๋ช…์‹œ
    conninfo = host=node1 port=5432 user=opensql dbname=opensql
    streaming_conninfo = host=node1 port=5432 user=opensql_streaming dbname=opensql
    
    [pg-2]    # ๋ชจ๋ธ ์ด๋ฆ„, Patroni REST API์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉค๋ฒ„ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•จ
    cluster = opensql   # ์ด ๋ชจ๋ธ์ด ์ข…์†๋œ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ํƒœ๊ทธ
    model = true        # ์„œ๋ฒ„ ์ •์˜๊ฐ€ ์•„๋‹Œ, ์„œ๋ฒ„์— ์ข…์†๋˜์–ด ์ผ๋ถ€ ์˜ต์…˜์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋Š” '๋ชจ๋ธ'์ž„์„ ๋ช…์‹œ
    conninfo = host=node2 port=5432 user=opensql dbname=opensql
    streaming_conninfo = host=node2 port=5432 user=opensql_streaming dbname=opensql
    
    [pg-3]    # ๋ชจ๋ธ ์ด๋ฆ„, Patroni REST API์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉค๋ฒ„ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•จ
    cluster = opensql   # ์ด ๋ชจ๋ธ์ด ์ข…์†๋œ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ํƒœ๊ทธ
    model = true        # ์„œ๋ฒ„ ์ •์˜๊ฐ€ ์•„๋‹Œ, ์„œ๋ฒ„์— ์ข…์†๋˜์–ด ์ผ๋ถ€ ์˜ต์…˜์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋Š” '๋ชจ๋ธ'์ž„์„ ๋ช…์‹œ
    conninfo = host=node3 port=5432 user=opensql dbname=opensql
    streaming_conninfo = host=node3 port=5432 user=opensql_streaming dbname=opensql
    
    $ pip install -r requirements.txt
    # ์…ธ์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ
    ## Barman์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์—ฌ์•ผ ํ•œ๋‹ค.
    ## Barman ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ค์ •์˜ [barman] ์„น์…˜ barman_user ํ•„๋“œ
    $ python3 server.py &
    
    # systemd ์„œ๋น„์Šค๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ
    ## barman-agent ์‹คํ–‰ํŒŒ์ผ๊ณผ config.yml ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋Š” systemd ์„œ๋น„์Šค ํŒŒ์ผ์— ์ •์˜๋œ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.
    ## ํ•„์š”์— ๋”ฐ๋ผ ํ•ด๋‹น ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ ๋˜๋Š” ์‹คํ–‰ํ•  ์‚ฌ์šฉ์ž๋ฅผ ์„œ๋น„์Šค ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
    $ sudo chmod 755 server.py
    $ sudo cp server.py /usr/local/bin/barman-agent
    
    $ sudo cp config.yml /var/lib/barman/config.yml  
    
    $ sudo cp barman-agent.service /usr/lib/systemd/system/.
    $ sudo systemctl daemon-reload
    $ sudo systemctl enable barman-agent
    $ sudo systemctl start barman-agent
    
    listen: "192.168.0.100"   ## Optional. ๋ฐ”์ธ๋”ฉํ•  ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์†Œ. ๊ธฐ๋ณธ๊ฐ’: 0.0.0.0 (๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค ํ—ˆ์šฉ)
    port: 8080                ## Optional. ๋ฐ”์ธ๋”ฉํ•  TCP ํฌํŠธ ๋ฒˆํ˜ธ. ๊ธฐ๋ณธ๊ฐ’: 8080
    cluster: opensql          ## ํ•„์ˆ˜. /etc/barman.d/opensql.conf ์˜ ์„œ๋ฒ„ ์ด๋ฆ„([opensql])๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    patroni:                  ## ํ•„์ˆ˜. Patroni ๋…ธ๋“œ๋“ค์˜ REST API ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
      - node1:8008
      - node2:8008
      - node3:8008
    name: pg-1 ## Patroni ๋ฉค๋ฒ„ ์ด๋ฆ„. Barman ํ™˜๊ฒฝ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ •์˜ํ•œ ๋ชจ๋ธ ์ด๋ฆ„([pg-1], [pg-2], ...)๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
    bootstrap:
      dcs:
        slots:
          barman:
            type: physical
    postgresql:
      callbacks:
        on_role_change: "curl 'http://{barman-host}:8080/renew_config'"
    $ barman receive-wal opensql ## Foreground ํ”„๋กœ์„ธ์Šค๋กœ receive-wal ์‹œ์ž‘
    Starting receive-wal for server opensql
    
    $ barman cron                ## barman receive-wal ์„ ์‹คํ–‰ํ•˜๋Š” Cron Job์„ ๋“ฑ๋ก
    Starting WAL archiving for server opensql
    Starting streaming archiver for server opensql
    
    $ which barman   ## barman ์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ ํ™•์ธ
    /usr/local/bin/barman
    
    $ crontab -e -u barman
    ## ์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€ (๊ฒฝ๋กœ๋Š” ์œ„ which barman ๊ฒฐ๊ณผ๋กœ ๋Œ€์ฒด)
    * * * * * /usr/local/bin/barman cron
    $ barman check opensql

    OpenHA ํด๋Ÿฌ์Šคํ„ฐ ๋งค๋‹ˆ์ €(OpenHA Cluster Manager)

    OpenHA์˜ ํ•ต์‹ฌ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์ธ OpenHA ํด๋Ÿฌ์Šคํ„ฐ ๋งค๋‹ˆ์ €(OpenHA Cluster Manager) ์„ค์ •, ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐœ์š”

    OpenHA ํด๋Ÿฌ์Šคํ„ฐ ๋งค๋‹ˆ์ €(OpenHA Cluster Manager)๋Š” OpenSQL ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ์žฅ์•  ์‹œ ์ž๋™ Failover, Primary ๋…ธ๋“œ ์„ ์ถœ, PostgreSQL ํŒŒ๋ผ๋ฏธํ„ฐ ๊ด€๋ฆฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•ต์‹ฌ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. Patroni ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, PostgreSQL ์„œ๋ฒ„์˜ ์‹œ์ž‘/์ค‘์ง€/์žฌ์‹œ์ž‘๊ณผ ๊ฐ™์€ ๋ผ์ดํ”„์‚ฌ์ดํด ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


    ํ™˜๊ฒฝ ์„ค์ •

    OpenHA Cluster Manager์˜ ์„ค์ •์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    Global Dynamic Configuration

    • OpenHA DCS(Distributed Configuration Store, etcd ๊ธฐ๋ฐ˜)์— ์ €์žฅ๋˜๋ฉฐ ๋ชจ๋“  ๋…ธ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • patronictl edit-config ๋ช…๋ น์ด๋‚˜ REST API๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์  ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ชจ๋“  ๋…ธ๋“œ์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

    • patroni.yml ์ˆ˜์ • ํ›„ patroni ์žฌ๊ธฐ๋™ ์—†์ด ๋™์  reload ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

      • Patroni ํ”„๋กœ์„ธ์Šค์— SIGHUP ๋ณด๋‚ด๋ฉด local config ํŒŒ์ผ ๋‹ค์‹œ ์ฝ์Šต๋‹ˆ๋‹ค,

      • POST /reload REST-API

    • local configuration parameter๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •/์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ณธ ๋งค๋‰ด์–ผ์—์„œ๋Š” ์œ„3๊ฐ€์ง€ ๋ฐฉ์‹ ์ค‘ Local Configuration File์œผ๋กœ ์„ค์ • ๋ฐ ์‹คํ–‰์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    OpenHA Cluster Manager ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์‹œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅ ๋ฐ›๋Š” ๊ฒฝ๋กœ์— ์œ„์น˜ํ•œ yaml ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ฝ์–ด์˜ค๋Š” ์„ค์ • ๊ฐ’์ž…๋‹ˆ๋‹ค. Patroni ํ”„๋กœ์„ธ์Šค์— SIGHUP ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ REST API ์„œ๋ฒ„์— POST /reload ์š”์ฒญ์„ ๋ณด๋‚ด ์„ค์ • ํŒŒ์ผ์„ ์ƒˆ๋กœ ์ฝ์–ด์˜ค๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ํ™˜๊ฒฝ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋Š” $OPENSQL_HOME/etc/patroni.yml ์ด๋‹ค. ํ•ด๋‹น ๊ฒฝ๋กœ์— yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    • Patroni ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฉ”ํƒ€ ์ •๋ณด, etcd ์—ฐ๊ฒฐ ์ •๋ณด, ๋กœ๊น… ๊ตฌ์„ฑ, REST API ์„œ๋ฒ„ ๊ตฌ์„ฑ ๋ฐ PostgreSQL ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • PostgreSQL ํŒจ๋Ÿฌ๋ฏธํ„ฐ ์…‹์€ Local Configuration ๋ฐ Global Dynamic Configuration๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๋ณต๋˜๋Š” ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Local Configuration์˜ ๊ฐ’์ด ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

    • bootstrap.dcs ํ•ญ๋ชฉ์„ ์ •์˜ํ•ด ์•„๋ž˜์˜ Global Dynamic Configuration์˜ ์ดˆ๊ธฐ ๊ตฌ์„ฑ ์…‹์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ฐ ๋…ธ๋“œ๋ณ„ patroni.yml ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

    REST API ๋ถ€๋ถ„์˜ connect_address ๊ฐ’๊ณผ etcd3์˜ hosts ์„ค์ •์„ ๋…ธ๋“œ๋ณ„ ip-address ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    ๋…ธ๋“œ ์ฃผ์†Œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™๊ณ  patroni ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ ํ•˜๋Š” ๊ฒฝ์šฐ

    • node1 192.168.0.1

    • node2 192.168.0.2

    • node3 192.168.0.3

    ์ฃผ์˜ HA ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๊ธฐ๋™ ์ „์— ์‹œ์Šคํ…œ ์‹œ๊ฐ„์ด ๋™๊ธฐํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ฐ„ ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Cluster Manager์˜ ์ƒํƒœ ํŒ๋‹จ ๋ฐ Failover ๋™์ž‘์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์€ ์˜ HA ๊ตฌ์„ฑ ์‹œ ์‹œ๊ฐ„ ๋™๊ธฐํ™”(NTP) ํ™•์ธ ํ•ญ๋ชฉ์„ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

    patroni.yml ์ž‘์„ฑ ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ๋…ธ๋“œ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด OpenHA Cluster Manager ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋กœ ์œ ํšจํ•œ Configuration .yml ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๊ฐ€ ์ž…๋ ฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    patronictl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cluster ์ •์ƒ ๋™์ž‘์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ Leader๋Š” running, Replica๋Š” streaming ์œผ๋กœ ํ‘œ๊ธฐ๋˜๋Š” ๊ฒƒ์ด cluster ์ •์ƒ ๋ถ€ํŒ… ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

    patronictl reload ๋ช…๋ น์–ด ์‚ฌ์šฉ

    Local Configuration File (patroni.yml)

    ํ™˜๊ฒฝ๋ณ€์ˆ˜

    Local Configuration File

    Configuration File ์˜ˆ์ œ

    OpenHA Cluster Manager ์‹คํ–‰

    Cluster ์‹คํ–‰ ํ™•์ธ

    ์‚ฌ์ „ํ™•์ธ์‚ฌํ•ญ
    # /etc/patroni/patroni.yml
    scope: opensql
    name: postgresql0
    restapi:
      listen: 0.0.0.0:8008
      connect_address: 192.168.0.1:8008
    etcd3:
      protocol: http
      hosts:
      - 192.168.0.1:2379
      - 192.168.0.2:2379
      - 192.168.0.3:2379
    bootstrap:
      # This section will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
      # and all other cluster members will use it as a `global configuration`.
      # WARNING! If you want to change any of the parameters that were set up
      # via `bootstrap.dcs` section, please use `patronictl edit-config`!
      dcs:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        failsafe_mode: true
        postgresql:
          use_pg_rewind: true
          parameters:
    #        wal_level: hot_standby
    #        hot_standby: "on"
            max_connections: 100
            max_worker_processes: 8
    #        wal_keep_segments: 8
    #        max_wal_senders: 10
    #        max_replication_slots: 10
    #        max_prepared_transactions: 0
    #        max_locks_per_transaction: 64
    #        wal_log_hints: "on"
    #        track_commit_timestamp: "off"
    #        archive_mode: "on"
    #        archive_timeout: 1800s
    #        archive_command: mkdir -p ../wal_archive && test ! -f ../wal_archive/%f && cp %p ../wal_archive/%f
    #      recovery_conf:
    #        restore_command: cp ../wal_archive/%f %p
    
      # some desired options for 'initdb'
      initdb:  # Note: It needs to be a list (some options need values, others are switches)
      - encoding: UTF8
      - data-checksums
    
      post_bootstrap: /home/opensql/scripts/post_bootstrap.sh # $OPENSQL_HOME/scripts/post_bootstrap.sh
    
    postgresql:
      listen: 0.0.0.0:5432
      connect_address: 192.168.0.1:5432
      proxy_address: 192.168.0.1:6432  # The address of connection pool (e.g.,openproxy) running next to Patroni/Postgres. Only for service discovery.
      data_dir: /home/opensql/data    # 
      bin_dir: /home/opensql/bin       # 
    #  config_dir:
      pgpass: /tmp/pgpass0
      authentication:
        replication:
          username: patroni_repl
          password: patroni_repl
        superuser:
          username: postgres
          password: postgres
        rewind:  # Has no effect on postgres 10 and lower
          username: patroni_rewind
          password: patroni_rewind
      pg_hba:
        - local all all trust
        - host replication patroni_repl all md5
        - host all all all md5
      parameters:
        log_line_prefix: '%m [%r] [%u] [%a]'
    
    tags:
      noloadbalance: false
      clonefrom: false
      nostream: false
    # /etc/patroni/patroni.yml
    scope: opensql
    name: postgresql0
    restapi:
      listen: 0.0.0.0:8008
      connect_address: 192.168.0.1:8008
    etcd3:
      protocol: http
      hosts:
      - 192.168.0.1:2379
      - 192.168.0.2:2379
      - 192.168.0.3:2379
    bootstrap:
      # This section will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
      # and all other cluster members will use it as a `global configuration`.
      # WARNING! If you want to change any of the parameters that were set up
      # via `bootstrap.dcs` section, please use `patronictl edit-config`!
      dcs:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        failsafe_mode: true
        postgresql:
          use_pg_rewind: true
          parameters:
    #        wal_level: hot_standby
    #        hot_standby: "on"
            max_connections: 100
            max_worker_processes: 8
    #        wal_keep_segments: 8
    #        max_wal_senders: 10
    #        max_replication_slots: 10
    #        max_prepared_transactions: 0
    #        max_locks_per_transaction: 64
    #        wal_log_hints: "on"
    #        track_commit_timestamp: "off"
    #        archive_mode: "on"
    #        archive_timeout: 1800s
    #        archive_command: mkdir -p ../wal_archive && test ! -f ../wal_archive/%f && cp %p ../wal_archive/%f
    #      recovery_conf:
    #        restore_command: cp ../wal_archive/%f %p
    
      # some desired options for 'initdb'
      initdb:  # Note: It needs to be a list (some options need values, others are switches)
      - encoding: UTF8
      - data-checksums
    
      post_bootstrap: /home/opensql/scripts/post_bootstrap.sh # $OPENSQL_HOME/scripts/post_bootstrap.sh
    
    postgresql:
      listen: 0.0.0.0:5432
      connect_address: 192.168.0.1:5432
      proxy_address: 192.168.0.1:6432  # The address of connection pool (e.g.,openproxy) running next to Patroni/Postgres. Only for service discovery.
      data_dir: /home/opensql/data    # 
      bin_dir: /home/opensql/bin       # 
    #  config_dir:
      pgpass: /tmp/pgpass0
      authentication:
        replication:
          username: patroni_repl
          password: patroni_repl
        superuser:
          username: postgres
          password: postgres
        rewind:  # Has no effect on postgres 10 and lower
          username: patroni_rewind
          password: patroni_rewind
      pg_hba:
        - local all all trust
        - host replication patroni_repl all md5
        - host all all all md5
      parameters:
        log_line_prefix: '%m [%r] [%u] [%a]'
    
    tags:
      noloadbalance: false
      clonefrom: false
      nostream: false
    
    $ patroni $OPENSQL_HOME/etc/patroni.yml
    postgres@opensql3:~$ patronictl -c $OPENSQL_HOME/etc/patroni.yml list
    + Cluster: cluster (7488929455988801618) ------+----+-----------+
    | Member   | Host        | Role    | State     | TL | Lag in MB |
    +----------+-------------+---------+-----------+----+-----------+
    | patroni1 | 192.168.0.1 | Replica | streaming |  1 |         0 |
    | patroni2 | 192.168.0.2 | Replica | streaming |  1 |         0 |
    | patroni3 | 192.168.0.3 | Leader  | running   |  1 |           |
    +----------+-------------+---------+-----------+----+-----------+

    OpenHA DCS (Distributed Configuration Store)

    ๊ฐœ์š”

    OpenHA DCS๋Š” OpenSQL ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ตฌ์„ฑ ์ •๋ณด์™€ ๊ฐ ์ธ์Šคํ„ด์Šค ์ƒํƒœ๋ฅผ ์ €์žฅยท๊ณต์œ ํ•˜๋ฉฐ, ๋ฆฌ๋” ์„ ์ถœ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ถ„์‚ฐ ๊ตฌ์„ฑ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

    ์ด ๋ชจ๋“ˆ์€ etcd ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ etcdctl์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


    ํ™˜๊ฒฝ ๊ตฌ์„ฑ

    OpenHA DCS๋Š” ์ตœ์†Œ 3๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑํ•ด์•ผํ•˜๋ฉฐ, ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    ์„ค์ • ํŒŒ์ผ์€ $OPENSQL_HOME/etc/etcd.env์—์„œ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

    • $OPENSQL_HOME ์€ OPENSQL์ด ์„ค์น˜๋  ์œ„์น˜์ž…๋‹ˆ๋‹ค.

    Environment Variable
    Example
    Description

    OpenHA DCS๋Š” TLS ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ฐ ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์„ค์ • ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    [ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„]๊ฐ„ ์ธ์ฆ๊ณผ [์„œ๋ฒ„ - ์„œ๋ฒ„] ๊ฐ„ Peer ์ธ์ฆ์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ ๋‘ ๊ฒฝ์šฐ์— ๊ฐ™์€ TLS ์ธ์ฆ์„œ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Environment Variable
    Example
    Description

    ๋…ธ๋“œ ์ฃผ์†Œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™๊ณ  etcd ๋…ธ๋“œ๋“ค๊ณผ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ ํ•˜๋Š” ๊ฒฝ์šฐ

    • node1 172.176.0.2

    • node2 172.176.0.3

    • node3 172.176.0.4


    ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐœ์˜ ๋…ธ๋“œ์— ๊ฐ๊ฐ systemd ์„œ๋น„์Šค ํŒŒ์ผ๋กœ etcd ๋“ฑ๋ก/๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    Systemd ์„œ๋น„์Šค๋กœ ๋“ฑ๋กํ•˜๋Š” ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„ ๋„๊ตฌ systemctl ์˜ daemon-reload ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ ์ •์˜ํ•œ etcd.service ์„œ๋น„์Šค ์ •์˜๋ฅผ ํฌํ•จํ•ด Configuration์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

    ๋“ฑ๋กํ•œ ์„œ๋น„์Šค๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ํ™œ์„ฑํ™” (Enable) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋œ ์„œ๋น„์Šค๋Š” ์‹œ์Šคํ…œ ๋ถ€ํŒ… ์‹œ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

    ์„œ๋น„์Šค๋ฅผ ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ง์ ‘ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ค‘์ง€, ์žฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋œ ์„œ๋น„์Šค๋„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์„ ์žฌ๋ถ€ํŒ…ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•„์š”์— ๋”ฐ๋ผ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ๊ตฌ๋™์ค‘์ธ ์„œ๋น„์Šค์˜ ์ƒํƒœ๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋˜๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ช…๋ น์ค„์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


    etcd ๋™์ž‘์„ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด 3๊ฐœ ๋…ธ๋“œ์˜ etcd ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค.

    GitHub - etcd-io/etcd: Distributed reliable key-value store for the most critical data of a distributed systemGitHub

    ETCD_INITIAL_CLUSTER_STATE

    new

    ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ฒ˜์Œ ์‹œ์ž‘๋˜๋Š” ์ง€ ์•„๋‹ˆ๋ฉด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ์‹œ์ž‘๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ new ๋ฅผ, ์ด๋ฏธ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ existing ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ETCD_INITIAL_CLUSTER_TOKEN

    my-etcd-cluster

    ETCD ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ดˆ๊ธฐํ™”์— ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋กœ ๋™์ผํ•œ ํ† ํฐ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋“ค์ด ํด๋Ÿฌ์Šคํ„ฐ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ETCD_INITIAL_ADVERTISE_PEER_URLS

    http://172.18.0.5:2380

    ETCD ๋…ธ๋“œ ๊ฐ„ ์„œ๋กœ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๊ณต๊ฐœ(Advertise)ํ•  ์ด ๋…ธ๋“œ์˜ ํ”ผ์–ด URL๋“ค์˜ ๋ชฉ๋ก. ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์ด ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ URL์ด ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ETCD_LISTEN_PEER_URLS

    http://172.18.0.5:2380

    ํ”ผ์–ด๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ์ด ๋…ธ๋“œ์˜ ETCD ์„œ๋ฒ„๊ฐ€ Listen ํ•  URL๋“ค์˜ ๋ชฉ๋ก.

    ETCD_LISTEN_CLIENT_URLS

    http://172.18.0.5:2379,

    https://192.168.0.31:2379,

    http://127.0.0.1:2379

    ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ์„ ์œ„ํ•ด ์ด ๋…ธ๋“œ์˜ ETCD ์„œ๋ฒ„๊ฐ€ Listen ํ•  URL๋“ค์˜ ๋ชฉ๋ก.

    ETCD_ADVERTISE_CLIENT_URLS

    https://192.168.0.31:2379

    ํด๋ผ์ด์–ธํŠธ์— ๊ณต๊ฐœ(Advertise)ํ•  ์ด ๋…ธ๋“œ์˜ ์„œ๋ฒ„ URL๋“ค์˜ ๋ชฉ๋ก. ETCD API๋ฅผ ์ด์šฉํ•ด ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์ด Client Addrs ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    ETCD_DATA_DIR

    /var/lib/etcd

    ETCD์˜ data directory

    ETCD_KEY_FILE

    /etc/etcd/pki/node3-key.pem

    [ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„]๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  Key ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ETCD_PEER_TRUSTED_CA_FILE

    /etc/etcd/pki/etcd-ca.pem

    [์„œ๋ฒ„ -์„œ๋ฒ„]๊ฐ„ Peer ํ†ต์‹ ์— ์‚ฌ์šฉํ•  TLS ์ธ์ฆ์„œ์˜ ์„œ๋ช… ์ฃผ์ฒด์ด๋ฉฐ, ๋ฃจํŠธ CA ์ธ์ฆ์„œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ETCD_PEER_CERT_FILE

    /etc/etcd/pki/node3-peer.pem

    [์„œ๋ฒ„-์„œ๋ฒ„]๊ฐ„ Peer ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ์ธ์ฆ์„œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ETCD_PEER_KEY_FILE

    /etc/etcd/pki/node3-peer-key.pem

    [์„œ๋ฒ„-์„œ๋ฒ„]๊ฐ„ Peer ํ†ต์‹ ์— ์‚ฌ์šฉํ•  Key ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ETCD_NAME

    node1

    ETCD ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๊ณ ์œ ํ•œ ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ ์žˆ์–ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ ํ›„์ˆ ํ•  ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ํ•ญ๋ชฉ์— ์ง€์ •๋œ ๋…ธ๋“œ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ETCD_INITIAL_CLUSTER

    node1=http://172.18.0.5:2380,

    node2=http://172.18.0.6:2380,

    node3=http://172.18.0.7:2380

    ์‰ผํ‘œ , ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ETCD ๋…ธ๋“œ์˜ Peer ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ URL์˜ ๋ชฉ๋ก์œผ๋กœ ETCD ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋ณ„๋กœ ์ •์˜๋˜๋Š” ETCD_INITIAL_ADVERTISE_PEER_URLS ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ETCD_TRUSTED_CA_FILE

    /etc/etcd/pki/etcd-ca.pem

    [ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„]๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  TLS ์ธ์ฆ์„œ์˜ ์„œ๋ช… ์ฃผ์ฒด์ด๋ฉฐ, ๋ฃจํŠธ CA (์ธ์ฆ๊ธฐ๊ด€) ์˜ ์ธ์ฆ์„œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ETCD_CERT_FILE

    /etc/etcd/pki/node3.pem

    [ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„]๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ์ธ์ฆ์„œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    etcd.env ํ™˜๊ฒฝ์„ค์ •

    ๋ฉค๋ฒ„ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด

    TLS ์ธ์ฆ

    3-๋…ธ๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑํ•˜๋Š” etcd ํ™˜๊ฒฝ์„ค์ • ์˜ˆ์‹œ

    ์‹คํ–‰

    Systemd๋กœ etcd ์‹คํ–‰ํ•˜๊ธฐ

    Command ๋กœ etcd ์‹คํ–‰ํ•˜๊ธฐ

    ์ฐธ๊ณ 

    Etcd ๋Š” Systemd ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

    ๊ตฌ์„ฑ ํ™•์ธ

    # $OPENSQL_HOME/etc/etcd.env 
    # mandatory configuration
    ETCD_NAME=<ETCD_NODE_NAME>
    
    # Initial cluster configuration
    ETCD_INITIAL_CLUSTER=<ETCD_NODE_NAME>=http://<NODE1_IP>:2380,<ETCD_NODE_NAME2>=http://<NODE2_IP>:2380, ...
    ETCD_INITIAL_CLUSTER_STATE=new
    ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
    
    # Peer configuration
    ETCD_INITIAL_ADVERTISE_PEER_URLS=http://<NODE_IP>:2380
    ETCD_LISTEN_PEER_URLS=http://<NODE_IP>:2380
    
    # Client/server configuration
    ETCD_ADVERTISE_CLIENT_URLS=http://<NODE_IP>:2379
    ETCD_LISTEN_CLIENT_URLS=http://<NODE_IP>:2379,http://127.0.0.1:2379
    
    #data dir
    ETCD_DATA_DIR=/opensql/etc/etcd
    #$OPENSQL_HOME/etc/etcd.env
    ## ์ด ์„œ๋ฒ„์˜ etcd ๋…ธ๋“œ ์ด๋ฆ„์„ node1 ๋กœ ์ง€์ •
    ETCD_NAME=node1
    
    ## ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  etcd ๋…ธ๋“œ ์ด๋ฆ„๊ณผ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ peer url์„ ์„ค์ •
    ETCD_INITIAL_CLUSTER=node1=http://172.176.0.2:2380,node2=http://172.176.0.3:2380,node3=http://172.176.0.4:2380
    ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster1
    ## ์ดˆ๊ธฐ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ ์‹œ์—๋Š” 3 ๋…ธ๋“œ ๋ชจ๋‘ 'new' ๋กœ ์„ค์ •ํ•˜๊ณ  ๋™์ž‘. ์ดํ›„ existing์œผ๋กœ ์ˆ˜์ •.
    ETCD_INITIAL_CLUSTER_STATE=new
    
    ## etcd ๋…ธ๋“œ๊ฐ„ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” peer url์„ ์ง€์ •. ๊ธฐ๋ณธ port๋Š” 2380์ž„
    ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.176.0.2:2380
    ETCD_LISTEN_PEER_URLS=http://172.176.0.2:2380
    
    # Client/server configuration
    ETCD_ADVERTISE_CLIENT_URLS=http://172.176.0.2:2379
    ETCD_LISTEN_CLIENT_URLS=http://172.176.0.2:2379,http://127.0.0.1:2379
    
    # data dir
    ETCD_DATA_DIR=/opensql/lib/etcd
    $ sudo vim /usr/lib/systemd/system/etcd.service
    
    [Unit]
    Description=etcd
    Documentation=https://github.com/coreos/etcd
    Conflicts=etcd-member.service
    Conflicts=etcd2.service
    
    [Service]
    EnvironmentFile=/etc/etcd/etcd.env
    ExecStart=/usr/bin/etcd
    Type=notify
    TimeoutStartSec=0
    Restart=on-failure
    RestartSec=5s
    LimitNOFILE=65536
    Nice=-10
    IOSchedulingClass=best-effort
    IOSchedulingPriority=2
    MemoryLow=200M
    
    [Install]
    WantedBy=multi-user.target
    $ sudo systemctl daemon-reload
    $ sudo systemctl enable etcd.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
    $ sudo systemctl start etcd.service
    
    ## ์„œ๋น„์Šค๋ฅผ ์ค‘์ง€ํ•˜๋Š” ์˜ˆ์‹œ
    $ sudo systemctl stop etcd.service
    
    ## ์„œ๋น„์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋Š” ์˜ˆ์‹œ
    $ sudo systemctl restart etcd.service
    $ sudo systemctl status -l etcd
    โ— etcd.service - etcd
       Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)
       Active: active (running) since Mon 2025-03-17 16:49:45 KST; 3 weeks 2 days ago
         Docs: https://github.com/coreos/etcd
     Main PID: 4763 (etcd)
       CGroup: /system.slice/etcd.service
               โ””โ”€4763 /usr/bin/etcd
    
    Apr 09 17:46:30 node2 etcd[4763]: {"level":"warn","ts":"2025-04-09T17:46:30.542+0900","caller":"etcdserver/util.go:170","msg":"apply request took too long","took":"402.056395ms","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/service/opensql/\" range_end:\"/service/opensql\" ","response":"range_response_count:9 size:6173"}
    $ etcd --name 'node1' \
        --data-dir '/var/lib/etcd' \
        --initial-cluster 'node1=http://172.18.0.2:2380,node2=http://172.18.0.3:2380,node3=http://172.18.0.4:2380' \
        --initial-cluster-token 'etcd-cluster1'
        --initial-cluster-state 'new'
    $ etcdctl member list -w=table
    +------------------+---------+-------+----------------------+-------------------------+------------+
    |        ID        | STATUS  | NAME  |      PEER ADDRS      |      CLIENT ADDRS       | IS LEARNER |
    +------------------+---------+-------+----------------------+-------------------------+------------+
    | bfac432fd36a61d5 | started | etcd3 | http://opensql3:2380 | http://178.176.0.3:2379 |      false |
    | c41cad57348d886f | started | etcd2 | http://opensql2:2380 | http://178.176.0.2:2379 |      false |
    | dc3ff6e1d56a1012 | started | etcd1 | http://opensql1:2380 | http://178.176.0.4:2379 |      false |
    +------------------+---------+-------+----------------------+-------------------------+------------+
    Logo

    OpenSQL ํ†ตํ•ฉ ์„ค์น˜

    1. ๊ฐœ์š”

    OpenSQL ํ†ตํ•ฉ ์„ค์น˜๋Š” OpenSQL-Installer ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

    OpenSQL-Installer๋Š” OpenSQL ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ•˜๋Š” Python ๊ธฐ๋ฐ˜ ์ธ์Šคํ†จ๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์„ค์น˜ ๋ฐฉ์‹์€ ๋‘ ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐฉ์‹
    ์Šคํฌ๋ฆฝํŠธ
    ์„ค๋ช…

    ์„ค์น˜๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ผ์ด์„ ์Šค ์—๋””์…˜์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ•˜๋Š” ๋ณ„๋„ ์„ค์ •์€ ์—†์Šต๋‹ˆ๋‹ค.

    ์ปดํฌ๋„ŒํŠธ
    ์—ญํ• 
    ๋ชจ๋“œ
    node1
    node2
    node3

    OS
    ๋ฒ„์ „
    ๋„๊ตฌ
    ์šฉ๋„

    ์ œ์–ด ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๋ฏ€๋กœ SSH ๊ด€๋ จ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    ๋„๊ตฌ
    ์šฉ๋„

    ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ ์›๊ฒฉ/๋กœ์ปฌ ๋…ธ๋“œ์˜ ํ•„์ˆ˜ ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

    • ์„ ํ™•์ธํ•˜์—ฌ ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ž๋™ ์„ค์น˜: common.env์—์„œ AUTO_INSTALL_PREREQS=true๋กœ ์„ค์ •ํ•˜๋ฉด ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ ๋ˆ„๋ฝ๋œ ํ•„์ˆ˜ ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    ๋ผ์ด์„ ์Šค XML์€ opensql-installer/licenses/ ํ•˜์œ„์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ ์„ค์น˜ ์ค‘ ๊ฐ ๋…ธ๋“œ๋กœ ๋ณต์‚ฌํ•˜๊ณ  OPENSQL_LICENSE_PATH๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋ชจ๋“œ๋ณ„ ํ•„์ˆ˜ ๋ผ์ด์„ ์Šค ๊ฐœ์ˆ˜:

    ๋ชจ๋“œ
    ํ•„์š” ๊ฐœ์ˆ˜
    ๋Œ€์ƒ ๋…ธ๋“œ
    • ์ œ์–ด ์„œ๋ฒ„ โ†’ ๊ฐ ๋…ธ๋“œ: SSH ์ ‘์† ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ SSH ํ‚ค(~/.ssh/id_rsa_opensql)๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ๋…ธ๋“œ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

    • ํ‚ค ๋“ฑ๋ก ์‹œ ์ตœ์ดˆ 1ํšŒ SSH ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • ๋กœ์ปฌ ์„ค์น˜: opensql_local_installer.py๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ sudo ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • ์›๊ฒฉ ์„ค์น˜: ๊ฐ ๋…ธ๋“œ์˜ SSH ์ ‘์† ์‚ฌ์šฉ์ž์—๊ฒŒ sudo ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


    ์ธ์Šคํ†จ๋Ÿฌ ์‹คํ–‰ ์ „, OpenSQL ๋ฐฐํฌ ํŒจํ‚ค์ง€(.tar.gz)๋ฅผ ๋จผ์ € ์••์ถ• ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์••์ถ•์„ ํ’€๋ฉด Tmax_OpenSQL_* ํ˜•ํƒœ์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ๊ทธ ์•ˆ์— opensql-installer/๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.


    ์„ค์ • ํŒŒ์ผ์€ ๊ณตํ†ต ์„ค์ •(config/common.env)๊ณผ ์›๊ฒฉ ์„ค์น˜ ์ „์šฉ ์„ค์ •(config/remote.env)์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋ณ„ ์„ธ๋ถ€ ์˜ต์…˜์€ ๊ฐ *.config.env์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    ๋กœ์ปฌ ์„ค์น˜์™€ ์›๊ฒฉ ์„ค์น˜ ๋ชจ๋‘์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณตํ†ต ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ NODE1_IP ~ NODE3_IP์™€ ํ˜„์žฌ ์„œ๋ฒ„ IP๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ž์‹ ์˜ ์—ญํ• ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

    • ์„ค์น˜ ์ˆ˜ํ–‰ ์‹œ OPENSQL_USER์™€ OPENSQL_GROUP ์€ ์ž๋™ ์ƒ์„ฑ๋˜๋ฉฐ sudo ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

      • ์ด๋ฏธ ๋™๋ช…์˜ ์œ ์ €์™€ ๊ทธ๋ฃน์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฌด์‹œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

      • ๊ธฐ์กด์˜ ์œ ์ €์™€ ๊ทธ๋ฃน์„ ์ด์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ์œ ์ €์— sudo ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ ์ƒํƒœ์—ฌ์•ผ ์ •์ƒ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.


    ์ œ์–ด ์„œ๋ฒ„์—์„œ opensql_remote_installer.py๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ๋ณ„ ์ด๋ฆ„, SSH ์ ‘์† ์ •๋ณด, ๋ผ์ด์„ ์Šค ํŒŒ์ผ๋ช…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ IP์™€ ๊ณตํ†ต ์„ค์ •์€ config/common.env๋ฅผ ํ•จ๊ป˜ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

    ๋น„๋ฐ€๋ฒˆํ˜ธ ์ง€์ •์€ ์šฐ์„ ์ˆœ์œ„ ์ˆœ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ๋ฐฉ๋ฒ• 1: ์‹คํ–‰ ์˜ต์…˜์œผ๋กœ ์ „๋‹ฌ (๊ถŒ์žฅ)

    ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰ ์‹œ์ ์— ์˜ต์…˜์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐฉ๋ฒ• 2: remote.env์— ๊ธฐ์žฌ


    ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ํฌํŠธ, ์‚ฌ์šฉ์ž, ํƒ€์ž„์•„์›ƒ ๋“ฑ ์„ธ๋ถ€ ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

    ํŒŒ์ผ
    ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ

    2node-witness ๋ชจ๋“œ์—์„œ๋Š” node3(witness)์˜ etcd ํฌํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    config/common.env์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ ์‹œ: ํด๋Ÿฌ์Šคํ„ฐ๋งˆ๋‹ค ๋‹ค๋ฅธ ํฌํŠธ๋กœ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

    ํด๋Ÿฌ์Šคํ„ฐ
    CLUSTER_ID
    CLIENT_PORT
    PEER_PORT

    ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด๋‚˜ ๋‹จ์ผ ์„œ๋ฒ„ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

    ๊ณตํ†ต ์„ค์ • (**config/common.env**):

    ์›๊ฒฉ ์„ค์น˜ ์ „์šฉ ์„ค์ • (**config/remote.env**):

    ์‹คํ–‰:


    ์šด์˜ ํ™˜๊ฒฝ์˜ ํ‘œ์ค€ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

    ๊ณตํ†ต ์„ค์ • (**config/common.env**):

    NODE1_IP ~ NODE3_IP๋Š” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์„ค์น˜์—์„œ ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ์‹คํ–‰ํ•  ๋•Œ NODE_NAME๊ณผ LICENSE_NAME๋งŒ ํ•ด๋‹น ๋…ธ๋“œ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    ์›๊ฒฉ ์„ค์น˜ ์ „์šฉ ์„ค์ • (**config/remote.env**):

    ์‹คํ–‰:


    2๊ฐœ์˜ PostgreSQL ๋…ธ๋“œ์™€ ๋ณ„๋„์˜ etcd witness ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ๊ณตํ†ต ์„ค์ • (**config/common.env**):

    NODE1_IP ~ NODE3_IP๋Š” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. node1/node2์—์„œ ์‹คํ–‰ ์‹œ NODE_NAME๊ณผ LICENSE_NAME์„ ํ•ด๋‹น ๋…ธ๋“œ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. node3(witness)์—๋Š” LICENSE_NAME์„ ๋น„์›Œ๋‘ก๋‹ˆ๋‹ค.

    etcd ์˜ต์…˜ (**config/etcd.config.env**):

    ์›๊ฒฉ ์„ค์น˜ ์ „์šฉ ์„ค์ • (**config/remote.env**):

    ์‹คํ–‰:

    ๋™์ผํ•œ node3์— ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ๋งˆ๋‹ค ๋‹ค๋ฅธ ํฌํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ํด๋Ÿฌ์Šคํ„ฐ 1: CLUSTER_ID=c1, WITNESS_ETCD_CLIENT_PORT=2379, WITNESS_ETCD_PEER_PORT=2380

    ํด๋Ÿฌ์Šคํ„ฐ 2: CLUSTER_ID=c2, WITNESS_ETCD_CLIENT_PORT=2479, WITNESS_ETCD_PEER_PORT=2480


    ๊ฐ ๋…ธ๋“œ์— ์ง์ ‘ SSH ์ ‘์†ํ•œ ํ›„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    node1, node2, node3 ๊ฐ๊ฐ์—์„œ NODE_NAME๊ณผ LICENSE_NAME์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ ํ›„ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰ํ•ด์•ผ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

    ์ œ์–ด ์„œ๋ฒ„์—์„œ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ์— ์ผ๊ด„ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

    ์˜ต์…˜
    ์„ค๋ช…
    ๋‹จ๊ณ„
    ์ด๋ฆ„
    ์„ค๋ช…
    ๋‹จ๊ณ„
    ์ด๋ฆ„
    ์„ค๋ช…
    ๋ฐฉ์‹
    ๋กœ๊ทธ ์œ„์น˜

    ์ธ์Šคํ†จ๋Ÿฌ๋Š” ๊ฐ ๋…ธ๋“œ์˜ opensql ์œ ์ € ํ™ˆ์— ~/.opensqlrc ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ ๊ธฐ๋กํ•˜๋Š” ๊ธฐ๋ณธ ๋‚ด์šฉ:

    ์ปค์Šคํ…€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถ”๊ฐ€:

    ๋ณ€๊ฒฝ ํ›„ ์žฌ๋กœ๋“œ:

    ์ฃผ์˜: ์ธ์Šคํ†จ๋Ÿฌ๋ฅผ ์žฌ์‹คํ–‰ํ•˜๋ฉด ~/.opensqlrc๊ฐ€ ๋ฎ์–ด์”Œ์›Œ์ง‘๋‹ˆ๋‹ค. ์žฌ์‹คํ–‰ ํ›„์—๋„ ์œ ์ง€ํ•  ๋ณ€์ˆ˜๋Š” ~/.bashrc ๋์— ์ง์ ‘ ์ถ”๊ฐ€ํ•˜์„ธ์š”. (~/.bashrc๋Š” ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ source ๋ผ์ธ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉฐ ๊ธฐ์กด ๋‚ด์šฉ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)


    ํฌํŠธ
    ์ปดํฌ๋„ŒํŠธ

    • config/common.env์˜ NODE1_IP ~ NODE3_IP๊ฐ€ ํ˜„์žฌ ์„œ๋ฒ„์˜ ์‹ค์ œ IP์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

    • hostname -I ๋ช…๋ น์œผ๋กœ ํ˜„์žฌ ์„œ๋ฒ„ IP๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

    • SSH ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜์„ธ์š”.

    • sshpass๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”: which sshpass

    • ์ˆ˜๋™์œผ๋กœ ํ‚ค๋ฅผ ๋“ฑ๋กํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    • ๋กœ๊ทธ์— ํ‘œ์‹œ๋œ ์„ค์น˜ ๋ช…๋ น์„ ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • ๋˜๋Š” AUTO_INSTALL_PREREQS=true ์„ค์ • ํ›„ ์žฌ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • opensql-installer/licenses/ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  XML ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

    • LICENSE_NAME (๋กœ์ปฌ) ๋˜๋Š” NODE{n}_LICENSE_NAME (์›๊ฒฉ) ๊ฐ’์ด ์‹ค์ œ ํŒŒ์ผ๋ช…๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

    • ๋ผ์ด์„ ์Šค XML ํŒŒ์ผ์— <edition> ํƒœ๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

    • ์ง€์› ์—๋””์…˜: standard, enterprise, ai

    • ๊ฐ ๋…ธ๋“œ์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ผ์ด์„ ์Šค XML์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • ๋‹จ๊ณ„ ๋กœ๊ทธ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์—†์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

    • etcd ์„œ๋น„์Šค ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

    • etcd ํฌํŠธ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

    • OpenProxy ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

    • ํฌํŠธ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

    • Patroni ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

    • Patroni API ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

    openproxy

    ์ปค๋„ฅ์…˜ ํ’€ ๋ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ถ„๋ฆฌ ํ”„๋ก์‹œ

    postgis

    ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ ํ™•์žฅ

    pg_hint_plan

    ์ฟผ๋ฆฌ ํžŒํŠธ ์ง€์›

    pg_cron

    ์Šค์ผ€์ค„๋Ÿฌ ํ™•์žฅ

    pgvector

    ๋ฒกํ„ฐ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰

    pgvectorscale

    pgvector ์„ฑ๋Šฅ ํ™•์žฅ

    credcheck

    ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •์ฑ… ํ™•์žฅ

    system_stats

    ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง

    pgaudit

    SQL ๊ฐ์‚ฌ ๋กœ๊ทธ

    opencrypto

    ์•”ํ˜ธํ™” ํ™•์žฅ

    o2

    Oracle๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•œ ํ™•์žฅ

    pg_profile

    ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง

    tibero_fdw

    Tibero FDW

    PG + Patroni + etcd + OpenProxy

    PG + Patroni + etcd + OpenProxy

    2node-witness

    PG + Patroni + etcd + OpenProxy

    PG + Patroni + etcd + OpenProxy

    etcd (witness only)

    Ubuntu

    22.04, 24.04

    sshpass

    ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜ SSH ํ‚ค ๋“ฑ๋ก ์‹œ ํ•„์š”

    2node-witness

    2๊ฐœ

    node1, node2

    2479

    2480

    ์‚ฌ์ „

    ํฌํŠธ ๊ฒ€์‚ฌ

    ํ•„์š” ํฌํŠธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ

    1

    ์œ ์ € ์ƒ์„ฑ

    opensql ์œ ์ €/๊ทธ๋ฃน ์ƒ์„ฑ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ ์ดˆ๊ธฐํ™”

    2

    ํŒจํ‚ค์ง€ ํ™•์ธ/๋ฐฐํฌ

    ํŒจํ‚ค์ง€ ์กด์žฌ ํ™•์ธ ๋ฐ ๋ˆ„๋ฝ ๋…ธ๋“œ์— ๋ฐฐํฌ

    3

    ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ๊ฒ€์ฆ

    OS๋ณ„ ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ๋ฒ„์ „ ํ™•์ธ

    4

    ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

    opensql ์œ ์ € ํ™˜๊ฒฝ๋ณ€์ˆ˜ (~/.opensqlrc) ์„ค์ •

    5

    ๋ผ์ด์„ ์Šค ๋ฐฐํฌ

    ๋…ธ๋“œ๋ณ„ ๋ผ์ด์„ ์Šค XML ๋ณต์‚ฌ ๋ฐ ๊ถŒํ•œ ์„ค์ •

    6

    ๋ผ์ด์„ ์Šค ํ™•์ธ

    OPENSQL_LICENSE_PATH, ํŒŒ์ผ ์กด์žฌ, signature ์ผ์น˜ ํ™•์ธ

    7

    ์ปดํฌ๋„ŒํŠธ ์„ค์น˜

    ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ์„ค์น˜

    8

    PostgreSQL ๋ฒ„์ „ ํ™•์ธ

    ๋…ธ๋“œ ๊ฐ„ PostgreSQL ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฒ„์ „ ์ผ์น˜ ํ™•์ธ

    9

    etcd ์„ค์ •

    etcd ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ฐ ์„œ๋น„์Šค ํŒŒ์ผ ์ƒ์„ฑ

    10

    etcd ์‹œ์ž‘

    etcd systemd ์„œ๋น„์Šค ์‹œ์ž‘ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ํ˜•์„ฑ ํ™•์ธ

    11

    Patroni ์„ค์ •

    Patroni ์„ค์ • ํŒŒ์ผ(patroni.yml) ์ƒ์„ฑ

    12

    Patroni ์‹œ์ž‘

    Patroni ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘ ๋ฐ Leader ์„ ์ถœ ํ™•์ธ

    13

    OpenProxy ์„ค์ •/์‹œ์ž‘

    OpenProxy ์„ค์ • ์ƒ์„ฑ ๋ฐ ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘

    14

    ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ํ™•์ธ

    etcd member list, patronictl list, PostgreSQL ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

    15

    ์„ค์น˜ ๊ฒฝ๋กœ ์ •๋ฆฌ

    ์›๊ฒฉ ๋…ธ๋“œ์˜ ์ž„์‹œ ์„ค์น˜ ๋””๋ ‰ํ† ๋ฆฌ ์ •๋ฆฌ

    16

    ์„ค์น˜ ์™„๋ฃŒ

    ์„ค์น˜ ์š”์•ฝ ๋ฐ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ

    3

    ์œ ์ € ์ƒ์„ฑ

    opensql ์œ ์ €/๊ทธ๋ฃน ์ƒ์„ฑ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ ์ดˆ๊ธฐํ™”

    4

    ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

    opensql ์œ ์ € ํ™˜๊ฒฝ๋ณ€์ˆ˜ (~/.opensqlrc) ์„ค์ •

    5

    ๋ผ์ด์„ ์Šค ๋ฐฐํฌ

    ๋ผ์ด์„ ์Šค XML ๋ณต์‚ฌ ๋ฐ ๊ถŒํ•œ ์„ค์ •

    6

    ์ปดํฌ๋„ŒํŠธ ์„ค์น˜

    ์ปดํฌ๋„ŒํŠธ ์„ค์น˜

    7

    etcd ์„ค์ •/์‹œ์ž‘

    etcd ์„ค์ • ์ƒ์„ฑ ๋ฐ ์„œ๋น„์Šค ์‹œ์ž‘

    8

    Patroni ์„ค์ •/์‹œ์ž‘

    Patroni ์„ค์ • ์ƒ์„ฑ ๋ฐ ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘

    9

    OpenProxy ์„ค์ •/์‹œ์ž‘

    OpenProxy ์„ค์ • ์ƒ์„ฑ ๋ฐ ์„œ๋น„์Šค ์‹œ์ž‘

    10

    ๋กœ์ปฌ ํฌํŠธ ์ ๊ฒ€

    etcd/Patroni ํฌํŠธ ์—ด๋ฆผ ์—ฌ๋ถ€ ํ™•์ธ

    8008

    Patroni REST API

    6432

    OpenProxy (client)

    6433

    OpenProxy (admin)

    ๋กœ์ปฌ ์„ค์น˜

    opensql_local_installer.py

    ๊ฐ ๋…ธ๋“œ์— ์ง์ ‘ ์ ‘์†ํ•˜์—ฌ ๊ฐœ๋ณ„ ์‹คํ–‰

    ์›๊ฒฉ ์„ค์น˜

    opensql_remote_installer.py

    ์ œ์–ด ์„œ๋ฒ„ 1๋Œ€์—์„œ ์ „์ฒด ๋…ธ๋“œ์— SSH๋กœ ์ผ๊ด„ ์„ค์น˜

    postgresql

    OpenSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„

    etcd

    ๋ถ„์‚ฐ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ (ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ๊ด€๋ฆฌ)

    patroni

    PostgreSQL HA ๊ด€๋ฆฌ (์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„)

    single

    PG + Patroni + etcd + OpenProxy

    -

    -

    3node

    Rocky Linux

    8.x, 9.x

    RHEL

    8.x, 9.x

    Oracle Linux / AlmaLinux

    8.x, 9.x

    python3

    ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰

    sudo ๊ถŒํ•œ

    ์„ค์น˜ ์ž‘์—… ์ˆ˜ํ–‰

    python3

    ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰

    ssh, scp

    ์›๊ฒฉ ๋…ธ๋“œ ์ ‘์†

    ssh-keygen

    SSH ํ‚ค ์ž๋™ ์ƒ์„ฑ

    single

    1๊ฐœ

    node1

    3node

    3๊ฐœ

    node1, node2, node3

    config/etcd.config.env

    etcd

    config/patroni.config.env

    Patroni / PostgreSQL

    config/openproxy.config.env

    OpenProxy

    ํด๋Ÿฌ์Šคํ„ฐ 1

    c1

    2379

    2380

    ํด๋Ÿฌ์Šคํ„ฐ 2

    --mode <mode>

    ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ (single, 2node-witness, 3node). ๊ธฐ๋ณธ: 3node

    --password <pw>

    SSH/sudo ๊ณตํ†ต ๋น„๋ฐ€๋ฒˆํ˜ธ

    --node{n}-password <pw>

    nodeN SSH/sudo ๊ณตํ†ต ๋น„๋ฐ€๋ฒˆํ˜ธ

    ์‚ฌ์ „

    SSH ํ‚ค ์„ค์ •

    SSH ํ‚ค ์ž๋™ ์ƒ์„ฑ ๋ฐ ๊ฐ ๋…ธ๋“œ์— ๋“ฑ๋ก

    ์‚ฌ์ „

    ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

    ๋ชจ๋“  ๋…ธ๋“œ์— SSH ํ‚ค ๊ธฐ๋ฐ˜ ์ ‘์† ํ™•์ธ

    1

    ํŒจํ‚ค์ง€ ํ™•์ธ

    ํ˜„์žฌ ๋…ธ๋“œ์˜ ํŒจํ‚ค์ง€ ์กด์žฌ ํ™•์ธ

    2

    ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ๊ฒ€์ฆ

    OS๋ณ„ ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ๋ฒ„์ „ ํ™•์ธ

    ๋กœ์ปฌ ์„ค์น˜

    opensql-installer/logs/YYYY-MM-DD_HH-MM-SS_opensql_install.log

    ์›๊ฒฉ ์„ค์น˜

    opensql-installer/logs/YYYY-MM-DD_HH-MM-SS_opensql_install.log

    5432

    PostgreSQL

    2379

    etcd (client)

    2380

    etcd (peer)

    ํŒŒ์ผ ๊ตฌ์กฐ

    2. ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ

    ์ปดํฌ๋„ŒํŠธ ๋ชฉ๋ก

    ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ๋ณ„ ๋…ธ๋“œ ์—ญํ• 

    3. ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

    3.1 ์ง€์› OS

    3.2 ์ธ์Šคํ†จ๋Ÿฌ ์‹คํ–‰ ํ™˜๊ฒฝ ์š”๊ตฌ์‚ฌํ•ญ

    ๋กœ์ปฌ ์„ค์น˜ (opensql_local_installer.py)

    ์›๊ฒฉ ์„ค์น˜ (opensql_remote_installer.py)

    3.3 ๊ฐ ๋…ธ๋“œ ํ•„์ˆ˜ OS ํŒจํ‚ค์ง€

    3.4 ๋ผ์ด์„ ์Šค ํŒŒ์ผ

    3.5 ๋„คํŠธ์›Œํฌ (์›๊ฒฉ ์„ค์น˜ ์‹œ)

    3.6 sudo ๊ถŒํ•œ

    4. ํŒจํ‚ค์ง€ ์••์ถ• ํ•ด์ œ

    5. ์„ค์ • ๊ฐ€์ด๋“œ

    5.1 ๊ณตํ†ต ์„ค์ • (config/common.env)

    ํ•„์ˆ˜ ์„ค์ •

    ์„ ํƒ ์„ค์ •

    ๋…ธ๋“œ๋ณ„ ์‹คํ–‰ ์‹œ ์ฃผ์˜

    ๋กœ์ปฌ ์„ค์น˜์—์„œ ๊ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•  ๋•Œ NODE_NAME๊ณผ LICENSE_NAME์„ ํ•ด๋‹น ๋…ธ๋“œ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•œ ํ›„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. NODE1_IP ~ NODE3_IP๋Š” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5.2 ์›๊ฒฉ ์„ค์น˜ ์ „์šฉ ์„ค์ • (config/remote.env)

    ํ•„์ˆ˜ ์„ค์ •

    ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •

    ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ

    ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ remote.env์— ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋นˆ ๊ฐ’์œผ๋กœ ๋‘์„ธ์š”. ์ธ์Šคํ†จ๋Ÿฌ ์‹คํ–‰ ์‹œ sudo ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋Œ€ํ™”ํ˜•์œผ๋กœ ์ž…๋ ฅ๋ฐ›์Šต๋‹ˆ๋‹ค.

    ์„ ํƒ ์„ค์ •

    5.3 ์ปดํฌ๋„ŒํŠธ๋ณ„ ์˜ต์…˜

    etcd ์˜ต์…˜ (config/etcd.config.env)

    Patroni/PostgreSQL ์˜ต์…˜ (config/patroni.config.env)

    OpenProxy ์˜ต์…˜ (config/openproxy.config.env)

    5.4 Witness etcd ํฌํŠธ ์„ค์ • (2node-witness ์ „์šฉ, ํ•„์ˆ˜)

    6. ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ๋ณ„ ์„ค์น˜ ๊ฐ€์ด๋“œ

    6.1 single ๋ชจ๋“œ (๋‹จ์ผ ๋…ธ๋“œ)

    6.2 3node ๋ชจ๋“œ (3๋…ธ๋“œ ๋Œ€์นญ ๊ตฌ์„ฑ, ๊ถŒ์žฅ)

    6.3 2node-witness ๋ชจ๋“œ

    ํ•˜๋‚˜์˜ witness์— ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

    7. ์„ค์น˜ ์‹คํ–‰

    7.1 ๋กœ์ปฌ ์„ค์น˜

    7.2 ์›๊ฒฉ ์„ค์น˜

    7.3 CLI ์˜ต์…˜ ์ „์ฒด ๋ชฉ๋ก (์›๊ฒฉ ์„ค์น˜)

    7.4 ์›๊ฒฉ ์„ค์น˜ ์ง„ํ–‰ ๋‹จ๊ณ„ (์ด 16๋‹จ๊ณ„)

    7.5 ๋กœ์ปฌ ์„ค์น˜ ์ง„ํ–‰ ๋‹จ๊ณ„

    7.6 ๋กœ๊ทธ ํŒŒ์ผ

    7.7 ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

    8. ์„ค์น˜ ํ›„ ํ™•์ธ

    8.1 ์„œ๋น„์Šค ํ™•์ธ

    8.2 ํฌํŠธ ํ™•์ธ

    8.3 PostgreSQL ์ ‘์† ํ…Œ์ŠคํŠธ

    ๋ถ€๋ก: ์ฃผ์š” ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

    ํ˜„์žฌ ์„œ๋ฒ„ IP ๋ถˆ์ผ์น˜ (๋กœ์ปฌ ์„ค์น˜)

    SSH ํ‚ค ๋“ฑ๋ก ์‹คํŒจ

    ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ๊ฒ€์ฆ ์‹คํŒจ

    ๋ผ์ด์„ ์Šค ๊ด€๋ จ ์˜ค๋ฅ˜

    ๋ผ์ด์„ ์Šค ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ ์—†์Œ

    ๋ผ์ด์„ ์Šค ์—๋””์…˜ ํ™•์ธ ๋ถˆ๊ฐ€

    signature ์ค‘๋ณต

    ๋ผ์ด์„ ์Šค ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ฏธ์„ค์ • / ๊ฒฝ๋กœ ๋ถˆ์ผ์น˜ (๋ฐฐํฌ ํ›„ ๊ฒ€์ฆ)

    etcd ์‹œ์ž‘ ์‹คํŒจ

    OpenProxy ์‹œ์ž‘ ์‹คํŒจ

    Patroni ์ƒํƒœ ํ™•์ธ ํ•„์š”

    ์‚ฌ์ „ํ™•์ธ์‚ฌํ•ญ

    PG + Patroni + etcd

    c2

    [๋กœ์ปฌ ์„ค์น˜]                             
    node1์—์„œ ์ง์ ‘ ์‹คํ–‰                     
      python3 opensql_local_installer.py          
                                                  
    node2์—์„œ ์ง์ ‘ ์‹คํ–‰                            
      python3 opensql_local_installer.py           
    
    node3์—์„œ ์ง์ ‘ ์‹คํ–‰
      python3 opensql_local_installer.py
      
      
    [์›๊ฒฉ ์„ค์น˜]
    python3 opensql_remote_installer.py
    โ”‚  SSH
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ–ถ node1
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ–ถ node2
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ node3
    opensql-installer/
    โ”œโ”€โ”€ opensql_local_installer.py   # ๋กœ์ปฌ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ
    โ”œโ”€โ”€ opensql_remote_installer.py  # ์›๊ฒฉ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ
    โ”œโ”€โ”€ config/                      # ์„ค์ • ๋””๋ ‰ํ† ๋ฆฌ
    โ”‚   โ”œโ”€โ”€ common.env               # ๊ณตํ†ต ์„ค์ • (๋กœ์ปฌ/์›๊ฒฉ ๊ณตํ†ต, ํ•„์ˆ˜ ์ˆ˜์ •)
    โ”‚   โ”œโ”€โ”€ remote.env               # ์›๊ฒฉ ์„ค์น˜ ์ „์šฉ ์„ค์ • (์›๊ฒฉ ์„ค์น˜ ์‹œ ํ•„์ˆ˜ ์ˆ˜์ •)
    โ”‚   โ”œโ”€โ”€ etcd.config.env          # etcd ์ „์šฉ ์˜ต์…˜
    โ”‚   โ”œโ”€โ”€ patroni.config.env       # Patroni/PostgreSQL ์ „์šฉ ์˜ต์…˜
    โ”‚   โ”œโ”€โ”€ openproxy.config.env     # OpenProxy ์ „์šฉ ์˜ต์…˜
    โ”‚   โ”œโ”€โ”€ etcd.env                 # etcd ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ…œํ”Œ๋ฆฟ 
    โ”‚   โ”œโ”€โ”€ etcd.service             # etcd ์„œ๋น„์Šค ํŒŒ์ผ ํ…œํ”Œ๋ฆฟ 
    โ”‚   โ”œโ”€โ”€ patroni.yml              # Patroni ์„ค์ • ํ…œํ”Œ๋ฆฟ 
    โ”‚   โ”œโ”€โ”€ openproxy.toml           # OpenProxy ์„ค์ • ํ…œํ”Œ๋ฆฟ 
    โ”‚   โ””โ”€โ”€ openproxy.service        # OpenProxy ์„œ๋น„์Šค ํŒŒ์ผ ํ…œํ”Œ๋ฆฟ 
    โ”œโ”€โ”€ licenses/                    # ๋…ธ๋“œ๋ณ„ ๋ผ์ด์„ ์Šค XML ๋ฐฐ์น˜ ๋””๋ ‰ํ† ๋ฆฌ (ํ•„์ˆ˜ ์ƒ์„ฑ)
    โ”‚   โ”œโ”€โ”€ node1_license.xml        (์˜ˆ์‹œ)
    โ”‚   โ””โ”€โ”€ ...
    โ””โ”€โ”€ src/                         # ๊ณตํ†ต ๋ชจ๋“ˆ (์ˆ˜์ • ๋ถˆํ•„์š”)
        โ”œโ”€โ”€ config.py
        โ”œโ”€โ”€ functions.py
        โ””โ”€โ”€ package_requirements.json
    # Rocky Linux / RHEL ์„ค์น˜ ์˜ˆ์‹œ
    dnf install -y openssh-clients python3 sshpass
    opensql-installer/
    โ””โ”€โ”€ licenses/
        โ”œโ”€โ”€ node1_license.xml
        โ”œโ”€โ”€ node2_license.xml   (3node, 2node-witness)
        โ””โ”€โ”€ node3_license.xml   (3node)
    # ์˜ˆ์‹œ: Rocky Linux 8.10์šฉ ํŒจํ‚ค์ง€
    tar -xzf Tmax_OpenSQL_3.18.1.3_rockylinux8.10_buildtime20260223.tar.gz
    Tmax_OpenSQL_3.18.1.3_rockylinux8.10_buildtime20260223/
    โ””โ”€โ”€ opensql-installer/
        โ”œโ”€โ”€ opensql_local_installer.py
        โ”œโ”€โ”€ opensql_remote_installer.py
        โ””โ”€โ”€ config/
            โ”œโ”€โ”€ common.env       โ† ๋กœ์ปฌ/์›๊ฒฉ ๊ณตํ†ต ์„ค์ • (ํ•„์ˆ˜ ์ˆ˜์ •)
            โ””โ”€โ”€ remote.env       โ† ์›๊ฒฉ ์„ค์น˜ ์ „์šฉ ์„ค์ • (์›๊ฒฉ ์„ค์น˜ ์‹œ ํ•„์ˆ˜ ์ˆ˜์ •)
    # ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ IP (ํ˜„์žฌ ๋…ธ๋“œ ํฌํ•จ)
    # ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ ํ˜„์žฌ ์„œ๋ฒ„ IP์™€ ๋น„๊ตํ•˜์—ฌ ์ž์‹ ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    NODE1_IP="<node1_ip>"
    NODE2_IP="<node2_ip>"
    NODE3_IP="<node3_ip>"
    
    # ํ˜„์žฌ ๋…ธ๋“œ์˜ ํ‘œ์‹œ ์ด๋ฆ„ (๋กœ์ปฌ ์„ค์น˜ ์‹œ ๋กœ๊ทธ์— ํ‘œ์‹œ๋จ)
    NODE_NAME="<node_name>"
    
    # OpenSQL ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ (์ ˆ๋Œ€ ๊ฒฝ๋กœ)
    # ๋ฐ”์ด๋„ˆ๋ฆฌ, ๋ฐ์ดํ„ฐ, ์„ค์ •, ๋กœ๊ทธ๊ฐ€ ์ด ๊ฒฝ๋กœ ํ•˜์œ„์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
    # ํŒจํ‚ค์ง€ ์„ค์น˜ ๊ฒฝ๋กœ๋Š” ์ž๋™์œผ๋กœ $OPENSQL_HOME/install ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    OPENSQL_HOME="/path/to/opensql/home"
    PG_HOME="/path/to/pg/home"
    PG_DATA_DIR="/path/to/pg/data"
    
    # ํ˜„์žฌ ๋…ธ๋“œ์— ์ ์šฉํ•  ๋ผ์ด์„ ์Šค ํŒŒ์ผ๋ช… (licenses/ ๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ์ค€)
    # ๋กœ์ปฌ ์„ค์น˜ ์‹œ ํ•„์ˆ˜. ์›๊ฒฉ ์„ค์น˜ ์‹œ์—๋Š” remote.env์—์„œ ๋…ธ๋“œ๋ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    LICENSE_NAME="<license file>"
    # ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์ž๋™ ์„ค์น˜ (๊ธฐ๋ณธ: false)
    # AUTO_INSTALL_PREREQS=false
    
    # OpenSQL ์šด์˜ ์œ ์ €/๊ทธ๋ฃน ์ด๋ฆ„ (๊ธฐ๋ณธ: opensql)
    # OPENSQL_USER=opensql
    # OPENSQL_GROUP=opensql
    
    # OpenSQL ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ ํŒจํ„ด (๊ธฐ๋ณธ: Tmax_OpenSQL*)
    # OPENSQL_PACKAGE_PATTERN="Tmax_OpenSQL*"
    
    # 2node-witness ๋ชจ๋“œ: witness ๋…ธ๋“œ์˜ etcd ํฌํŠธ (ํ•„์ˆ˜)
    # WITNESS_ETCD_CLIENT_PORT=2379
    # WITNESS_ETCD_PEER_PORT=2380
    # ๋…ธ๋“œ ํ‘œ์‹œ ์ด๋ฆ„ (๋กœ๊ทธ์— ํ‘œ์‹œ๋จ)
    NODE1_NAME="db-node1"
    NODE2_NAME="db-node2"
    NODE3_NAME="db-node3"
    
    # SSH ์ ‘์† ์œ ์ € (๊ฐ ๋…ธ๋“œ์— ์กด์žฌํ•ด์•ผ ํ•จ, sudo ๊ถŒํ•œ ํ•„์š”)
    NODE1_SSH_USER="ec2-user"
    NODE2_SSH_USER="ec2-user"
    NODE3_SSH_USER="ec2-user"
    
    # SSH ํฌํŠธ (๊ธฐ๋ณธ 22๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋ช…์‹œ)
    NODE1_SSH_PORT="22"
    NODE2_SSH_PORT="22"
    NODE3_SSH_PORT="22"
    
    # ๋…ธ๋“œ๋ณ„ OpenSQL ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ (common.env์˜ OPENSQL_HOME๊ณผ ๋‹ค๋ฅผ ๊ฒฝ์šฐ)
    NODE1_OPENSQL_HOME="/home/opensql"
    NODE2_OPENSQL_HOME="/home/opensql"
    NODE3_OPENSQL_HOME="/home/opensql"
    
    # ๋…ธ๋“œ๋ณ„ PG ๋””๋ ‰ํ„ฐ๋ฆฌ
    NODE1_PG_HOME="/path/to/pg/"
    NODE2_PG_HOME="/path/to/pg/"
    NODE3_PG_HOME="/path/to/pg/"
    
    # ๋…ธ๋“œ๋ณ„ PG_DATA ์œ„์น˜
    NODE1_PG_DATA="/path/to/pg/data"
    NODE2_PG_DATA="/path/to/pg/data"
    NODE3_PG_DATA="/path/to/pg/data"
    
    # ๋…ธ๋“œ๋ณ„ ๋ผ์ด์„ ์Šค ํŒŒ์ผ๋ช… (opensql-installer/licenses/ ๊ธฐ์ค€)
    # Patroni๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋…ธ๋“œ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    # 2node-witness ๋ชจ๋“œ์˜ witness(node3)๋Š” ๋น„์›Œ๋‘ก๋‹ˆ๋‹ค.
    NODE1_LICENSE_NAME="node1_license.xml"
    NODE2_LICENSE_NAME="node2_license.xml"
    NODE3_LICENSE_NAME="node3_license.xml"
    ๋…ธ๋“œ๋ณ„ ๋น„๋ฐ€๋ฒˆํ˜ธ (NODE{n}_PASSWORD)
      > ์ „์ฒด ๊ณตํ†ต ๋น„๋ฐ€๋ฒˆํ˜ธ (COMMON_PASSWORD)
        > ๋Œ€ํ™”ํ˜• ์ž…๋ ฅ (์‹คํ–‰ ์‹œ ํ”„๋กฌํ”„ํŠธ)
    python3 opensql_remote_installer.py --password "my_password"
    python3 opensql_remote_installer.py --node1-password "pw1" --node2-password "pw2" --node3-password "pw3"
    # ์ „์ฒด ๊ณตํ†ต ๋น„๋ฐ€๋ฒˆํ˜ธ
    # COMMON_PASSWORD=""
    
    # ๋…ธ๋“œ๋ณ„ ๊ฐœ๋ณ„ ์ง€์ •
    # NODE1_PASSWORD=""
    # NODE2_PASSWORD=""
    # NODE3_PASSWORD=""
    # SSH ํ‚ค ๊ฒฝ๋กœ (๊ธฐ๋ณธ: ~/.ssh/id_rsa_opensql)
    # SSH_KEY="$HOME/.ssh/id_rsa_opensql"
    
    # SSH ์ถ”๊ฐ€ ์˜ต์…˜ (๊ธฐ๋ณธ: StrictHostKeyChecking=no, ConnectTimeout=10)
    # SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=10"
    # 2node-witness ๋ชจ๋“œ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์‹๋ณ„์ž (๊ธฐ๋ณธ: c1)
    # CLUSTER_ID=c1
    
    # etcd ํฌํŠธ (๊ธฐ๋ณธ: 2379/2380)
    # ETCD_CLIENT_PORT=2379
    # ETCD_PEER_PORT=2380
    
    # etcd ๋ฐ์ดํ„ฐ/ํ™˜๊ฒฝ ํŒŒ์ผ ๊ฒฝ๋กœ (๋น„์›Œ๋‘๋ฉด ์ž๋™ ์„ค์ •)
    # ETCD_DATA_DIR=/etc/opensql/etcd_data
    # ETCD_ENV_FILE=/etc/opensql/etcd.env
    # Patroni ์ธ์Šคํ„ด์Šค ์ด๋ฆ„ (๊ธฐ๋ณธ: postgresql1/2/3)
    # NODE1_PATRONI_NAME=postgresql1
    # NODE2_PATRONI_NAME=postgresql2
    # NODE3_PATRONI_NAME=postgresql3
    
    # Patroni ์„ค์ • (๊ธฐ๋ณธ๊ฐ’)
    # PATRONI_SCOPE_BASE=opensql
    # PATRONI_API_PORT=8008
    # PATRONI_TTL=30
    # PATRONI_LOOP_WAIT=10
    # PATRONI_RETRY_TIMEOUT=10
    
    # PostgreSQL ํฌํŠธ/๊ณ„์ • (๊ธฐ๋ณธ๊ฐ’)
    # PG_PORT=5432
    # PG_SUPERUSER=postgres
    # PG_SUPERUSER_PASSWORD=postgres
    # PG_REPLICATION_USER=patroni_repl
    # PG_REPLICATION_PASSWORD=patroni_repl
    # PG_REWIND_USER=patroni_rewind
    # PG_REWIND_PASSWORD=patroni_rewind
    # OpenProxy ํฌํŠธ (๊ธฐ๋ณธ: 6432/6433)
    # OPENPROXY_PORT=6432
    # OPENPROXY_ADMIN_PORT=6433
    
    # OpenProxy ๋™์ž‘ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’)
    # OPENPROXY_CONNECT_TIMEOUT=10000    # ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ (๋ฐ€๋ฆฌ์ดˆ)
    # OPENPROXY_POOL_MODE=session        # ํ’€ ๋ชจ๋“œ: session / transaction
    # OPENPROXY_DEFAULT_ROLE=primary     # ๊ธฐ๋ณธ ๋ผ์šฐํŒ…: primary / replica
    # OPENPROXY_QUERY_PARSER_ENABLED=false
    # OPENPROXY_POOL_SIZE=10             # ํ’€๋‹น ์ตœ๋Œ€ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ˆ˜
    # OPENPROXY_DATABASE=postgres        # ์—ฐ๊ฒฐ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ช…
    WITNESS_ETCD_CLIENT_PORT=2379
    WITNESS_ETCD_PEER_PORT=2380
    NODE1_IP="192.168.1.10"
    NODE2_IP=""
    NODE3_IP=""
    
    NODE_NAME="db-single"
    OPENSQL_HOME="/home/opensql"
    LICENSE_NAME="node1_license.xml"
    NODE1_NAME="db-single"
    NODE1_SSH_USER="ec2-user"
    NODE1_SSH_PORT="22"
    NODE1_OPENSQL_HOME="/home/opensql"
    NODE1_LICENSE_NAME="node1_license.xml"
    # ๋กœ์ปฌ ์„ค์น˜ (node1์—์„œ ์ง์ ‘)
    cd opensql-installer
    python3 opensql_local_installer.py --mode single
    
    # ์›๊ฒฉ ์„ค์น˜ (์ œ์–ด ์„œ๋ฒ„์—์„œ)
    cd opensql-installer
    python3 opensql_remote_installer.py --mode single
    node1: Primary PostgreSQL + Patroni + etcd
    node2: Standby PostgreSQL + Patroni + etcd + OpenProxy
    node3: Standby PostgreSQL + Patroni + etcd + OpenProxy
    # ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๊ณตํ†ต
    NODE1_IP="192.168.1.10"
    NODE2_IP="192.168.1.11"
    NODE3_IP="192.168.1.12"
    
    OPENSQL_HOME="/home/opensql"
    
    # node1์—์„œ ์‹คํ–‰ ์‹œ
    NODE_NAME="db-primary"
    LICENSE_NAME="node1_license.xml"
    
    # node2์—์„œ ์‹คํ–‰ ์‹œ โ†’ NODE_NAME="db-standby1", LICENSE_NAME="node2_license.xml"
    # node3์—์„œ ์‹คํ–‰ ์‹œ โ†’ NODE_NAME="db-standby2", LICENSE_NAME="node3_license.xml"
    NODE1_NAME="db-primary"
    NODE1_SSH_USER="ec2-user"
    NODE1_SSH_PORT="22"
    NODE1_OPENSQL_HOME="/home/opensql"
    NODE1_LICENSE_NAME="node1_license.xml"
    
    NODE2_NAME="db-standby1"
    NODE2_SSH_USER="ec2-user"
    NODE2_SSH_PORT="22"
    NODE2_OPENSQL_HOME="/home/opensql"
    NODE2_LICENSE_NAME="node2_license.xml"
    
    NODE3_NAME="db-standby2"
    NODE3_SSH_USER="ec2-user"
    NODE3_SSH_PORT="22"
    NODE3_OPENSQL_HOME="/home/opensql"
    NODE3_LICENSE_NAME="node3_license.xml"
    # ๋กœ์ปฌ ์„ค์น˜ (๊ฐ ๋…ธ๋“œ์—์„œ NODE_NAME/LICENSE_NAME ๋ณ€๊ฒฝ ํ›„ ์‹คํ–‰)
    cd opensql-installer
    python3 opensql_local_installer.py --mode 3node
    
    # ์›๊ฒฉ ์„ค์น˜ (์ œ์–ด ์„œ๋ฒ„์—์„œ ํ•œ ๋ฒˆ์— ์‹คํ–‰)
    cd opensql-installer
    python3 opensql_remote_installer.py --mode 3node
    node1: PostgreSQL + Patroni + etcd + OpenProxy
    node2: PostgreSQL + Patroni + etcd + OpenProxy
    node3: etcd (witness only)
    # ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๊ณตํ†ต
    NODE1_IP="192.168.1.10"
    NODE2_IP="192.168.1.11"
    NODE3_IP="192.168.1.12"
    
    OPENSQL_HOME="/home/opensql"
    
    # witness etcd ํฌํŠธ (ํ•„์ˆ˜ โ€” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋™์ผํ•˜๊ฒŒ ์„ค์ •)
    WITNESS_ETCD_CLIENT_PORT=2379
    WITNESS_ETCD_PEER_PORT=2380
    
    # node1์—์„œ ์‹คํ–‰ ์‹œ
    NODE_NAME="db-primary"
    LICENSE_NAME="node1_license.xml"
    
    # node2์—์„œ ์‹คํ–‰ ์‹œ โ†’ NODE_NAME="db-standby", LICENSE_NAME="node2_license.xml"
    # node3(witness)์—์„œ ์‹คํ–‰ ์‹œ โ†’ NODE_NAME="witness", LICENSE_NAME=""
    CLUSTER_ID=c1
    NODE1_NAME="db-primary"
    NODE1_SSH_USER="ec2-user"
    NODE1_SSH_PORT="22"
    NODE1_OPENSQL_HOME="/home/opensql"
    NODE1_LICENSE_NAME="node1_license.xml"
    
    NODE2_NAME="db-standby"
    NODE2_SSH_USER="ec2-user"
    NODE2_SSH_PORT="22"
    NODE2_OPENSQL_HOME="/home/opensql"
    NODE2_LICENSE_NAME="node2_license.xml"
    
    NODE3_NAME="witness"
    NODE3_SSH_USER="ec2-user"
    NODE3_SSH_PORT="22"
    NODE3_OPENSQL_HOME="/home/opensql"
    # witness(node3)๋Š” Patroni ์—†์Œ โ†’ LICENSE_NAME ๋น„์›Œ๋‘ก๋‹ˆ๋‹ค.
    NODE3_LICENSE_NAME=""
    # ๋กœ์ปฌ ์„ค์น˜ (๊ฐ ๋…ธ๋“œ์—์„œ NODE_NAME/LICENSE_NAME ๋ณ€๊ฒฝ ํ›„ ์‹คํ–‰)
    cd opensql-installer
    python3 opensql_local_installer.py --mode 2node-witness
    
    # ์›๊ฒฉ ์„ค์น˜ (์ œ์–ด ์„œ๋ฒ„์—์„œ ํ•œ ๋ฒˆ์— ์‹คํ–‰)
    cd opensql-installer
    python3 opensql_remote_installer.py --mode 2node-witness
    cd opensql-installer
    
    python3 opensql_local_installer.py --mode 3node
    python3 opensql_local_installer.py --mode single
    python3 opensql_local_installer.py --mode 2node-witness
    cd opensql-installer
    
    # ๊ธฐ๋ณธ ์‹คํ–‰ (3node, ๋Œ€ํ™”ํ˜• sudo ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ)
    python3 opensql_remote_installer.py --mode 3node
    
    # ๊ณตํ†ต ๋น„๋ฐ€๋ฒˆํ˜ธ ์ง€์ •
    python3 opensql_remote_installer.py --mode 3node --password "my_password"
    
    # ๋…ธ๋“œ๋ณ„ ๋น„๋ฐ€๋ฒˆํ˜ธ
    python3 opensql_remote_installer.py --mode 3node \
      --node1-password "pw1" \
      --node2-password "pw2" \
      --node3-password "pw3"
    export OPENSQL_HOME=/home/opensql
    export PATH=/home/opensql/bin:$PATH
    export LD_LIBRARY_PATH=/home/opensql/lib:$LD_LIBRARY_PATH
    export PGHOST=/home/opensql/tmp
    export PGDATA=/home/opensql/data
    export OPENSQL_LICENSE_PATH=/home/opensql/license/node1_license.xml
    vi /home/opensql/.opensqlrc
    
    # ํŒŒ์ผ ๋์— ์ถ”๊ฐ€
    export PGOPTIONS="-c log_min_duration_statement=1000"
    export PGTZ="Asia/Seoul"
    source ~/.opensqlrc
    # etcd ์„œ๋น„์Šค ์ƒํƒœ
    sudo systemctl status opensql-etcd
    
    # Patroni ํ”„๋กœ์„ธ์Šค
    ps aux | grep patroni
    
    # OpenProxy ํ”„๋กœ์„ธ์Šค
    pgrep -f openproxy
    
    # ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ (opensql ์œ ์ €๋กœ)
    patronictl -c /home/opensql/etc/patroni.yml list
    ss -tunlp | grep -E "5432|6432|6433|2379|2380|8008"
    # opensql ์œ ์ €๋กœ
    psql -h 127.0.0.1 -p 5432 -U postgres
    
    # OpenProxy๋ฅผ ํ†ตํ•œ ์ ‘์†
    psql -h 127.0.0.1 -p 6432 -U postgres
    RuntimeError: ํ˜„์žฌ ์„œ๋ฒ„ IP(x.x.x.x)๊ฐ€ ์„ค์ •๋œ ๋…ธ๋“œ IP์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ERROR: ํ‚ค ๋“ฑ๋ก ์‹คํŒจ
    ssh-copy-id -i ~/.ssh/id_rsa_opensql ec2-user@192.168.1.10
    ERROR: ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์š”๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ERROR: ๋ˆ„๋ฝ๋œ ํ•„์ˆ˜ ํŒจํ‚ค์ง€: python3-psycopg2
    ERROR: ๋ผ์ด์„ ์Šค ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: .../licenses
    ERROR: ๋ผ์ด์„ ์Šค ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: .../licenses/node1_license.xml
    ERROR: ๋ผ์ด์„ ์Šค edition์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    ERROR: ๋ผ์ด์„ ์Šค signature๊ฐ€ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.
    ERROR: OPENSQL_LICENSE_PATH ๋ฏธ์„ค์ •
    ERROR: OPENSQL_LICENSE_PATH ๋ถˆ์ผ์น˜ (expected=..., actual=...)
    ERROR: etcd ์‹œ์ž‘ ์‹คํŒจ
    sudo journalctl -u opensql-etcd -n 100 --no-pager
    ss -tunlp | grep 2379
    ERROR: OpenProxy ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
    cat /home/opensql/logs/openproxy.log | tail -50
    ss -tunlp | grep 6432
    WARN: Patroni ์ƒํƒœ ํ™•์ธ ํ•„์š”
    cat /home/opensql/logs/patroni.log | tail -50
    curl http://192.168.1.10:8008/health

    ์‚ฌ์ „ํ™•์ธ์‚ฌํ•ญ

    ์ง€์› ํ”Œ๋žซํผ ๋ฐ ์šด์˜์ฒด์ œ

    OpenSQL 3.0์€ ์•„๋ž˜์˜ ํ•˜๋“œ์›จ์–ด ๋ฐ ์šด์˜์ฒด์ œ ํ™˜๊ฒฝ์—์„œ ์„ค์น˜ ๋ฐ ์šด์˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    HW/SW
    CPU
    OS
    Binary Bits

    GNU

    x86

    Oracle Linux 8

    Oracle Linux 9

    Rocky Linux 8

    Rocky Linux 9 RHEL 8 RHEL 9 Ubuntu 22.04 Ubuntu 24.04

    OpenSQL 3.0์„ ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€๊ฐ€ ์‚ฌ์ „์— ์„ค์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    HA ํ™˜๊ฒฝ์—์„œ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ์‹œ์Šคํ…œ ์‹œ๊ฐ„์ด ๋™์ผํ•˜๊ฒŒ ๋™๊ธฐํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ฐ„ ์‹œ๊ฐ„์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ Leader ์„ ์ถœ, ๋…ธ๋“œ ์ƒํƒœ ํŒ๋‹จ, ๋กœ๊ทธ ๋ถ„์„, ์žฅ์•  ์กฐ์น˜ ๊ณผ์ •์—์„œ ์˜ค์ž‘๋™์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ชจ๋“  HA ๋…ธ๋“œ์—๋Š” NTP ๋˜๋Š” Chrony ๊ธฐ๋ฐ˜ ์‹œ๊ฐ„ ๋™๊ธฐํ™”๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋™์ผํ•œ ์‹œ๊ฐ„ ๋™๊ธฐํ™” ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

    • OpenHA ๋ฐ PostgreSQL ๊ธฐ๋™ ์ „์— ๋…ธ๋“œ ๊ฐ„ ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์„ค์ • ์˜ˆ์‹œ:

    ํ™•์ธ ์˜ˆ์‹œ:

    • PostgreSQL

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์šฉ๋„
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • Patroni

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    • pgAudit

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • Postgis

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • pgvectorscale

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • opensql-installer

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • pg_repack

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • PostgreSQL

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์šฉ๋„
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • Patroni

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    • pgAudit

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • Postgis

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • pgvectorscale

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • opensql-installer

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • pg_repack

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • PostgreSQL

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์šฉ๋„
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • Patroni

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    • pgAudit

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • pgvectorscale

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • opensql-installer

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • postgis

    ์„ค์น˜ํ•  ํŒจํ‚ค์ง€ ๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • pg_repack

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€

    • PostgreSQL

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์šฉ๋„
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • Patroni

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    • pgAudit

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • pgvectorscale

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • opensql-installer

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • postgis

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€
    • pg_repack

    ํŒจํ‚ค์ง€๋ช…
    ์ตœ์†Œ ๋ฒ„์ „
    ์ •ํ™•ํ•œ ๋ฒ„์ „ ์˜ˆ์‹œ
    ์„ค๋ช…
    ํ•„์ˆ˜ ์—ฌ๋ถ€

    OpenSQL 3.0 ์€ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3-Node, 2-Node ๊ตฌ์„ฑ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

    ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๊ตฌ์„ฑ์œผ๋กœ, ๋…ธ๋“œ ๊ฐ„ ์ด์ค‘ํ™” ๋ฐ ์ž๋™ ์žฅ์•  ์กฐ์น˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    2๊ฐœ์˜ ๋…ธ๋“œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ์œผ๋กœ๋„ ๊ณ ๊ฐ€์šฉ์„ฑ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ฟผ๋Ÿผ ์œ ์ง€๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ Witness ๋…ธ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    witness node ์ตœ์†Œ ๊ตฌ์„ฑ ์š”๊ตฌ์‚ฌํ•ญ

    (์ฐธ๊ณ :)

    On-premises

    ํ•ญ๋ชฉ
    ์ตœ์†Œ spec
    ๊ถŒ์žฅ spec

    Cloud

    Provider
    Type
    vCPUs
    Memory (GB)
    Max concurrent IOPS
    Disk bandwidth (MB/s)

    OpenSQL ์„ค์น˜๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ์š”๊ฑด์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • ์„ค์น˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์šด์˜์ฒด์ œ(OS) ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” sudo ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • OpenSQL์˜ ์„ค์น˜ ๋ฐ ์‹คํ–‰์„ ์œ„ํ•ด ์ „์šฉ OS ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

    • OpenSQL์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜ OPENSQL_HOME ๋กœ ์„ค์ •ํ•œ ์œ„์น˜์— ์„ค์น˜๊ฐ€ ๋˜๋ฏ€๋กœ ์‚ฌ์ „์— ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    ๋ณธ ๋งค๋‰ด์–ผ์—์„œ๋Š” 3-Node ๊ตฌ์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๋…ธ๋“œ์— ์„ค์น˜๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ ์˜ˆ์‹œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์„œ๋ฒ„๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•˜๋ฉฐ, OpenSQL 3.0์˜ ๊ณ ๊ฐ€์šฉ์„ฑ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค.

    Servers
    Components
    IP Address

    ์˜คํ”ˆ ํ”„๋ก์‹œ(OpenProxy)

    Rust ๊ธฐ๋ฐ˜ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค์ธ ์˜คํ”ˆํ”„๋ก์‹œ(OpenProxy) ์„ค์ • ๋ฐ ์‹คํ–‰์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    OpenSQL ์˜ connection pooler, load-balancer, virtual-ip failover ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์˜คํ”ˆํ”„๋ก์‹œ(OpenProxy)์˜ ์„ค์ • ๋ฐ ์‹คํ–‰์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


    ํ•ด๋‹น ๋ฌธ์„œ๋Š” OpenProxy ์‹คํ–‰๋  ๋•Œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’๋“ค์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. OpenProxy๋ฅผ ์›ํ•˜๋Š” ์„ค์ • ํŒŒ์ผ๋กœ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด OpenProxy ๋ช…๋ น์–ด ๋’ค์— ์„ค์ • ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    [general] ์— ์„ ์–ธ๋˜๋Š” ๊ฐ’๋“ค์ด๋‹ค. general์— ์„ค์ •๋˜๋Š” ๊ฐ’๋“ค์€ port์™€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์„ค์ •, OpenProxy์˜ admin ์ด๋ฆ„๊ณผ ํŒจ์Šค์›Œ๋“œ ๋“ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋ณ€์ˆ˜๋ช…
    Type
    Default
    Description

    libgcc

    8.x ์ด์ƒ

    8.5.0-4.el8

    GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libstdc++

    8.x ์ด์ƒ

    8.5.0-4.el8

    C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    zlib

    1.2.11 ์ด์ƒ

    1.2.11-17.el8

    ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    readline

    7.0 ์ด์ƒ

    7.0-10.el8

    ๋ช…๋ น์ค„ ํŽธ์ง‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    ncurses-libs

    6.1 ์ด์ƒ

    6.1-9.20180224.el8

    ํ„ฐ๋ฏธ๋„ ์ œ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    lz4-libs

    1.8.3 ์ด์ƒ

    1.8.3-3.el8

    LZ4 ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜

    ํ•„์ˆ˜

    libicu

    60.2 ์ด์ƒ

    60.2-3.el8

    ์œ ๋‹ˆ์ฝ”๋“œ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    openssl-libs

    1.1.1 ์ด์ƒ

    1.1.1k-5.el8

    SSL/TLS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libxml2

    2.9.7 ์ด์ƒ

    2.9.7-9.el8

    XML ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    llvm-libs

    12.0 ์ด์ƒ

    12.0.1-2.el8

    JIT ์ปดํŒŒ์ผ (PostgreSQL 11+)

    ์„ ํƒ (JIT ์‚ฌ์šฉ ์‹œ)

    perl-libs

    5.26 ์ด์ƒ

    5.26.3-420.el8

    PL/Perl ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Perl ์‚ฌ์šฉ ์‹œ)

    python3-libs

    3.6 ์ด์ƒ

    3.6.8-38.el8

    PL/Python ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Python ์‚ฌ์šฉ ์‹œ)

    tcl

    8.6 ์ด์ƒ

    8.6.8-4.el8

    PL/Tcl ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Tcl ์‚ฌ์šฉ ์‹œ)

    pam

    1.3.1 ์ด์ƒ

    1.3.1-12.el8

    PAM ์ธ์ฆ

    ์„ ํƒ (PAM ์ธ์ฆ ์‚ฌ์šฉ ์‹œ)

    krb5-libs

    1.18 ์ด์ƒ

    1.18.2-8.el8

    Kerberos ์ธ์ฆ

    ์„ ํƒ (Kerberos ์‚ฌ์šฉ ์‹œ)

    libxslt

    1.1.32 ์ด์ƒ

    1.1.32-6.el8

    XSLT ๋ณ€ํ™˜

    ์„ ํƒ (XSLT ์‚ฌ์šฉ ์‹œ)

    openldap

    2.4.46 ์ด์ƒ

    2.4.46-17.el8

    LDAP ์ธ์ฆ

    ์„ ํƒ (LDAP ์‚ฌ์šฉ ์‹œ)

    libselinux

    2.9 ์ด์ƒ

    2.9-5.el8

    SELinux ์ง€์›

    ์„ ํƒ (SELinux ์‚ฌ์šฉ ์‹œ)

    systemd-libs

    239 ์ด์ƒ

    239-51.el8

    systemd ํ†ตํ•ฉ

    ์„ ํƒ (systemd ์‚ฌ์šฉ ์‹œ)

    3.6.8-38.el8

    Python ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    glibc

    2.28 ์ด์ƒ

    2.28-225.el8

    GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์‹œ์Šคํ…œ ๊ธฐ๋ณธ)

    libgcc

    8.x ์ด์ƒ

    8.5.0-4.el8

    GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libstdc++

    8.x ์ด์ƒ

    8.5.0-4.el8

    C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    openssl-libs

    1.1.1 ์ด์ƒ

    1.1.1k-5.el8

    SSL/TLS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    jq

    1.5 ์ด์ƒ

    1.5-3.el8

    JSON ํŒŒ์„œ/ํ”„๋กœ์„ธ์„œ

    postgresql12-libs

    12.0 ์ด์ƒ

    12.15-1.el8

    PostgreSQL ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (psycopg2 ์˜์กด)

    libpq-devel

    13.x ์ด์ƒ

    libpq-devel-13.20-1.el8_10

    libpq(ํด๋ผ์ด์–ธํŠธ) ํ—ค๋”/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    krb5-devel

    1.18 ์ด์ƒ

    1.18.2-32.el8_10

    (PostgreSQL ๋นŒ๋“œ/์—ฐ๋™ ์˜ต์…˜์— ๋”ฐ๋ผ) GSSAPI/Kerberos ํ—ค๋”

    ํ•„์ˆ˜

    geos

    3.13.1 ์ด์ƒ

    geos-3.13.1-1.el8

    2D ๊ณต๊ฐ„(geometry) ์—ฐ์‚ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    proj

    6.3.2 ์ด์ƒ

    proj-6.3.2-4.el8

    ์ขŒํ‘œ๊ณ„ ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    json-c

    0.13.1 ์ด์ƒ

    json-c-0.13.1-3.el8

    JSON ํŒŒ์‹ฑ ๋ฐ ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libxml2

    2.9.7 ์ด์ƒ

    libxml2-2.9.7-21.el8_10.3

    XML ํŒŒ์‹ฑ ๋ฐ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libxml2-devel

    2.9.7 ์ด์ƒ

    libxml2-2.9.7-21.el8_10.3

    XML ํŒŒ์‹ฑ ๋ฐ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    gdal

    3.0.4 ์ด์ƒ

    gdal-3.0.4-12.el8

    ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    protobuf-c

    1.3.0 ์ด์ƒ

    1.3.0-8.el8

    Protocol Buffer C ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    clang-devel

    20.1.8 ์ด์ƒ

    2.module+el8.10.0+2096+4bb90181

    Clang ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€

    ํ•„์ˆ˜

    rustup

    1.85.0

    1.85.0-x86_64-unknown-linux-gnu

    Rust ์„ค์น˜ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ

    ํ•„์ˆ˜

    cargo-pgrx

    0.13.0 ์ด์ƒ

    0.13.0

    Rust ๊ธฐ๋ฐ˜ PostgreSQL ํ™•์žฅ ๊ฐœ๋ฐœ ๋„๊ตฌ

    ํ•„์ˆ˜

    python3-dataclasses

    0.8 ์ด์ƒ

    0.8-4.el8

    ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ์ž๋™ ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    gcc

    8.0 ์ด์ƒ

    8.5.0-4.el8

    GNU C ์ปดํŒŒ์ผ๋Ÿฌ

    ํ•„์ˆ˜

    lz4-devel

    1.8.3 ์ด์ƒ

    1.8.3-3.el8

    LZ4 ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    zlib-devel

    1.2.11 ์ด์ƒ

    1.2.11-17.el8

    ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    readline-devel

    7.0 ์ด์ƒ

    7.0-10.el8

    ๋ช…๋ น์ค„ ํŽธ์ง‘ ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libgcc

    11.x ์ด์ƒ

    11.2.1-9.el9

    GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libstdc++

    11.x ์ด์ƒ

    11.2.1-9.el9

    C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    zlib

    1.2.11 ์ด์ƒ

    1.2.11-31.el9

    ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    readline

    8.1 ์ด์ƒ

    8.1-4.el9

    ๋ช…๋ น์ค„ ํŽธ์ง‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    ncurses-libs

    6.2 ์ด์ƒ

    6.2-4.el9

    ํ„ฐ๋ฏธ๋„ ์ œ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    lz4-libs

    1.9.3 ์ด์ƒ

    1.9.3-5.el9

    LZ4 ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜

    ํ•„์ˆ˜

    libicu

    67.1 ์ด์ƒ

    67.1-7.el9

    ์œ ๋‹ˆ์ฝ”๋“œ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    openssl-libs

    3.0.x ์ด์ƒ

    3.0.1-23.el9

    SSL/TLS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (OpenSSL 3.0)

    ํ•„์ˆ˜

    libxml2

    2.9.13 ์ด์ƒ

    2.9.13-3.el9

    XML ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    llvm-libs

    14.0 ์ด์ƒ

    14.0.0-2.el9

    JIT ์ปดํŒŒ์ผ (PostgreSQL 11+)

    ์„ ํƒ (JIT ์‚ฌ์šฉ ์‹œ)

    perl-libs

    5.32 ์ด์ƒ

    5.32.1-6.el9

    PL/Perl ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Perl ์‚ฌ์šฉ ์‹œ)

    python3-libs

    3.9 ์ด์ƒ

    3.9.16-1.el9

    PL/Python ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Python ์‚ฌ์šฉ ์‹œ)

    tcl

    8.6 ์ด์ƒ

    8.6.10-5.el9

    PL/Tcl ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Tcl ์‚ฌ์šฉ ์‹œ)

    pam

    1.5.1 ์ด์ƒ

    1.5.1-10.el9

    PAM ์ธ์ฆ

    ์„ ํƒ (PAM ์ธ์ฆ ์‚ฌ์šฉ ์‹œ)

    krb5-libs

    1.19 ์ด์ƒ

    1.19.1-8.el9

    Kerberos ์ธ์ฆ

    ์„ ํƒ (Kerberos ์‚ฌ์šฉ ์‹œ)

    libxslt

    1.1.34 ์ด์ƒ

    1.1.34-6.el9

    XSLT ๋ณ€ํ™˜

    ์„ ํƒ (XSLT ์‚ฌ์šฉ ์‹œ)

    openldap

    2.6.2 ์ด์ƒ

    2.6.2-3.el9

    LDAP ์ธ์ฆ

    ์„ ํƒ (LDAP ์‚ฌ์šฉ ์‹œ)

    libselinux

    3.4 ์ด์ƒ

    3.4-5.el9

    SELinux ์ง€์›

    ์„ ํƒ (SELinux ์‚ฌ์šฉ ์‹œ)

    systemd-libs

    250 ์ด์ƒ

    250-4.el9

    systemd ํ†ตํ•ฉ

    ์„ ํƒ (systemd ์‚ฌ์šฉ ์‹œ)

    3.9.16-1.el9

    Python ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    glibc

    2.34 ์ด์ƒ

    2.34-40.el9

    GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์‹œ์Šคํ…œ ๊ธฐ๋ณธ)

    libgcc

    11.x ์ด์ƒ

    11.2.1-9.el9

    GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libstdc++

    11.x ์ด์ƒ

    11.2.1-9.el9

    C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    openssl-libs

    3.0.x ์ด์ƒ

    3.0.1-23.el9

    SSL/TLS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (OpenSSL 3.0)

    jq

    1.5 ์ด์ƒ

    1.5-3.el9

    JSON ํŒŒ์„œ/ํ”„๋กœ์„ธ์„œ

    postgresql13-libs

    13.0 ์ด์ƒ

    13.11-1.el9

    PostgreSQL ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (psycopg2 ์˜์กด)

    libpq-devel

    13.x ์ด์ƒ

    libpq-devel-13.20-1.el8_10

    libpq(ํด๋ผ์ด์–ธํŠธ) ํ—ค๋”/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    krb5-devel

    1.20.x ์ด์ƒ

    1.18.2-32.el8_10

    (PostgreSQL ๋นŒ๋“œ/์—ฐ๋™ ์˜ต์…˜์— ๋”ฐ๋ผ) GSSAPI/Kerberos ํ—ค๋”

    ํ•„์ˆ˜

    geos

    3.13.1 ์ด์ƒ

    geos-3.13.1-1.el9

    2D ๊ณต๊ฐ„(geometry) ์—ฐ์‚ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    proj

    9.6.0 ์ด์ƒ

    proj-9.6.0-2.el9

    ์ขŒํ‘œ๊ณ„ ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    json-c

    0.14 ์ด์ƒ

    json-c-0.14-11

    JSON ํŒŒ์‹ฑ ๋ฐ ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libxml2

    2.9.13 ์ด์ƒ

    libxml2-2.9.13-14.el9_7

    XML ํŒŒ์‹ฑ ๋ฐ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libxml2-devel

    2.9.13 ์ด์ƒ

    libxml2-2.9.13-14.el9_7

    XML ํŒŒ์‹ฑ ๋ฐ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    gdal

    3.4.x ์ด์ƒ

    gdal-3.4.3-3.el9

    ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    protobuf-c

    1.3.0 ์ด์ƒ

    1.3.0-13.el9

    Protocol Buffer C ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    clang-devel

    20.1.8 ์ด์ƒ

    2.module+el8.10.0+2096+4bb90181

    Clang ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€

    ํ•„์ˆ˜

    rustup

    1.85.0

    1.85.0-x86_64-unknown-linux-gnu

    Rust ์„ค์น˜ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ

    ํ•„์ˆ˜

    cargo-pgrx

    0.13.0 ์ด์ƒ

    0.13.0

    Rust ๊ธฐ๋ฐ˜ PostgreSQL ํ™•์žฅ ๊ฐœ๋ฐœ ๋„๊ตฌ

    ํ•„์ˆ˜

    python3-dataclasses

    0.8 ์ด์ƒ

    0.8-4.el9

    ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ์ž๋™ ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    gcc

    11.0 ์ด์ƒ

    11.4.1-3.el9

    GNU C ์ปดํŒŒ์ผ๋Ÿฌ

    ํ•„์ˆ˜

    lz4-devel

    1.9.3 ์ด์ƒ

    1.9.3-5.el9

    LZ4 ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    zlib-devel

    1.2.11 ์ด์ƒ

    1.2.11-31.el9

    ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    readline-devel

    8.1 ์ด์ƒ

    8.1-4.el9

    ๋ช…๋ น์ค„ ํŽธ์ง‘ ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libgcc-s1

    12.x ์ด์ƒ

    12.3.0-1ubuntu1

    GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libstdc++6

    12.x ์ด์ƒ

    12.3.0-1ubuntu1

    C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    zlib1g

    1.2.11 ์ด์ƒ

    1:1.2.11.dfsg-2ubuntu9

    ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libreadline8

    8.1 ์ด์ƒ

    8.1.2-1

    ๋ช…๋ น์ค„ ํŽธ์ง‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libncurses6

    6.3 ์ด์ƒ

    6.3-2

    ํ„ฐ๋ฏธ๋„ ์ œ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    liblz4-1

    1.9.3 ์ด์ƒ

    1.9.3-2build2

    LZ4 ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜

    ํ•„์ˆ˜

    libicu70

    70.x ์ด์ƒ

    70.1-2

    ์œ ๋‹ˆ์ฝ”๋“œ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libssl3

    3.0.x ์ด์ƒ

    3.0.2-0ubuntu1

    SSL/TLS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libxml2

    2.9.13 ์ด์ƒ

    2.9.13+dfsg-1ubuntu0

    XML ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libllvm14

    14.x ์ด์ƒ

    1:14.0.0-1ubuntu1

    JIT ์ปดํŒŒ์ผ (PostgreSQL 14+)

    ์„ ํƒ (JIT ์‚ฌ์šฉ ์‹œ)

    libperl5.34

    5.34 ์ด์ƒ

    5.34.0-3ubuntu1

    PL/Perl ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Perl ์‚ฌ์šฉ ์‹œ)

    libpython3.10

    3.10 ์ด์ƒ

    3.10.12-1~22.04

    PL/Python ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Python ์‚ฌ์šฉ ์‹œ)

    libtcl8.6

    8.6 ์ด์ƒ

    8.6.12+dfsg-1build1

    PL/Tcl ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Tcl ์‚ฌ์šฉ ์‹œ)

    libpam0g

    1.4.0 ์ด์ƒ

    1.4.0-11ubuntu2

    PAM ์ธ์ฆ

    ์„ ํƒ (PAM ์ธ์ฆ ์‚ฌ์šฉ ์‹œ)

    libkrb5-3

    1.19 ์ด์ƒ

    1.19.2-2ubuntu0

    Kerberos ์ธ์ฆ

    ์„ ํƒ (Kerberos ์‚ฌ์šฉ ์‹œ)

    libxslt1.1

    1.1.34 ์ด์ƒ

    1.1.35-1

    XSLT ๋ณ€ํ™˜

    ์„ ํƒ (XSLT ์‚ฌ์šฉ ์‹œ)

    libldap-2.5-0

    2.5.x ์ด์ƒ

    2.5.13+dfsg-5ubuntu1

    LDAP ์ธ์ฆ

    ์„ ํƒ (LDAP ์‚ฌ์šฉ ์‹œ)

    libselinux1

    3.3 ์ด์ƒ

    3.3-1build2

    SELinux ์ง€์›

    ์„ ํƒ (SELinux ์‚ฌ์šฉ ์‹œ)

    libsystemd0

    249 ์ด์ƒ

    249.11-0ubuntu3

    systemd ํ†ตํ•ฉ

    ์„ ํƒ (systemd ์‚ฌ์šฉ ์‹œ)

    flex

    2.6.4 ์ด์ƒ

    2.6.4-8build2

    ๋ ‰์„œ ์ƒ์„ฑ ๋„๊ตฌ

    ํ•„์ˆ˜

    bison

    3.8 ์ด์ƒ

    2:3.8.2+dssfg-1build1

    ํŒŒ์„œ ์ƒ์„ฑ ๋„๊ตฌ

    ํ•„์ˆ˜

    12.3.0-1ubuntu1

    GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libstdc++6

    12.x ์ด์ƒ

    12.3.0-1ubuntu1

    C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libssl3

    3.0.x ์ด์ƒ

    3.0.2-0ubuntu1

    SSL/TLS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libpq5

    14.x ์ด์ƒ

    14.13-0ubuntu0.22.04.1

    PostgreSQL ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (psycopg2 ์˜์กด)

    jq

    1.6 ์ด์ƒ

    1.6-2.1ubuntu3

    JSON ํŒŒ์„œ/ํ”„๋กœ์„ธ์„œ

    libpq-dev

    14.x ์ด์ƒ

    14.13-0ubuntu0.22.04.1

    libpq ํ—ค๋”/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libkrb5-dev

    1.19 ์ด์ƒ

    1.19.2-2ubuntu0.3

    GSSAPI/Kerberos ํ—ค๋”

    ํ•„์ˆ˜

    libclang-dev

    14.0 ์ด์ƒ

    1:14.0-55~exp2

    Clang ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€

    ํ•„์ˆ˜

    rustup

    1.85.0

    1.85.0-x86_64-unknown-linux-gnu

    Rust ์„ค์น˜ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ

    ํ•„์ˆ˜

    cargo-pgrx

    0.13.0 ์ด์ƒ

    0.13.0

    Rust ๊ธฐ๋ฐ˜ PostgreSQL ํ™•์žฅ ๊ฐœ๋ฐœ ๋„๊ตฌ

    ํ•„์ˆ˜

    libssl-dev

    3.0.2 ์ด์ƒ

    3.0.2-0ubuntu3.7

    TLS/crypto ํ—ค๋”

    ํ•„์ˆ˜

    curl

    7.81.0 ์ด์ƒ

    7.81.0-1ubuntu1

    ๋ฐ์ดํ„ฐ ์ „์†ก์šฉ ๋ช…๋ น์ค„ ๋„๊ตฌ

    ํ•„์ˆ˜

    libproj-dev

    8.2.0

    8.2.1-1

    ์ขŒํ‘œ๊ณ„ ๊ฐ„ ํˆฌ์˜ยท๋ณ€ํ™˜

    ํ•„์ˆ˜

    libjson-c5

    0.16

    0.16-2

    JSON ํŒŒ์‹ฑ ๋ฐ ์ง๋ ฌํ™”

    ํ•„์ˆ˜

    libxml2

    2.9.0

    2.9.13+dfsg-1

    XML ํŒŒ์‹ฑ

    ํ•„์ˆ˜

    gcc

    11.0 ์ด์ƒ

    4:11.2.0-1ubuntu1

    GNU C ์ปดํŒŒ์ผ๋Ÿฌ

    ํ•„์ˆ˜

    liblz4-dev

    1.9.3 ์ด์ƒ

    1.9.3-2build2

    LZ4 ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    zlib1g-dev

    1.2.11 ์ด์ƒ

    1:1.2.11.dfsg-2ubuntu9.2

    ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libreadline-dev

    8.1 ์ด์ƒ

    8.1.2-1

    ๋ช…๋ น์ค„ ํŽธ์ง‘ ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libgcc-s1

    14.x ์ด์ƒ

    14.2.0-4ubuntu2

    GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libstdc++6

    14.x ์ด์ƒ

    14.2.0-4ubuntu2

    C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    zlib1g

    1.3 ์ด์ƒ

    1:1.3.dfsg-3.1ubuntu2

    ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libreadline8t64

    8.2 ์ด์ƒ

    8.2-4build1

    ๋ช…๋ น์ค„ ํŽธ์ง‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libncurses6

    6.4 ์ด์ƒ

    6.4+20240113-2ubuntu1

    ํ„ฐ๋ฏธ๋„ ์ œ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    liblz4-1

    1.9.4 ์ด์ƒ

    1.9.4-1build1

    LZ4 ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜

    ํ•„์ˆ˜

    libicu74

    74.x ์ด์ƒ

    74.2-1ubuntu3

    ์œ ๋‹ˆ์ฝ”๋“œ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libssl3t64

    3.0.x ์ด์ƒ

    3.0.13-0ubuntu3

    SSL/TLS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libxml2

    2.9.14 ์ด์ƒ

    2.9.14+dfsg-1.3ubuntu3

    XML ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libllvm17

    17.x ์ด์ƒ

    1:17.0.6-9ubuntu1

    JIT ์ปดํŒŒ์ผ (PostgreSQL 14+)

    ์„ ํƒ (JIT ์‚ฌ์šฉ ์‹œ)

    libperl5.38

    5.38 ์ด์ƒ

    5.38.2-3.2build2

    PL/Perl ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Perl ์‚ฌ์šฉ ์‹œ)

    libpython3.12

    3.12 ์ด์ƒ

    3.12.3-1

    PL/Python ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Python ์‚ฌ์šฉ ์‹œ)

    libtcl8.6

    8.6 ์ด์ƒ

    8.6.14+dfsg-1build1

    PL/Tcl ํ™•์žฅ ์–ธ์–ด

    ์„ ํƒ (PL/Tcl ์‚ฌ์šฉ ์‹œ)

    libpam0g

    1.5.3 ์ด์ƒ

    1.5.3-5ubuntu5

    PAM ์ธ์ฆ

    ์„ ํƒ (PAM ์ธ์ฆ ์‚ฌ์šฉ ์‹œ)

    libkrb5-3

    1.20 ์ด์ƒ

    1.20.1-6ubuntu2

    Kerberos ์ธ์ฆ

    ์„ ํƒ (Kerberos ์‚ฌ์šฉ ์‹œ)

    libxslt1.1

    1.1.39 ์ด์ƒ

    1.1.39-0exp1ubuntu1

    XSLT ๋ณ€ํ™˜

    ์„ ํƒ (XSLT ์‚ฌ์šฉ ์‹œ)

    libldap2

    2.6.x ์ด์ƒ

    2.5.18+dfsg-0ubuntu1

    LDAP ์ธ์ฆ

    ์„ ํƒ (LDAP ์‚ฌ์šฉ ์‹œ)

    libselinux1

    3.5 ์ด์ƒ

    3.5-2ubuntu2

    SELinux ์ง€์›

    ์„ ํƒ (SELinux ์‚ฌ์šฉ ์‹œ)

    libsystemd0

    255 ์ด์ƒ

    255.4-1ubuntu8

    systemd ํ†ตํ•ฉ

    ์„ ํƒ (systemd ์‚ฌ์šฉ ์‹œ)

    flex

    2.6.4 ์ด์ƒ

    2.6.4-2build1

    ๋ ‰์„œ ์ƒ์„ฑ ๋„๊ตฌ

    ํ•„์ˆ˜

    bison

    3.8 ์ด์ƒ

    2:3.8.2+dsfg-1build1

    ํŒŒ์„œ ์ƒ์„ฑ ๋„๊ตฌ

    ํ•„์ˆ˜

    14.2.0-4ubuntu2

    GCC ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libstdc++6

    14.x ์ด์ƒ

    14.2.0-4ubuntu2

    C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libssl3t64

    3.0.x ์ด์ƒ

    3.0.13-0ubuntu3

    SSL/TLS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libpq5

    16.x ์ด์ƒ

    16.4-0ubuntu0.24.04.2

    PostgreSQL ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (psycopg2 ์˜์กด)

    jq

    1.7 ์ด์ƒ

    1.7.1-3build1

    JSON ํŒŒ์„œ/ํ”„๋กœ์„ธ์„œ

    libpq-dev

    16.x ์ด์ƒ

    16.4-0ubuntu0.24.04.2

    libpq ํ—ค๋”/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libkrb5-dev

    1.20 ์ด์ƒ

    1.20.1-6ubuntu2.1

    GSSAPI/Kerberos ํ—ค๋”

    ํ•„์ˆ˜

    libclang-dev

    18.0 ์ด์ƒ

    1:18.1.3-1ubuntu1

    Clang ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€

    ํ•„์ˆ˜

    rustup

    1.85.0

    1.85.0-x86_64-unknown-linux-gnu

    Rust ์„ค์น˜ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ

    ํ•„์ˆ˜

    cargo-pgrx

    0.13.0 ์ด์ƒ

    0.13.0

    Rust ๊ธฐ๋ฐ˜ PostgreSQL ํ™•์žฅ ๊ฐœ๋ฐœ ๋„๊ตฌ

    ํ•„์ˆ˜

    libssl-dev

    3.0.13 ์ด์ƒ

    3.0.13-0ubuntu3.7

    TLS/crypto ํ—ค๋”

    ํ•„์ˆ˜

    curl

    8.5.0 ์ด์ƒ

    8.5.0-2ubuntu10.8

    ๋ฐ์ดํ„ฐ ์ „์†ก์šฉ ๋ช…๋ น์ค„ ๋„๊ตฌ

    ํ•„์ˆ˜

    libproj-dev

    9.4.0

    9.4.0-1~jammy1

    ์ขŒํ‘œ๊ณ„ ๊ฐ„ ํˆฌ์˜ยท๋ณ€ํ™˜

    ํ•„์ˆ˜

    libjson-c5

    0.16

    0.16-2

    JSON ํŒŒ์‹ฑ ๋ฐ ์ง๋ ฌํ™”

    ํ•„์ˆ˜

    libxml2

    2.9.0

    2.9.13+dfsg-1

    XML ํŒŒ์‹ฑ

    ํ•„์ˆ˜

    gcc

    13.0 ์ด์ƒ

    4:13.2.0-7ubuntu1

    GNU C ์ปดํŒŒ์ผ๋Ÿฌ

    ํ•„์ˆ˜

    liblz4-dev

    1.9.4 ์ด์ƒ

    1.9.4-1build1.1

    LZ4 ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    zlib1g-dev

    1.3 ์ด์ƒ

    1:1.3.dfsg-3.1ubuntu2.1

    ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    libreadline-dev

    8.2 ์ด์ƒ

    8.2-4build1

    ๋ช…๋ น์ค„ ํŽธ์ง‘ ๊ฐœ๋ฐœ ํ—ค๋” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ํ•„์ˆ˜

    Disk ํƒ€์ž…

    SSD

    NVMe SSD

    Disk IOPS

    500 IOPS

    3000 IOPS ์ด์ƒ

    Disk bandwidth

    25MB/s

    100MB/s ์ด์ƒ

    Disk ์šฉ๋Ÿ‰

    50GB

    100GB ์ด์ƒ

    Networks

    1Gbps

    10Gbps ์ด์ƒ

    56.25

    GCE

    n1-standard-2 + 50GB PD SSD

    2

    7.5

    1500

    25

    PostgreSQL ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ PG_HOME์œผ๋กœ ์„ค์ •ํ•œ ๊ฒฝ๋กœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‚ฌ์ „์— ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • PostgreSQL ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ(PGDATA)๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ PG_DATA_DIR๋กœ ์„ค์ •ํ•œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‚ฌ์ „์— ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • OpenSQL์˜ PG engine์€ PG_HOME ์— ์„ค์น˜๋˜๋ฏ€๋กœ ์‚ฌ์ „์— ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ผ๋ถ€ ํŒจํ‚ค์ง€๋“ค์€ rust๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด $OPENSQL_RUST_BASE ์œ„์น˜์— rust๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. $OPENSQL_RUST_BASE๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด /opt/opensql/rust ์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. $OPENSQL_RUST_BASE ํ•˜์œ„์— cargo์™€ rustup๋ผ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ ๊ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” $CARGO_HOME , $RUSTUP_HOME ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์œ„์น˜์— cargo, rustup๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

    • ๋งŒ์•ฝ cargo์™€ rustup์ด ์„ค์น˜๋˜์—ˆ๋‹ค๋ฉด ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ $OPENSQL_RUST_BASE ๋กœ ์ง€์ • ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • node3

    PostgreSQL, OpenHA, Openproxy

    178.176.0.4

    64bits

    sudo systemctl enable --now chronyd
    timedatectl status
    chronyc sources -v
    date

    glibc

    2.28 ์ด์ƒ

    2.28-225.el8

    GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์‹œ์Šคํ…œ ๊ธฐ๋ณธ)

    ํ•„์ˆ˜

    python3

    3.6 ์ด์ƒ

    3.6.8-38.el8

    Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ

    python3-libs

    openssl-devel

    1.1.1 ์ด์ƒ

    1.1.1k-12.el8_9

    (PostgreSQL ๋นŒ๋“œ/์—ฐ๋™ ์˜ต์…˜์— ๋”ฐ๋ผ) TLS/crypto ํ—ค๋”

    ํ•„์ˆ˜

    SFCGAL

    1.x ์ด์ƒ

    libSFCGAL.so.1.5.0

    3D/๊ณ ๊ธ‰ ๊ธฐํ•˜ ์—ฐ์‚ฐ ์—”์ง„

    ํ•„์ˆ˜

    pkgconf-pkg-config

    1.4.2 ์ด์ƒ

    pkgconf-1.4.2-1.el8

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ ์˜ต์…˜ ์กฐํšŒ ๋„๊ตฌ

    ํ•„์ˆ˜

    envsubst

    0.19 ์ด์ƒ

    0.19.8.1-17.el8

    ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์น˜ํ™˜ ๋„๊ตฌ

    ํ•„์ˆ˜

    make

    4.2.1 ์ด์ƒ

    4.2.1-9.el8

    ํ™•์žฅ ๋นŒ๋“œ ๋„๊ตฌ

    ํ•„์ˆ˜

    glibc

    2.34 ์ด์ƒ

    2.34-40.el9

    GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์‹œ์Šคํ…œ ๊ธฐ๋ณธ)

    ํ•„์ˆ˜

    python3

    3.9 ์ด์ƒ

    3.9.16-1.el9

    Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ

    python3-libs

    openssl-devel

    3.x ์ด์ƒ

    1.1.1k-12.el8_9

    (PostgreSQL ๋นŒ๋“œ/์—ฐ๋™ ์˜ต์…˜์— ๋”ฐ๋ผ) TLS/crypto ํ—ค๋”

    ํ•„์ˆ˜

    SFCGAL

    2.x ์ด์ƒ

    libSFCGAL.so.2.0.0

    3D/๊ณ ๊ธ‰ ๊ธฐํ•˜ ์—ฐ์‚ฐ ์—”์ง„

    ํ•„์ˆ˜

    pkgconf-pkg-config

    1.4.2 ์ด์ƒ

    pkgconf-1.4.2-1.el8

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ ์˜ต์…˜ ์กฐํšŒ ๋„๊ตฌ

    ํ•„์ˆ˜

    gettext

    0.21 ์ด์ƒ

    0.21-8.el9

    ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์น˜ํ™˜ ๋„๊ตฌ

    ํ•„์ˆ˜

    make

    4.3 ์ด์ƒ

    1:4.3-7.el9

    ํ™•์žฅ ๋นŒ๋“œ ๋„๊ตฌ

    ํ•„์ˆ˜

    libc6

    2.35 ์ด์ƒ

    2.35-0ubuntu3

    GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์‹œ์Šคํ…œ ๊ธฐ๋ณธ)

    ํ•„์ˆ˜

    libc6

    2.35 ์ด์ƒ

    2.35-0ubuntu3

    GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libgcc-s1

    libssl-dev

    3.0.x ์ด์ƒ

    3.0.2-0ubuntu1.18

    TLS/crypto ํ—ค๋”

    ํ•„์ˆ˜

    pkg-config

    0.29.2 ์ด์ƒ

    0.29.2-1ubuntu3

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ ์˜ต์…˜ ์กฐํšŒ ๋„๊ตฌ

    ํ•„์ˆ˜

    gettext-base

    0.21 ์ด์ƒ

    0.21-4ubuntu2

    ๋‹ค๊ตญ์–ด ์ง€์› ๊ธฐ๋ณธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํŒจํ‚ค์ง€

    ํ•„์ˆ˜

    libgeos

    3.10.0

    3.10.2-1

    ๊ณต๊ฐ„ ๊ธฐํ•˜ ์—ฐ์‚ฐ(์ ยท์„ ยท๋ฉด ๊ต์ฐจ, ๋ฒ„ํผ๋ง ๋“ฑ) C API

    ํ•„์ˆ˜

    make

    4.3 ์ด์ƒ

    4.3-4.1build1

    ํ™•์žฅ ๋นŒ๋“œ ๋„๊ตฌ

    ํ•„์ˆ˜

    libc6

    2.39 ์ด์ƒ

    2.39-0ubuntu8

    GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์‹œ์Šคํ…œ ๊ธฐ๋ณธ)

    ํ•„์ˆ˜

    libc6

    2.39 ์ด์ƒ

    2.39-0ubuntu8

    GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    libgcc-s1

    libssl-dev

    3.0.x ์ด์ƒ

    3.0.13-0ubuntu3.5

    TLS/crypto ํ—ค๋”

    ํ•„์ˆ˜

    pkg-config

    1.8.1 ์ด์ƒ

    1.8.1-2build1

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ ์˜ต์…˜ ์กฐํšŒ ๋„๊ตฌ

    ํ•„์ˆ˜

    gettext-base

    0.21 ์ด์ƒ

    0.21-14ubuntu2

    ๋‹ค๊ตญ์–ด ์ง€์› ๊ธฐ๋ณธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํŒจํ‚ค์ง€

    ํ•„์ˆ˜

    libgeos

    3.12.1

    3.12.1-1~jammy1

    ๊ณต๊ฐ„ ๊ธฐํ•˜ ์—ฐ์‚ฐ(์ ยท์„ ยท๋ฉด ๊ต์ฐจ, ๋ฒ„ํผ๋ง ๋“ฑ) C API

    ํ•„์ˆ˜

    make

    4.3 ์ด์ƒ

    4.3-4.1build2

    ํ™•์žฅ ๋นŒ๋“œ ๋„๊ตฌ

    ํ•„์ˆ˜

    CPU

    2

    4 ์ฝ”์–ด ์ด์ƒ

    RAM

    8GB

    16 GB ์ด์ƒ

    AWS

    m4.large

    2

    8

    node1

    PostgreSQL, OpenHA

    178.176.0.2

    node2

    PostgreSQL, OpenHA, Openproxy

    178.176.0.3

    ์‹œ์Šคํ…œ ์†Œํ”„ํŠธ์›จ์–ด ์š”๊ตฌ์‚ฌํ•ญ

    HA ๊ตฌ์„ฑ ์‹œ ์‹œ๊ฐ„ ๋™๊ธฐํ™”(NTP) ํ™•์ธ

    RHEL8/Rocky Linux 8/Oracle Linux8

    RHEL9/Rocky Linux 9/Oracle Linux9

    Ubuntu 22.04 (Jammy)

    Ubuntu 24.04 (Noble)

    ํ‘œ์ค€ ์•„ํ‚คํ…์ณ ๊ตฌ์„ฑ

    3-Node ๊ตฌ์„ฑ

    2-Node ๊ตฌ์„ฑ

    ์„ค์น˜ ์ „ ์š”๊ตฌ์‚ฌํ•ญ

    ์ฐธ๊ณ 

    ์ƒ๊ธฐ ๊ตฌ์„ฑ์€ ์˜ˆ์‹œ์ด๋ฉฐ, ์‹ค์ œ IP ์ฃผ์†Œ ๋ฐ ๋ฐฐํฌ๊ตฌ์„ฑ์€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์กฐ์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    https://etcd.io/docs/v3.5/op-guide/hardware/

    3.6 ์ด์ƒ

    3.9 ์ด์ƒ

    12.x ์ด์ƒ

    14.x ์ด์ƒ

    3600

    host

    String

    0.0.0.0

    OpenProxy ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ

    port

    Number

    6432

    OpenProxy ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” port

    worker_threads

    Number

    OpenProxy์˜ ๊ฐ€์ƒ IP ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— [general.virtual_router] ์„น์…˜ ๋ฐ‘์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์„น์…˜์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ๋ณ€์ˆ˜๋ช…
    Type
    Default
    Description

    interface

    String

    -

    ๊ฐ€์ƒ IP๋ฅผ ๋“ฑ๋กํ•  ํ˜ธ์ŠคํŠธ์˜ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„.

    router_id

    ์ƒˆ๋กœ์šด 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

    Openproxy์˜ Connection pool์€ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์‚ฌ์šฉ์ž ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๋ณ„ ์„ค์ •๊ณผ ์ผ๋ฐ˜ ์„ค์ • ๋ฐ ํ’€ ์„ค์ •์˜ ์ถ”๊ฐ€ ์žฌ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    [pools.{pool_name}.users.0] ํ•˜์œ„ ํ•ญ๋ชฉ์— ์‚ฌ์šฉ์ž ๊ด€๋ จ ํ•ญ๋ชฉ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

    ๋ณ€์ˆ˜๋ช…
    Type
    Default
    Description

    username

    String

    -

    ์‚ฌ์šฉ์ž ์ด๋ฆ„, Client <-> OpenProxy ๊ฐ„ ์ธ์ฆ์— ์ด์šฉ

    password

    [pools.{pool_name}.shards.0] ํ•˜์œ„ ์„น์…˜์— ์ ‘์†ํ•  database server ์ฃผ์†Œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๋ณ€์ˆ˜๋ช…
    Type
    Default
    Description

    database

    String

    None

    PostgreSQL ์— ์—ฐ๊ฒฐํ•œ database ์ด๋ฆ„

    servers

    ์œ„ ์„ค์ • ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • postgres ํ’€์ด PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ•จ๊ป˜ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

    • postgres database ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์‚ฌ์šฉ์ž: postgres , ๋น„๋ฐ€๋ฒˆํ˜ธ: postgres ๋Š” postgres database ์— CONNECT ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


    ์„ค์น˜ํ•œ 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 : ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ ํ˜•์‹์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.

    ์ด ์™ธ์— ๋„์›€๋ง์„ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๋ฒ„์ „ ์ •๋ณด ํ˜น์€ ๋ฆฌ๋น„์ „ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


    OpenProxy ๋…ธ๋“œ์— openproxy ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์„ ์ด์šฉํ•˜์—ฌ admin ์‚ฌ์šฉ์ž๋กœ PostgreSQL ์—ฐ๊ฒฐ์„ ๋งบ์œผ๋ฉด ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Configuration ๋ฐ ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ Pool ์กฐํšŒ, Stat ์ •๋ณด ํ™•์ธ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐœ์š”

    ํ™˜๊ฒฝ ์„ค์ •

    General Settings

    [general]
    port = 6432
    admin_username = "postgres"
    admin_password = "postgres"
    worker_threads = 3
    
    [pools.postgres]
    pool_mode = "transaction"
    query_parser_enabled = true
    query_parser_read_write_splitting = true
    
    [pools.postgres.users.0]
    username = "postgres"
    password = "postgres"
    server_username = "postgres"
    server_password = "postgres"
    pool_size = 10
    statement_timeout = 0
    
    [pools.postgres.shards.0]
    database = "postgres"
    servers = [
      ["172.176.0.2", 5432, "auto"],
      ["172.176.0.3", 5432, "auto"],
      ["172.176.0.4", 5432, "auto"]
    ]
    use_patroni = true
    
    ## virtual-ip
    [general.virtual_router]
    interface = "eth0"
    router_id = 50
    priority = 50
    advert_int = 3
    vip_addresses = ["178.176.0.200/24"]
    $ ./openproxy /home/myUser/openproxy.toml
    $ openproxy --help
    OpenProxy: PostgreSQL pooler for OpenSQL - fork of pgCat
    
    Usage: openproxy [OPTIONS] [CONFIG_FILE] [COMMAND]
    
    Commands:
      show    Print current config and exit (loads config from file/etcd same as normal startup)
      edit    Edit config and save. Without --set: interactive (open in $EDITOR). With --set: non-interactive
      encode  Encode user password into SCRAM-SHA-256 compatible password that can be used for "password" in config
      stop    Stop a running openproxy instance via the admin console
      help    Print this message or the help of the given subcommand(s)
    
    Arguments:
      [CONFIG_FILE]  Path to a configuration TOML file [env: CONFIG_FILE=] [default: openproxy.toml]
    
    Options:
          --force-config-file
              Load config only from file; ignore etcd even if enabled in config
          --log-target <LOG_TARGET>
              Where to emit logs: file only, stdout only, or both [env: LOG_TARGET=] [default: both] [possible values: file, stdout, both]
      -l, --log-level <LOG_LEVEL>
              Logging level (trace, debug, info, warn, error) [env: LOG_LEVEL=] [default: INFO]
          --max-logfile-num <MAX_LOGFILE_NUM>
              Maximum number of log files to keep when rotating [env: MAX_LOGFILE_NUM=] [default: 5]
          --log-dir <LOG_DIR>
              Directory for log files (used when log_target is file or both) [env: LOG_DIR=/home/opensql/logs/openproxy] [default: logs]
          --revision
              Print revision number
      -F, --log-format <LOG_FORMAT>
              Log output format: text (human-readable), structured (e.g. JSON), or debug [env: LOG_FORMAT=] [default: text] [possible values: text, structured, debug]
      -h, --help
              Print help
      -V, --version
              Print version
    $ openproxy --help
    
    $ openproxy --version
    openproxy 1.1.0
    
    $ openproxy --revision
    revision number: 681
    [Unit]
    Description=OpenProxy connection pooler - fork of postgresml's pgcat
    After=network.target
    StartLimitIntervalSec=0
    
    [Service]
    User=opensql
    Type=simple
    Restart=always
    RestartSec=1
    Environment=LOG_LEVEL=info
    LimitNOFILE=65536
    AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW
    ExecStart=/usr/bin/openproxy /etc/openproxy.toml
    
    [Install]
    WantedBy=multi-user.target
    $ psql -h 127.0.0.1 -p 6432 -d openproxy -U postgres
    openproxy=> SHOW HELP;
    NOTICE:  Console usage
    DETAIL:  
    	SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION
    	SHOW LISTS
    	SHOW STATS
    	SET key = arg
    	RELOAD
    	PAUSE [<db>, <user>]
    	RESUME [<db>, <user>]
    	SHUTDOWN
    openproxy=> SHOW VERSION;
             version         
    -------------------------
     OpenProxy 1.1.0
    (1 row)
    openproxy=> SHOW CONFIG;
                           key                        |     value      | default | changeable 
    --------------------------------------------------+----------------+---------+------------
     idle_client_in_transaction_timeout               | 30000          | -       | yes
     pools."postgres".users                           | postgres       | -       | yes
     prometheus_exporter_port                         | 9930           | -       | yes
     pools.postgres.query_parser_max_length           | unlimited      | -       | yes
     pools.postgres.load_balancing_mode               | random         | -       | yes
     pools."postgres".shard_count                     | 1              | -       | yes
     port                                             | 6432           | -       | no
     connect_timeout                                  | 1000           | -       | no
     healthcheck_timeout                              | 1000           | -       | yes
     pools.postgres.default_role                      | any            | -       | yes
     healthcheck_delay                                | 30000          | -       | yes
     pools.postgres.query_parser_read_write_splitting | true           | -       | yes
     pools.postgres.sharding_function                 | pg_bigint_hash | -       | yes
     ban_time                                         | 60             | -       | yes
     pools.postgres.pool_mode                         | transaction    | -       | yes
     shutdown_timeout                                 | 60000          | -       | yes
     host                                             | 0.0.0.0        | -       | no
     pools.postgres.primary_reads_enabled             | false          | -       | yes
     idle_timeout                                     | 600000         | -       | yes
     pools.postgres.query_parser_enabled              | true           | -       | yes
    (20 rows)
    openproxy=> SHOW DATABASES;
                name            |      host      | port | database | force_user | pool_size | min_pool_size | reserve_pool |  pool_mode  | max_connections | current_connections | paused | disabled 
    ----------------------------+----------------+------+----------+------------+-----------+---------------+--------------+-------------+-----------------+---------------------+--------+----------
     postgres_shard_0_primary   | 192.168.131.12 | 5432 | postgres | postgres   |      1100 |             0 |            0 | transaction |            1100 |                   0 |      0 |        0
     postgres_shard_0_replica_0 | 192.168.131.13 | 5432 | postgres | postgres   |      1100 |             0 |            0 | transaction |            1100 |                   0 |      0 |        0
     postgres_shard_0_replica_1 | 192.168.131.14 | 5432 | postgres | postgres   |      1100 |             0 |            0 | transaction |            1100 |                   0 |      0 |        0
    (3 rows)
    openproxy=> SHOW POOLS;
     database  |    user     |  pool_mode  | cl_idle | cl_active | cl_waiting | cl_cancel_req | sv_active | sv_idle | sv_used | sv_tested | sv_login | maxwait | maxwait_us 
    -----------+-------------+-------------+---------+-----------+------------+---------------+-----------+---------+---------+-----------+----------+---------+------------
     simple_db | simple_user | session     |       0 |         0 |          0 |             0 |         0 |       0 |       0 |         0 |        0 |       0 |          0
     postgres  | postgres    | transaction |       0 |         0 |          0 |             0 |         0 |       3 |       0 |         0 |        0 |       0 |          0
    (2 rows)
    openproxy=> SHOW CLIENTS;
     client_id  | database |   user   | application_name | state | transaction_count | query_count | error_count | age_seconds | maxwait | maxwait_us 
    ------------+----------+----------+------------------+-------+-------------------+-------------+-------------+-------------+---------+------------
     0x43332945 | postgres | postgres | openproxy        | idle  |                 8 |           8 |           0 |           9 |       0 |          8
     0x993A6EA2 | postgres | postgres | openproxy        | idle  |                10 |          10 |           0 |           9 |       0 |          8
     0x09CFDA65 | pgcat    | postgres | psql             | idle  |                 0 |           0 |           0 |         208 |       0 |          0
     0x1E5A084D | postgres | postgres | openproxy        | idle  |                10 |          10 |           0 |           4 |       0 |          9
    (4 rows)
    openproxy=> SHOW SERVERS;
     server_id  | database_name |   user   |        address_id        |           application_name           | state | transaction_count | query_count | bytes_sent | bytes_received | age_seconds | prepare_cache_hit | prepare_cache_miss | prepare_cache_eviction | prepare_cache_size 
    ------------+---------------+----------+--------------------------+--------------------------------------+-------+-------------------+-------------+------------+----------------+-------------+-------------------+--------------------+------------------------+--------------------
     0x342F491B | postgres      | postgres | postgres_shard_0_primary | DBeaver 22.3.4 - SQLEditor <Console> | idle  |                41 |          41 |      18760 |         302727 |          25 |               123 |                 82 |                      0 |                 41
    (1 row)
    openproxy=> SHOW USERS;
       name   |  pool_mode  
    ----------+-------------
     postgres | transaction
    (1 row)
    openproxy=> SHOW LISTS;
         list      | items 
    ---------------+-------
     databases     |     4
     users         |     2
     pools         |     4
     free_clients  |     4
     used_clients  |     0
     login_clients |     0
     free_servers  |     1
     used_servers  |     0
     dns_names     |     0
     dns_zones     |     0
     dns_queries   |     0
     dns_pending   |     0
    (12 rows)
    openproxy=> SHOW STATS;
              instance          | database |   user   | total_xact_count | total_query_count | total_received | total_sent | total_xact_time | total_query_time | total_wait_time | total_errors | avg_xact_count | avg_query_count | avg_recv | avg_sent | avg_errors | avg_xact_time | avg_query_time | avg_wait_time 
    ----------------------------+----------+----------+------------------+-------------------+----------------+------------+-----------------+------------------+-----------------+--------------+----------------+-----------------+----------+----------+------------+---------------+----------------+---------------
     postgres_shard_0_primary   | postgres | postgres |               41 |                41 |         302727 |      18760 |               0 |               39 |           14152 |            0 |              0 |               0 |        0 |        0 |          0 |             0 |              0 |             0
     postgres_shard_0_replica_0 | postgres | postgres |                0 |                 0 |              0 |          0 |               0 |                0 |               0 |            0 |              0 |               0 |        0 |        0 |          0 |             0 |              0 |             0
     postgres_shard_0_replica_1 | postgres | postgres |                0 |                 0 |              0 |          0 |               0 |                0 |               0 |            0 |              0 |               0 |        0 |        0 |          0 |             0 |              0 |             0
    (3 rows)

    Virtual Router

    Pools

    Users

    Shards

    Configuration ์˜ˆ์ œ

    ์‹คํ–‰

    CLI๋กœ ์‹คํ–‰ํ•˜๊ธฐ

    Systemd ์„œ๋น„์Šค๋กœ ์ •์˜ํ•˜๊ธฐ

    ์กฐํšŒ ๊ธฐ๋Šฅ

    Version ์กฐํšŒ

    Configuration ์กฐํšŒ

    Database ์กฐํšŒ

    Pool ์กฐํšŒ

    Client ์กฐํšŒ

    Server ์กฐํšŒ

    User ์กฐํšŒ

    List ์กฐํšŒ

    Stat ์กฐํšŒ

    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์ž…๋‹ˆ๋‹ค. auth_type ์„ scram-sha-256 ํ˜•ํƒœ๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ openproxy encode ๋ช…๋ น์–ด๋กœ ์•”ํ˜ธํ™”ํ•œ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    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 ์—ฌ๋ถ€๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์ฃผ๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. (deprecated) v1.1.0๋ถ€ํ„ฐ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. v1.1.0๋ถ€ํ„ฐ Primary/Replica ์ƒํƒœ ๊ฐ์ง€๊ฐ€ etcd ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜๋˜์–ด ํด๋ง ์ฃผ๊ธฐ ์„ค์ •์ด ๋ถˆํ•„์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

    reload_toml

    Bool

    true

    renew_interval ๊ฐ„๊ฒฉ์œผ๋กœ TOML ์„ค์ •ํŒŒ์ผ์„ ๋‹ค์‹œ ์ฝ์–ด ๋ถˆ๋Ÿฌ์˜ฌ ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. false ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ Patroni๋กœ ๊ด€๋ฆฌ๋˜๋Š” Shard์˜ ๋…ธ๋“œ๋ณ„ Role ๋งŒ์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. (deprecated) v1.1.0๋ถ€ํ„ฐ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. v1.1.0๋ถ€ํ„ฐ Primary/Replica ์ƒํƒœ ๊ฐ์ง€๊ฐ€ etcd ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜๋˜์–ด ํด๋ง ์ฃผ๊ธฐ ์„ค์ •์ด ๋ถˆํ•„์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

    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 ์ƒˆ๋กœ ๊ณ ์นจ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

    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. BACKUP โ†’ MASTER ์Šน๊ฒฉ์ด ์ผ์–ด๋‚  ๋•Œ ๊ฐ€์ƒ IP ์ ์œ ์— ์•ž์„œ ์‹คํ–‰ํ•  OS ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    pre_demote_script

    String

    -

    Optional. MASTER โ†’ BACKUP ๊ฐ•๋“ฑ์ด ์ผ์–ด๋‚  ๋•Œ ๊ฐ€์ƒ IP ํ•ด์ œ์— ์•ž์„œ ์‹คํ–‰ํ•  OS ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    unicast_peers

    Array

    -

    Optional. ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์ธ ๊ฒฝ์šฐ VRRP ํŒจํ‚ท์„ ์œ ๋‹ˆ์บ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  Peer ๊ฐ€์ƒ ๋ผ์šฐํ„ฐ ๋…ธ๋“œ์˜ IPv4 ์ฃผ์†Œ๋ฅผ ์‰ผํ‘œ, ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ [โ€œ192.168.0.6", โ€œ192.168.0.8"] ์ฒ˜๋Ÿผ ๊ธฐ์ž…ํ•ฉ๋‹ˆ๋‹ค.

    Enum

    random

    Replica ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•˜์—ฌ Load balancingํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•˜๋ฉฐ random ๊ณผ loc ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. 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 ๋‹จ์œ„์—์„œ ์žฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    String

    -

    Optional,

    ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ. auth_type ์„ scram-sha-256 ํ˜•ํƒœ๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ openproxy encode ๋ช…๋ น์–ด๋กœ ์•”ํ˜ธํ™”ํ•œ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    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 ๊ฐ’์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    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

    Patroni ์„œ๋ฒ„์— ์š”์ฒญํ•ด servers ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    patroni_port

    String

    8008

    Patroni ์„œ๋ฒ„์™€ ์—ฐ๋™ํ•˜๋Š” ๊ฒฝ์šฐ Patroni ์„œ๋ฒ„์˜ Port ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    tmax OpenSQL 2 node ๊ตฌ์„ฑ
    tmax OpenSQL 3 node ๊ตฌ์„ฑ