SQL ๋คํ๋ก ๋ฐฑ์ ์ ๋ง๋๋ ๊ฒ์ ์ค๋ซ๋์ ์๋ ค์ ธ ์์ต๋๋ค. pg_dump ๋๋ pg_dumpall) ์ข์ ์๊ฐ์ด ์๋๋๋ค. PostgreSQL DBMS๋ฅผ ๋ฐฑ์ ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. pg_basebackup, WAL ๋ก๊ทธ์ ๋ฐ์ด๋๋ฆฌ ๋ณต์ฌ๋ณธ์ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ ๋ณต์ํ๋ ์ ์ฒด ๊ณผ์ ์ ์ฐ๊ตฌํ๊ธฐ ์์ํ๋ฉด ์ด๊ฒ์ด ์๋ํ๊ณ ์์๋ ๋ชจ๋ ๊ณ ํต์ ์ ๋ฐํ์ง ์์ผ๋ ค๋ฉด ์ต์ํ ๋ ๊ฐ์ ์ธ๋ฐ ์์ ๊ฑฐ๋ฅผ ์์ฑํด์ผํ๋ค๋ ๊ฒ์ ์ดํดํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ณ ํต์ ์ํํ๊ธฐ ์ํด WAL-G๊ฐ ๊ฐ๋ฐ๋์์ต๋๋ค.
์ด ๊ธ์ ์ฃผ๋ก ์ ๊ฐ ์๊ณ ์๋ ์ง์์ ์ฒด๊ณํํ๊ธฐ ์ํด ์์ฑ๋์์ต๋๋ค. ์ ๋ DBA๊ฐ ์๋๋ฉฐ ์ด๋๊ฐ์์ ์ผ๋ฐ์ธ์ ์ธ์ด๋ก ํํํ ์ ์์ผ๋ฏ๋ก ์ด๋ค ์์ ์ด๋ผ๋ ํ์ํฉ๋๋ค!
์ด์ ๋ณ๋๋ก, ์๋์ ๋ชจ๋ ๋ด์ฉ์ Ubuntu 12.3์ PostgreSQL 18.04๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ ํ ์คํธ๋์์ผ๋ฉฐ ๋ชจ๋ ๋ช ๋ น์ ๊ถํ ์๋ ์ฌ์ฉ์๋ก ์คํ๋์ด์ผ ํฉ๋๋ค.
์ค์น
์ด ๊ธฐ์ฌ๋ฅผ ์์ฑํ๋ ์์ ์์ WAL-G์ ์์ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#!/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์ ๋ํ ์ด์ ๊ธฐ์ฌ๋ ๋ชจ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ง๋ง ์ด๋ฒ ๋ฆด๋ฆฌ์ค์์๋ ์ค์ ์ ๋ค์ ์์น์์ ์ฐพ์ ์ ์์ต๋๋ค.
#!/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 ์์ผ์ ํตํด ์ํํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค:
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 ๋ก๊ทธ๋ฅผ ๋ณต์ํ๋ ๋ช ๋ น์ด ์ฌ์ฉ๋ฉ๋๋ค.
๊ณต์ ๋ฌธ์ ๋ฒ์ญ์์ ์ด๋ฌํ ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฝ์ ์ ์์ต๋๋ค.
๋ฐฑ์ ์ผ์ ์ค์
์ด๋ค ์ฌ๋์ด ๋งํ๋ ๊ฐ์ฅ ํธ๋ฆฌํ ์คํ ๋ฐฉ๋ฒ์ 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
์ธ๋ฑ์ค๋ฅผ ํ์ธํ๋ ค๋ฉด - ์กด์ฌํฉ๋๋ค.
#!/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์์๋ ์๋ํ ์ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
MySQL / MariaDB ;MongoDB์ ;ํ์ด๋ฐ์ด์ DB ;- ๊ทธ๋ฆฌ๊ณ ์ปค๋ฐ์ผ๋ก ํ๋จํ๋ฉด ๋ช ๊ฐ์ง๊ฐ ๋ ์์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค!
์ถ์ฒ : habr.com