Sao lưu postgresql gia tăng với pgbackrest - một khóa học dành cho chiến binh trẻ từ nhà phát triển

Tuyên bố từ chối trách nhiệm

Tôi là một nhà phát triển. Tôi viết mã và chỉ tương tác với cơ sở dữ liệu với tư cách là người dùng. Tôi không bao giờ giả vờ là một quản trị viên hệ thống, càng không phải là một dba. Nhưng…

Tình cờ là tôi cần tổ chức một bản sao lưu cơ sở dữ liệu postgresql. Không có đám mây - chỉ cần sử dụng SSH và đảm bảo mọi thứ hoạt động mà không yêu cầu tiền. Chúng ta phải làm gì trong những trường hợp như vậy? Đúng rồi, chúng ta đẩy pgdump vào cron, sao lưu mọi thứ vào kho lưu trữ hàng ngày và nếu mất hết thì chúng ta sẽ gửi kho lưu trữ này đi đâu đó rất xa.

Khó khăn lần này là theo kế hoạch, cơ sở dữ liệu phải tăng khoảng +- 100 MB mỗi ngày. Tất nhiên, sau một vài tuần, mong muốn sao lưu mọi thứ bằng pgdump sẽ biến mất. Đây là nơi các bản sao lưu gia tăng sẽ được giải cứu.

Hấp dẫn? Chào mừng đến với con mèo.

Sao lưu gia tăng là một loại sao lưu khi không phải tất cả các tệp nguồn đều được sao chép mà chỉ những tệp mới và những tệp được thay đổi kể từ khi tạo bản sao trước đó.

Giống như bất kỳ nhà phát triển nào TUYỆT ĐỐI không muốn (vào thời điểm đó) hiểu được sự phức tạp của postgres, tôi muốn tìm nút màu xanh lá cây. Bạn biết đấy, giống như trong AWS, DigitalOcean: bạn nhấn một nút - bạn có bản sao, bạn nhấn nút thứ hai - bạn thiết lập bản sao lưu, nút thứ ba - bạn khôi phục mọi thứ trở lại vài giờ. Tôi không tìm thấy nút hay công cụ GUI đẹp mắt nào. Nếu bạn biết một cái (miễn phí hoặc giá rẻ), hãy viết về nó trong phần bình luận.

Sau khi googling tôi tìm thấy hai công cụ pgbarman и tựa lưng pg. Đơn giản là tôi đã không thành công với cái đầu tiên (tài liệu rất thưa thớt, tôi đã cố gắng tìm hiểu mọi thứ theo hướng dẫn cũ), nhưng với cái thứ hai, tài liệu hóa ra ngang bằng, nhưng không phải không có sai sót. Để đơn giản hóa công việc của những người phải đối mặt với một nhiệm vụ tương tự, bài viết này đã được viết.

Sau khi đọc bài viết này, bạn sẽ tìm hiểu cách tạo các bản sao lưu gia tăng, lưu chúng vào máy chủ từ xa (kho lưu trữ có bản sao lưu) và khôi phục chúng trong trường hợp mất dữ liệu hoặc các sự cố khác trên máy chủ chính.

Đào tạo

Để sao chép hướng dẫn sử dụng, bạn sẽ cần hai VPS. Đầu tiên sẽ là bộ lưu trữ (kho lưu trữ các bản sao lưu) và thứ hai, trên thực tế, chính máy chủ có postgres (trong trường hợp của tôi là phiên bản 11 của postgres).

Giả sử rằng trên máy chủ có postgres bạn có root, người dùng sudo, người dùng postgres và chính postgres đã được cài đặt (người dùng postgres được tạo tự động khi cài đặt postgresql) và trên máy chủ kho lưu trữ có người dùng root và sudo (trong hướng dẫn sử dụng tên người dùng pgbackrest sẽ được sử dụng).

Để các bạn gặp ít khó khăn hơn khi sao chép hướng dẫn, mình viết chữ nghiêng Tôi đã thực hiện lệnh ở đâu, với người dùng nào và với quyền gì trong khi viết và kiểm tra bài viết.

Đang cài đặt pgbackrest

Kho lưu trữ (người dùng pgbackrest):

1. Tải xuống kho lưu trữ từ pgbackrest và chuyển nội dung của nó vào thư mục /build:

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. Cài đặt các phụ thuộc cần thiết cho việc lắp ráp:

sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev 
       libpq-dev

3. Lắp ráp pgbackrest:

cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src

4. Sao chép tệp thực thi vào thư mục /usr/bin:

sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest

5. PGbackrest yêu cầu Perl. Cài đặt:

sudo apt-get install perl

6. Tạo thư mục cho nhật ký, cấp cho chúng một số quyền nhất định:

sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

7. Kiểm tra:

pgbackrest version

Máy chủ Postgres (người dùng sudo hoặc root):

Quá trình cài đặt pgbackrest trên máy chủ có postgres tương tự như quá trình cài đặt trên kho lưu trữ (vâng, pgbackrest phải được cài đặt trên cả hai máy chủ), nhưng trong đoạn thứ 6, lệnh thứ hai và cuối cùng:

sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

thay bằng:

sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

Thiết lập tương tác giữa các máy chủ thông qua SSH không mật khẩu

Để pgbackrest hoạt động chính xác, cần phải định cấu hình tương tác giữa máy chủ postgres và kho lưu trữ bằng tệp khóa.

Kho lưu trữ (người dùng pgbackrest):

Tạo cặp khóa:

mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Cảnh báo! Chúng tôi chạy các lệnh trên mà không cần sudo.

Máy chủ Postgres (người dùng sudo hoặc root):

Tạo cặp khóa:

sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh
sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Kho lưu trữ (người dùng sudo):

Sao chép khóa chung của máy chủ postgres vào máy chủ kho lưu trữ:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

Ở bước này, bạn sẽ được yêu cầu nhập mật khẩu cho người dùng root. Bạn cần nhập mật khẩu của người dùng root của máy chủ postgres!

Máy chủ Postgres (người dùng sudo):

Sao chép khóa chung của kho lưu trữ vào máy chủ bằng postgres:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

Ở bước này, bạn sẽ được yêu cầu nhập mật khẩu cho người dùng root. Bạn cần nhập chính xác mật khẩu của người dùng root của kho lưu trữ!

Chúng tôi kiểm tra:

Kho lưu trữ (người dùng root, để đảm bảo tính thuần khiết của thử nghiệm):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Máy chủ Postgres (người dùng root, vì sự thuần khiết của thử nghiệm):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Chúng tôi đảm bảo rằng chúng tôi có được quyền truy cập mà không gặp vấn đề gì.

Thiết lập máy chủ postgres

Máy chủ Postgres (người dùng sudo hoặc root):

1. Hãy cho phép gõ vào máy chủ postgres từ các IP bên ngoài. Để làm điều này, hãy chỉnh sửa tập tin postgresql.conf (nằm trong thư mục /etc/postgresql/11/main), thêm dòng vào đó:

listen_addresses = '*'

Nếu một dòng như vậy đã tồn tại, hãy bỏ ghi chú hoặc đặt giá trị tham số là '*'.

Trong tập tin pg_hba.conf (cũng nằm trong thư mục /etc/postgresql/11/main) thêm các dòng sau:

hostssl  all  all  0.0.0.0/0  md5
host  all  all  0.0.0.0/0  md5

Trong đó:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Hãy thực hiện các cài đặt cần thiết trong postgresql.conf (nó nằm trong thư mục /etc/postgresql/11/main) để pgbackrest hoạt động:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Hãy thực hiện các cài đặt cần thiết trong tệp cấu hình pgbackrest (/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Tải lại postgresql:

sudo service postgresql restart

Thiết lập máy chủ kho lưu trữ

Kho lưu trữ (người dùng pgbackrest):

Hãy thực hiện các cài đặt cần thiết trong tệp cấu hình tựa lưng pg
(/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-host=<postgres_server_ip>
pg1-path=/var/lib/postgresql/11/main

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий - первые два будут удалены вместе с инкрементами. 
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Tạo một kho lưu trữ

Kho lưu trữ (người dùng pgbackrest):

Tạo bộ nhớ mới cho cụm chính:

sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create

Проверка

Máy chủ Postgres (người dùng sudo hoặc root):

Chúng tôi kiểm tra trên máy chủ postgres:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info check

Kho lưu trữ (người dùng pgbackrest):

Chúng tôi kiểm tra trên máy chủ kho lưu trữ:

sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check

Chúng tôi đảm bảo rằng ở đầu ra, chúng tôi thấy dòng “kiểm tra lệnh kết thúc: đã hoàn thành thành công”.

Mệt? Hãy chuyển sang phần thú vị nhất.

Đang tạo bản sao lưu

Kho lưu trữ (người dùng pgbackrest):

1. Thực hiện sao lưu:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Đảm bảo rằng bản sao lưu đã được tạo:

ls /var/lib/pgbackrest/backup/main/

PGbackrest sẽ tạo bản sao lưu đầy đủ đầu tiên. Nếu muốn, bạn có thể chạy lại lệnh sao lưu và đảm bảo rằng hệ thống tạo bản sao lưu gia tăng.

Nếu bạn muốn tạo lại bản sao lưu đầy đủ, hãy chỉ định một cờ bổ sung:

sudo -u pgbackrest pgbackrest --stanza=main --type=full backup

Nếu bạn muốn đầu ra bảng điều khiển chi tiết, thì hãy chỉ định:

sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup

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

Máy chủ Postgres (người dùng sudo hoặc root):

1. Dừng cluster đang chạy:

sudo pg_ctlcluster 11 main stop

2. Khôi phục từ bản sao lưu:

sudo -u postgres pgbackrest --stanza=main --delta restore

3. Khởi động cụm:

sudo pg_ctlcluster 11 main start

Sau khi khôi phục bản sao lưu, chúng ta cần thực hiện bản sao lưu thứ hai:

Kho lưu trữ (người dùng pgbackrest):

sudo pgbackrest --stanza=main backup

Đó là tất cả. Tóm lại, tôi muốn nhắc bạn rằng tôi không hề cố gắng giả vờ là một dba cấp cao và sẽ sử dụng đám mây khi có cơ hội nhỏ nhất. Hiện tại, bản thân tôi đang bắt đầu nghiên cứu nhiều chủ đề khác nhau như sao lưu, sao chép, giám sát, v.v. và tôi viết những báo cáo nhỏ về kết quả đạt được nhằm đóng góp một phần nhỏ cho cộng đồng và để lại cho mình những tấm cheat nhỏ.

Trong các bài viết sau, tôi sẽ cố gắng nói về các tính năng bổ sung - khôi phục dữ liệu vào một cụm sạch, mã hóa các bản sao lưu và xuất bản lên S3, sao lưu qua rsync.

Nguồn: www.habr.com

Thêm một lời nhận xét