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

Cách sử dụng pgBackRest để sao lưu PostgreSQL và TimescaleDB

Dữ liệu của bạn có lẽ là tài sản có giá trị nhất trong công ty, vì vậy bạn nên có Kế hoạch khôi phục sau thảm họa (DRP) để ngăn mất dữ liệu trong trường hợp xảy ra tai nạn hoặc lỗi phần cứng. Bản sao lưu là dạng DR đơn giản nhất. Nó có thể không phải lúc nào cũng đủ để đảm bảo Mục tiêu Điểm khôi phục (RPO) được chấp nhận nhưng là một cách tiếp cận tốt đầu tiên. Ngoài ra, bạn nên xác định Mục tiêu thời gian khôi phục (RTO) theo yêu cầu của công ty bạn. Có nhiều cách để đạt được giá trị RTO, tùy thuộc vào mục tiêu của công ty.

Trong blog này, chúng ta sẽ xem cách sử dụng pgBackRest để sao lưu PostgreSQL và TimescaleDB cũng như cách sử dụng một trong những tính năng quan trọng nhất của công cụ sao lưu này, sự kết hợp của các bản sao lưu Toàn bộ, Tăng dần và Khác biệt, để giảm thiểu thời gian chết.

pgBackRest là gì?

Có nhiều loại sao lưu khác nhau cho cơ sở dữ liệu:

  • Logic:Bản sao lưu được lưu trữ ở định dạng con người có thể đọc được như SQL.
  • Vật lý:Bản sao lưu chứa dữ liệu nhị phân.
  • Toàn bộ / Gia tăng / Khác biệt:Định nghĩa của ba loại sao lưu này được ngầm hiểu trong tên gọi. Bản sao lưu đầy đủ là bản sao đầy đủ của tất cả dữ liệu của bạn. Sao lưu tăng dần chỉ sao lưu dữ liệu đã thay đổi kể từ lần sao lưu trước và sao lưu phân biệt chỉ chứa dữ liệu đã thay đổi kể từ lần sao lưu đầy đủ cuối cùng được thực thi. Các bản sao lưu gia tăng và khác biệt được giới thiệu như một cách để giảm lượng thời gian và dung lượng ổ đĩa sử dụng để thực hiện sao lưu đầy đủ.

pgBackRest là một công cụ sao lưu mã nguồn mở tạo các bản sao lưu vật lý với một số cải tiến so với công cụ pg_basebackup cổ điển. Chúng tôi có thể sử dụng pgBackRest để thực hiện sao chép cơ sở dữ liệu ban đầu cho Nhân bản truyền trực tuyến bằng cách sử dụng bản sao lưu hiện có hoặc chúng tôi có thể sử dụng tùy chọn delta để xây dựng lại máy chủ dự phòng cũ.

Một số tính năng quan trọng nhất của pgBackRest là:

  • Sao lưu và khôi phục song song
  • Hoạt động cục bộ hoặc từ xa
  • Bản sao lưu đầy đủ, tăng dần và khác biệt
  • Xoay vòng sao lưu và hết hạn lưu trữ
  • Kiểm tra tính toàn vẹn của bản sao lưu
  • Tiếp tục sao lưu
  • Khôi phục Delta
  • Mã hóa

Bây giờ, hãy xem cách chúng ta có thể sử dụng pgBackRest để sao lưu cơ sở dữ liệu PostgreSQL và TimescaleDB.

Cách sử dụng pgBackRest

Đối với thử nghiệm này, chúng tôi sẽ sử dụng CentOS 7 làm Hệ điều hành và PostgreSQL 11 làm máy chủ cơ sở dữ liệu. Chúng tôi sẽ giả sử bạn đã cài đặt cơ sở dữ liệu, nếu chưa, bạn có thể theo các liên kết này để triển khai cả PostgreSQL hoặc TimescaleDB một cách dễ dàng bằng cách sử dụng ClusterControl.

Đầu tiên, chúng ta cần cài đặt gói pgbackrest.

$ yum install pgbackrest

pgBackRest có thể được sử dụng từ dòng lệnh hoặc từ tệp cấu hình được đặt theo mặc định trong /etc/pgbackrest.conf trên CentOS7. Tệp này chứa các dòng sau:

[global]
repo1-path=/var/lib/pgbackrest
#[main]
#pg1-path=/var/lib/pgsql/10/data

Bạn có thể kiểm tra liên kết này để xem chúng tôi có thể thêm thông số nào vào tệp cấu hình này.

Chúng tôi sẽ thêm các dòng sau:

[testing]
pg1-path=/var/lib/pgsql/11/data

Đảm bảo rằng bạn đã thêm cấu hình sau vào tệp postgresql.conf (những thay đổi này yêu cầu khởi động lại dịch vụ).

archive_mode = on
archive_command = 'pgbackrest --stanza=testing archive-push %p'
max_wal_senders = 3
wal_level = logical

Bây giờ, hãy thực hiện một bản sao lưu cơ bản. Đầu tiên, chúng ta cần tạo một “stanza”, xác định cấu hình sao lưu cho một cụm cơ sở dữ liệu PostgreSQL hoặc TimescaleDB cụ thể. Phần khổ thơ phải xác định đường dẫn cụm cơ sở dữ liệu và máy chủ / người dùng nếu cụm cơ sở dữ liệu ở xa.

$ pgbackrest --stanza=testing --log-level-console=info stanza-create
2019-04-29 21:46:36.922 P00   INFO: stanza-create command begin 2.13: --log-level-console=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
2019-04-29 21:46:37.475 P00   INFO: stanza-create command end: completed successfully (554ms)

Và sau đó, chúng ta có thể chạy lệnh kiểm tra để xác thực cấu hình.

$ pgbackrest --stanza=testing --log-level-console=info check
2019-04-29 21:51:09.893 P00   INFO: check command begin 2.13: --log-level-console=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
2019-04-29 21:51:12.090 P00   INFO: WAL segment 000000010000000000000001 successfully stored in the archive at '/var/lib/pgbackrest/archive/testing/11-1/0000000100000000/000000010000000000000001-f29875cffe780f9e9d9debeb0b44d945a5165409.gz'
2019-04-29 21:51:12.090 P00   INFO: check command end: completed successfully (2197ms)

Để sao lưu, hãy chạy lệnh sau:

$ pgbackrest --stanza=testing --type=full --log-level-stderr=info backup
INFO: backup command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing --type=full
WARN: option repo1-retention-full is not set, the repository may run out of space
      HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum.
INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-04-30 15:43:21": backup begins after the next regular checkpoint completes
INFO: backup start archive = 000000010000000000000006, lsn = 0/6000028
WARN: aborted backup 20190429-215508F of same type exists, will be cleaned to remove invalid files and resumed
INFO: backup file /var/lib/pgsql/11/data/base/16384/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/13878/1255 (608KB, 3%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/13877/1255 (608KB, 5%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
. . .
INFO: full backup size = 31.8MB
INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
INFO: backup stop archive = 000000010000000000000006, lsn = 0/6000130
INFO: new backup label = 20190429-215508F
INFO: backup command end: completed successfully (12810ms)
INFO: expire command begin
INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired
INFO: expire command end: completed successfully (10ms)

Bây giờ, chúng ta đã hoàn tất quá trình sao lưu với đầu ra "đã hoàn tất thành công", vì vậy, hãy bắt đầu khôi phục nó. Chúng tôi sẽ ngừng dịch vụ postgresql-11.

$ service postgresql-11 stop
Redirecting to /bin/systemctl stop postgresql-11.service

Và để trống datadir.

$ rm -rf /var/lib/pgsql/11/data/*

Bây giờ, hãy chạy lệnh sau:

$ pgbackrest --stanza=testing --log-level-stderr=info restore
INFO: restore command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing
INFO: restore backup set 20190429-215508F
INFO: restore file /var/lib/pgsql/11/data/base/16384/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: restore file /var/lib/pgsql/11/data/base/13878/1255 (608KB, 3%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: restore file /var/lib/pgsql/11/data/base/13877/1255 (608KB, 5%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
. . .
INFO: write /var/lib/pgsql/11/data/recovery.conf
INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
INFO: restore command end: completed successfully (10819ms)

Sau đó, khởi động dịch vụ postgresql-11.

$ service postgresql-11 stop

Và bây giờ chúng tôi đã thiết lập và chạy cơ sở dữ liệu của mình.

$ psql -U app_user world
world=> select * from city limit 5;
 id |      name      | countrycode |   district    | population
----+----------------+-------------+---------------+------------
  1 | Kabul          | AFG         | Kabol         |    1780000
  2 | Qandahar       | AFG         | Qandahar      |     237500
  3 | Herat          | AFG         | Herat         |     186800
  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800
  5 | Amsterdam      | NLD         | Noord-Holland |     731200
(5 rows)

Bây giờ, hãy xem cách chúng ta có thể thực hiện một bản sao lưu khác biệt.

$ pgbackrest --stanza=testing --type=diff --log-level-stderr=info backup
INFO: backup command begin 2.13: --log-level-stderr=info --pg1-path=/var/lib/pgsql/11/data --repo1-path=/var/lib/pgbackrest --stanza=testing --type=diff
WARN: option repo1-retention-full is not set, the repository may run out of space
      HINT: to retain full backups indefinitely (without warning), set option 'repo1-retention-full' to the maximum.
INFO: last backup label = 20190429-215508F, version = 2.13
INFO: execute non-exclusive pg_start_backup() with label "pgBackRest backup started at 2019-04-30 21:22:58": backup begins after the next regular checkpoint completes
INFO: backup start archive = 00000002000000000000000B, lsn = 0/B000028
WARN: a timeline switch has occurred since the last backup, enabling delta checksum
INFO: backup file /var/lib/pgsql/11/data/base/16429/1255 (608KB, 1%) checksum e560330eb5300f7e2bcf8260f37f36660ce3a2c1
INFO: backup file /var/lib/pgsql/11/data/base/16429/2608 (448KB, 8%) checksum 53bd7995dc4d29226b1ad645995405e0a96a4a7b
. . .
INFO: diff backup size = 40.1MB
INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
INFO: backup stop archive = 00000002000000000000000B, lsn = 0/B000130
INFO: new backup label = 20190429-215508F_20190430-212258D
INFO: backup command end: completed successfully (23982ms)
INFO: expire command begin
INFO: option 'repo1-retention-archive' is not set - archive logs will not be expired
INFO: expire command end: completed successfully (14ms)

Đối với các bản sao lưu phức tạp hơn, bạn có thể làm theo hướng dẫn sử dụng pgBackRest.

Như chúng tôi đã đề cập trước đó, bạn có thể sử dụng dòng lệnh hoặc tệp cấu hình để quản lý các bản sao lưu của mình.

Cách sử dụng pgBackRest trong ClusterControl

Kể từ phiên bản 1.7.2, ClusterControl đã thêm hỗ trợ cho pgBackRest để sao lưu cơ sở dữ liệu PostgreSQL và TimescaleDB, vì vậy hãy xem cách chúng ta có thể sử dụng nó từ ClusterControl.

Tạo bản sao lưu

Đối với tác vụ này, hãy chuyển đến ClusterControl -> Chọn Cluster -> Backup -> Create Backup.

Chúng tôi có thể tạo một bản sao lưu mới hoặc định cấu hình một bản sao lưu đã lên lịch. Đối với ví dụ của chúng tôi, chúng tôi sẽ tạo một bản sao lưu duy nhất ngay lập tức.

Chúng ta phải chọn một phương pháp, máy chủ mà bản sao lưu sẽ được lấy và nơi chúng ta muốn lưu trữ bản sao lưu. Chúng tôi cũng có thể tải bản sao lưu của mình lên đám mây (AWS, Google hoặc Azure) bằng cách bật nút tương ứng.

Trong trường hợp này, chúng tôi sẽ chọn phương thức pgbackrestfull để tạo một bản sao lưu đầy đủ ban đầu. Khi chọn tùy chọn này, chúng ta sẽ thấy ghi chú màu đỏ sau:

“Trong lần đầu tiên tạo sao lưu pgBackRest, ClusterControl sẽ định cấu hình lại nút (triển khai và định cấu hình pgBackRest) và sau đó, nút db cần được khởi động lại trước.”

Vì vậy, hãy tính đến nó cho lần sao lưu đầu tiên.

Sau đó, chúng tôi chỉ định việc sử dụng nén và cấp độ nén cho bản sao lưu của chúng tôi.

Trên phần sao lưu, chúng ta có thể thấy tiến trình của quá trình sao lưu và thông tin như phương pháp, kích thước, vị trí và hơn thế nữa.

Các bước giống nhau để tạo ra sự khác biệt của sao lưu gia tăng. Chúng tôi chỉ cần chọn phương pháp mong muốn trong quá trình tạo bản sao lưu.

Khôi phục bản sao lưu

Sau khi sao lưu xong, chúng tôi có thể khôi phục nó bằng cách sử dụng ClusterControl. Đối với điều này, trong phần sao lưu của chúng tôi (ClusterControl -> Chọn Cluster -> Sao lưu), chúng tôi có thể chọn "Khôi phục sao lưu" hoặc trực tiếp "Khôi phục" trên bản sao lưu mà chúng tôi muốn khôi phục.

Chúng tôi có ba tùy chọn để khôi phục bản sao lưu. Chúng tôi có thể khôi phục bản sao lưu trong một nút cơ sở dữ liệu hiện có, khôi phục và xác minh bản sao lưu trên một máy chủ độc lập hoặc tạo một cụm mới từ bản sao lưu.

Nếu chúng tôi chọn tùy chọn Khôi phục trên Node, chúng tôi phải chỉ định nút Chính vì nó là nút duy nhất có thể ghi trong cụm.

Chúng tôi có thể theo dõi tiến trình khôi phục của mình từ phần Hoạt động trong ClusterControl của chúng tôi.

Xác minh sao lưu tự động

Một bản sao lưu không phải là bản sao lưu nếu nó không khôi phục được. Việc xác minh các bản sao lưu là một việc thường bị nhiều người bỏ qua. Hãy xem cách ClusterControl có thể tự động hóa việc xác minh các bản sao lưu PostgreSQL và TimescaleDB và giúp tránh bất kỳ điều gì bất ngờ.

Trong ClusterControl, chọn cụm của bạn và chuyển đến phần "Sao lưu", sau đó, chọn "Tạo bản sao lưu".

Tính năng sao lưu tự động xác minh khả dụng cho các bản sao lưu theo lịch trình. Vì vậy, hãy chọn tùy chọn "Lên lịch sao lưu".

Khi lập lịch sao lưu, ngoài việc chọn các tùy chọn phổ biến như phương pháp hoặc bộ nhớ, chúng tôi cũng cần chỉ định lịch trình / tần suất.

Trong bước tiếp theo, chúng tôi có thể nén bản sao lưu của mình và bật tính năng “Xác minh bản sao lưu”.

Để sử dụng tính năng này, chúng tôi cần một máy chủ (hoặc máy ảo) chuyên dụng không phải là một phần của cụm.

ClusterControl sẽ cài đặt phần mềm và nó sẽ khôi phục bản sao lưu trong máy chủ lưu trữ này. Sau khi khôi phục, chúng ta có thể thấy biểu tượng xác minh trong phần ClusterControl Backup.

Đề xuất

Ngoài ra còn có một số mẹo mà chúng tôi có thể tính đến khi tạo bản sao lưu của mình:

  • Lưu trữ bản sao lưu ở một vị trí từ xa:Chúng tôi không nên lưu trữ bản sao lưu trên máy chủ cơ sở dữ liệu. Trong trường hợp máy chủ bị lỗi, chúng tôi có thể mất cơ sở dữ liệu và bản sao lưu cùng lúc.
  • Giữ bản sao của bản sao lưu mới nhất trên máy chủ cơ sở dữ liệu:Điều này có thể hữu ích để khôi phục nhanh hơn.
  • Sử dụng sao lưu gia tăng / chênh lệch:Để giảm thời gian khôi phục sao lưu và sử dụng dung lượng ổ đĩa.
  • Sao lưu WAL:Nếu chúng tôi cần khôi phục cơ sở dữ liệu từ lần sao lưu cuối cùng, nếu bạn chỉ khôi phục nó, bạn sẽ mất các thay đổi kể từ khi sao lưu được thực hiện cho đến thời điểm khôi phục, nhưng nếu có WAL, chúng tôi có thể áp dụng những thay đổi và chúng ta có thể sử dụng PITR.
  • Sử dụng cả bản sao lưu Lôgic và Vật lý:Cả hai đều cần thiết vì những lý do khác nhau, ví dụ:nếu chúng tôi muốn khôi phục chỉ một cơ sở dữ liệu / bảng, chúng tôi không cần sao lưu vật lý, chúng tôi chỉ cần sao lưu lôgic và nó sẽ khôi phục toàn bộ máy chủ thậm chí còn nhanh hơn.
  • Thực hiện sao lưu từ các nút dự phòng (nếu có thể):Để tránh tải thêm trên nút chính, bạn nên thực hiện sao lưu từ máy chủ dự phòng.
  • Kiểm tra các bản sao lưu của bạn:Việc xác nhận rằng bản sao lưu đã được thực hiện xong không đủ để đảm bảo bản sao lưu đang hoạt động. Chúng tôi nên khôi phục nó trên một máy chủ độc lập và kiểm tra nó để tránh bất ngờ trong trường hợp không thành công.

Kết luận

Như chúng ta có thể thấy, pgBackRest là một lựa chọn tốt để cải thiện chiến lược sao lưu của chúng tôi. Nó giúp bạn bảo vệ dữ liệu của mình và có thể hữu ích để đạt được RTO bằng cách giảm thời gian chết trong trường hợp bị lỗi. Sao lưu tăng dần có thể giúp giảm lượng thời gian và không gian lưu trữ được sử dụng cho quá trình sao lưu. ClusterControl có thể giúp tự động hóa quá trình sao lưu cho cơ sở dữ liệu PostgreSQL và TimescaleDB của bạn và trong trường hợp không thành công, hãy khôi phục nó bằng một vài cú nhấp chuột.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ứng dụng khách postgresql tốt cho windows?

  2. Psycopg2, Postgresql, Python:Cách nhanh nhất để chèn hàng loạt

  3. LỖI:địa điểm quan hệ không tồn tại Nhập db Heroku

  4. Truyền kiểu NULL khi cập nhật nhiều hàng

  5. PostgreSQL cách nối giá trị khoảng thời gian '2 ngày'