PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Xác thực các bản sao lưu PostgreSQL của bạn trên Docker

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
192.168.0.112
CentOS-7

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.

  1. 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
  2. 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.
  3. 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.

  1. Cài đặt postgresql-11, pgbackrest và openssh-client. Openssh-client là cần thiết cho pgbackrest.
  2. Đị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
    1. 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.
    2. 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]).
  3. 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.
  4. 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

  1. Đặt tên vùng chứa là “pgbench”

  2. 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

  3. Mở cảng container 5432 đến cổng 15432 trên nút 2.

  4. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hướng dẫn PostgreSQL cho người mới bắt đầu - Tất cả những gì bạn cần biết về PostgreSQL

  2. Cách lấy văn bản SQL từ trình kích hoạt sự kiện Postgres

  3. Cách age () hoạt động trong PostgreSQL

  4. Điều chỉnh PostgreSQL:Những điều quan trọng để thúc đẩy hiệu suất

  5. DROP TABLE IF EXISTS Ví dụ trong PostgreSQL