Sao lưu là phần quan trọng và cần thiết của bất kỳ kế hoạch khắc phục thảm họa nào, sao lưu cơ sở dữ liệu sản xuất cũng là một phần cơ bản và quan trọng của quản trị PostgreSQL. Tuy nhiên, DBA thường không xác thực rằng những bản sao lưu đó là đáng tin cậy.
Mọi tổ chức thực hiện sao lưu cơ sở dữ liệu PostgreSQL ở các dạng khác nhau, một số có thể sao lưu hệ thống tệp (vật lý) cho các thư mục dữ liệu PostgreSQL (sử dụng các công cụ như Barman, PGBackRest) trong khi những tổ chức khác có thể chỉ sao lưu lôgic (sử dụng pg_dump) và thậm chí những người khác có thể chụp nhanh cấp khối bằng các công cụ như EBS hoặc VMWare snapshot.
Trong blog này, chúng tôi sẽ hướng dẫn bạn cách xác thực bản sao lưu PostgreSQL của bạn bằng cách khôi phục bản sao lưu vào vùng chứa Docker bằng công cụ pgBackRest để lấy và khôi phục bản sao lưu. Chúng tôi giả định rằng bạn đã có kiến thức về cách sử dụng PostgreSQL, Docker và pgBackRest.
Tại sao bạn nên sử dụng Docker?
Docker làm cho việc tự động hóa trở nên đơn giản hơn, nó cũng giúp giảm bớt công việc tích hợp tác vụ Xác thực sao lưu PostgreSQL của chúng tôi trong các công cụ CI / CD như CircleCI, Travis, GitLab hoặc Jenkins. Việc sử dụng Docker tránh được thời gian và tài nguyên mà chúng tôi phải dành cho việc mang lại môi trường mới để kiểm tra bản sao lưu.
Thiết lập Demo
Máy chủ | Vai trò | Đã cài đặt Gói hàng | Crontab |
node-1 192.168.0.111 CentOS-7 | Phiên bản chính của Posgresql-11. Đã tạo người dùng và cơ sở dữ liệu “pgbench“ và khởi chạy bằng bảng pgbench. | postgresql-11, pgbackrest-2.15 | Chạy pgbench 5 phút một lần để mô phỏng khối lượng công việc. |
node-2 | Máy kiểm tra - chúng tôi sẽ chạy xác thực Docker của chúng tôi trên máy chủ này. | docker-ce-18.06, pgbackrest-2.15 | |
node-3 192.168.0.113 CentOS-7 | pgBackRest Máy chủ Kho lưu trữ | pgbackrest-2.15 | Chạy pgbackrest để sao lưu Incr cứ 4 giờ một lần Sao lưu chênh lệch mỗi ngày Sao lưu đầy đủ hàng tuần |
Để pgbackrest hoạt động, tôi đã thiết lập quyền truy cập SSH không cần mật khẩu giữa các nút này.
Người dùng "postgres" trên nút 1 và nút 2 có thể đăng nhập không cần mật khẩu vào người dùng "pgbackrest" trên nút 3.
[[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
Người dùng "pgbackrest" trên nút-3 có thể đăng nhập không cần mật khẩu vào người dùng "postgres" trên nút 1 và nút 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
Tổng quan về Xác thực Dự phòng
Dưới đây là tổng quan ngắn gọn về các bước chúng tôi sẽ thực hiện để Xác thực sao lưu PostgreSQL của chúng tôi.
- Sử dụng lệnh khôi phục pgbackrest, chúng tôi sẽ tìm nạp bản sao lưu mới nhất từ Máy chủ lưu trữ pgBackRest (nút-3) đến thư mục Máy kiểm tra (nút-2) / var / lib / pgsql / 11 / data
- Trong quá trình chạy docker, chúng tôi gắn thư mục máy chủ (node-2) / var / lib / pgsql trên vùng chứa docker và khởi động daemon postgres / postmaster từ thư mục được gắn kết. Chúng tôi cũng sẽ đưa cổng 5432 từ thùng chứa sang cổng máy chủ 15432.
- Khi vùng chứa docker bắt đầu chạy, chúng tôi sẽ kết nối với cơ sở dữ liệu PostgreSQL qua nút-2:15432 và xác minh rằng tất cả các bảng và hàng đã được khôi phục. Chúng tôi cũng sẽ kiểm tra nhật ký PostgreSQL để đảm bảo không có thông báo LỖI trong quá trình khôi phục và phiên bản cũng đã đạt đến trạng thái nhất quán.
Hầu hết các bước xác thực sao lưu sẽ được thực hiện trên nút máy chủ-2.
Xây dựng Hình ảnh Docker
Trên node-2, tạo Dockerfile và xây dựng hình ảnh docker “postgresql:11”. Trong Dockerfile bên dưới, chúng tôi sẽ áp dụng các thay đổi sau đối với hình ảnh cơ sở centos:7.
- Cài đặt postgresql-11, pgbackrest và openssh-client. Openssh-client là cần thiết cho pgbackrest.
- Định cấu hình pgbackrest - Chúng tôi cần cấu hình pgbackrest trong hình ảnh để kiểm tra PITR, nếu không có lệnh restore_command cấu hình pgbackrest sẽ không thành công. Là một phần của cấu hình pgbackrest
- Chúng tôi đang thêm ip máy chủ lưu trữ pgbackrest (192.168.0.113) trong tệp cấu hình /etc/pgbackrest.conf.
- Chúng tôi cũng cần mật khẩu ít quyền truy cập SSH hơn giữa vùng chứa docker và máy chủ lưu trữ kho pgbackrest. Đối với điều này, tôi đang sao chép SSH_PRIVATE_KEY mà tôi đã tạo và tôi cũng đã thêm khóa công khai của nó vào máy chủ kho lưu trữ pgbackrest ([email protected]).
- VOLUME ["$ {PGHOME_DIR}"] - Xác định thư mục vùng chứa / var / lib / pgsql làm điểm gắn kết. Trong khi chạy lệnh docker run, chúng tôi sẽ chỉ định thư mục máy chủ lưu trữ node-2 cho điểm gắn kết này.
- USER postgres - Mọi lệnh chạy trên vùng chứa sẽ được thực thi với tư cách người dùng postgres.
$ 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
Bây giờ chúng ta có hai tệp, Dockerfile được sử dụng bởi bản dựng docker và SSH_PRIVATE_KEY mà chúng ta sẽ được sao chép vào hình ảnh docker.
$ ls
Dockerfile SSH_PRIVATE_KEY
Chạy lệnh dưới đây trên node-2 để xây dựng hình ảnh docker của chúng tôi. Tôi đã đề cập đến IP máy chủ lưu trữ pgbackrest trong lệnh và IP này sẽ được sử dụng trong tham số pgbackrest “repo-host”.
$ 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
Đảm bảo rằng hình ảnh được tạo thành công và kiểm tra hình ảnh “postgresql:11” được tạo gần đây như được hiển thị bên dưới.
$ docker image ls postgresql:11
REPOSITORY TAG IMAGE ID CREATED SIZE
postgresql 11 2e03ed2a5946 3 minutes ago 482MB
Khôi phục Bản sao lưu PostgreSQL
Bây giờ chúng tôi sẽ khôi phục bản sao lưu PostgreSQL của chúng tôi được duy trì trong máy chủ lưu trữ sao lưu pgbackrest nút-3.
Dưới đây là tệp cấu hình pgbackrest có trên máy chủ lưu trữ nút-2 và tôi đã đề cập đến nút-3 là máy chủ lưu trữ kho lưu trữ pgbackrest. Thư mục được đề cập trong param pg1-path là nơi thư mục dữ liệu PostgreSQL sẽ được khôi phục.
[[email protected] ~]$ cat /etc/pgbackrest.conf
[global]
log-level-file=detail
repo1-host=node-3
[pgbench]
pg1-path=/var/lib/pgsql/11/data
Sử dụng lệnh khôi phục pgbackrest dưới đây, thư mục dữ liệu postgresql sẽ được khôi phục tại nút-2:/ var / lib / pgsql / 11 / data.
Để xác thực PITR với bản sao lưu pgbackrest, tôi đã đặt --type =time --target ='2019-07-30 06:24:50.241352 + 00', để quá trình khôi phục WAL dừng trước khi thời gian đã đề cập.
[[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"
Lệnh trên có thể mất thời gian tùy thuộc vào kích thước sao lưu và băng thông mạng. Sau khi khôi phục, hãy xác minh kích thước của thư mục dữ liệu và cũng kiểm tra recovery.conf.
[[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'
Tắt chế độ lưu trữ cho vùng chứa trình cố định PostgreSQL.
[[email protected] ~]$ sudo -u postgres bash -c "echo 'archive_mode = off' >> /var/lib/pgsql/11/data/postgresql.auto.conf"
Khởi động vùng chứa docker với hình ảnh “postgresql:11”. Trong lệnh chúng ta đang
-
Đặt tên vùng chứa là “pgbench”
-
Gắn thư mục máy chủ docker (node-2) / var / lib / psql vào thư mục chứa docker / var / lib / psql
-
Mở cảng container 5432 đến cổng 15432 trên nút 2.
-
Khởi động daemon postgres bằng lệnh / 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
Xác minh rằng vùng chứa “pgbench” đã được tạo và đang chạy.
[[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
Xác thực PostgreSQL
Vì thư mục máy chủ / var / lib / pgsql được chia sẻ với vùng chứa docker, các nhật ký được tạo bởi dịch vụ PostgreSQL cũng hiển thị từ nút 2. Xác minh nhật ký của ngày hôm nay để đảm bảo PostgreSQL đã bắt đầu tốt mà không có LỖI nào và đảm bảo có các dòng nhật ký bên dưới.
[[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",,,,,,,,,""
Thông báo "trạng thái khôi phục nhất quán đạt được tại E / CE000210", cho biết rằng với thư mục dữ liệu sao lưu pgbackrest, chúng tôi có thể đạt được trạng thái nhất quán.
Thông báo "đã hoàn tất khôi phục kho lưu trữ", cho biết rằng chúng tôi có thể phát lại tệp WAL được pgbackrest sao lưu và có thể khôi phục mà không gặp bất kỳ sự cố nào.
Kết nối với phiên bản postgresql qua cổng cục bộ 15432 và xác minh các bảng cũng như số lượng hàng.
[[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)
Hiện tại, chúng tôi đã khôi phục bản sao lưu PostgreSQL của mình trên bộ chứa docker và cũng đã xác minh PITR. Sau khi xác thực bản sao lưu, chúng tôi có thể dừng vùng chứa và xóa thư mục dữ liệu.
[[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"
Kết luận
Trong blog này, tôi đã trình bày xác thực sao lưu bằng cách sử dụng cơ sở dữ liệu nhỏ trên một máy ảo VirtualBox nhỏ. Do đó, quá trình xác thực sao lưu đã hoàn tất chỉ trong vài phút. Điều quan trọng cần lưu ý là trong quá trình sản xuất, bạn sẽ cần chọn một máy ảo phù hợp với đủ Bộ nhớ, CPU và Đĩa để cho phép xác thực sao lưu hoàn tất thành công. Bạn cũng có thể tự động hóa toàn bộ quá trình xác thực trong một tập lệnh bash hoặc thậm chí bằng cách tích hợp với đường dẫn CI / CD để bạn có thể thường xuyên xác thực các bản sao lưu PostgreSQL của chúng tôi.