बैकअप किसी भी आपदा रिकवरी योजना का महत्वपूर्ण और महत्वपूर्ण हिस्सा है, उत्पादन डेटाबेस का बैकअप लेना भी PostgreSQL प्रशासन का एक बुनियादी और महत्वपूर्ण हिस्सा है। हालांकि, DBA अक्सर यह पुष्टि नहीं करते हैं कि वे बैकअप विश्वसनीय हैं।
हर संगठन PostgreSQL डेटाबेस बैकअप को अलग-अलग रूपों में लेता है, कुछ पोस्टग्रेएसक्यूएल डेटा निर्देशिकाओं का फ़ाइल सिस्टम (भौतिक) बैकअप ले सकते हैं (बरमन, पीजीबैकरेस्ट जैसे टूल का उपयोग करके) जबकि अन्य केवल तार्किक बैकअप ले सकते हैं (उपयोग करके) pg_dump), और यहां तक कि अन्य भी EBS या VMWare स्नैपशॉट जैसे टूल का उपयोग करके ब्लॉक स्तरीय स्नैपशॉट ले सकते हैं।
इस ब्लॉग में, हम आपको दिखाएंगे कि कैसे बैकअप लेने और पुनर्स्थापित करने के लिए टूल pgBackRest का उपयोग करके डॉकर कंटेनर पर बैकअप को पुनर्स्थापित करके अपने PostgreSQL बैकअप को मान्य किया जाए। हम मान रहे हैं कि आपको पहले से ही PostgreSQL, Docker और pgBackRest का उपयोग करने का ज्ञान है।
आपको डॉकर का उपयोग क्यों करना चाहिए?
डॉकर स्वचालन को सरल बनाता है, यह हमारे PostgreSQL बैकअप सत्यापन कार्य को CI/CD टूल जैसे CircleCI, Travis, GitLab या Jenkins में एकीकृत करने के कार्य को भी आसान बनाता है। डॉकर का उपयोग करने से उस समय और संसाधन की बचत होती है जो हमें बैकअप परीक्षण के लिए नया वातावरण लाने में खर्च करना पड़ता है।
डेमो सेटअप
होस्ट | भूमिका | इंस्टॉल किया गया पैकेज | क्रोंटैब |
नोड-1 192.168.0.111 CentOS-7 | Posgresql-11 प्राथमिक उदाहरण। उपयोगकर्ता और डेटाबेस "pgbench" बनाया और pgbench तालिकाओं के साथ आरंभ किया। | postgresql-11, pgbackrest-2.15 | वर्कलोड को अनुकरण करने के लिए हर 5 मिनट में pgbench चलाना। |
नोड-2 | टेस्ट मशीन - हम इस होस्ट पर अपना डॉकर सत्यापन चलाएंगे। | docker-ce-18.06, pgbackrest-2.15 | |
नोड-3 192.168.0.113 CentOS-7 | pgBackRest रिपोजिटरी होस्ट | pgbackrest-2.15 | Incr बैकअप हर 4 घंटे में लेने के लिए pgbackrest चलाना हर दिन अलग-अलग बैकअप लें साप्ताहिक रूप से पूर्ण बैकअप |
pgbackrest के काम करने के लिए, मैंने इन नोड्स के बीच पासवर्ड रहित SSH एक्सेस सेटअप किया है।
नोड-1 और नोड-2 पर उपयोगकर्ता "पोस्टग्रेज" नोड-3 पर उपयोगकर्ता "pgbackrest" के लिए पासवर्ड रहित लॉगिन कर सकता है।
[[email protected] ~]$ sudo -u postgres ssh [email protected] uptime
13:31:51 up 7:00, 1 user, load average: 0.00, 0.01, 0.05
[[email protected] ~]$ sudo -u postgres ssh [email protected] uptime
13:31:27 up 7:00, 1 user, load average: 0.00, 0.01, 0.05
नोड-3 पर उपयोगकर्ता "pgbackrest" नोड-1 और नोड-2 पर उपयोगकर्ता "पोस्टग्रेज" के लिए पासवर्ड रहित लॉगिन कर सकता है।
[[email protected] ~]$ sudo -u pgbackrest ssh [email protected] uptime
13:32:29 up 7:02, 1 user, load average: 1.18, 0.83, 0.58
[[email protected] ~]$ sudo -u pgbackrest ssh [email protected] uptime
13:32:33 up 7:01, 1 user, load average: 0.00, 0.01, 0.05
बैकअप सत्यापन का अवलोकन
नीचे उन चरणों का संक्षिप्त विवरण दिया गया है जिनका हम अपने PostgreSQL बैकअप सत्यापन के लिए अनुसरण करेंगे।
- pgbackrest रिस्टोर कमांड का उपयोग करके हम नवीनतम बैकअप pgBackRest रिपोजिटरी होस्ट (नोड-3) से टेस्ट मशीन (नोड-2) डायरेक्टरी /var/lib/pgsql/11/data में प्राप्त करेंगे।
- डॉकर रन के दौरान, हम होस्ट मशीन (नोड-2) डायरेक्टरी /var/lib/pgsql को डॉकटर कंटेनर पर माउंट करते हैं और माउंटेड डायरेक्टरी से पोस्टग्रेज/पोस्टमास्टर डेमॉन शुरू करते हैं। हम पोर्ट 5432 को कंटेनर से होस्ट मशीन पोर्ट 15432 में भी प्रदर्शित करेंगे।
- डॉकर कंटेनर के चलने के बाद, हम नोड-2:15432 के माध्यम से पोस्टग्रेएसक्यूएल डेटाबेस से जुड़ेंगे और सत्यापित करेंगे कि सभी टेबल और पंक्तियां बहाल हो गई हैं। हम यह सुनिश्चित करने के लिए पोस्टग्रेएसक्यूएल लॉग की भी जांच करेंगे कि पुनर्प्राप्ति के दौरान कोई त्रुटि संदेश नहीं है और उदाहरण भी सुसंगत स्थिति में पहुंच गया है।
अधिकांश बैकअप सत्यापन चरण होस्ट नोड-2 पर निष्पादित किए जाएंगे।
डॉकर छवि बनाना
नोड-2 पर, Dockerfile बनाएं और docker इमेज "postgresql:11" बनाएं। नीचे दी गई Dockerfile में, हम सेंटो पर निम्न परिवर्तन लागू करेंगे:7 मूल छवि।
- postgresql-11, pgbackrest और Opensh-clients को स्थापित करना। pgbackrest के लिए ओपनश-क्लाइंट की आवश्यकता है।
- pgbackrest को कॉन्फ़िगर करना - हमें PITR का परीक्षण करने के लिए छवि में pgbackrest कॉन्फ़िगरेशन की आवश्यकता है, बिना pgbackrest कॉन्फ़िगरेशन के पुनर्स्थापित_कमांड विफल हो जाएगा। pgbackrest विन्यास के भाग के रूप में
- हम कॉन्फ़िगरेशन फ़ाइल /etc/pgbackrest.conf में pgbackrest रिपॉजिटरी होस्ट ip (192.168.0.113) जोड़ रहे हैं।
- हमें docker कंटेनर और pgbackrest रिपॉजिटरी होस्ट के बीच पासवर्ड रहित SSH एक्सेस की भी आवश्यकता है। इसके लिए, मैं SSH_PRIVATE_KEY को कॉपी कर रहा हूं जिसे मैंने पहले ही जेनरेट कर लिया है और मैंने इसकी सार्वजनिक कुंजी को pgbackrest रिपॉजिटरी होस्ट ([email protected]) में भी जोड़ दिया है।
- VOLUME ["${PGHOME_DIR}"] - कंटेनर निर्देशिका /var/lib/pgsql को माउंट पॉइंट के रूप में परिभाषित करता है। डॉकर रन कमांड चलाते समय हम इस आरोह बिंदु पर नोड-2 होस्ट निर्देशिका निर्दिष्ट करेंगे।
- USER पोस्टग्रेज करता है - कंटेनर पर चलने वाला कोई भी कमांड पोस्टग्रेज यूजर के रूप में निष्पादित किया जाएगा।
$ cat Dockerfile
FROM centos:7
ARG PGBACKREST_REPO_HOST
ARG PGHOME_DIR=/var/lib/pgsql
## Adding Postgresql Repo for CentOS7
RUN yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
## Installing PostgreSQL
RUN yum -y install postgresql11 postgresql11-server postgresql11-devel postgresql11-contrib postgresql11-libs pgbackrest openssh-clients
## Adding configuration for pgbackrest, needed for WAL recovery and replication.
RUN echo -ne "[global]\nrepo1-host=${PGBACKREST_REPO_HOST}\n\n[pgbench]\npg1-path=/var/lib/pgsql/11/data\n" > /etc/pgbackrest.conf
## Adding Private Key to the Docker. Docker container would use this private key for pgbackrest wal recovery.
RUN mkdir -p ${PGHOME_DIR}/.ssh && chmod 0750 ${PGHOME_DIR}/.ssh
COPY --chown=postgres:postgres ./SSH_PRIVATE_KEY ${PGHOME_DIR}/.ssh/id_rsa
RUN chmod 0600 ${PGHOME_DIR}/.ssh/id_rsa
RUN echo -ne "Host ${PGBACKREST_REPO_HOST}\n\tStrictHostKeyChecking no\n" >> ${PGHOME_DIR}/.ssh/config
## Making "/var/lib/pgsql" as a mountable directory in the container
VOLUME ["${PGHOME_DIR}"]
## Setting postgres as the default user for any remaining commands
USER postgres
अब हमारे पास दो फाइलें हैं, Dockerfile docker build द्वारा उपयोग की जाती है और SSH_PRIVATE_KEY जिसे हम docker इमेज में कॉपी कर लेंगे।
$ ls
Dockerfile SSH_PRIVATE_KEY
हमारी डॉकटर छवि बनाने के लिए नोड-2 पर निम्न कमांड चलाएँ। मैंने कमांड में pgbackrest रिपॉजिटरी होस्ट IP का उल्लेख किया है और इस IP का उपयोग pgbackrest पैरामीटर “रेपो-होस्ट” में किया जाएगा।
$ docker build --no-cache -t postgresql:11 --build-arg PGBACKREST_REPO_HOST=192.168.0.113 .
Sending build context to Docker daemon 230.4kB
Step 1/12 : FROM centos:7
---> 9f38484d220f
Step 2/12 : ARG PGBACKREST_REPO_HOST
---> Running in 8b7b36c6f151
Removing intermediate container 8b7b36c6f151
---> 31510e46e286
Step 3/12 : ARG PGHOME_DIR=/var/lib/pgsql
...
Step 4/12 : RUN yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
...
...
Step 12/12 : USER postgres
---> Running in c91abcf46440
Removing intermediate container c91abcf46440
---> bebce78df5ae
Successfully built bebce78df5ae
Successfully tagged postgresql:11
सुनिश्चित करें कि छवि सफलतापूर्वक बनाई गई है, और नीचे दिखाए गए अनुसार "postgresql:11" छवि हाल ही में बनाई गई है, इसकी जांच करें।
$ docker image ls postgresql:11
REPOSITORY TAG IMAGE ID CREATED SIZE
postgresql 11 2e03ed2a5946 3 minutes ago 482MB
PostgreSQL बैकअप को पुनर्स्थापित करना
अब हम अपने PostgreSQL बैकअप को pgbackrest बैकअप रिपॉजिटरी होस्ट नोड-3 में बनाए रखेंगे।
नीचे होस्ट नोड-2 पर मौजूद pgbackrest कॉन्फ़िगरेशन फ़ाइल है और मैंने नोड-3 का उल्लेख pgbackrest रिपॉजिटरी होस्ट के रूप में किया है। परम pg1-पथ में उल्लिखित निर्देशिका वह जगह है जहाँ PostgreSQL डेटा निर्देशिका को पुनर्स्थापित किया जाएगा।
[[email protected] ~]$ cat /etc/pgbackrest.conf
[global]
log-level-file=detail
repo1-host=node-3
[pgbench]
pg1-path=/var/lib/pgsql/11/data
नीचे दिए गए pgbackrest रिस्टोर कमांड का उपयोग करके, postgresql डेटा डायरेक्टरी को नोड-2:/var/lib/pgsql/11/data पर रिस्टोर किया जाएगा।
pgbackrest बैकअप के साथ PITR को मान्य करने के लिए मैंने --type=time --target='2019-07-30 06:24:50.241352+00' सेट किया है, ताकि WAL रिकवरी बंद हो जाए। समय का उल्लेख किया।
[[email protected] ~]$ sudo -u postgres bash -c "/usr/bin/pgbackrest --type=time --target='2019-07-30 06:24:50.241352+00' --target-action=promote --recovery-option='standby_mode=on' --stanza=pgbench restore"
उपरोक्त कमांड में बैकअप आकार और नेटवर्क बैंडविड्थ के आधार पर समय लग सकता है। एक बार पुनर्स्थापित हो जाने पर, डेटा निर्देशिका के आकार को सत्यापित करें और पुनर्प्राप्ति.कॉन्फ़ भी देखें।
[[email protected] ~]$ sudo -u postgres du -sh /var/lib/pgsql/11/data
2.1G /var/lib/pgsql/11/data
[[email protected] ~]$ sudo -u postgres cat /var/lib/pgsql/11/data/recovery.conf
standby_mode = 'on'
restore_command = '/usr/bin/pgbackrest --stanza=pgbench archive-get %f "%p"'
recovery_target_time = '2019-07-30 06:24:50.241352+00'
PostgreSQL डॉकटर कंटेनर के लिए संग्रह मोड अक्षम करें।
[[email protected] ~]$ sudo -u postgres bash -c "echo 'archive_mode = off' >> /var/lib/pgsql/11/data/postgresql.auto.conf"
डॉकर कंटेनर को "postgresql:11" छवि के साथ प्रारंभ करें। कमांड में हम हैं
-
कंटेनर का नाम "pgbench" के रूप में सेट करना
-
डॉकर होस्ट (नोड-2) निर्देशिका /var/lib/psql को docker कंटेनर निर्देशिका /var/lib/psql
में माउंट करना -
नोड-2 पर कंटेनर पोर्ट 5432 को पोर्ट 15432 पर एक्सपोज़ करना।
-
/usr/pgsql-11/bin/postmaster -D /var/lib/pgsql/11/data
कमांड का उपयोग करके पोस्टग्रेज डेमॉन शुरू करना
[[email protected] ~]$ docker run --rm --name "pgbench" -v /var/lib/pgsql:/var/lib/pgsql -p 15432:5432 -d postgresql:11 /usr/pgsql-11/bin/postmaster -D /var/lib/pgsql/11/data
e54f2f65afa13b6a09236a476cb1de3d8e499310abcec2b121a6b35611dac276
सत्यापित करें कि "pgbench" कंटेनर बनाया और चल रहा है।
[[email protected] ~]$ docker ps -f name=pgbench
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e54f2f65afa1 postgresql:11 "/usr/pgsql-11/bin/p…" 34 seconds ago Up 33 seconds 0.0.0.0:15432->5432/tcp pgbench
PostgreSQL मान्य करना
चूंकि होस्ट निर्देशिका /var/lib/pgsql को docker कंटेनर के साथ साझा किया जाता है, PostgreSQL सेवा द्वारा उत्पन्न लॉग नोड-2 से भी दिखाई देते हैं। यह सुनिश्चित करने के लिए आज के लॉग को सत्यापित करें कि PostgreSQL बिना किसी त्रुटि के ठीक शुरू हो गया है और सुनिश्चित करें कि नीचे लॉग लाइनें मौजूद हैं।
[[email protected] ~]$ sudo -u postgres tailf /var/lib/pgsql/11/data/log/postgresql-Tue.csv
..
2019-07-30 06:38:34.633 UTC,,,7,,5d3fe5e9.7,5,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"consistent recovery state reached at E/CE000210",,,,,,,,,""
2019-07-30 06:38:34.633 UTC,,,1,,5d3fe5e9.1,2,,2019-07-30 06:38:33 UTC,,0,LOG,00000,"database system is ready to accept read only connections",,,,,,,,,""
2019-07-30 06:38:35.236 UTC,,,7,,5d3fe5e9.7,6,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"restored log file ""000000010000000E000000CF"" from archive",,,,,,,,,""
2019-07-30 06:38:36.210 UTC,,,7,,5d3fe5e9.7,7,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"restored log file ""000000010000000E000000D0"" from archive",,,,,,,,,""
...
2019-07-30 06:39:57.221 UTC,,,7,,5d3fe5e9.7,37,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"recovery stopping before commit of transaction 52181192, time 2019-07-30 06:25:01.576689+00",,,,,,,,,""
...
2019-07-30 06:40:00.682 UTC,,,7,,5d3fe5e9.7,47,,2019-07-30 06:38:33 UTC,1/0,0,LOG,00000,"archive recovery complete",,,,,,,,,""
संदेश "संगत पुनर्प्राप्ति स्थिति E/CE000210 पर पहुंच गई", इंगित करता है कि pgbackrest बैकअप डेटा निर्देशिका के साथ हम एक सुसंगत स्थिति तक पहुंचने में सक्षम थे।
संदेश "संग्रह पुनर्प्राप्ति पूर्ण", इंगित करता है कि हम pgbackrest द्वारा समर्थित WAL फ़ाइल को फिर से चलाने में सक्षम हैं और बिना किसी समस्या के पुनर्प्राप्त करने में सक्षम हैं।
स्थानीय पोर्ट 15432 के माध्यम से postgresql उदाहरण से कनेक्ट करें और तालिकाओं और पंक्तियों की संख्या सत्यापित करें।
[[email protected] ~]$ sudo -iu postgres /usr/pgsql-11/bin/psql -p 15432 -h localhost -U pgbench
Password for user pgbench:
psql (11.4)
Type "help" for help.
pgbench=> \dt
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+---------
public | pgbench_accounts | table | pgbench
public | pgbench_branches | table | pgbench
public | pgbench_history | table | pgbench
public | pgbench_tellers | table | pgbench
(4 rows)
pgbench=> select * from pgbench_history limit 1;
tid | bid | aid | delta | mtime | filler
-----+-----+---------+-------+----------------------------+--------
98 | 3 | 2584617 | 507 | 2019-07-30 06:20:01.412226 |
(1 row)
pgbench=> select max(mtime) from pgbench_history ;
max
----------------------------
2019-07-30 06:22:01.402245
(1 row)
pgbench=> select count(1) from pgbench_history ;
count
-------
90677
(1 row)
pgbench=> select count(1) from pgbench_accounts ;
count
----------
10000000
(1 row)
अब हमने अपने पोस्टग्रेएसक्यूएल बैकअप को डॉकटर कंटेनर पर बहाल कर दिया है और पीआईटीआर को भी सत्यापित किया है। बैकअप को सत्यापित करने के बाद हम कंटेनर को रोक सकते हैं और डेटा निर्देशिका को हटा सकते हैं।
[[email protected] ~]$ docker stop pgbench
pgbench
[[email protected] ~]$ sudo -u postgres bash -c "rm -rf /var/lib/pgsql/11/data && mkdir -p /var/lib/pgsql/11/data && chmod 0700 /var/lib/pgsql/11/data"
निष्कर्ष
इस ब्लॉग में, मैंने एक छोटे वर्चुअलबॉक्स वीएम पर एक छोटे डेटाबेस का उपयोग करके बैकअप सत्यापन का प्रदर्शन किया। इस वजह से, बैकअप सत्यापन कुछ ही मिनटों में पूरा हो गया था। यह ध्यान रखना महत्वपूर्ण है कि उत्पादन में आपको बैकअप सत्यापन को सफलतापूर्वक पूरा करने की अनुमति देने के लिए पर्याप्त मेमोरी, सीपीयू और डिस्क के साथ एक उचित वीएम चुनना होगा। आप पूरी सत्यापन प्रक्रिया को बैश स्क्रिप्ट में या सीआई/सीडी पाइपलाइन के साथ एकीकृत करके भी स्वचालित कर सकते हैं ताकि आप नियमित रूप से हमारे पोस्टग्रेएसक्यूएल बैकअप को मान्य कर सकें।