WAL-G: PostgreSQL DBMS ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ

SQL ๋คํ”„๋กœ ๋ฐฑ์—…์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜ค๋žซ๋™์•ˆ ์•Œ๋ ค์ ธ ์™”์Šต๋‹ˆ๋‹ค. pg_dump ๋˜๋Š” pg_dumpall) ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. PostgreSQL DBMS๋ฅผ ๋ฐฑ์—…ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. pg_basebackup, WAL ๋กœ๊ทธ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ  ๋ณต์›ํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ์—ฐ๊ตฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๊ณ  ์œ„์•„๋ž˜ ๋ชจ๋‘ ๊ณ ํ†ต์„ ์œ ๋ฐœํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ตœ์†Œํ•œ ๋‘ ๊ฐœ์˜ ์„ธ๋ฐœ ์ž์ „๊ฑฐ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ํ†ต์„ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด WAL-G๊ฐ€ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์›”์ง€ PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐฑ์—…ํ•˜๊ณ  ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด Go๋กœ ์ž‘์„ฑ๋œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” MySQL/MariaDB, MongoDB ๋ฐ FoundationDB). Amazon S3 ์Šคํ† ๋ฆฌ์ง€(๋ฐ Yandex Object Storage์™€ ๊ฐ™์€ ์œ ์‚ฌ ์ œํ’ˆ)๋Š” ๋ฌผ๋ก  Google Cloud Storage, Azure Storage, Swift Object Storage ๋ฐ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ž‘์—…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์„ค์ •์€ ๊ฐ„๋‹จํ•œ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง€์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๊ฐ€ ์ธํ„ฐ๋„ท์— ํฉ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•˜๋Š” ์™„์ „ํ•œ ์‚ฌ์šฉ ์„ค๋ช…์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (Habrรฉ์— ์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ๊ธฐ์—๋Š” ๋งŽ์€ ์ ์ด ๋น ์กŒ์Šต๋‹ˆ๋‹ค).

WAL-G: PostgreSQL DBMS ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ

์ด ๊ธ€์€ ์ฃผ๋กœ ์ œ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ง€์‹์„ ์ฒด๊ณ„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” DBA๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์–ด๋”˜๊ฐ€์—์„œ ์ผ๋ฐ˜์ธ์˜ ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์–ด๋–ค ์ˆ˜์ •์ด๋ผ๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์ด์™€ ๋ณ„๋„๋กœ, ์•„๋ž˜์˜ ๋ชจ๋“  ๋‚ด์šฉ์€ Ubuntu 12.3์˜ PostgreSQL 18.04๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ํ…Œ์ŠคํŠธ๋˜์—ˆ์œผ๋ฉฐ ๋ชจ๋“  ๋ช…๋ น์€ ๊ถŒํ•œ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜

์ด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์—์„œ WAL-G์˜ ์•ˆ์ • ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. v0.2.15 (2020๋…„ XNUMX์›”). ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—์„œ ์ง์ ‘ ๋นŒ๋“œํ•˜๋ ค๋ฉด github ์ €์žฅ์†Œ์— ์ด์— ๋Œ€ํ•œ ๋ชจ๋“  ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค.). ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#!/bin/bash

curl -L "https://github.com/wal-g/wal-g/releases/download/v0.2.15/wal-g.linux-amd64.tar.gz" -o "wal-g.linux-amd64.tar.gz"
tar -xzf wal-g.linux-amd64.tar.gz
mv wal-g /usr/local/bin/

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋จผ์ € WAL-G๋ฅผ ๊ตฌ์„ฑํ•œ ๋‹ค์Œ PostgreSQL ์ž์ฒด๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

WAL-G ์„ค์ •

๋ฐฑ์—… ์ €์žฅ์˜ ์˜ˆ๋กœ๋Š” Amazon S3๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(๋‚ด ์„œ๋ฒ„์™€ ๋” ๊ฐ€๊น๊ณ  ์‚ฌ์šฉ๋ฃŒ๊ฐ€ ๋งค์šฐ ์ €๋ ดํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด โ€œs3 ๋ฒ„ํ‚ทโ€๊ณผ ์•ก์„ธ์Šค ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

WAL-G์— ๋Œ€ํ•œ ์ด์ „ ๊ธฐ์‚ฌ๋Š” ๋ชจ๋‘ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์„ค์ •์„ ๋‹ค์Œ ์œ„์น˜์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .walg.json ํŒŒ์ผ postgres ์‚ฌ์šฉ์ž์˜ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

#!/bin/bash

cat > /var/lib/postgresql/.walg.json << EOF
{
    "WALG_S3_PREFIX": "s3://your_bucket/path",
    "AWS_ACCESS_KEY_ID": "key_id",
    "AWS_SECRET_ACCESS_KEY": "secret_key",
    "WALG_COMPRESSION_METHOD": "brotli",
    "WALG_DELTA_MAX_STEPS": "5",
    "PGDATA": "/var/lib/postgresql/12/main",
    "PGHOST": "/var/run/postgresql/.s.PGSQL.5432"
}
EOF
# ะพะฑัะทะฐั‚ะตะปัŒะฝะพ ะผะตะฝัะตะผ ะฒะปะฐะดะตะปัŒั†ะฐ ั„ะฐะนะปะฐ:
chown postgres: /var/lib/postgresql/.walg.json

๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • WALG_S3_PREFIX โ€“ ๋ฐฑ์—…์ด ์—…๋กœ๋“œ๋  S3 ๋ฒ„ํ‚ท ๊ฒฝ๋กœ(๋ฃจํŠธ ๋˜๋Š” ํด๋”)
  • AWS_ACCESS_KEY_ID โ€“ S3์˜ ์•ก์„ธ์Šค ํ‚ค(ํ…Œ์ŠคํŠธ ์„œ๋ฒ„์—์„œ ๋ณต๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ํ‚ค์—๋Š” ReadOnly ์ •์ฑ…์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋ณต๊ตฌ ์„น์…˜์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.);
  • AWS_SECRET_ACCESS_KEY โ€“ S3 ์ €์žฅ์†Œ์˜ ๋น„๋ฐ€ ํ‚ค
  • WALG_COMPRESSION_METHOD โ€“ ์••์ถ• ๋ฐฉ๋ฒ•, Brotli๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์ด ์ตœ์ข… ํฌ๊ธฐ์™€ ์••์ถ•/์••์ถ• ํ•ด์ œ ์†๋„ ์‚ฌ์ด์˜ ํ™ฉ๊ธˆ ํ‰๊ท ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
  • WALG_DELTA_MAX_STEPS โ€“ ์ „์ฒด ๋ฐฑ์—…์„ ์ƒ์„ฑํ•˜๊ธฐ ์ „์˜ "๋ธํƒ€" ์ˆ˜(๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐ„๊ณผ ํฌ๊ธฐ๋ฅผ ์ ˆ์•ฝํ•˜์ง€๋งŒ ๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•ฝ๊ฐ„ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํฐ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)
  • PG๋ฐ์ดํ„ฐ โ€“ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ(๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค pg_lsclusters);
  • ์œ ๋ น โ€“ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๋กœ์ปฌ ๋ฐฑ์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์˜ˆ์™€ ๊ฐ™์ด Unix ์†Œ์ผ“์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฌธ์„œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

PostgreSQL ๊ตฌ์„ฑ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด๋ถ€์˜ ์•„์นด์ด๋ฒ„๊ฐ€ WAL ๋กœ๊ทธ๋ฅผ ํด๋ผ์šฐ๋“œ์— ์—…๋กœ๋“œํ•˜๊ณ  (ํ•„์š”ํ•œ ๊ฒฝ์šฐ) ์ด๋ฅผ ๋ณต์›ํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. /etc/postgresql/12/main/postgresql.conf. ์ดˆ๋ณด์ž์šฉ ๋‹น์‹ ์€ ํ™•์‹คํžˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค์•„๋ž˜ ์„ค์ • ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ๋กœ๋“œํ•  ๋•Œ DBMS๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#!/bin/bash

echo "wal_level=replica" >> /etc/postgresql/12/main/postgresql.conf
echo "archive_mode=on" >> /etc/postgresql/12/main/postgresql.conf
echo "archive_command='/usr/local/bin/wal-g wal-push "%p" >> /var/log/postgresql/archive_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf
echo โ€œarchive_timeout=60โ€ >> /etc/postgresql/12/main/postgresql.conf
echo "restore_command='/usr/local/bin/wal-g wal-fetch "%f" "%p" >> /var/log/postgresql/restore_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf

# ะฟะตั€ะตะทะฐะณั€ัƒะถะฐะตะผ ะบะพะฝั„ะธะณ ั‡ะตั€ะตะท ะพั‚ะฟั€ะฐะฒะบัƒ SIGHUP ัะธะณะฝะฐะปะฐ ะฒัะตะผ ะฟั€ะพั†ะตััะฐะผ ะ‘ะ”
killall -s HUP postgres

์„ค์ •ํ•  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช…:

  • wal_level โ€“ WAL ๋กœ๊ทธ์— ์“ธ ์ •๋ณด์˜ ์–‘, "replica" โ€“ ๋ชจ๋“  ๊ฒƒ์„ ์”๋‹ˆ๋‹ค.
  • ์•„์นด์ด๋ธŒ_๋ชจ๋“œ โ€“ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ WAL ๋กœ๊ทธ ๋‹ค์šด๋กœ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์•„์นด์ด๋ธŒ ๋ช…๋ น;
  • ์•„์นด์ด๋ธŒ ๋ช…๋ น โ€“ ์™„์„ฑ๋œ WAL ๋กœ๊ทธ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ช…๋ น;
  • archive_timeout โ€“ ๋กœ๊ทธ ๋ณด๊ด€์€ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜ํ–‰๋˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ฝ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝ/์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ์ดˆ ๋‹จ์œ„๋กœ ์ œํ•œ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ฉฐ ๊ทธ ํ›„์— ๋ณด๊ด€ ๋ช…๋ น์ด ๊ฐ•์ œ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค(๋งค์ดˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง‘์ค‘์ ์œผ๋กœ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.);
  • ๋ณต์› ๋ช…๋ น โ€“ "์ „์ฒด ๋ฐฑ์—…"(๊ธฐ๋ณธ ๋ฐฑ์—…)์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ฐฑ์—…์—์„œ WAL ๋กœ๊ทธ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ช…๋ น์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ๋ฌธ์„œ ๋ฒˆ์—ญ์—์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

๋ฐฑ์—… ์ผ์ • ์„ค์ •

์–ด๋–ค ์‚ฌ๋žŒ์ด ๋งํ•˜๋“  ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ์‹คํ–‰ ๋ฐฉ๋ฒ•์€ cron์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐฑ์—…์„ ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๋ฐฑ์—…์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. wal-g์—์„œ๋Š” ์ด๊ฒƒ์ด ์‹œ์ž‘ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฐฑ์—…-ํ‘ธ์‹œ. ํ•˜์ง€๋งŒ ๋จผ์ € postgres ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ช…๋ น์„ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์€์ง€(์•ก์„ธ์Šค ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€) ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

#!/bin/bash

su - postgres -c '/usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main'

์‹œ์ž‘ ์ธ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ์ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ์„ ์ƒ๊ธฐ์‹œ์ผœ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. pg_lsclusters.

๋ชจ๋“  ๊ฒƒ์ด ์˜ค๋ฅ˜ ์—†์ด ์ง„ํ–‰๋˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ S3 ์Šคํ† ๋ฆฌ์ง€์— ๋กœ๋“œ๋œ ๊ฒฝ์šฐ crontab์—์„œ ์ฃผ๊ธฐ์  ์‹คํ–‰์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#!/bin/bash

echo "15 4 * * *    /usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main >> /var/log/postgresql/walg_backup.log 2>&1" >> /var/spool/cron/crontabs/postgres
# ะทะฐะดะฐะตะผ ะฒะปะฐะดะตะปัŒั†ะฐ ะธ ะฒั‹ัั‚ะฐะฒะปัะตะผ ะฟั€ะฐะฒะธะปัŒะฝั‹ะต ะฟั€ะฐะฒะฐ ั„ะฐะนะปัƒ
chown postgres: /var/spool/cron/crontabs/postgres
chmod 600 /var/spool/cron/crontabs/postgres

์ด ์˜ˆ์—์„œ ๋ฐฑ์—… ํ”„๋กœ์„ธ์Šค๋Š” ๋งค์ผ ์˜ค์ „ 4์‹œ 15๋ถ„์— ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ๋ฐฑ์—… ์‚ญ์ œ

์•„๋งˆ๋„ ์ค‘์ƒ๋Œ€์˜ ๋ชจ๋“  ๋ฐฑ์—…์„ ์™„์ „ํžˆ ๋ณด๊ด€ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฏ€๋กœ ์Šคํ† ๋ฆฌ์ง€("์ „์ฒด ๋ฐฑ์—…"๊ณผ WAL ๋กœ๊ทธ ๋ชจ๋‘)๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ "์ •๋ฆฌ"ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. cron ์ž‘์—…์„ ํ†ตํ•ด ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

#!/bin/bash

echo "30 6 * * *    /usr/local/bin/wal-g delete before FIND_FULL $(date -d '-10 days' '+%FT%TZ') --confirm >> /var/log/postgresql/walg_delete.log 2>&1" >> /var/spool/cron/crontabs/postgres
# ะตั‰ั‘ ั€ะฐะท ะทะฐะดะฐะตะผ ะฒะปะฐะดะตะปัŒั†ะฐ ะธ ะฒั‹ัั‚ะฐะฒะปัะตะผ ะฟั€ะฐะฒะธะปัŒะฝั‹ะต ะฟั€ะฐะฒะฐ ั„ะฐะนะปัƒ (ั…ะพั‚ัŒ ัั‚ะพ ะพะฑั‹ั‡ะฝะพ ัั‚ะพ ะธ ะฝะต ะฝัƒะถะฝะพ ะฟะพะฒั‚ะพั€ะฝะพ ะดะตะปะฐั‚ัŒ)
chown postgres: /var/spool/cron/crontabs/postgres
chmod 600 /var/spool/cron/crontabs/postgres

Cron์€ ๋งค์ผ ์˜ค์ „ 6์‹œ 30๋ถ„์— ์ด ์ž‘์—…์„ ์‹คํ–‰ํ•˜์—ฌ ์ง€๋‚œ 10์ผ ๋™์•ˆ์˜ ๋ณต์‚ฌ๋ณธ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ(์ „์ฒด ๋ฐฑ์—…, ๋ธํƒ€ ๋ฐ WAL)์„ ์‚ญ์ œํ•˜์ง€๋งŒ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐฑ์—…์€ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค. ์— ํŠน์ • ๋‚ ์งœ์— ์–ด๋–ค ์ง€์ ์ด๋ผ๋„ ํ›„ ๋‚ ์งœ๊ฐ€ PITR์— ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—…์—์„œ ๋ณต์›

๊ฑด๊ฐ•ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ•ต์‹ฌ์€ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ณต์›ํ•˜๊ณ  ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์„น์…˜์—์„œ๋Š” WAL-G๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ  ๋‚˜์ค‘์— ํ™•์ธ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋กœ ๋”ฐ๋กœ ์ฃผ๋ชฉํ• ๋งŒํ•œ ๊ฐ€์น˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(ํ”„๋กœ๋•์…˜์ด ์•„๋‹Œ ๋ชจ๋“  ๊ฒƒ)์—์„œ ๋ณต์›ํ•˜๋ ค๋ฉด ์‹ค์ˆ˜๋กœ ๋ฐฑ์—…์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋„๋ก S3์—์„œ ์ฝ๊ธฐ ์ „์šฉ ๊ณ„์ •์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. WAL-G์˜ ๊ฒฝ์šฐ ๊ทธ๋ฃน ์ •์ฑ…(๊ทธ๋ฃน ์ •์ฑ…)์—์„œ S3 ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ๋‹ค์Œ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.ํšจ๊ณผ: ํ—ˆ์šฉ): s3:GetObject, s3:๋ฆฌ์ŠคํŠธ๋ฒ„ํ‚ท, s3:GetBucketLocation. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก , ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. archive_mode=๊บผ์ง ์„ค์ • ํŒŒ์ผ์—์„œ postgresql.conf, ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์กฐ์šฉํžˆ ๋ฐฑ์—…๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณต์›์€ ์†์˜ ์•ฝ๊ฐ„์˜ ์›€์ง์ž„์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  PostgreSQL ๋ฐ์ดํ„ฐ ์‚ญ์ œ (์‚ฌ์šฉ์ž ํฌํ•จ)์ด๋ฏ€๋กœ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ๋Š” ๊ฐ๋ณ„ํžˆ ์ฃผ์˜ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

#!/bin/bash

# ะตัะปะธ ะตัั‚ัŒ ะฑะฐะปะฐะฝัะธั€ะพะฒั‰ะธะบ ะฟะพะดะบะปัŽั‡ะตะฝะธะน (ะฝะฐะฟั€ะธะผะตั€, pgbouncer), ั‚ะพ ะฒะฝะฐั‡ะฐะปะต ะพั‚ะบะปัŽั‡ะฐะตะผ ะตะณะพ, ั‡ั‚ะพะฑั‹ ะพะฝ ะฝะต ะฝะฐั€ั‹ะณะฐะป ะพัˆะธะฑะพะบ ะฒ ะปะพะณ
service pgbouncer stop
# ะตัะปะธ ะตัั‚ัŒ ะดะตะผะพะฝ, ะบะพั‚ะพั€ั‹ะน ะฟะตั€ะตะทะฐะฟัƒัะบะฐะตั‚ ัƒะฟะฐะฒัˆะธะต ะฟั€ะพั†ะตััั‹ (ะฝะฐะฟั€ะธะผะตั€, monit), ั‚ะพ ะพัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฒ ะฝั‘ะผ ะฟั€ะพั†ะตัั ะผะพะฝะธั‚ะพั€ะธะฝะณะฐ ะฑะฐะทั‹ (ัƒ ะผะตะฝั ัั‚ะพ pgsql12)
monit stop pgsql12
# ะธะปะธ ะพัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะผะพะฝะธั‚ะพั€ะธะฝะณ ะฟะพะปะฝะพัั‚ัŒัŽ
service monit stop
# ะพัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ัะฐะผัƒ ะฑะฐะทัƒ ะดะฐะฝะฝั‹ั…
service postgresql stop
# ัƒะดะฐะปัะตะผ ะฒัะต ะดะฐะฝะฝั‹ะต ะธะท ั‚ะตะบัƒั‰ะตะน ะฑะฐะทั‹ (!!!); ะปัƒั‡ัˆะต ะฟั€ะตะดะฒะฐั€ะธั‚ะตะปัŒะฝะพ ัะดะตะปะฐั‚ัŒ ะธั… ะบะพะฟะธัŽ, ะตัะปะธ ะตัั‚ัŒ ัะฒะพะฑะพะดะฝะพะต ะผะตัั‚ะพ ะฝะฐ ะดะธัะบะต
rm -rf /var/lib/postgresql/12/main
# ัะบะฐั‡ะธะฒะฐะตะผ ั€ะตะทะตั€ะฒะฝัƒัŽ ะบะพะฟะธัŽ ะธ ั€ะฐะทะฐั€ั…ะธะฒะธั€ัƒะตะผ ะตั‘
su - postgres -c '/usr/local/bin/wal-g backup-fetch /var/lib/postgresql/12/main LATEST'
# ะฟะพะผะตั‰ะฐะตะผ ั€ัะดะพะผ ั ะฑะฐะทะพะน ัะฟะตั†ะธะฐะปัŒะฝั‹ะน ั„ะฐะนะป-ัะธะณะฝะฐะป ะดะปั ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั (ัะผ. https://postgrespro.ru/docs/postgresql/12/runtime-config-wal#RUNTIME-CONFIG-WAL-ARCHIVE-RECOVERY ), ะพะฝ ะพะฑัะทะฐั‚ะตะปัŒะฝะพ ะดะพะปะถะตะฝ ะฑั‹ั‚ัŒ ัะพะทะดะฐะฝ ะพั‚ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั postgres
su - postgres -c 'touch /var/lib/postgresql/12/main/recovery.signal'
# ะทะฐะฟัƒัะบะฐะตะผ ะฑะฐะทัƒ ะดะฐะฝะฝั‹ั…, ั‡ั‚ะพะฑั‹ ะพะฝะฐ ะธะฝะธั†ะธะธั€ะพะฒะฐะปะฐ ะฟั€ะพั†ะตัั ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั
service postgresql start

๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์•„๋ž˜์— ์ž‘์€ bash ๋งค์ง ์กฐ๊ฐ์ด ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ณต๊ตฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ 120์ด ์•„๋‹Œ ์ข…๋ฃŒ ์ฝ”๋“œ๋กœ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์‹ ํ˜ธ ํŒŒ์ผ์ด ์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด 5์ดˆ์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ(๋ณต๊ตฌ์— ์ด 10๋ถ„)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ XNUMX๊ฐœ์˜ ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” ๋ณต๊ตฌ๊ฐ€ ์„ฑ๊ณตํ–ˆ์Œ์„ ์˜๋ฏธํ•จ).

#!/bin/bash

CHECK_RECOVERY_SIGNAL_ITER=0
while [ ${CHECK_RECOVERY_SIGNAL_ITER} -le 120 ]
do
    if [ ! -f "/var/lib/postgresql/12/main/recovery.signal" ]
    then
        echo "recovery.signal removed"
        break
    fi
    sleep 5
    ((CHECK_RECOVERY_SIGNAL_ITER+1))
done

# ะตัะปะธ ะฟะพัะปะต ะฒัะตั… ะฟั€ะพะฒะตั€ะพะบ ั„ะฐะนะป ะฒัั‘ ั€ะฐะฒะฝะพ ััƒั‰ะตัั‚ะฒัƒะตั‚, ั‚ะพ ะฟะฐะดะฐะตะผ ั ะพัˆะธะฑะบะพะน
if [ -f "/var/lib/postgresql/12/main/recovery.signal" ]
then
    echo "recovery.signal still exists!"
    exit 17
fi

์„ฑ๊ณต์ ์ธ ๋ณต๊ตฌ ํ›„์—๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค(pgbouncer/monit ๋“ฑ)๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ณต๊ตฌ ํ›„ ๋ฐ์ดํ„ฐ ํ™•์ธ

๋ฐฑ์—…์ด ๊นจ์ง€๊ฑฐ๋‚˜ ๋น„๋šค์–ด์ง„ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋ณต์› ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ๊ฐ ์•„์นด์ด๋ธŒ์— ๋Œ€ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€๋งŒ ์œ„์น˜์™€ ๋ฐฉ๋ฒ•์€ ์ƒ์ƒ์—๋งŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค(์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๊ฐœ๋ณ„ ์„œ๋ฒ„๋ฅผ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ CI์—์„œ ํ™•์ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ). ํ•˜์ง€๋งŒ ์ตœ์†Œํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ์™€ ์ธ๋ฑ์Šค๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋คํ”„๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ฒดํฌ์„ฌ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค(๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ):

#!/bin/bash

if ! su - postgres -c 'pg_dumpall > /dev/null'
then
    echo 'pg_dumpall failed'
    exit 125
fi

์ธ๋ฑ์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด - ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. amcheck ๋ชจ๋“ˆ, ์ด์— ๋Œ€ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. WAL-G ํ…Œ์ŠคํŠธ ๊ทธ ์ฃผ์œ„์— ์•ฝ๊ฐ„์˜ ๋…ผ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์‹ญ์‹œ์˜ค.

#!/bin/bash

# ะดะพะฑะฐะฒะปัะตะผ sql-ะทะฐะฟั€ะพั ะดะปั ะฟั€ะพะฒะตั€ะบะธ ะฒ ั„ะฐะนะป ะฒะพ ะฒั€ะตะผะตะฝะฝะพะน ะดะธั€ะตะบั‚ะพั€ะธะธ
cat > /tmp/amcheck.sql << EOF
CREATE EXTENSION IF NOT EXISTS amcheck;
SELECT bt_index_check(c.oid), c.relname, c.relpages
FROM pg_index i
JOIN pg_opclass op ON i.indclass[0] = op.oid
JOIN pg_am am ON op.opcmethod = am.oid
JOIN pg_class c ON i.indexrelid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE am.amname = 'btree'
AND c.relpersistence != 't'
AND i.indisready AND i.indisvalid;
EOF
chown postgres: /tmp/amcheck.sql

# ะดะพะฑะฐะฒะปัะตะผ ัะบั€ะธะฟั‚ ะดะปั ะทะฐะฟัƒัะบะฐ ะฟั€ะพะฒะตั€ะพะบ ะฒัะตั… ะดะพัั‚ัƒะฟะฝั‹ั… ะฑะฐะท ะฒ ะบะปะฐัั‚ะตั€ะต
# (ะพะฑั€ะฐั‚ะธั‚ะต ะฒะฝะธะผะฐะฝะธะต ั‡ั‚ะพ ะฟะตั€ะตะผะตะฝะฝั‹ะต ะธ ะทะฐะฟัƒัะบ ะบะพะผะฐะฝะด โ€“ ัะบั€ะฐะฝะธั€ะพะฒะฐะฝั‹)
cat > /tmp/run_amcheck.sh << EOF
for DBNAME in $(su - postgres -c 'psql -q -A -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;" ')
do
    echo "Database: ${DBNAME}"
    su - postgres -c "psql -f /tmp/amcheck.sql -v 'ON_ERROR_STOP=1' ${DBNAME}" && EXIT_STATUS=$? || EXIT_STATUS=$?
    if [ "${EXIT_STATUS}" -ne 0 ]
    then
        echo "amcheck failed on DB: ${DBNAME}"
        exit 125
    fi
done
EOF
chmod +x /tmp/run_amcheck.sh

# ะทะฐะฟัƒัะบะฐะตะผ ัะบั€ะธะฟั‚
/tmp/run_amcheck.sh > /tmp/amcheck.log

# ะดะปั ะฟั€ะพะฒะตั€ะบะธ ั‡ั‚ะพ ะฒัั‘ ะฟั€ะพัˆะปะพ ัƒัะฟะตัˆะฝะพ ะผะพะถะฝะพ ะฟั€ะพะฒะตั€ะธั‚ัŒ exit code ะธะปะธ grepโ€™ะฝัƒั‚ัŒ ะพัˆะธะฑะบัƒ
if grep 'amcheck failed' "/tmp/amcheck.log"
then
    echo 'amcheck failed: '
    cat /tmp/amcheck.log
    exit 125
fi

์š”์•ฝ

์ถœํŒ๋ฌผ์„ ์ค€๋น„ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€ Andrey Borodin์—๊ฒŒ ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•˜๊ณ  WAL-G ๊ฐœ๋ฐœ์— ๊ธฐ์—ฌํ•œ ๋ฐ ํŠน๋ณ„ํ•œ ๊ฐ์‚ฌ๋ฅผ ํ‘œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

์ด๊ฒƒ์œผ๋กœ ์ด ๋…ธํŠธ๋ฅผ ๋งˆ์นฉ๋‹ˆ๋‹ค. ์„ค์ •์ด ๊ฐ„ํŽธํ•˜๊ณ  ํšŒ์‚ฌ์—์„œ ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—„์ฒญ๋‚œ ์ž ์žฌ๋ ฅ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” WAL-G์— ๋Œ€ํ•ด ๋งŽ์ด ๋“ค์—ˆ์ง€๋งŒ ์•‰์•„์„œ ์•Œ์•„๋‚ผ ์‹œ๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง‘์—์„œ ๊ตฌํ˜„ํ•ด๋ณธ ๊ฒฐ๊ณผ ์ด๋Ÿฐ ๊ธ€์ด ๋‚˜์™”์–ด์š”.

์ด์™€ ๋ณ„๋„๋กœ WAL-G๊ฐ€ ๋‹ค์Œ DBMS์—์„œ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€