Giới thiệu

PostgreSQL là một nền tảng cơ sở dữ liệu mã nguồn mở khá phổ biến với các nhà phát triển ứng dụng web và di động để dễ bảo trì, hiệu quả về chi phí và tích hợp đơn giản với các công nghệ nguồn mở khác.

Một nhiệm vụ quan trọng trong việc duy trì môi trường PostgreSQL là sao lưu cơ sở dữ liệu thường xuyên. Bản sao lưu là một phần của quy trình Khôi phục thảm họa (DR) đối với bất kỳ tổ chức nào. Điều này rất quan trọng vì một vài lý do:

  • Bảo vệ chống mất dữ liệu do lỗi của các thành phần cơ sở hạ tầng cơ sở như lưu trữ hoặc chính máy chủ
  • Bảo vệ chống tham nhũng dữ liệu và mất dữ liệu không mong muốn hoặc độc hại
  • Di chuyển cơ sở dữ liệu sản xuất vào môi trường phát triển hoặc thử nghiệm

Thông thường trách nhiệm sao lưu cơ sở dữ liệu và phục hồi rơi trên vai của một DBA. Tuy nhiên, trong các tổ chức hoặc khởi nghiệp nhỏ hơn, quản trị viên hệ thống, kỹ sư DevOps hoặc lập trình viên thường phải tạo các chương trình cơ sở dữ liệu của riêng họ. Vì vậy, điều quan trọng là tất cả mọi người sử dụng PostgreSQL để hiểu cách thức sao lưu hoạt động và cách khôi phục từ bản sao lưu.

Trong hướng dẫn này, bạn sẽ thiết lập máy chủ sao lưu Barman, tạo bản sao lưu từ máy chủ cơ sở dữ liệu chính và khôi phục lại máy chủ dự phòng.

Giới thiệu tóm tắt về phương pháp sao lưu PostgreSQL

Trước khi khởi chạy vào thiết lập Barman của bạn, chúng ta hãy dành một chút thời gian để xem xét các kiểu sao lưu sẵn có cho PostgreSQL và cách sử dụng của chúng. (Để có cái nhìn tổng quan rộng hơn về các chiến lược sao lưu, hãy đọc bài viết của chúng tôi về sao lưu hiệu quả.)

PostgreSQL cung cấp hai loại phương thức sao lưu:

  • Sao lưu hợp lý
  • Sao lưu vật lý

Sao lưu hợp lý giống như ảnh chụp nhanh của cơ sở dữ liệu. Chúng được tạo bằng cách sử dụng pg_dump hoặc là pg_dumpall tiện ích đi kèm với PostgreSQL. Sao lưu hợp lý:

  • Sao lưu cơ sở dữ liệu cá nhân hoặc tất cả cơ sở dữ liệu
  • Chỉ sao lưu các lược đồ, chỉ dữ liệu, các bảng riêng lẻ hoặc toàn bộ cơ sở dữ liệu (lược đồ và dữ liệu)
  • Tạo tệp sao lưu ở định dạng nhị phân độc quyền hoặc trong tập lệnh SQL thuần túy
  • Có thể được khôi phục bằng cách sử dụng pg_restore tiện ích cũng được cung cấp với PostgreSQL
  • Không cung cấp -sự phục hồi theo thời gian

Điều này có nghĩa là nếu bạn thực hiện sao lưu hợp lý (các) cơ sở dữ liệu của bạn vào lúc 2:00 sáng vào buổi sáng, khi bạn khôi phục từ cơ sở dữ liệu đó, cơ sở dữ liệu đã khôi phục sẽ vào lúc 2:00 sáng. Không có cách nào để dừng khôi phục tại một thời điểm cụ thể, nói vào lúc 1:30 sáng. Nếu bạn đang khôi phục bản sao lưu lúc 10:00 sáng, bạn đã mất dữ liệu của tám giờ.

Các bản sao lưu vật lý khác với các bản sao lưu logic vì chúng chỉ xử lý với định dạng nhị phân và tạo các bản sao lưu ở mức tệp. Sao lưu vật lý:

  • Phục hồi điểm trong thời gian
  • Sao lưu nội dung của PostgreSQL Thư mục dữ liệuWAL (Viết nhật ký đăng nhập)
  • Lấy dung lượng đĩa lớn hơn
  • Sử dụng PostgreSQL pg_start_backuppg_stop_backup lệnh. Tuy nhiên, các lệnh này cần được viết kịch bản, điều này làm cho các bản sao lưu vật lý trở thành một quá trình phức tạp hơn
  • Không sao lưu cơ sở dữ liệu cá nhân, chỉ các lược đồ, v.v. Đó là một cách tiếp cận tất cả hoặc không có gì

Tệp WAL chứa danh sách giao dịch (INSERT, UPDATE hoặc DELETE) xảy ra với một cơ sở dữ liệu. Các tệp cơ sở dữ liệu thực tế chứa dữ liệu nằm trong thư mục dữ liệu. Vì vậy, khi nói đến khôi phục đến một điểm trong thời gian từ một bản sao lưu vật lý, PostgreSQL phục hồi nội dung của thư mục dữ liệu đầu tiên, và sau đó phát các giao dịch trên đầu trang của nó từ các tập tin WAL. Điều này mang lại cho các cơ sở dữ liệu đến một trạng thái nhất quán trong thời gian.

Cách Barman sao lưu hoạt động

Theo truyền thống, các DBA PostgreSQL sẽ viết các kịch bản dự phòng của riêng họ và lên lịch cron công việc để thực hiện sao lưu vật lý. Barman làm điều này theo một cách tiêu chuẩn hóa.

Barman hoặc là Trình quản lý sao lưu và khôi phục là một công cụ sao lưu PostgreSQL mã nguồn mở miễn phí từ 2ndQuadrant - một công ty giải pháp Postgres chuyên nghiệp. Barman được viết bằng Python và cung cấp phương pháp sao lưu và phục hồi vật lý đơn giản, trực quan cho cá thể PostgreSQL của bạn. Một số lợi ích của việc sử dụng Barman là:

  • Nó hoàn toàn miễn phí
  • Đó là một ứng dụng được duy trì tốt và có sự hỗ trợ chuyên nghiệp từ nhà cung cấp
  • Giải phóng DBA / Sysadmin bằng cách viết và thử nghiệm các tập lệnh phức tạp và cron công việc
  • Có thể sao lưu nhiều phiên bản PostgreSQL vào một vị trí trung tâm
  • Có thể khôi phục lại cùng một cá thể PostgreSQL hoặc một cá thể khác
  • Cung cấp cơ chế nén để giảm thiểu lưu lượng mạng và dung lượng ổ đĩa

Những mục tiêu

Trong hướng dẫn này, chúng tôi sẽ tạo ra ba giọt DigitalOcean, cài đặt PostgreSQL 9.4 trên hai máy này và cài đặt Barman vào thứ ba.

Một trong những máy chủ PostgreSQL sẽ là máy chủ cơ sở dữ liệu chính của chúng tôi: đây là nơi chúng tôi sẽ tạo cơ sở dữ liệu sản xuất của mình. Ví dụ PostgreSQL thứ hai sẽ trống và được coi là máy dự phòng nơi chúng ta có thể khôi phục từ bản sao lưu.

Máy chủ Barman sẽ liên lạc với máy chủ cơ sở dữ liệu chính và thực hiện sao lưu vật lý và lưu trữ WAL.

Sau đó chúng tôi sẽ mô phỏng một "thảm họa" bằng cách thả một bảng từ cơ sở dữ liệu trực tiếp của chúng tôi.

Cuối cùng, chúng tôi sẽ khôi phục bản sao PostgreSQL đã sao lưu từ máy chủ Barman sang máy chủ dự phòng.

Điều kiện tiên quyết

Để làm theo hướng dẫn này, bạn sẽ cần phải tạo ra ba giọt nhỏ DigitalOcean (hoặc các máy chủ Linux của riêng bạn), mỗi máy có ít nhất RAM 2 GB và 2 lõi CPU. Chúng tôi sẽ không đi vào chi tiết tạo ra một giọt; bạn có thể tìm thêm thông tin đây.

Tất cả ba máy chủ nên có cùng một hệ điều hành (CentOS 7 bit x64).

Chúng tôi sẽ đặt tên cho các máy như sau:

  • main-db-server (chúng tôi sẽ biểu thị địa chỉ IP của nó là main-db-server-ip)
  • chế độ chờ-db-server (chúng tôi sẽ biểu thị địa chỉ IP của nó là chế độ chờ-db-server-ip)
  • barman-backup-server (chúng tôi sẽ biểu thị địa chỉ IP của nó là barman-backup-server-ip)

Có thể tìm thấy địa chỉ IP thực của các máy từ bảng điều khiển DigitalOcean.

Bạn cũng nên thiết lập một người dùng sudo trên mỗi máy chủ và sử dụng nó để truy cập chung. Hầu hết các lệnh sẽ được thực hiện dưới dạng hai người dùng khác nhau (postgresbarman), nhưng bạn sẽ cần một người dùng sudo trên mỗi máy chủ để bạn có thể chuyển sang các tài khoản đó. Để hiểu các đặc quyền sudo hoạt động như thế nào, hãy xem Hướng dẫn DigitalOcean về cách bật quyền truy cập sudo.

Chú thích: Hướng dẫn này sẽ sử dụng thư mục cài đặt Barman mặc định làm vị trí sao lưu. Trong CentOS, vị trí này là: /var/lib/barman/. 2ndQuadrant khuyên tốt nhất là giữ đường dẫn mặc định. Trong các trường hợp sử dụng thực tế, tùy thuộc vào kích cỡ cơ sở dữ liệu của bạn và số lượng cá thể được sao lưu, bạn nên kiểm tra xem có đủ không gian trong hệ thống tệp lưu trữ thư mục này hay không.

Cảnh báo: Bạn không nên chạy bất kỳ lệnh, truy vấn hoặc cấu hình nào từ hướng dẫn này trên máy chủ sản xuất. Hướng dẫn này sẽ liên quan đến việc thay đổi cấu hình và khởi động lại các cá thể PostgreSQL. Làm như vậy trong môi trường sống mà không có kế hoạch và ủy quyền phù hợp có nghĩa là cúp điện cho ứng dụng của bạn.

Bước 1 - Cài đặt các máy chủ cơ sở dữ liệu PostgreSQL

Đầu tiên chúng ta sẽ thiết lập môi trường cơ sở dữ liệu bằng cách cài đặt PostgreSQL 9.4 trên main-db-serverchế độ chờ-db-server.

Vui lòng hoàn tất các bước cài đặt PostgreSQL từ hướng dẫn ngăn xếp LEPP này. Từ hướng dẫn này, bạn sẽ cần:

  • Theo dõi phần Bước Một - Cài đặt PostgreSQL
  • Theo dõi phần Bước Hai - Cấu hình PostgreSQL

Trong Bước Hai - Cấu hình PostgreSQL, thay vì thực hiện thay đổi đối với pg_hba.conf để cho phép truy cập vào cơ sở dữ liệu cho máy chủ web, thêm dòng này để máy chủ Barman có thể kết nối, bằng cách sử dụng barman-backup-server Địa chỉ IP, tiếp theo là /32:

host    all     all     barman-backup-server-ip/32        trust

Điều này sẽ cấu hình PostgreSQL chấp nhận bất kỳ kết nối nào đến từ máy chủ Barman.

Phần còn lại của hướng dẫn trong phần đó có thể được theo dõi như chúng.

Chú thích: Cài đặt PostgreSQL sẽ tạo một người dùng hệ điều hành được gọi là postgres trên máy chủ cơ sở dữ liệu. Tài khoản này không có mật khẩu; bạn sẽ chuyển sang nó từ người dùng sudo của bạn.

Đảm bảo bạn đã cài đặt PostgreSQL trên cả hai main-db-serverchế độ chờ-db-servervà bạn đã cho phép truy cập vào cả hai từ barman-backup-server.

Tiếp theo chúng ta sẽ thêm một số dữ liệu mẫu vào máy chủ cơ sở dữ liệu chính.

Bước 2 - Tạo cơ sở dữ liệu và bảng PostgreSQL

Khi PostgreSQL được cài đặt và cấu hình trên cả hai máy, chúng tôi sẽ thêm một số dữ liệu mẫu vào main-db-server để mô phỏng một môi trường sản xuất.

Trên main-db-server, chuyển sang người dùng postgres:

sudo su - postgres

Bắt đầu psql tiện ích để truy cập vào máy chủ cơ sở dữ liệu:

psql

Từ psql nhắc, chạy các lệnh sau để tạo cơ sở dữ liệu và chuyển sang nó:

CREATE DATABASE mytestdb;

\connect mytestdb;

Một thông báo đầu ra sẽ cho bạn biết rằng bạn đang kết nối với cơ sở dữ liệu mytestdb là người dùng postgres.

Tiếp theo, thêm hai bảng trong cơ sở dữ liệu:

CREATE TABLE mytesttable1 (id integer NULL);

CREATE TABLE mytesttable2 (id integer NULL);

Chúng được đặt tên mytesttable1mytesttable2.

Thoát khỏi công cụ máy khách bằng cách nhập \q và nhấn ENTER.

Bước 3 - Cài đặt Barman

Bây giờ chúng tôi sẽ cài đặt Barman trên máy chủ sao lưu, cả hai sẽ kiểm soát và lưu trữ các bản sao lưu của chúng tôi.

Hoàn thành bước này trên barman-backup-server.

Để làm điều này, trước tiên bạn sẽ cần phải cài đặt các kho sau:

  • Gói bổ sung cho kho lưu trữ Enterprise Linux (EPEL)
  • Kho lưu trữ RPM nhóm phát triển toàn cầu PostgreSQL

Chạy lệnh sau để cài đặt EPEL:

sudo yum -y install epel-release

Chạy các lệnh này để cài đặt repo PostgreSQL:

sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm

sudo rpm -ivh pgdg-centos94-9.4-1.noarch.rpm

Cuối cùng, chạy lệnh này để cài đặt Barman:

sudo yum -y install barman

Chú thích: Cài đặt Barman sẽ tạo một người dùng hệ điều hành được gọi là barman. Tài khoản này không có mật khẩu; bạn có thể chuyển sang người dùng này từ tài khoản người dùng sudo của mình.

Barman đã được cài đặt! Bây giờ, hãy đảm bảo các máy chủ có thể kết nối với nhau một cách an toàn.

Bước 4 - Cấu hình kết nối SSH giữa các máy chủ

Trong phần này, chúng tôi sẽ thiết lập các khóa SSH cho kết nối không mật khẩu an toàn giữa main-db-serverbarman-backup-server, và ngược lại.

Tương tự, chúng tôi sẽ thiết lập các khóa SSH giữa chế độ chờ-db-serverbarman-backup-server, và ngược lại.

Điều này là để đảm bảo PostgreSQL (trên cả hai máy chủ cơ sở dữ liệu) và Barman có thể "nói chuyện" với nhau trong quá trình sao lưu và phục hồi.

Đối với hướng dẫn này, bạn sẽ cần đảm bảo:

  • Người dùng postgres có thể kết nối từ xa từ main-db-server đến barman-backup-server
  • Người dùng postgres có thể kết nối từ xa từ chế độ chờ-db-server đến barman-backup-server
  • Người dùng barman có thể kết nối từ xa từ barman-backup-server đến main-db-server
  • Người dùng barman có thể kết nối từ xa từ barman-backup-server đến chế độ chờ-db-server

Chúng tôi sẽ không đi vào chi tiết về cách thức hoạt động của SSH. Có một bài viết rất hay về DigitalOcean về các thông tin cơ bản về SSH mà bạn có thể tham khảo.

Tất cả các lệnh bạn sẽ cần được bao gồm ở đây, mặc dù.

Chúng tôi sẽ chỉ cho bạn cách thực hiện việc này một lần để thiết lập kết nối cho người dùng postgres để kết nối từ main-db-server đến barman-backup-server.

Từ main-db-server, chuyển sang người dùng postgres nếu nó chưa phải là người dùng hiện tại:

sudo su - postgres

Chạy lệnh sau để tạo cặp khóa SSH:

ssh-keygen -t rsa

Chấp nhận vị trí và tên mặc định cho các tệp khóa bằng cách nhấn ENTER.

nhấn ENTER hai lần để tạo khóa riêng tư mà không có bất kỳ cụm mật khẩu nào.

Khi các khóa được tạo, sẽ có một .ssh thư mục được tạo theo postgres thư mục chính của người dùng, với các phím trong đó.

Bây giờ bạn sẽ cần phải sao chép khóa công cộng SSH vào authorized_keys tập tin theo barman người dùng .ssh thư mục trên barman-backup-server.

Chú thích: Rất tiếc, bạn không thể sử dụng ssh-copy-id barman@barman-backup-server-ip lệnh ở đây. Đó là bởi vì lệnh này sẽ yêu cầu barman mật khẩu của người dùng, không được đặt theo mặc định. Do đó, bạn sẽ cần sao chép nội dung khóa công khai theo cách thủ công.

Chạy lệnh sau để xuất postgres nội dung khóa công khai của người dùng:

cat ~/.ssh/id_rsa.pub

Sao chép nội dung của đầu ra.

Chuyển sang bảng điều khiển được kết nối với barman-backup-server máy chủ và chuyển sang người dùng barman:

sudo su - barman

Chạy các lệnh sau để tạo .ssh thư mục, đặt quyền của nó, sao chép nội dung khóa công khai vào authorized_keys và cuối cùng làm cho tệp đó có thể đọc được và ghi được:

mkdir -p ~/.ssh

chmod 700 ~/.ssh

echo "public_key_string" >> ~/.ssh/authorized_keys

chmod 600 ~/.ssh/authorized_keys

Đảm bảo bạn đặt chuỗi khóa công khai dài bắt đầu bằng ssh-rsa giữa các dấu ngoặc kép, thay vì public_key_string.

Bạn đã sao chép khóa đến máy chủ từ xa.

Bây giờ, để kiểm tra kết nối, hãy quay lại main-db-server và kiểm tra kết nối từ đó:

ssh barman@barman-backup-server-ip

Sau khi cảnh báo ban đầu về tính xác thực của máy chủ từ xa không được biết và bạn chấp nhận lời nhắc, một kết nối sẽ được thiết lập từ main-db-server máy chủ đến barman-backup-server. Nếu thành công, hãy đăng xuất khỏi phiên bằng cách thực thi exit chỉ huy.

exit

Bạn cần thiết lập các kết nối khóa SSH ba lần nữa. Bạn có thể bỏ qua việc tạo .ssh thư mục nếu nó đã được thực hiện (mặc dù điều này là không cần thiết).

  • Chạy lại các lệnh tương tự, lần này từ chế độ chờ-db-server đến barman-backup-server
  • Chạy lần thứ ba, lần này bắt nguồn từ barman người dùng trên barman-backup-servervà đi đến postgres người dùng trên main-db-server
  • Cuối cùng, chạy các lệnh để sao chép khóa từ barman người dùng trên barman-backup-server đến postgres người dùng trên chế độ chờ-db-server

Đảm bảo bạn kiểm tra kết nối theo từng cách để bạn có thể chấp nhận cảnh báo ban đầu về kết nối mới.

Từ chế độ chờ-db-server:

ssh barman@barman-backup-server-ip

Từ barman-backup-server:

ssh postgres@main-db-server-ip

Từ barman-backup-server:

ssh postgres@standby-db-server-ip

Chú thích: Đảm bảo kết nối SSH giữa cả ba máy chủ là yêu cầu sao lưu để hoạt động.

Bước 5 - Cấu hình Barman để sao lưu

Bây giờ bạn sẽ cấu hình Barman để sao lưu máy chủ PostgreSQL chính của bạn.

Tập tin cấu hình chính cho BARMAN là /etc/barman.conf. Tệp này chứa một phần dành cho các tham số chung và các phần riêng biệt cho mỗi máy chủ mà bạn muốn sao lưu. Tệp mặc định chứa một phần cho máy chủ mẫu PostgreSQL được gọi là chủ yếu, được nhận xét. Bạn có thể sử dụng nó như một hướng dẫn để thiết lập các máy chủ khác mà bạn muốn sao lưu.

Dấu chấm phẩy (;) ở đầu dòng có nghĩa là dòng được nhận xét. Cũng giống như hầu hết các ứng dụng dựa trên Linux, một tham số cấu hình nhận xét cho Barman nghĩa là hệ thống sẽ sử dụng giá trị mặc định trừ khi bạn bỏ ghi chú và nhập một giá trị khác.

Một tham số như vậy là configuration_files_directory, có giá trị mặc định là /etc/barman.d. Điều này có nghĩa là, khi được kích hoạt, Barman sẽ sử dụng .conf các tệp trong thư mục đó cho các cấu hình sao lưu của máy chủ Postgres khác nhau. Nếu bạn thấy tệp chính quá dài, hãy tạo các tệp riêng biệt cho mỗi máy chủ bạn muốn sao lưu.

Để đơn giản hóa trong hướng dẫn này, chúng tôi sẽ đặt mọi thứ vào tệp cấu hình mặc định.

Mở /etc/barman.conf trong trình chỉnh sửa văn bản người dùng sudo (người dùng barman chỉ đọc quyền truy cập vào nó):

sudo vi /etc/barman.conf

Các tham số chung được xác định theo [barman] phần. Trong phần này, thực hiện các thay đổi sau. Các giá trị đã hoàn thành được hiển thị bên dưới các điểm bullet:

  • Bỏ ghi chú dòng cho compression và giữ giá trị mặc định của gzip. Điều này có nghĩa là các tệp tin PostgreSQL WAL - khi được sao chép trong thư mục sao lưu - sẽ được lưu dưới dạng nén gzip
  • Bỏ ghi chú dòng cho reuse_backup và giữ giá trị mặc định của link. Khi tạo bản sao lưu đầy đủ của máy chủ PostgreSQL, Barman sẽ cố gắng tiết kiệm không gian trong thư mục sao lưu bằng cách tạo các bản sao lưu gia tăng mức tệp. Điều này sử dụng rsync và liên kết cứng. Tạo bản sao lưu đầy đủ gia tăng có cùng lợi ích của bất kỳ phương pháp sao chép dữ liệu nào: tiết kiệm thời gian và dung lượng đĩa
  • Bỏ ghi chú dòng cho immediate_checkpoint và đặt giá trị của nó thành true. Cài đặt tham số này đảm bảo rằng khi Barman bắt đầu sao lưu đầy đủ, nó sẽ yêu cầu PostgreSQL thực hiện CHECKPOINT. Checkpointing đảm bảo mọi dữ liệu đã sửa đổi trong bộ nhớ cache của PostgreSQL được ghi vào các tệp dữ liệu. Từ góc độ dự phòng, điều này có thể thêm một số giá trị vì BARMAN có thể sao lưu các thay đổi dữ liệu mới nhất
  • Bỏ ghi chú dòng cho basebackup_retry_times và đặt giá trị 3. Khi tạo bản sao lưu đầy đủ, Barman sẽ cố gắng kết nối với máy chủ PostgreSQL ba lần nếu thao tác sao chép không thành công vì một số lý do
  • Bỏ ghi chú dòng cho basebackup_retry_sleep và giữ giá trị mặc định của 30. Sẽ có độ trễ 30 giây giữa mỗi lần thử lại
  • Bỏ ghi chú dòng cho last_backup_maximum_age và đặt giá trị của nó thành 1 DAYS

Các cài đặt mới sẽ giống như sau:

Excerpts from /etc/barman.conf

[barman]
barman_home = /var/lib/barman

. . .

barman_user = barman
log_file = /var/log/barman/barman.log
compression = gzip
reuse_backup = link

. . .

immediate_checkpoint = true

. . .

basebackup_retry_times = 3
basebackup_retry_sleep = 30
last_backup_maximum_age = 1 DAYS

Những gì chúng tôi đang làm ở đây là:

  • Giữ vị trí sao lưu mặc định
  • Chỉ định rằng không gian sao lưu cần được lưu. Bản ghi WAL sẽ được nén và sao lưu cơ sở sẽ sử dụng sao chép dữ liệu gia tăng
  • Barman sẽ thử lại ba lần nếu sao lưu toàn bộ không thực hiện được nửa chừng vì một số lý do
  • Độ tuổi của bản sao lưu đầy đủ cuối cùng cho máy chủ PostgreSQL không được cũ hơn 1 ngày

Ở cuối tệp, thêm phần mới. Tiêu đề của nó nên nói [main-db-server] trong dấu ngoặc vuông. (Nếu bạn muốn sao lưu nhiều máy chủ cơ sở dữ liệu hơn với Barman, bạn có thể tạo một khối như thế này cho mỗi máy chủ và sử dụng tên tiêu đề duy nhất cho mỗi máy chủ.)

Phần này chứa thông tin kết nối cho máy chủ cơ sở dữ liệu và một vài cài đặt sao lưu duy nhất.

Thêm các tham số này vào khối mới:

Excerpt from /etc/barman.conf

[main-db-server]
description = "Main DB Server"
ssh_command = ssh postgres@main-db-server-ip
conninfo = host=main-db-server-ip user=postgres
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF 7 days
wal_retention_policy = main

Các retention_policy cài đặt có nghĩa là Barman sẽ ghi đè lên các tệp sao lưu đầy đủ cũ và nhật ký WAL tự động, trong khi vẫn giữ đủ bản sao lưu cho thời lượng khôi phục 7 ngày. Điều đó có nghĩa là chúng tôi có thể khôi phục toàn bộ máy chủ cơ sở dữ liệu đến bất kỳ thời điểm nào trong 7 ngày qua. Đối với một hệ thống sản xuất, bạn có lẽ nên đặt giá trị này cao hơn để bạn có các bản sao lưu cũ hơn trong tay.

Bạn sẽ cần sử dụng địa chỉ IP của main-db-server bên trong ssh_commandconninfo thông số. Nếu không, bạn có thể sao chép chính xác cài đặt ở trên.

Phiên bản cuối cùng của tệp đã sửa đổi sẽ trông như thế này, trừ đi tất cả các nhận xét và cài đặt chưa sửa đổi:

Excerpts from /etc/barman.conf

[barman]
barman_home = /var/lib/barman

. . .

barman_user = barman
log_file = /var/log/barman/barman.log
compression = gzip
reuse_backup = link

. . .

immediate_checkpoint = true

. . .

basebackup_retry_times = 3
basebackup_retry_sleep = 30
last_backup_maximum_age = 1 DAYS

. . .

[main-db-server]
description = "Main DB Server"
ssh_command = ssh postgres@main-db-server-ip
conninfo = host=main-db-server-ip user=postgres
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF 7 days
wal_retention_policy = main

Lưu và đóng tập tin.

Tiếp theo, chúng tôi sẽ đảm bảo main-db-server được cấu hình để tạo bản sao lưu.

Bước 6 - Cấu hình file postgresql.conf

Có một cấu hình cuối cùng được thực hiện trên main-db-server, để bật chế độ sao lưu (hoặc lưu trữ).

Đầu tiên, chúng ta cần định vị giá trị của thư mục sao lưu đến từ barman-backup-server. Trên máy chủ Barman, chuyển sang người dùng barman:

sudo su - barman

Chạy lệnh này để định vị thư mục sao lưu đến:

barman show-server main-db-server | grep incoming_wals_directory

Điều này sẽ xuất ra một cái gì đó như thế này:

barman show-server command outputincoming_wals_directory: /var/lib/barman/main-db-server/incoming

Ghi lại giá trị của incoming_wals_directory; trong ví dụ này, đó là /var/lib/barman/main-db-server/incoming.

Bây giờ chuyển sang main-db-server giao diện điều khiển.

Chuyển sang người dùng postgres nếu nó không phải là người dùng hiện tại.

Mở postgresql.conf tệp trong trình chỉnh sửa văn bản:

vi $PGDATA/postgresql.conf

Thực hiện các thay đổi sau đối với tệp:

  • Bỏ ghi chú wal_level và đặt giá trị của nó thành archive thay vì minimal
  • Bỏ ghi chú archive_mode và đặt giá trị của nó thành on thay vì off
  • Bỏ ghi chú archive_command và đặt giá trị của nó thành 'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f' thay vì ''. Sử dụng địa chỉ IP của máy chủ Barman. Nếu bạn có một giá trị khác cho incoming_wals_directorythay vào đó, hãy sử dụng

Excerpts from postgresql.conf

wal_level = archive                     # minimal, archive, hot_standby, or logical

. . .

archive_mode = on               # allows archiving to be done

. . .

archive_command = 'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f'                # command to use to archive a logfile segment

Chuyển về người dùng sudo.

Khởi động lại PostgreSQL:

sudo systemctl restart postgresql-9.4.service

Chú thích: Nếu bạn đang cấu hình một cá thể PostgreSQL sản xuất hiện có, có khả năng là ba thông số này sẽ được thiết lập. Sau đó, bạn sẽ phải thêm / sửa đổi chỉ archive_command tham số để PostgreSQL gửi các tệp WAL của nó tới máy chủ sao lưu.

Bước 7 - Thử nghiệm Barman

Bây giờ là lúc kiểm tra xem Barman có tất cả các cấu hình được đặt chính xác và có thể kết nối với main-db-server.

Trên barman-backup-server, chuyển sang người dùng barman nếu nó không phải là người dùng hiện tại. Chạy lệnh sau để kiểm tra kết nối đến máy chủ cơ sở dữ liệu chính của bạn:

barman check main-db-server

Lưu ý rằng nếu bạn đã nhập tên khác giữa các dấu ngoặc vuông cho khối máy chủ trong /etc/barman.conf trong Bước 5, bạn nên sử dụng tên đó thay thế.

Nếu mọi thứ ổn, đầu ra sẽ trông như thế này:

barman check command outputServer main-db-server:
        PostgreSQL: OK
        archive_mode: OK
        wal_level: OK
        archive_command: OK
        continuous archiving: OK
        directories: OK
        retention policy settings: OK
        backup maximum age: FAILED (interval provided: 1 day, latest backup age: No available backups)
        compression settings: OK
        minimum redundancy requirements: OK (have 0 backups, expected at least 0)
        ssh: OK (PostgreSQL server)
        not in recovery: OK

Đừng lo lắng về độ tuổi tối đa sao lưu FAILED tiểu bang. Điều này xảy ra vì chúng tôi đã cấu hình Barman sao cho bản sao lưu mới nhất không được cũ hơn 1 ngày. Chưa có bản sao lưu nào được thực hiện, vì vậy việc kiểm tra không thành công.

Nếu bất kỳ tham số nào khác nằm trong FAILED nhà nước, bạn nên điều tra thêm và khắc phục vấn đề trước khi tiếp tục.

Có thể có nhiều lý do để kiểm tra thất bại: ví dụ, Barman không thể đăng nhập vào Postgres instance, Postgres không được cấu hình để lưu trữ WAL, SSH không hoạt động giữa các máy chủ, v.v. Dù nguyên nhân, nó cần phải cố định trước khi sao lưu có thể xảy ra. Chạy qua các bước trước và đảm bảo tất cả các kết nối đều hoạt động.

Để có danh sách các máy chủ PostgreSQL được cấu hình với Barman, hãy chạy lệnh sau:

barman list-server

Ngay bây giờ nó sẽ chỉ hiển thị:

Output

main-db-server - Main DB Server

Bước 8 - Tạo bản sao lưu đầu tiên

Bây giờ bạn đã có Barman, hãy tạo một bản sao lưu theo cách thủ công.

Chạy lệnh sau đây làm lệnh barman người dùng trên barman-backup-server để tạo bản sao lưu đầu tiên của bạn:

barman backup main-db-server

Một lần nữa, main-db-server giá trị là những gì bạn đã nhập làm phần đầu của khối máy chủ trong /etc/barman.conf tệp ở Bước 5.

Điều này sẽ bắt đầu một bản sao lưu đầy đủ của thư mục dữ liệu PostgreSQL. Vì cá thể của chúng ta chỉ có một cơ sở dữ liệu nhỏ với hai bảng, nên nó sẽ kết thúc rất nhanh.

Output

Starting backup for server main-db-server in /var/lib/barman/main-db-server/base/20151111T051954
Backup start at xlog location: 0/2000028 (000000010000000000000002, 00000028)
Copying files.
Copy done.
Asking PostgreSQL server to finalize the backup.
Backup size: 26.9 MiB. Actual size on disk: 26.9 MiB (-0.00% deduplication ratio).
Backup end at xlog location: 0/20000B8 (000000010000000000000002, 000000B8)
Backup completed
Processing xlog segments for main-db-server
        Older than first backup. Trashing file 000000010000000000000001 from server main-db-server
        000000010000000000000002
        000000010000000000000002.00000028.backup

Vị trí tệp sao lưu

Vậy bản sao lưu được lưu ở đâu? Để tìm câu trả lời, hãy liệt kê nội dung của /var/lib/barman danh mục:

ls -l /var/lib/barman

Sẽ có một thư mục ở đó: main-db-server. Đó là máy chủ Barman hiện được cấu hình để sao lưu, và các bản sao lưu của nó tồn tại ở đó. (Nếu bạn cấu hình Barman để sao lưu các máy chủ khác, sẽ có một thư mục được tạo cho mỗi máy chủ.) main-db-server thư mục, sẽ có ba thư mục con:

  • base: Đây là nơi lưu các tệp sao lưu cơ sở
  • incoming: PostgreSQL gửi các tệp WAL đã hoàn thành của nó đến thư mục này để lưu trữ
  • wals: Barman sao chép nội dung của incoming thư mục đến wals danh mục

Trong thời gian phục hồi, Barman sẽ phục hồi nội dung từ base thư mục vào thư mục dữ liệu của máy chủ mục tiêu. Sau đó, nó sẽ sử dụng các tệp từ wals thư mục để áp dụng các thay đổi giao dịch và đưa máy chủ mục tiêu đến trạng thái nhất quán.

Sao lưu danh sách

Có một lệnh Barman cụ thể để liệt kê tất cả các bản sao lưu cho một máy chủ. Lệnh đó là barman list-backup. Chạy lệnh sau để xem nó trả về cái gì main-db-server:

barman list-backup main-db-server

Outputmain-db-server 20151111T051954 - Wed Nov 11 05:19:46 2015 - Size: 26.9 MiB - WAL Size: 0 B
  • Phần đầu tiên của đầu ra là tên của máy chủ. Trong trường hợp này, main-db-server
  • Phần thứ hai - một giá trị chữ và số dài - là ID dự phòng cho bản sao lưu. Một ID dự phòng được sử dụng để nhận dạng duy nhất bất kỳ bản sao lưu nào của Barman. Trong trường hợp này, đó là 20151111T051954. Bạn sẽ cần ID dự phòng cho các bước tiếp theo
  • Thông tin thứ ba cho bạn biết khi nào sao lưu được thực hiện
  • Phần thứ tư là kích thước của bản sao lưu cơ bản (26,9 MB trong trường hợp này)
  • Phần thứ năm và cuối cùng của chuỗi cung cấp kích thước của bản lưu trữ WAL được sao lưu

Để xem thêm chi tiết về bản sao lưu, hãy thực hiện lệnh này bằng tên của máy chủ và ID dự phòng (20151111T051954 trong ví dụ của chúng tôi) từ lệnh trước:

barman show-backup main-db-server backup-id

Một bộ thông tin chi tiết sẽ được hiển thị:

OutputBackup 20151111T051954:
  Server Name            : main-db-server
  Status                 : DONE
  PostgreSQL Version     : 90405
  PGDATA directory       : /var/lib/pgsql/9.4/data

  Base backup information:
    Disk usage           : 26.9 MiB (26.9 MiB with WALs)
    Incremental size     : 26.9 MiB (-0.00%)
    Timeline             : 1
    Begin WAL            : 000000010000000000000002
    End WAL              : 000000010000000000000002
    WAL number           : 1
    WAL compression ratio: 99.84%
    Begin time           : 2015-11-11 05:19:44.438072-05:00
    End time             : 2015-11-11 05:19:46.839589-05:00
    Begin Offset         : 40
    End Offset           : 184
    Begin XLOG           : 0/2000028
    End XLOG             : 0/20000B8

  WAL information:
    No of files          : 0
    Disk usage           : 0 B
    Last available       : 000000010000000000000002

  Catalog information:
    Retention Policy     : VALID
    Previous Backup      : - (this is the oldest base backup)
    Next Backup          : - (this is the latest base backup)

Để xem chi tiết hơn để xem tệp nào sẽ được sao lưu, hãy chạy lệnh sau:

barman list-files main-db-server backup-id

Thao tác này sẽ cung cấp danh sách các bản sao lưu cơ bản và các tệp nhật ký WAL cần thiết để khôi phục từ bản sao lưu cụ thể đó.

Bước 9 - Lập lịch sao lưu

Lý tưởng nhất là các bản sao lưu của bạn sẽ tự động diễn ra theo lịch biểu.

Trong bước này, chúng tôi sẽ tự động sao lưu và chúng tôi sẽ bảo Barman thực hiện bảo trì trên các bản sao lưu để các tệp cũ hơn chính sách lưu giữ bị xóa. Để bật lập lịch, hãy chạy lệnh này làm barman người dùng trên barman-backup-server (chuyển sang người dùng này nếu cần):

crontab -e

Điều này sẽ mở ra crontab tệp cho người dùng barman. Chỉnh sửa tệp, thêm các dòng này, sau đó lưu và thoát:

cron

30 23 * * * /usr/bin/barman backup main-db-server
* * * * * /usr/bin/barman cron

Lệnh đầu tiên sẽ chạy một bản sao lưu đầy đủ của main-db-server mỗi đêm lúc 11:30 tối. (Nếu bạn đã sử dụng tên khác cho máy chủ trong /etc/barman.conf thay vào đó, hãy sử dụng tên đó.)

Lệnh thứ hai sẽ chạy mỗi phút và thực hiện các thao tác bảo trì trên cả hai tệp WAL và các tệp sao lưu cơ sở.

Bước 10 - Mô phỏng một "Thảm họa"

Bây giờ bạn sẽ thấy cách bạn có thể khôi phục từ bản sao lưu bạn vừa tạo. Để kiểm tra sự phục hồi, trước hết hãy mô phỏng một kịch bản "thảm họa" mà bạn đã mất một số dữ liệu.

Chúng tôi đang thả một bảng ở đây. Đừng làm điều này trên một cơ sở dữ liệu sản xuất!

Quay lại main-db-server giao diện điều khiển và chuyển sang người dùng postgres nếu nó chưa phải là người dùng hiện tại.

Bắt đầu psql tiện ích:

psql

Từ psql nhắc, thực hiện lệnh sau để chuyển ngữ cảnh cơ sở dữ liệu sang mytestdb:

\connect mytestdb;

Tiếp theo, liệt kê các bảng trong cơ sở dữ liệu:

\dt

Đầu ra sẽ hiển thị các bảng bạn đã tạo ở đầu hướng dẫn này:

Output            List of relations
 Schema |     Name     | Type  |  Owner
--------+--------------+-------+----------
 public | mytesttable1 | table | postgres
 public | mytesttable2 | table | postgres

Bây giờ, hãy chạy lệnh này để thả một trong các bảng:

drop table mytesttable2;

Nếu bây giờ bạn thực hiện \dt lệnh một lần nữa:

\dt

Bạn sẽ chỉ thấy rằng mytesttable1 vẫn còn.

Đây là loại tình huống mất dữ liệu mà bạn muốn khôi phục từ bản sao lưu. Trong trường hợp này, bạn sẽ khôi phục bản sao lưu sang một máy chủ riêng biệt: chế độ chờ-db-server.

Bước 11 - Khôi phục hoặc di chuyển đến máy chủ từ xa

Bạn có thể làm theo phần này để khôi phục bản sao lưu hoặc di chuyển bản sao lưu PostgreSQL mới nhất của bạn sang máy chủ mới.

Đi đến chế độ chờ-db-server.

Đầu tiên, dừng dịch vụ PostgreSQL là người dùng sudo. (Khởi động lại sẽ bị ngắt nếu bạn cố chạy phục hồi trong khi dịch vụ đang chạy.)

sudo systemctl stop postgresql-9.4.service

Khi dịch vụ dừng lại, hãy chuyển đến barman-backup-server. Chuyển sang người dùng barman nếu nó chưa phải là người dùng hiện tại.

Hãy tìm các chi tiết cho bản sao lưu mới nhất:

barman show-backup main-db-server latest

Output

Backup 20160114T173552:
  Server Name            : main-db-server
  Status                 : DONE
  PostgreSQL Version     : 90405
  PGDATA directory       : /var/lib/pgsql/9.4/data

  Base backup information:

. . .

    Begin time           : 2016-01-14 17:35:53.164222-05:00
    End time             : 2016-01-14 17:35:55.054673-05:00

Từ đầu ra, ghi lại ID sao lưu được in trên dòng đầu tiên (20160114T173552 ở trên). Nếu latest sao lưu có dữ liệu bạn muốn, bạn có thể sử dụng latest làm ID dự phòng.

Đồng thời kiểm tra thời điểm sao lưu được thực hiện, từ Begin time cánh đồng (2016-01-14 17:35:53.164222-05:00 ở trên).

Tiếp theo, chạy lệnh này để khôi phục bản sao lưu được chỉ định từ barman-backup-server đến chế độ chờ-db-server:

barman recover --target-time "Begin time"  --remote-ssh-command "ssh postgres@standby-db-server-ip"   main-db-server   backup-id   /var/lib/pgsql/9.4/data

Có khá nhiều tùy chọn, đối số và biến ở đây, vì vậy hãy giải thích chúng.

  • --target-time "Begin time": Sử dụng thời gian bắt đầu từ show-backup chỉ huy
  • --remote-ssh-command "ssh postgres@standby-db-server-ip": Sử dụng địa chỉ IP của chế độ chờ-db-server
  • main-db-server: Sử dụng tên của máy chủ cơ sở dữ liệu từ /etc/barman.conf tập tin
  • backup-id: Sử dụng ID dự phòng từ show-backup lệnh hoặc sử dụng latest nếu đó là cái bạn muốn
  • /var/lib/pgsql/9.4/data: Đường dẫn nơi bạn muốn sao lưu được khôi phục. Đường dẫn này sẽ trở thành thư mục dữ liệu mới cho Postgres trên máy chủ dự phòng. Ở đây, chúng tôi đã chọn thư mục dữ liệu mặc định cho Postgres trong CentOS. Đối với trường hợp sử dụng trong đời thực, hãy chọn đường dẫn thích hợp

Để khôi phục thành công hoạt động, bạn sẽ nhận được kết quả đầu ra như sau:

Output from Barman Recovery

Starting remote restore for server  main-db-server using backup backup-id
Destination directory: /var/lib/pgsql/9.4/data
Doing PITR. Recovery target time: Begin time
Copying the base backup.
Copying required WAL segments.
Generating recovery.conf
Identify dangerous settings in destination directory.

IMPORTANT
These settings have been modified to prevent data losses

postgresql.conf line 207: archive_command = false

Your PostgreSQL server has been successfully prepared for recovery!

Bây giờ chuyển sang chế độ chờ-db-server lại một lần nữa. Như người dùng sudo, khởi động dịch vụ PostgreSQL:

sudo systemctl start postgresql-9.4.service

Đó nên là nó!

Hãy xác minh rằng cơ sở dữ liệu của chúng tôi đã hết. Chuyển sang người dùng postgres và bắt đầu psql tiện ích:

sudo su - postgres

psql

Chuyển ngữ cảnh cơ sở dữ liệu sang mytestdb và liệt kê các bảng trong đó:

\connect mytestdb;

\dt

Output

            List of relations
 Schema |     Name     | Type  |  Owner   
--------+--------------+-------+----------
 public | mytesttable1 | table | postgres
 public | mytesttable2 | table | postgres
(2 rows)

Danh sách sẽ hiển thị hai bảng trong cơ sở dữ liệu. Nói cách khác, bạn vừa thu hồi bảng đã bị bỏ.

Tùy thuộc vào chiến lược khôi phục lớn hơn của bạn, bây giờ bạn có thể muốn chuyển sang chế độ chờ-db-serverhoặc bạn có thể muốn kiểm tra xem cơ sở dữ liệu đã khôi phục có đang hoạt động hay không và sau đó chạy lại phần này để khôi phục main-db-server.

Để khôi phục lại bất kỳ máy chủ nào khác, chỉ cần đảm bảo rằng bạn đã cài đặt PostgreSQL và thực hiện các kết nối thích hợp với máy chủ Barman, sau đó thực hiện theo phần này bằng địa chỉ IP của máy chủ khôi phục đích của bạn.

Phần kết luận

Trong hướng dẫn này, chúng ta đã thấy cách cài đặt và cấu hình Barman để sao lưu máy chủ PostgreSQL. Chúng tôi cũng đã tìm hiểu cách khôi phục hoặc di chuyển từ các bản sao lưu này.

Với sự cân nhắc cẩn thận, Barman có thể trở thành kho lưu trữ trung tâm cho tất cả các cơ sở dữ liệu PostgresSQL của bạn. Nó cung cấp một cơ chế sao lưu mạnh mẽ và một bộ lệnh đơn giản. Tuy nhiên, việc tạo bản sao lưu chỉ là một nửa câu chuyện. Bạn nên luôn xác thực bản sao lưu của mình bằng cách khôi phục chúng về một vị trí khác. Bài tập này nên được thực hiện định kỳ.

Một số câu hỏi để lắp Barman vào chiến lược dự phòng của bạn:

  • Có bao nhiêu trường hợp PostgreSQL sẽ được sao lưu?
  • Có đủ dung lượng ổ đĩa trên máy chủ Barman để lưu trữ tất cả các bản sao lưu cho một khoảng thời gian lưu giữ được chỉ định không? Làm thế nào bạn có thể giám sát máy chủ để sử dụng không gian?
  • Tất cả các bản sao lưu cho các máy chủ khác nhau có bắt đầu cùng một lúc hay chúng có thể được so le trong suốt giai đoạn ngoài giờ cao điểm? Bắt đầu sao lưu của tất cả các máy chủ cùng một lúc có thể đặt căng thẳng không cần thiết trên máy chủ Barman và mạng
  • Tốc độ mạng giữa máy chủ Barman và máy chủ Postgres có đáng tin cậy không?

Một điểm khác cần chú ý là Barman không thể sao lưu và khôi phục cơ sở dữ liệu cá nhân. Nó hoạt động trên cấp độ hệ thống tập tin và sử dụng một cách tiếp cận tất cả hoặc không có gì. Trong quá trình sao lưu, toàn bộ cá thể với tất cả các tệp dữ liệu của nó được sao lưu; khi khôi phục, tất cả các tệp đó đều được khôi phục. Tương tự, bạn không thể thực hiện sao lưu chỉ dữ liệu hoặc chỉ với dữ liệu Barman.

Do đó, chúng tôi khuyên bạn nên thiết kế chiến lược sao lưu của mình để nó sử dụng cả bản sao lưu hợp lý với pg_dump hoặc là pg_dumpall và sao lưu vật lý với Barman. Bằng cách đó, nếu bạn cần khôi phục cơ sở dữ liệu cá nhân một cách nhanh chóng, bạn có thể sử dụng pg_dump sao lưu. Để khôi phục điểm trong thời gian, hãy sử dụng bản sao lưu Barman.