PostgreSQL์ ํด๋ผ์ฐ๋์ ๋ฐฑ์ ํ๊ธฐ ์ํ ๊ฐ๋จํ๊ณ ํจ๊ณผ์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ฃผ์ ๊ธฐ๋ฅ ์ธก๋ฉด์์ ์ธ๊ธฐ ์๋ ๋๊ตฌ์ ์์์์ ๋๋ค. ์ด์ง๋ง Go๋ก ๋ค์ ์์ฑ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ WAL-G์๋ ๋ธํ ๋ณต์ฌ๋ผ๋ ์ค์ํ ์๋ก์ด ๊ธฐ๋ฅ์ด ํ๋ ์์ต๋๋ค. ๋ธํ ๋ณต์ฌ๋ณธ ์ด์ ๋ฒ์ ์ ๋ฐฑ์ ์ดํ ๋ณ๊ฒฝ๋ ํ์ผ ํ์ด์ง๋ฅผ ์ ์ฅํฉ๋๋ค. WAL-G๋ ๋ฐฑ์ ๋ณ๋ ฌํ๋ฅผ ์ํด ์๋นํ ๋ง์ ๊ธฐ์ ์ ๊ตฌํํฉ๋๋ค. WAL-G๋ WAL-E๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋๋ค.
wal-g์ ์๋ ๋ฐฉ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์ ๊ธฐ์ฌ์์ ํ์ธํ ์ ์์ต๋๋ค.
S3 ์คํ ๋ฆฌ์ง ํ๋กํ ์ฝ์ ๋ฐ์ดํฐ ์ ์ฅ์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. S3์ ์ฅ์ ์ค ํ๋๋ API๋ฅผ ํตํด ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ณต๊ฐ ์ฝ๊ธฐ ์ก์ธ์ค๋ฅผ ํฌํจํ์ฌ ์คํ ๋ฆฌ์ง์์ ์ ์ฐํ ์ํธ ์์ฉ์ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ ์คํ ๋ฆฌ์ง์ ์ ๋ณด ์ ๋ฐ์ดํธ๋ ๊ถํ ์๋ ์ฌ๋๋ง ์ํํ ์ ์์ต๋๋ค.
S3 ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๊ณต์ฉ ๋ฐ ๊ฐ์ธ ์ ์ฅ์ ๊ตฌํ์ด ์์ต๋๋ค. ์ค๋์ ์๊ท๋ชจ ์คํ ๋ฆฌ์ง ์ ๋ฆฌ๋ฅผ ์ํ ์ธ๊ธฐ ์๋ ์๋ฃจ์ ์ธ Minio๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
wal-g ํ ์คํธ์๋ ๋จ์ผ PostgreSQL ์๋ฒ๊ฐ ์ ํฉํ๋ฉฐ S3 ๋์ Minio๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฏธ๋์ค ์๋ฒ
๋ฏธ๋์ค ์ค์น
yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minio/etc/minio/minio.conf์์ AccessKey ๋ฐ SecretKey๋ฅผ ํธ์งํ์ธ์.
vi /etc/minio/minio.confMinio ์ด์ ์ nginx๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
--address 127.0.0.1:9000--address 0.0.0.0:9000๋ฏธ๋์ค ์ถ์
systemctl start minioMinio ์น ์ธํฐํ์ด์ค๋ก ์ด๋ ๋ฒํท(์: pg-backups)์ ์์ฑํฉ๋๋ค.
DB ์๋ฒ
rpm ๋จ์์ WAL-G๋ ๋(Anton Patsev)๊ฐ ์กฐ๋ฆฝํ์ต๋๋ค. , .
RPM ๊ธฐ๋ฐ ์์คํ ์ด ์๋ ๋ถ๋ค์ ๊ณต์ ์์คํ ์ ์ด์ฉํ์ธ์. ์ค์น๋ก.
wal-g ๋ฐ์ด๋๋ฆฌ์ ํจ๊ป rpm์๋ /etc/wal-gd/server-s3.conf ํ์ผ์์ ๋ณ์๋ฅผ ๊ฐ์ ธ์ค๋ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.sh์๊ทธ๋ฅผ ์ค์นํฉ๋๋ค.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gwal-g ๋ฒ์ ์ ํ์ธํ๋ ์ค์ ๋๋ค.
wal-g --version
wal-g version v0.2.14ํ์์ ๋ง๊ฒ /etc/wal-gd/server-s3.conf๋ฅผ ํธ์งํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ์์ ์ฌ์ฉํ๋ ๊ตฌ์ฑ ํ์ผ๊ณผ ๋ฐ์ดํฐ ํ์ผ์ ์ผ๋ฐ์ ์ผ๋ก ํด๋ฌ์คํฐ ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ์ ํจ๊ป ์ ์ฅ๋ฉ๋๋ค. PGDATA
#!/bin/bash
export PG_VER="9.6"
export WALE_S3_PREFIX="s3://pg-backups" # ะฑะฐะบะตั, ะบะพัะพััะน ะผั ัะพะทะดะฐะปะธ ะฒ S3
export AWS_ACCESS_KEY_ID="xxxx" # AccessKey ะธะท /etc/minio/minio.conf
export AWS_ENDPOINT="http://ip-ะฐะดัะตั-ัะตัะฒะตัะฐ-minio:9000"
export AWS_S3_FORCE_PATH_STYLE="true"
export AWS_SECRET_ACCESS_KEY="yyyy" # SecretKey ะธะท /etc/minio/minio.conf
export PGDATA=/var/lib/pgsql/$PG_VER/data/
export PGHOST=/var/run/postgresql/.s.PGSQL.5432 # ะกะพะบะตั ะดะปั ะฟะพะดะบะปััะตะฝะธั ะบ PostgreSQL
export WALG_UPLOAD_CONCURRENCY=2 # ะะพะป-ะฒะพ ะฟะพัะพะบะพะฒ ะดะปั ะทะฐะบะฐัะบะธ
export WALG_DOWNLOAD_CONCURRENCY=2 # ะะพะป-ะฒะพ ะฟะพัะพะบะพะฒ ะดะปั ัะบะฐัะธะฒะฐะฝะธั
export WALG_UPLOAD_DISK_CONCURRENCY=2 # ะะพะป-ะฒะพ ะฟะพัะพะบะพะฒ ะฝะฐ ะดะธัะบะต ะดะปั ะทะฐะบะฐัะบะธ
export WALG_DELTA_MAX_STEPS=7
export WALG_COMPRESSION_METHOD=brotli # ะะฐะบะพะน ะผะตัะพะด ัะถะฐัะธั ะธัะฟะพะปัะทะพะฒะฐัั.
WAL-G๋ฅผ ๊ตฌ์ฑํ ๋ ๊ธฐ๋ณธ ๋ฐฑ์ ์์ ๋ธํ ๋ฐฑ์ ์ด ์ต๋ ๋จ๊ณ ์์ธ WALG_DELTA_MAX_STEPS๋ฅผ ์ง์ ํ๊ณ ๋ธํ ๋ณต์ฌ ์ ์ฑ ์ ์ง์ ํฉ๋๋ค. ๋ง์ง๋ง ๊ธฐ์กด ๋ธํ์์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ฑฐ๋ ์๋ณธ ์ ์ฒด ๋ฐฑ์ ์์ ๋ธํ๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์ผํ ๊ตฌ์ฑ ์์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํญ์ ๋ณ๊ฒฝ๋๊ณ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์ ํ์ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค์น ์ค์ ๋๋ค.
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.
noarch.rpm
yum install -y postgresql96 postgresql96-server mc๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ธฐํํด ๋ณด๊ฒ ์ต๋๋ค.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK1๊ฐ์ ์๋ฒ์์ ํ ์คํธํ๋ ๊ฒฝ์ฐ ๋ฒ์ 10 ๋ฏธ๋ง์ PostgreSQL์ ๋ํด ์์นด์ด๋ธํ๊ณ PostgreSQL ๋ฒ์ 10 ์ดํ์ ๋ํ ๋ณต์ ๋ณธ์ ๋ณด๊ดํ๋๋ก wal_level ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
wal_level = archivePostgreSQL ์์ฒด๋ฅผ ์ฌ์ฉํ์ฌ 60์ด๋ง๋ค WAL ์์นด์ด๋ธ๋ฅผ ๋ฐฑ์ ํด ๋ณด๊ฒ ์ต๋๋ค. prod์์๋ ๋ค๋ฅธ archive_timeout ๊ฐ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # ะะฐะถะดัะต 60 ัะตะบัะฝะด ะฑัะดะตั ะฒัะฟะพะปะฝัััั ะบะพะผะฐะฝะดะฐ archive_command.PostgreSQL์ ์์ํด๋ณด์
systemctl start postgresql-9.6๋ณ๋์ ์ฝ์์์ PostgreSQL ๋ก๊ทธ์์ ์ค๋ฅ๋ฅผ ํ์ธํฉ๋๋ค. (postgresql-Wed.log๋ฅผ ํ์ฌ ๋ก๊ทธ๋ก ๋ณ๊ฒฝ)
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logpsql๋ก ๊ฐ๋ณด์.
su - postgres
psqlpsql์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
๋ฐ์ดํฐ๋ฒ ์ด์ค test1์ ํ ์ด๋ธ์ ๋ง๋ญ๋๋ค.
create database test1;๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์คํธ๋ก ์ ํํฉ๋๋ค.
postgres=# c test1;indexing_table ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค.
test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ฐ์ดํฐ ์ฝ์ ์ ์์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ 10-20 ๋ถ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
done๋ฐ๋์ ์ ์ฒด ๋ฐฑ์ ์ ํ์๊ธฐ ๋ฐ๋๋๋ค.
su - postgres
/usr/local/bin/backup-push.shtest1 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ์๋ ํญ๋ชฉ์ ์ดํด๋ด ๋๋ค.
select * from indexing_table;
2020-01-29 09:41:25.226198+
2020-01-29 09:42:25.336989+
2020-01-29 09:43:25.356069+
2020-01-29 09:44:25.37381+
2020-01-29 09:45:25.392944+
2020-01-29 09:46:25.412327+
2020-01-29 09:47:25.432564+
2020-01-29 09:48:25.451985+
2020-01-29 09:49:25.472653+
2020-01-29 09:50:25.491974+
2020-01-29 09:51:25.510178+๋ฌธ์์ด์ ํ์ฌ ์๊ฐ์ ๋๋ค.
์ ์ฒด ๋ฐฑ์ ๋ชฉ๋ก ๋ณด๊ธฐ
/usr/local/bin/backup-list.sh๋ณต๊ตฌ ํ ์คํธ
์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ WAL์ ๋กค๋งํ์ฌ ์ ์ฒด ๋ณต๊ตฌ.
PostgreSQL์ ์ค์งํฉ๋๋ค.
/var/lib/pgsql/9.6/data ํด๋์์ ๋ชจ๋ ํญ๋ชฉ์ ์ญ์ ํฉ๋๋ค.
postgres ์ฌ์ฉ์๋ก /usr/local/bin/backup-fetch.sh ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค.
su - postgres
/usr/local/bin/backup-fetch.sh๋ฐฑ์ ์ถ์ถ์ด ์๋ฃ๋์์ต๋๋ค.
๋ค์ ๋ด์ฉ์ผ๋ก /var/lib/pgsql/9.6/data ํด๋์ Recovery.conf๋ฅผ ์ถ๊ฐํฉ๋๋ค.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'PostgreSQL์ ์์ํฉ๋๋ค. PostgreSQL์ ๋ณด๊ด๋ WAL์์ ๋ณต๊ตฌ ํ๋ก์ธ์ค๋ฅผ ์์ํ ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฝ๋๋ค.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log์ผ์ ์๊ฐ ๋์ ํ๋ณต๋ฉ๋๋ค.
ํน์ ๋ถ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณต์ํ๋ ค๋ฉด Recovery.conf์ Recovery_target_time ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณต์ํ ์๊ฐ์ ๋ํ๋ ๋๋ค.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'๋ณต๊ตฌ ํ indexing_table ํ ์ด๋ธ์ ์ดํด๋ณด์ธ์.
2020-01-29 09:41:25.226198+00
2020-01-29 09:42:25.336989+00
2020-01-29 09:43:25.356069+00
2020-01-29 09:44:25.37381+00
2020-01-29 09:45:25.392944+00PostgreSQL์ ์์ํฉ๋๋ค. PostgreSQL์ ๋ณด๊ด๋ WAL์์ ๋ณต๊ตฌ ํ๋ก์ธ์ค๋ฅผ ์์ํ ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฝ๋๋ค.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logํ ์คํธ
์ฌ๊ธฐ์ ์ค๋ช ๋ ๋๋ก 1GB ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
1GB์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ํ ๋ฒํท ํฌ๊ธฐ๋ฅผ ์์ฒญํฉ๋๋ค.
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MBs4cmd โ ะฑะตัะฟะปะฐัะฝัะน ะธะฝััััะผะตะฝั ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ ะดะปั ัะฐะฑะพัั ั ะดะฐะฝะฝัะผะธ, ัะฐัะฟะพะปะพะถะตะฝะฝัะผะธ ะฒ ั ัะฐะฝะธะปะธัะต Amazon S3. ะฃัะธะปะธัะฐ ะฝะฐะฟะธัะฐะฝะฐ ะฝะฐ ัะทัะบะต ะฟัะพะณัะฐะผะผะธัะพะฒะฐะฝะธั python, ะธ ะฑะปะฐะณะพะดะฐัั ััะพะผั ะผะพะถะตั ะธัะฟะพะปัะทะพะฒะฐัััั ะฒ ะพะฟะตัะฐัะธะพะฝะฝัั ัะธััะตะผะฐั ะธ Windows๊ณผ Linux.
s4cmd ์ค์น
pip install s4cmdLZ4
s4cmd --endpoint-url=http://ip-ะฐะดัะตั-ัะตัะฒะตัะฐ-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822 s3://pg-backups/wal_005/
840 ะะ ะฒ ัะพัะผะฐัะต lz4 ัะพะปัะบะพ WAL ะปะพะณะพะฒ
ะะพะปะฝัะน ะฑะตะบะฐะฟ ั lz4 - 1GB ะดะฐะฝะฝัั
time backup_push.sh
real 0m18.582s
ะ ะฐะทะผะตั S3 ะฑะฐะบะตัะฐ ะฟะพัะปะต ะฟะพะปะฝะพะณะพ ะฑะตะบะฐะฟะฐ
581480085 s3://pg-backups/basebackups_005/
842374424 s3://pg-backups/wal_005
581 ะะ ะทะฐะฝะธะผะฐะตั ะฟะพะปะฝัะน ะฑะตะบะฐะฟLZMA
ะะพัะปะต ะณะตะฝะตัะฐัะธะธ 1ะะ ะดะฐะฝะฝัั
338413694 s3://pg-backups/wal_005/
338 ะผะฑ ะปะพะณะพะฒ ะฒ ัะพัะผะฐัะต lzma
ะัะตะผั ะณะตะฝะตัะฐัะธะธ ะฟะพะปะฝะพะณะพ ะฑะตะบะฐะฟะฐ
time backup_push.sh
real 5m25.054s
ะ ะฐะทะผะตั ะฑะฐะบะตัะฐ ะฒ S3
270310495 s3://pg-backups/basebackups_005/
433485092 s3://pg-backups/wal_005/
270 ะผะฑ ะทะฐะฝะธะผะฐะตั ะฟะพะปะฝัะน ะฑะตะบะฐะฟ ะฒ ัะพัะผะฐัะต lzma๋ธ๋ก ํ๋ฆฌ
ะะพัะปะต ะณะตะฝะตัะฐัะธะธ 1ะะ ะดะฐะฝะฝัั
459229886 s3://pg-backups/wal_005/
459 ะผะฑ ะปะพะณะพะฒ ะฒ ัะพัะผะฐัะต brotli
ะัะตะผั ะณะตะฝะตัะฐัะธะธ ะฟะพะปะฝะพะณะพ ะฑะตะบะฐะฟะฐ
real 0m23.408s
ะ ะฐะทะผะตั ะฑะฐะบะตัะฐ ะฒ S3
312960942 s3://pg-backups/basebackups_005/
459309262 s3://pg-backups/wal_005/
312 ะผะฑ ะทะฐะฝะธะผะฐะตั ะฟะพะปะฝัะน ะฑะตะบะฐะฟ ะฒ ัะพัะผะฐัะต brotli
์ฐจํธ์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํฉ๋๋ค.

๋ณด์๋ค์ํผ Brotli๋ ํฌ๊ธฐ๊ฐ LZMA์ ๋น์ทํ์ง๋ง ๋ฐฑ์ ์ LZ4 ์๊ฐ์ ์ํ๋ฉ๋๋ค.
๋ฌ์์์ด๋ฅผ ์ฌ์ฉํ๋ PostgreSQL ์ปค๋ฎค๋ํฐ ์ฑํ :
์ฌ์ฉํ์๋ ๊ฒฝ์ฐ Github์ ๋ณํ๋ฅผ ๋จ๊ฒจ์ฃผ์ธ์
์ถ์ฒ : habr.com
