WAL-G: PostgreSQL DBMS ನ ಬ್ಯಾಕ್‌ಅಪ್‌ಗಳು ಮತ್ತು ಮರುಪಡೆಯುವಿಕೆ

ಬ್ಯಾಕ್‌ಅಪ್‌ಗಳನ್ನು SQL ಡಂಪ್‌ಗಳಾಗಿ ಮಾಡುವುದು (ಬಳಸುವುದು pg_dump ಅಥವಾ pg_dumpall) ಒಳ್ಳೆಯದು ಅಲ್ಲ. PostgreSQL DBMS ಅನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಲು, ಆಜ್ಞೆಯನ್ನು ಬಳಸುವುದು ಉತ್ತಮ pg_basebackup, ಇದು WAL ಲಾಗ್‌ಗಳ ಬೈನರಿ ನಕಲನ್ನು ಮಾಡುತ್ತದೆ. ಆದರೆ ನೀವು ನಕಲನ್ನು ರಚಿಸುವ ಮತ್ತು ಮರುಸ್ಥಾಪಿಸುವ ಸಂಪೂರ್ಣ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಅಧ್ಯಯನ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಿದಾಗ, ಇದು ಕೆಲಸ ಮಾಡಲು ನೀವು ಕನಿಷ್ಟ ಒಂದೆರಡು ಟ್ರೈಸಿಕಲ್‌ಗಳನ್ನು ಬರೆಯಬೇಕಾಗಿದೆ ಮತ್ತು ಮೇಲಿನ ಮತ್ತು ಕೆಳಗಿನ ಎರಡೂ ನೋವನ್ನು ಉಂಟುಮಾಡುವುದಿಲ್ಲ ಎಂದು ನೀವು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುತ್ತೀರಿ. ದುಃಖವನ್ನು ನಿವಾರಿಸಲು, WAL-G ಅನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸಲಾಗಿದೆ.

WAL-G PostgreSQL ಡೇಟಾಬೇಸ್‌ಗಳನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಲು ಮತ್ತು ಮರುಸ್ಥಾಪಿಸಲು Go ನಲ್ಲಿ ಬರೆಯಲಾದ ಸಾಧನವಾಗಿದೆ (ಮತ್ತು ಇತ್ತೀಚೆಗೆ MySQL/MariaDB, MongoDB ಮತ್ತು FoundationDB) ಇದು ಅಮೆಜಾನ್ S3 ಸಂಗ್ರಹಣೆ (ಮತ್ತು ಅನಲಾಗ್‌ಗಳು, ಉದಾಹರಣೆಗೆ, ಯಾಂಡೆಕ್ಸ್ ಆಬ್ಜೆಕ್ಟ್ ಸ್ಟೋರೇಜ್), ಹಾಗೆಯೇ ಗೂಗಲ್ ಕ್ಲೌಡ್ ಸ್ಟೋರೇಜ್, ಅಜುರೆ ಸ್ಟೋರೇಜ್, ಸ್ವಿಫ್ಟ್ ಆಬ್ಜೆಕ್ಟ್ ಸ್ಟೋರೇಜ್ ಮತ್ತು ಫೈಲ್ ಸಿಸ್ಟಮ್‌ನೊಂದಿಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ. ಸಂಪೂರ್ಣ ಸೆಟಪ್ ಸರಳ ಹಂತಗಳಿಗೆ ಬರುತ್ತದೆ, ಆದರೆ ಅದರ ಬಗ್ಗೆ ಲೇಖನಗಳು ಇಂಟರ್ನೆಟ್‌ನಾದ್ಯಂತ ಹರಡಿಕೊಂಡಿರುವುದರಿಂದ, ಪ್ರಾರಂಭದಿಂದ ಕೊನೆಯವರೆಗೆ ಎಲ್ಲಾ ಹಂತಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಸಂಪೂರ್ಣ ಹೌ-ಟು ಮ್ಯಾನ್ಯುವಲ್ ಇಲ್ಲ (ಹಬ್ರೆಯಲ್ಲಿ ಹಲವಾರು ಪೋಸ್ಟ್‌ಗಳಿವೆ, ಆದರೆ ಅಲ್ಲಿ ಅನೇಕ ಅಂಕಗಳು ತಪ್ಪಿಹೋಗಿವೆ).

WAL-G: PostgreSQL DBMS ನ ಬ್ಯಾಕ್‌ಅಪ್‌ಗಳು ಮತ್ತು ಮರುಪಡೆಯುವಿಕೆ

ಈ ಲೇಖನವನ್ನು ಪ್ರಾಥಮಿಕವಾಗಿ ನನ್ನ ಜ್ಞಾನವನ್ನು ವ್ಯವಸ್ಥಿತಗೊಳಿಸಲು ಬರೆಯಲಾಗಿದೆ. ನಾನು DBA ಅಲ್ಲ ಮತ್ತು ನಾನು ಎಲ್ಲೋ ಸಾಮಾನ್ಯರ ಭಾಷೆಯಲ್ಲಿ ನನ್ನನ್ನು ವ್ಯಕ್ತಪಡಿಸಬಲ್ಲೆ, ಆದ್ದರಿಂದ ಯಾವುದೇ ತಿದ್ದುಪಡಿಗಳು ಸ್ವಾಗತಾರ್ಹ!

ಪ್ರತ್ಯೇಕವಾಗಿ, ಉಬುಂಟು 12.3 ನಲ್ಲಿ PostgreSQL 18.04 ಗಾಗಿ ಕೆಳಗಿನ ಎಲ್ಲವೂ ಸಂಬಂಧಿತವಾಗಿದೆ ಮತ್ತು ಪರೀಕ್ಷಿಸಲಾಗಿದೆ ಎಂದು ನಾನು ಗಮನಿಸುತ್ತೇನೆ, ಎಲ್ಲಾ ಆಜ್ಞೆಗಳನ್ನು ಸವಲತ್ತು ಪಡೆದ ಬಳಕೆದಾರರಂತೆ ಕಾರ್ಯಗತಗೊಳಿಸಬೇಕು.

ಸೆಟ್ಟಿಂಗ್

ಈ ಲೇಖನವನ್ನು ಬರೆಯುವ ಸಮಯದಲ್ಲಿ, WAL-G ಯ ಸ್ಥಿರ ಆವೃತ್ತಿಯಾಗಿದೆ v0.2.15 (ಮಾರ್ಚ್ 2020). ಇದನ್ನೇ ನಾವು ಬಳಸುತ್ತೇವೆ (ಆದರೆ ನೀವು ಅದನ್ನು ಮಾಸ್ಟರ್ ಶಾಖೆಯಿಂದ ನಿರ್ಮಿಸಲು ಬಯಸಿದರೆ, ಗಿಥಬ್ ರೆಪೊಸಿಟರಿಯು ಇದಕ್ಕಾಗಿ ಎಲ್ಲಾ ಸೂಚನೆಗಳನ್ನು ಹೊಂದಿದೆ) ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಮತ್ತು ಸ್ಥಾಪಿಸಲು ನೀವು ಹೀಗೆ ಮಾಡಬೇಕು:

#!/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 ಫೈಲ್ ಪೋಸ್ಟ್‌ಗ್ರೆಸ್ ಬಳಕೆದಾರರ ಹೋಮ್ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ. ಇದನ್ನು ರಚಿಸಲು, ಈ ಕೆಳಗಿನ ಬ್ಯಾಷ್ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ರನ್ ಮಾಡಿ:

#!/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 ನಲ್ಲಿ ಪ್ರವೇಶ ಕೀ (ಪರೀಕ್ಷಾ ಸರ್ವರ್‌ನಲ್ಲಿ ಚೇತರಿಕೆಯ ಸಂದರ್ಭದಲ್ಲಿ, ಈ ಕೀಗಳು ಓದಲು ಮಾತ್ರ ನೀತಿಯನ್ನು ಹೊಂದಿರಬೇಕು! ಚೇತರಿಕೆಯ ವಿಭಾಗದಲ್ಲಿ ಇದನ್ನು ಹೆಚ್ಚು ವಿವರವಾಗಿ ವಿವರಿಸಲಾಗಿದೆ.);
  • AWS_SECRET_ACCESS_KEY - S3 ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ರಹಸ್ಯ ಕೀ;
  • WALG_COMPRESSION_METHOD - ಸಂಕೋಚನ ವಿಧಾನ, ಬ್ರೋಟ್ಲಿಯನ್ನು ಬಳಸುವುದು ಉತ್ತಮ (ಇದು ಅಂತಿಮ ಗಾತ್ರ ಮತ್ತು ಸಂಕೋಚನ / ಡಿಕಂಪ್ರೆಷನ್ ವೇಗದ ನಡುವಿನ ಗೋಲ್ಡನ್ ಮೀನ್ ಆಗಿರುವುದರಿಂದ);
  • WALG_DELTA_MAX_STEPS - ಪೂರ್ಣ ಬ್ಯಾಕ್ಅಪ್ ರಚಿಸುವ ಮೊದಲು "ಡೆಲ್ಟಾಗಳ" ಸಂಖ್ಯೆ (ಅವರು ಸಮಯ ಮತ್ತು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಡೇಟಾದ ಗಾತ್ರವನ್ನು ಉಳಿಸುತ್ತಾರೆ, ಆದರೆ ಚೇತರಿಕೆ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಸ್ವಲ್ಪಮಟ್ಟಿಗೆ ನಿಧಾನಗೊಳಿಸಬಹುದು, ಆದ್ದರಿಂದ ದೊಡ್ಡ ಮೌಲ್ಯಗಳನ್ನು ಬಳಸುವುದು ಸೂಕ್ತವಲ್ಲ);
  • PGDATA - ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ ಡೇಟಾದೊಂದಿಗೆ ಡೈರೆಕ್ಟರಿಗೆ ಮಾರ್ಗ (ಆಜ್ಞೆಯನ್ನು ಚಲಾಯಿಸುವ ಮೂಲಕ ನೀವು ಕಂಡುಹಿಡಿಯಬಹುದು pg_lsclusters);
  • PGHOST - ಡೇಟಾಬೇಸ್‌ಗೆ ಸಂಪರ್ಕಿಸುವುದು, ಸ್ಥಳೀಯ ಬ್ಯಾಕಪ್‌ನೊಂದಿಗೆ ಈ ಉದಾಹರಣೆಯಲ್ಲಿರುವಂತೆ ಯುನಿಕ್ಸ್-ಸಾಕೆಟ್ ಮೂಲಕ ಮಾಡುವುದು ಉತ್ತಮ.

ಇತರ ನಿಯತಾಂಕಗಳನ್ನು ದಸ್ತಾವೇಜನ್ನು ಕಾಣಬಹುದು: 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 ಲಾಗ್‌ಗಳಲ್ಲಿ ಬರೆಯಲು ಎಷ್ಟು ಮಾಹಿತಿ, "ಪ್ರತಿಕೃತಿ" - ಎಲ್ಲವನ್ನೂ ಬರೆಯಿರಿ;
  • ಆರ್ಕೈವ್_ಮೋಡ್ - ಪ್ಯಾರಾಮೀಟರ್‌ನಿಂದ ಆಜ್ಞೆಯನ್ನು ಬಳಸಿಕೊಂಡು WAL ಲಾಗ್‌ಗಳ ಡೌನ್‌ಲೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಆರ್ಕೈವ್_ಕಮಾಂಡ್;
  • ಆರ್ಕೈವ್_ಕಮಾಂಡ್ - ಪೂರ್ಣಗೊಂಡ WAL ಲಾಗ್ ಅನ್ನು ಆರ್ಕೈವ್ ಮಾಡಲು ಆಜ್ಞೆ;
  • ಆರ್ಕೈವ್_ಟೈಮ್‌ಔಟ್ - ಲಾಗ್‌ಗಳ ಆರ್ಕೈವಿಂಗ್ ಪೂರ್ಣಗೊಂಡಾಗ ಮಾತ್ರ ನಿರ್ವಹಿಸಲ್ಪಡುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಸರ್ವರ್ ಡೇಟಾಬೇಸ್‌ಗೆ ಸ್ವಲ್ಪ ಡೇಟಾವನ್ನು ಬದಲಾಯಿಸಿದರೆ / ಸೇರಿಸಿದರೆ, ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಇಲ್ಲಿ ಮಿತಿಯನ್ನು ಹೊಂದಿಸಲು ಇದು ಅರ್ಥಪೂರ್ಣವಾಗಿದೆ, ಅದರ ನಂತರ ಆರ್ಕೈವಿಂಗ್ ಆಜ್ಞೆಯನ್ನು ಬಲವಂತವಾಗಿ ಕರೆಯಲಾಗುತ್ತದೆ (ನಾನು ಪ್ರತಿ ಸೆಕೆಂಡಿಗೆ ಡೇಟಾಬೇಸ್ಗೆ ತೀವ್ರವಾಗಿ ಬರೆಯುತ್ತೇನೆ, ಆದ್ದರಿಂದ ಉತ್ಪಾದನೆಯಲ್ಲಿ ಈ ನಿಯತಾಂಕವನ್ನು ಹೊಂದಿಸದಿರಲು ನಾನು ನಿರ್ಧರಿಸಿದೆ);
  • ಪುನಃಸ್ಥಾಪನೆ_ಆಜ್ಞೆ - "ಪೂರ್ಣ ಬ್ಯಾಕಪ್" (ಬೇಸ್ ಬ್ಯಾಕಪ್) ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳನ್ನು ಹೊಂದಿಲ್ಲದಿದ್ದರೆ ಬ್ಯಾಕಪ್‌ನಿಂದ WAL ಲಾಗ್ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸುವ ಆಜ್ಞೆಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.

ಅಧಿಕೃತ ದಸ್ತಾವೇಜನ್ನು ಅನುವಾದದಲ್ಲಿ ನೀವು ಈ ಎಲ್ಲಾ ನಿಯತಾಂಕಗಳ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು ಓದಬಹುದು: https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

ಬ್ಯಾಕಪ್ ವೇಳಾಪಟ್ಟಿಯನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ

ಒಬ್ಬರು ಏನೇ ಹೇಳಬಹುದು, ಅದನ್ನು ಚಲಾಯಿಸಲು ಅತ್ಯಂತ ಅನುಕೂಲಕರ ಮಾರ್ಗವೆಂದರೆ ಕ್ರಾನ್. ಬ್ಯಾಕ್‌ಅಪ್‌ಗಳನ್ನು ರಚಿಸಲು ನಾವು ಇದನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತೇವೆ. ಪೂರ್ಣ ಬ್ಯಾಕಪ್ ರಚಿಸಲು ಆಜ್ಞೆಯೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸೋಣ: wal-g ನಲ್ಲಿ ಇದು ಲಾಂಚ್ ಆರ್ಗ್ಯುಮೆಂಟ್ ಆಗಿದೆ ಬ್ಯಾಕ್ಅಪ್-ಪುಶ್. ಆದರೆ ಮೊದಲು, ಎಲ್ಲವೂ ಉತ್ತಮವಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಪೋಸ್ಟ್‌ಗ್ರೆಸ್ ಬಳಕೆದಾರರಿಂದ ಈ ಆಜ್ಞೆಯನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಚಲಾಯಿಸುವುದು ಉತ್ತಮ (ಮತ್ತು ಯಾವುದೇ ಪ್ರವೇಶ ದೋಷಗಳಿಲ್ಲ):

#!/bin/bash

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

ಉಡಾವಣಾ ವಾದಗಳು ಡೇಟಾ ಡೈರೆಕ್ಟರಿಗೆ ಮಾರ್ಗವನ್ನು ಸೂಚಿಸುತ್ತವೆ - ಚಾಲನೆಯಲ್ಲಿರುವ ಮೂಲಕ ನೀವು ಅದನ್ನು ಕಂಡುಹಿಡಿಯಬಹುದು ಎಂದು ನಾನು ನಿಮಗೆ ನೆನಪಿಸುತ್ತೇನೆ pg_lsclusters.

ಎಲ್ಲವೂ ದೋಷಗಳಿಲ್ಲದೆ ಹೋದರೆ ಮತ್ತು ಡೇಟಾವನ್ನು S3 ಸಂಗ್ರಹಣೆಗೆ ಲೋಡ್ ಮಾಡಿದರೆ, ನಂತರ ನೀವು ಕ್ರಾಂಟಾಬ್‌ನಲ್ಲಿ ಆವರ್ತಕ ಉಡಾವಣೆಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು:

#!/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 am ಕ್ಕೆ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.

ಹಳೆಯ ಬ್ಯಾಕಪ್‌ಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ

ಹೆಚ್ಚಾಗಿ, ನೀವು ಮೆಸೊಜೊಯಿಕ್ ಯುಗದ ಎಲ್ಲಾ ಬ್ಯಾಕ್‌ಅಪ್‌ಗಳನ್ನು ಇಟ್ಟುಕೊಳ್ಳುವ ಅಗತ್ಯವಿಲ್ಲ, ಆದ್ದರಿಂದ ನಿಯತಕಾಲಿಕವಾಗಿ ನಿಮ್ಮ ಸಂಗ್ರಹಣೆಯನ್ನು "ಸ್ವಚ್ಛಗೊಳಿಸಲು" ಇದು ಉಪಯುಕ್ತವಾಗಿರುತ್ತದೆ ("ಪೂರ್ಣ ಬ್ಯಾಕಪ್‌ಗಳು" ಮತ್ತು WAL ಲಾಗ್‌ಗಳು ಎರಡೂ). ನಾವು ಇದನ್ನು ಕ್ರಾನ್ ಟಾಸ್ಕ್ ಮೂಲಕ ಮಾಡುತ್ತೇವೆ:

#!/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

ಕ್ರಾನ್ ಪ್ರತಿದಿನ ಬೆಳಗ್ಗೆ 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

ಮರುಪ್ರಾಪ್ತಿ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಬಯಸುವವರಿಗೆ, ಬ್ಯಾಷ್ ಮ್ಯಾಜಿಕ್‌ನ ಸಣ್ಣ ತುಣುಕನ್ನು ಕೆಳಗೆ ಸಿದ್ಧಪಡಿಸಲಾಗಿದೆ, ಇದರಿಂದಾಗಿ ಚೇತರಿಕೆಯಲ್ಲಿ ಸಮಸ್ಯೆಗಳಿದ್ದಲ್ಲಿ, ಸ್ಕ್ರಿಪ್ಟ್ ಶೂನ್ಯವಲ್ಲದ ನಿರ್ಗಮನ ಕೋಡ್‌ನೊಂದಿಗೆ ಕ್ರ್ಯಾಶ್ ಆಗುತ್ತದೆ. ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, ಸಿಗ್ನಲ್ ಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆಯೇ ಎಂದು ಕಂಡುಹಿಡಿಯಲು 120 ಸೆಕೆಂಡುಗಳ ಕಾಲಾವಧಿಯೊಂದಿಗೆ (ಮರುಪ್ರಾಪ್ತಿಗಾಗಿ ಒಟ್ಟು 5 ನಿಮಿಷಗಳು) 10 ತಪಾಸಣೆಗಳನ್ನು ಮಾಡಲಾಗುತ್ತದೆ (ಇದು ಚೇತರಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ ಎಂದು ಅರ್ಥೈಸುತ್ತದೆ):

#!/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

ಸಾರಾಂಶಿಸು

ಪ್ರಕಟಣೆಯನ್ನು ಸಿದ್ಧಪಡಿಸುವಲ್ಲಿ ಅವರ ಸಹಾಯಕ್ಕಾಗಿ ಆಂಡ್ರೆ ಬೊರೊಡಿನ್ ಅವರಿಗೆ ನನ್ನ ಕೃತಜ್ಞತೆಯನ್ನು ವ್ಯಕ್ತಪಡಿಸಲು ನಾನು ಬಯಸುತ್ತೇನೆ ಮತ್ತು WAL-G ಅಭಿವೃದ್ಧಿಗೆ ಅವರ ಕೊಡುಗೆಗಾಗಿ ವಿಶೇಷ ಧನ್ಯವಾದಗಳು!

ಇದು ಈ ಟಿಪ್ಪಣಿಯನ್ನು ಮುಕ್ತಾಯಗೊಳಿಸುತ್ತದೆ. ಸೆಟಪ್‌ನ ಸುಲಭತೆ ಮತ್ತು ನಿಮ್ಮ ಕಂಪನಿಯಲ್ಲಿ ಈ ಉಪಕರಣವನ್ನು ಬಳಸುವ ದೊಡ್ಡ ಸಾಮರ್ಥ್ಯವನ್ನು ನಾನು ತಿಳಿಸಲು ಸಾಧ್ಯವಾಯಿತು ಎಂದು ನಾನು ಭಾವಿಸುತ್ತೇನೆ. ನಾನು WAL-G ಬಗ್ಗೆ ಸಾಕಷ್ಟು ಕೇಳಿದ್ದೇನೆ, ಆದರೆ ಕುಳಿತುಕೊಳ್ಳಲು ಮತ್ತು ಅದನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡಲು ಸಾಕಷ್ಟು ಸಮಯ ಇರಲಿಲ್ಲ. ಮತ್ತು ನಾನು ಅದನ್ನು ಮನೆಯಲ್ಲಿ ಕಾರ್ಯಗತಗೊಳಿಸಿದ ನಂತರ, ಈ ಲೇಖನವು ನನ್ನಿಂದ ಹೊರಬಂದಿತು.

ಪ್ರತ್ಯೇಕವಾಗಿ, WAL-G ಈ ಕೆಳಗಿನ DBMS ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಬಹುದು ಎಂಬುದು ಗಮನಿಸಬೇಕಾದ ಸಂಗತಿ:

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ