Thứ tư, 20/01/2016 | 00:00 GMT+7

Cách sao lưu, khôi phục và di chuyển cơ sở dữ liệu PostgreSQL với Barman trên CentOS 7

PostgreSQL là một nền tảng database open-souce khá phổ biến với các nhà phát triển ứng dụng web và di động vì dễ bảo trì, tiết kiệm chi phí và tích hợp đơn giản với các công nghệ open-souce khác.

Một nhiệm vụ quan trọng của việc duy trì môi trường PostgreSQL là sao lưu database của nó thường xuyên. Bản sao lưu là một phần của quy trình Khôi phục sau thảm họa (DR) cho bất kỳ tổ chức nào. Điều này quan trọng vì một số 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ơ bản như bộ nhớ hoặc chính server
  • Bảo vệ chống lại sự hỏng dữ liệu và mất dữ liệu không mong muốn hoặc độc hại
  • Di chuyển database production sang môi trường phát triển hoặc thử nghiệm

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

Trong hướng dẫn này, bạn sẽ cài đặt server sao lưu Barman, tạo bản sao lưu từ server database chính và khôi phục về server dự phòng.

Giới thiệu ngắn gọn về các phương pháp sao lưu PostgreSQL

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

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

  • Sao lưu lôgic
  • Sao lưu vật lý

Các bản sao lưu logic giống như ảnh chụp nhanh của database . Chúng được tạo bằng cách sử dụng trình pg_dump hoặc pg_dumpall đi kèm với PostgreSQL. Sao lưu lôgic:

  • Sao lưu database riêng lẻ hoặc tất cả database
  • Chỉ sao lưu các schemas , chỉ dữ liệu, các bảng riêng lẻ hoặc toàn bộ database (lược đồ và dữ liệu)
  • Tạo file sao lưu ở định dạng binary độ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 trình pg_restore cũng đi kèm với PostgreSQL
  • Không cung cấp khôi phục tại thời điểm (PITR)

Điều này nghĩa là nếu bạn tạo một bản sao lưu hợp lý cho (các) database của bạn vào lúc 2:00 sáng, khi bạn khôi phục từ đó, database được khôi phục sẽ giống như 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ể, chẳng hạn như 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ó giá trị tám giờ.

Sao lưu vật lý khác với sao lưu lôgic vì chúng chỉ xử lý với định dạng binary và thực hiện sao lưu cấp file . Sao lưu vật lý:

  • Cung cấp phục hồi tại thời điểm
  • Sao lưu nội dung của thư mục dữ liệu PostgreSQL và file WAL (Write Ahead Log)
  • Lấy dung lượng ổ đĩa lớn hơn
  • Sử dụng các lệnh PostgreSQL pg_start_backuppg_stop_backup . Tuy nhiên, các lệnh này cần phải được viết theo tập lệnh, điều này làm cho quá trình sao lưu vật lý trở nên phức tạp hơn
  • Không sao lưu các database , schemas riêng lẻ, v.v. Đó là cách tiếp cận tất cả hoặc không có gì

Tệp WAL chứa danh sách các giao dịch (CHÈN, CẬP NHẬT hoặc XÓA) xảy ra với database . Các file database thực tế có chứa dữ liệu được đặt trong folder dữ liệu. Vì vậy, khi nói đến việc khôi phục tại một thời điểm từ bản sao lưu vật lý, PostgreSQL sẽ khôi phục nội dung của folder dữ liệu trước, sau đó phát các giao dịch trên đó từ các file WAL.Điều này đưa database về trạng thái nhất quán trong thời gian.

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

Theo truyền thống, các DBA PostgreSQL sẽ viết các tập lệnh sao lưu của riêng họ và các cron việc cron lên lịch để thực hiện các bả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 hay Backup and Recovery Manager là một công cụ sao lưu PostgreSQL open-souce miễn phí từ 2ndQuadrant - một công ty cung cấp giải pháp Postgres chuyên nghiệp. Barman được viết bằng Python và cung cấp một phương pháp sao lưu và phục hồi vật lý đơn giản, trực quan cho version PostgreSQL của bạn. Một số lợi ích của việc sử dụng Barman là:

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

Bàn thắng

Trong hướng dẫn này, ta sẽ tạo ba server DigitalOcean, cài đặt PostgreSQL 9.4 trên hai trong số các máy này và cài đặt Barman trên máy thứ ba.

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

Server Barman sẽ giao tiếp với server database chính và thực hiện sao lưu vật lý và lưu trữ WAL.

Sau đó, ta sẽ mô phỏng một “thảm họa” bằng cách xóa một bảng khỏi database trực tiếp của ta .

Cuối cùng, ta sẽ khôi phục cá thể PostgreSQL đã sao lưu từ server Barman sang server dự phòng.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần tạo ba server DigitalOcean (hoặc server Linux của bạn ), mỗi server có ít nhất 2 GB RAM và 2 lõi CPU. Ta sẽ không đi vào chi tiết của việc tạo Server; bạn có thể tìm thêm thông tin ở đây .

Tất cả ba server phải có cùng một hệ điều hành ( CentOS 7 x64 bit).

Ta sẽ đặt tên cho các máy như sau:

  • main-db-server ( ta sẽ biểu thị địa chỉ IP của nó là main-db-server-ip )
  • standby-db-server ( ta sẽ biểu thị địa chỉ IP của nó là standby-db-server-ip )
  • barman-backup-server ( ta sẽ ký hiệu địa chỉ IP của nó là barman-backup-server-ip )

Địa chỉ IP thực của các máy có thể được tìm thấy từ console DigitalOcean.

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

Lưu ý: Hướng dẫn này sẽ sử dụng folder 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 nghị tốt nhất nên 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 thước database của bạn và số lượng version được sao lưu, bạn nên kiểm tra xem có đủ dung lượng trong hệ thống file lưu trữ folder này 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 server production .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 version PostgreSQL. Làm như vậy trong một môi trường trực tiếp mà không có kế hoạch và ủy quyền thích hợp sẽ nghĩa là ứng dụng của bạn ngừng hoạt động.

Bước 1 - Cài đặt Server Database PostgreSQL

Trước tiên, ta sẽ cài đặt môi trường database của bạn bằng cách cài đặt PostgreSQL 9.4 trên máy chủ chính-db và server db- dự phòng .

Vui lòng hoàn thành 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 cần :

  • Làm theo phần Bước một - Cài đặt PostgreSQL
  • Làm theo phần Bước hai - Cấu hình PostgreSQL

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

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

Điều này cấu hình PostgreSQL để chấp nhận bất kỳ kết nối nào đến từ server Barman.

Phần còn lại của các hướng dẫn trong phần đó có thể được thực hiện theo nguyên trạng.

Lưu ý: Việc cài đặt PostgreSQL sẽ tạo một user hệ điều hành được gọi là postgres trên server database . Tài khoản này không có password ; bạn sẽ chuyển sang nó từ user sudo của bạn.

Đảm bảo rằng bạn đã cài đặt PostgreSQL trên cả main-db-serverstandby-db-server , đồng thời bạn đã cho phép truy cập vào cả hai từ barman-backup-server .

Tiếp theo, ta sẽ thêm một số dữ liệu mẫu vào server database chính.

Bước 2 - Tạo bảng và database PostgreSQL

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

Trên máy chủ main-db , chuyển sang postgres của user :

  • sudo su - postgres

Khởi động tiện ích psql để truy cập server database :

  • psql

Từ dấu nhắc psql , hãy chạy các lệnh sau để tạo database và chuyển sang database đó:

  • CREATE DATABASE mytestdb;
  • \connect mytestdb;

Một thông báo kết quả sẽ cho bạn biết rằng bạn hiện đã kết nối với database mytestdb dưới dạng postgres user .

Tiếp theo, thêm hai bảng trong database :

  • CREATE TABLE mytesttable1 (id integer NULL);
  • CREATE TABLE mytesttable2 (id integer NULL);

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

Thoát khỏi công cụ khách bằng lệnh \q và nhấn ENTER .

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

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

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

Để thực hiện việc này, trước tiên bạn cần cài đặt các repository sau:

  • Gói bổ sung cho repository Enterprise Linux (EPEL)
  • Kho lưu trữ RPM của Group Phát triển Global PostgreSQL

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

  • sudo yum -y install epel-release

Chạy các lệnh sau để 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

Lưu ý: Việc cài đặt Barman sẽ tạo ra một user hệ điều hành được gọi là barman . Tài khoản này không có password ; bạn có thể chuyển sang user này từ account user sudo của bạn .

Barman đã được cài đặt! Bây giờ, hãy đảm bảo các server 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 server

Trong phần này, ta sẽ cài đặt SSH key cho kết nối không password an toàn giữa máy chủ chính-db- server server barman-sao lưu và ngược lại.

Tương tự như vậy, ta sẽ cài đặt các SSH key giữa server standby-db và server barman-backup-server và ngược lại.

Điều này nhằm đảm bảo PostgreSQL (trên cả hai server database ) và Barman có thể “nói chuyện” với nhau trong quá trình sao lưu và khôi phục.

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

  • User postgres có thể kết nối từ xa từ main-db-server đến barman-backup-server
  • User postgres có thể kết nối từ xa từ standby-db-server tới barman-backup-server
  • User barman có thể kết nối từ xa từ barman-backup-server đến main-db-server
  • Tài barman có thể kết nối từ xa từ các barman-backup-server để chờ-db-server

Ta sẽ không đi vào chi tiết cách thức hoạt động của SSH. Có một bài viết rất hay trên DigitalOcean về các yếu tố cần thiết của SSH mà bạn có thể tham khảo.

Tuy nhiên, tất cả các lệnh bạn cần đều có ở đây.

Ta sẽ chỉ cho bạn cách thực hiện việc này một lần để cài đặt kết nối cho postgres user kết nối từ main-db-server đến barman-backup-server .

Từ máy chủ main-db , hãy chuyển sang postgres của user nếu đó không phải là user hiện tại:

  • sudo su - postgres

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

  • ssh-keygen -t rsa

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

Nhấn ENTER hai lần để tạo private key mà không cần bất kỳ passphrase (password bảo vệ) nào.

Sau khi các khóa được tạo, sẽ có một .ssh được tạo trong .ssh của user postgres , với các khóa trong đó.

Đến đây bạn cần sao chép public key SSH vào file authorized_keys quyền_key trong .ssh của user barman trên server barman-backup-server .

Lưu ý: Rất tiếc, bạn không thể sử dụng lệnh ssh-copy-id barman@ barman-backup-server-ip tại đây. Đó là bởi vì lệnh này sẽ yêu cầu password của user barman , password này không được đặt theo mặc định. Do đó, bạn cần phải sao chép nội dung public key theo cách thủ công.

Chạy lệnh sau để xuất nội dung public key của user postgres :

  • cat ~/.ssh/id_rsa.pub

Sao chép nội dung của kết quả .

Chuyển sang console được kết nối với máy chủ barman-backup- server và chuyển sang barman user :

  • sudo su - barman

Chạy các lệnh sau để tạo .ssh , đặt quyền của nó, sao chép nội dung public key vào file authorized_keys quyền_key và cuối cùng làm cho file đó có thể đọ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 public key dài bắt đầu bằng ssh-rsa giữa dấu ngoặc kép, thay vì public_key_string .

Bạn đã sao chép khóa vào server từ xa.

Bây giờ, để kiểm tra kết nối, hãy chuyển trở lại máy chủ main-db và kiểm tra kết nối từ đó:

  • ssh barman@barman-backup-server-ip

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

  • exit

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

  • Chạy lại các lệnh tương tự, lần này từ server standby-db đến server barman-backup-server
  • Chạy chúng lần thứ ba, lần này bắt nguồn từ user barman trên server barman-backup- và chuyển đến user postgres trên máy chủ chính-db
  • Cuối cùng, chạy các lệnh để sao chép khóa từ user barman trên barman-backup-server sang user postgres trên standby-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ừ standby-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

Lưu ý: Đảm bảo kết nối SSH giữa cả ba server là một yêu cầu để các bản sao lưu hoạt động.

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

Đến đây bạn sẽ cấu hình Barman để sao lưu server PostgreSQL chính của bạn .

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

Dấu chấm phẩy ( ; ) ở đầu dòng nghĩa là dòng đó được comment . Giống như với hầu hết các ứng dụng dựa trên Linux, tham số cấu hình được chú thích 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 trong những tham số như vậy là configuration_files_directory , có giá trị mặc định là /etc/barman.d . Điều này nghĩa là , khi được bật, Barman sẽ sử dụng các file .conf trong folder đó cho các cấu hình sao lưu khác nhau của server Postgres. Nếu bạn thấy file chính quá dài, hãy tạo các file riêng biệt cho từng server mà bạn muốn sao lưu.

Vì mục đích đơn giản trong hướng dẫn này, ta sẽ đưa mọi thứ vào file cấu hình mặc định.

Mở /etc/barman.conf trong editor với quyền là user sudo của bạn ( user barman chỉ có quyền đọc đối với nó):

  • sudo vi /etc/barman.conf

Các tham số toàn cục được xác định trong phần [barman] . Trong phần này, hãy áp dụng các thay đổi sau. Các giá trị đã hoàn thành được hiển thị bên dưới các dấu đầu dòng:

  • Bỏ comment để compression và giữ giá trị mặc định của gzip. Điều này nghĩa là các file PostgreSQL WAL - khi được sao chép trong folder sao lưu - sẽ được lưu ở dạng nén gzip
  • Bỏ comment cho reuse_backup và giữ giá trị mặc định của link . Khi tạo các bản sao lưu đầy đủ của server PostgreSQL, Barman sẽ cố gắng tiết kiệm dung lượng trong folder sao lưu bằng cách tạo các bản sao lưu gia tăng ở cấp độ file . Đ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 khử trùng lặp dữ liệu nào: tiết kiệm thời gian và dung lượng đĩa
  • Bỏ comment cho điểm kiểm tra immediate_checkpoint và đặt giá trị của nó thành true . Cài đặt tham số này đảm bảo 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ớ đệm của PostgreSQL đều được ghi vào các file dữ liệu. Từ góc độ sao lưu, điều này có thể thêm một số giá trị vì BARMAN sẽ có thể sao lưu những thay đổi dữ liệu mới nhất
  • Bỏ comment cho basebackup_retry_times và đặt giá trị là 3 . Khi tạo bản sao lưu đầy đủ, Barman sẽ cố gắng kết nối với server PostgreSQL ba lần nếu thao tác sao chép không thành công vì lý do nào đó
  • Bỏ comment cho basebackup_retry_sleep và giữ giá trị mặc định là 30 . Sẽ có độ trễ 30 giây giữa mỗi lần thử lại
  • Bỏ comment 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 chính xác như sau:

Trích từ /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ì ta đang làm ở đây là:

  • Giữ vị trí sao lưu mặc định
  • Chỉ định rằng không gian sao lưu sẽ được lưu. Nhật ký 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 bản sao lưu đầy đủ không thành công giữa chừng vì lý do nào đó
  • Tuổi của bản sao lưu đầy đủ cuối cùng cho server PostgreSQL không được cũ hơn 1 ngày

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

Phần này chứa thông tin kết nối cho server database 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:

Trích từ /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 nghĩa là Barman sẽ overrides lên file sao lưu đầy đủ già và WAL đăng nhập tự động, trong khi vẫn giữ đủ các bản sao lưu cho một cửa sổ thu hồi 7 ngày. Điều đó nghĩa là ta có thể khôi phục toàn bộ server database vào bất kỳ thời điểm nào trong bảy ngày qua. Đối với hệ thống production , bạn có thể nên đặt giá trị này cao hơn để có sẵn các bản sao lưu cũ hơn.

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

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

Trích từ /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 file .

Tiếp theo, ta sẽ đảm bảo main-db-server của ta đượ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 máy chủ main-db , để bật chế độ sao lưu (hoặc lưu trữ).

Đầu tiên, ta cần xác định giá trị của folder sao lưu đến từ barman-backup-server . Trên server Barman, chuyển sang barman user :

  • sudo su - barman

Chạy lệnh này để định vị folder sao lưu đến:

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

Điều này sẽ xuất ra thông tin như thế này:

barman show-server command output
incoming_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 console server main-db .

Chuyển sang postgres của user nếu đó không phải là user hiện tại.

Mở file postgresql.conf trong editor :

  • vi $PGDATA/postgresql.conf

áp dụng các thay đổi sau đối với file :

  • Bỏ ghi chú tham số wal_level và đặt giá trị của nó thành archive thay vì minimal
  • Bỏ ghi chú tham số archive_mode và đặt giá trị của nó thành on thay vì off
  • Bỏ ghi chú tham số 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 server Barman. Nếu bạn có một giá trị khác cho incoming_wals_directory , hãy sử dụng giá trị đó để thay thế
Trích từ 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 trở lại user sudo của bạn.

Khởi động lại PostgreSQL:

  • sudo systemctl restart postgresql-9.4.service

Lưu ý: Nếu bạn đang cấu hình version PostgreSQL production hiện có, thì rất có thể ba thông số này đã được cài đặt . Sau đó, bạn sẽ chỉ phải thêm / sửa đổi tham số archive_command để PostgreSQL gửi các file WAL của nó đến server sao lưu.

Bước 7 - Kiểm tra Barman

Bây giờ là lúc để kiểm tra xem Barman đã đặt đúng tất cả các cấu hình và có thể kết nối với máy chủ chính-db hay không .

Trên barman-backup-server , chuyển sang barman user nếu đó không phải là user hiện tại. Chạy lệnh sau để kiểm tra kết nối với server database chính của bạn:

  • barman check main-db-server

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

Nếu mọi thứ đều ổn, kết quả sẽ như sau:

barman check command output
Server 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ề trạng thái tuổi tối đa của bản sao lưu FAILED . Điều này xảy ra vì ta đã cấu hình Barman để 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 nên việc kiểm tra không thành công.

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

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

Để có danh sách các server 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ẽ hiển thị:

Đầu ra
main-db-server - Main DB Server

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

Đến đây bạn đã có Barman sẵn sàng, hãy tạo một bản sao lưu theo cách thủ công.

Chạy lệnh sau với quyền là user barman trên barman-backup-server để tạo bản sao lưu đầu tiên của bạn:

  • barman backup main-db-server

, giá trị main-db-server là giá trị bạn đã nhập với quyền là người đứng đầu khối server trong file /etc/barman.conf ở Bước 5.

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

Đầu ra
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í file 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 folder /var/lib/barman :

  • ls -l /var/lib/barman

Ở đó sẽ có một folder : main-db-server . Đó là server mà Barman hiện đã được cấu hình để sao lưu và các bản sao lưu của nó nằm ở đó. (Nếu bạn cấu hình Barman để sao lưu các server khác, sẽ có một folder được tạo trên mỗi server .) Trong folder main-db-server , sẽ có ba folder con:

  • base : Đây là nơi lưu các file sao lưu cơ sở
  • incoming : PostgreSQL gửi các file WAL hoàn chỉnh của nó đến folder này để lưu trữ
  • wals : bản Barman các nội dung của incoming folder vào wals folder

Trong quá trình khôi phục, Barman sẽ khôi phục nội dung từ folder base vào folder dữ liệu của server đích. Sau đó, nó sẽ sử dụng các file từ folder wals để áp dụng các thay đổi giao dịch và đưa server đích về 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 server . Lệnh đó là barman list-backup . Chạy lệnh sau để xem nó trả về những gì cho main-db-server của ta :

barman list-backup main-db-server
Output
main-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 kết quả là tên của server . 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. ID dự phòng được sử dụng để xác định duy nhất bất kỳ bản sao lưu nào mà Barman thực hiện. Trong trường hợp này, đó là 20151111T051954 . Bạn cần ID dự phòng cho các bước tiếp theo
  • Phần 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ơ sở (26,9 MB trong trường hợp này)
  • Phần thứ năm và phần cuối cùng của chuỗi cung cấp kích thước của repository WAL được sao lưu

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

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

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

Output
Backup 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 những file nào được đưa vào bản 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 file log WAL và sao lưu cơ sở 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à việc sao lưu của bạn nên diễn ra tự động theo lịch trình.

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

  • crontab -e

Điều này sẽ mở một crontab file cho barman user . Chỉnh sửa file , 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 máy chủ main-db-server mỗi đêm lúc 11:30 PM. (Nếu bạn đã sử dụng tên khác cho server trong file /etc/barman.conf , hãy sử dụng tên đó thay thế.)

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

Bước 10 - Mô phỏng “Thảm họa”

Đến đây 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 việc khôi phục, trước tiên ta hãy mô phỏng một tình huống "thảm họa" trong đó bạn bị mất một số dữ liệu.

Ta đang bỏ một cái bàn ở đây. Đừng làm điều này trên database production !

Quay lại console main-db-server và chuyển sang postgres của user nếu đó chưa phải là user hiện tại.

Khởi động tiện ích psql :

  • psql

Từ dấu nhắc psql , hãy thực hiện lệnh sau để chuyển ngữ cảnh database sang mytestdb :

  • \connect mytestdb;

Tiếp theo, liệt kê các bảng trong database :

  • \dt

Kết quả kết quả 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ờ, 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 lại lệnh \dt :

  • \dt

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

Đâ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 vào một server riêng biệt: server db-dự phòng .

Bước 11 - Khôi phục hoặc di chuyển sang server 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ột server mới.

Chuyển đến server db-standby .

Đầu tiên, hãy dừng dịch vụ PostgreSQL với quyền là user sudo. (Khởi động lại sẽ bị nghẹt nếu bạn cố gắng chạy khôi phục trong khi dịch vụ đang chạy.)

  • sudo systemctl stop postgresql-9.4.service

Khi dịch vụ dừng, hãy chuyển đến barman-backup-server . Chuyển sang barman dùng nếu nó chưa được user hiện hành.

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
Đầu ra
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ừ kết quả , ghi lại ID dự phòng được in trên dòng đầu tiên ( 20160114T173552 ở trên). Nếu latest sao lưu latest có dữ liệu bạn muốn, bạn có thể sử dụng latest làm ID sao lưu.

Cũng kiểm tra thời điểm sao lưu được thực hiện, từ trường Begin time ( 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 sang standby-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ừ lệnh show-backup
  • --remote-ssh-command "ssh postgres@ standby-db-server-ip " : Sử dụng địa chỉ IP của standby-db-server
  • main-db-server : Sử dụng tên của server database từ file /etc/barman.conf của bạn
  • backup-id : Sử dụng ID dự phòng từ lệnh show-backup hoặc sử dụng latest nếu đó là ID bạn muốn
  • /var/lib/pgsql/9.4/data : Đường dẫn bạn muốn khôi phục bản sao lưu. Đường dẫn này sẽ trở thành folder dữ liệu mới cho Postgres trên server dự phòng. Ở đây, ta đã chọn folder dữ liệu mặc định cho Postgres trong CentOS. Đối với các trường hợp sử dụng thực tế, hãy chọn đường dẫn thích hợp

Đối với một hoạt động khôi phục thành công, bạn sẽ nhận được kết quả như sau:

Đầu ra từ 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ờ lại chuyển sang console server db-standby . Với quyền là user sudo , hãy khởi động dịch vụ PostgreSQL:

  • sudo systemctl start postgresql-9.4.service

Đó phải là nó!

Hãy xác minh database của ta đã hoạt động. Chuyển sang postgres của user và khởi động tiện ích psql :

  • sudo su - postgres
  • psql

Chuyển ngữ cảnh database sang mytestdb và liệt kê các bảng trong đó:

  • \connect mytestdb;
  • \dt
Đầu ra
            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 database . Nói cách khác, bạn vừa khôi phục được bảng bị rơi.

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ể cần chuyển sang server db-dự phòng hoặc bạn có thể cần kiểm tra xem database được khôi phục có hoạt động không, sau đó chạy lại phần này để khôi phục về main-db- server .

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

Kết luận

Trong hướng dẫn này, ta đã biết cách cài đặt và cấu hình Barman để sao lưu server PostgreSQL. Ta cũng đã học 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 kỹ , Barman có thể trở thành repository trung tâm cho tất cả các database 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, tạo bản sao lưu chỉ là một nửa câu chuyện. Bạn phải luôn xác thực các bản sao lưu của bạn bằng cách khôi phục chúng vào 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 để đưa Barman vào chiến lược dự phòng của bạn:

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

Một điểm cần lưu ý nữa là Barman không thể sao lưu và khôi phục các database riêng lẻ. Nó hoạt động ở level độ hệ thống file và sử dụng 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ộ version với tất cả các file dữ liệu của nó được sao lưu; khi khôi phục, tất cả các file đó được khôi phục. Tương tự, bạn không thể thực hiện sao lưu chỉ schemas hoặc chỉ dữ liệu với Barman.

Do đó, ta khuyên bạn nên thiết kế chiến lược sao lưu của bạn để nó sử dụng cả các bản sao lưu hợp lý với pg_dump hoặc pg_dumpall và sao lưu vật lý với Barman. Bằng cách đó, nếu bạn cần nhanh chóng khôi phục các database riêng lẻ, bạn có thể sử dụng bản sao lưu pg_dump . Để khôi phục tại thời điểm, hãy sử dụng sao lưu Barman.


Tags:

Các tin trước

how-to-install-and-use-postgresql-9-4-on-debian-8 2015-06-11
Cách sử dụng PostgreSQL với Ứng dụng Django của bạn trên Ubuntu 14.04 2015-03-25
Cách sử dụng PostgreSQL với Ứng dụng Django của bạn trên CentOS 7 2015-03-25
Cách sử dụng PostgreSQL với ứng dụng Ruby on Rails của bạn trên Ubuntu 14.04 2015-03-18
Cách sử dụng PostgreSQL với ứng dụng Ruby on Rails của bạn trên CentOS 7 2015-03-18
Cách cài đặt và sử dụng PostgreSQL trên Ubuntu 14.04 2014-04-28
Cách cài đặt và sử dụng Zope 2 và PostgreSQL trên Ubuntu 13.10 2014-03-25
Cách mở rộng quy mô theo chiều ngang một ứng dụng Laravel 4 với cơ sở dữ liệu PostgreSQL 2014-02-27
Mở rộng quy mô Ruby on Rails: Thiết lập một server PostgreSQL chuyên dụng (Phần 3) 2014-02-27
Cách thiết lập bản sao Master Slave trên PostgreSQL trên VPS Ubuntu 12.04 2013-10-29