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

Tạo thiết lập sao chép PostgreSQL trên Debian / Ubuntu

PostgreSQL có thể hoạt động riêng biệt trên nhiều máy có cùng cấu trúc dữ liệu, làm cho lớp bền vững của ứng dụng linh hoạt hơn và chuẩn bị cho một số trường hợp bất ngờ có thể ảnh hưởng đến tính liên tục của dịch vụ.

Ý tưởng đằng sau điều này là cải thiện thời gian phản hồi của hệ thống bằng cách phân phối các yêu cầu trong mạng "Round Robin" trong đó mỗi nút hiện diện là một cụm. Trong kiểu thiết lập này, việc xử lý yêu cầu nào sẽ không quan trọng vì phản hồi sẽ luôn giống nhau.

Trong blog này, chúng tôi sẽ giải thích cách sao chép một cụm PostgreSQL bằng cách sử dụng các công cụ được cung cấp trong cài đặt chương trình. Phiên bản được sử dụng là PostgreSQL 11.5, phiên bản ổn định hiện tại, thường khả dụng cho hệ điều hành Debian Buster. Đối với các ví dụ trong blog này, giả sử rằng bạn đã quen thuộc với Linux.

Chương trình PostgreSQL

Bên trong thư mục / usr / bin / là chương trình chịu trách nhiệm quản lý cụm.

# 1. Lists the files contained in the directory
# 2. Filters the elements that contain 'pg_' in the name
ls /usr/bin/ | grep pg_

Các hoạt động được thực hiện thông qua các chương trình này có thể được thực hiện tuần tự hoặc thậm chí kết hợp với các chương trình khác. Có thể chạy một khối các hoạt động này thông qua một lệnh duy nhất nhờ vào một chương trình Linux được tìm thấy trong cùng một thư mục, được gọi là make.

Để liệt kê các cụm hiện tại, hãy sử dụng chương trình pg_lsclusters. Bạn cũng có thể sử dụng make để chạy nó. Công việc của nó phụ thuộc vào một tệp có tên Makefile, tệp này cần nằm trong cùng thư mục nơi lệnh sẽ chạy.

# 1. The current directory is checked
pwd

# 2. Creates a directory
mkdir ~/Documents/Severalnines/

# 3. Enroute to the chosen directory
cd ~/Documents/Severalnines/

# 4. Create the file Makefile
touch Makefile

# 5. Open the file for editing

Định nghĩa của một khối được hiển thị bên dưới, có tên là ls và một chương trình duy nhất sẽ được chạy, pg_lsclusters.

# 1. Block name
ls:
# 2. Program to be executed
pg_lsclusters

Tệp Makefile có thể chứa nhiều khối và mỗi khối có thể chạy bao nhiêu chương trình tùy thích và thậm chí nhận các tham số. Điều bắt buộc là các dòng thuộc một khối thực thi phải chính xác, sử dụng các bảng để thụt lề thay vì khoảng trắng.

Việc sử dụng make để chạy chương trình pg_lsclusters được thực hiện bằng cách sử dụng lệnh make ls.

# 1. Executes pg_lsclusters
make ls

Kết quả thu được trong quá trình cài đặt PostgreSQL gần đây mang lại một cụm duy nhất được gọi là main, được phân bổ trên cổng 5432 của hệ điều hành. Khi chương trình pg_createcluster được sử dụng, một cổng mới được cấp phát cho cụm mới được tạo, có giá trị 5432 làm điểm bắt đầu, cho đến khi tìm thấy một cổng khác theo thứ tự tăng dần.

Ghi nhật ký phía trước (WAL)

Quy trình sao chép này bao gồm việc tạo bản sao lưu của một cụm làm việc đang tiếp tục nhận các bản cập nhật. Tuy nhiên, nếu điều này được thực hiện trên cùng một máy, nhiều lợi ích do kỹ thuật này mang lại sẽ bị mất.

Mở rộng hệ thống theo chiều ngang đảm bảo tính khả dụng của dịch vụ cao hơn, vì nếu có bất kỳ sự cố phần cứng nào xảy ra, điều đó sẽ không tạo ra nhiều khác biệt vì có những máy khác sẵn sàng đảm nhận khối lượng công việc.

WAL là thuật ngữ được sử dụng để đại diện cho một thuật toán phức tạp bên trong PostgreSQL đảm bảo tính toàn vẹn của các giao dịch được thực hiện trên hệ thống. Tuy nhiên, chỉ một cụm duy nhất phải có trách nhiệm truy cập nó với quyền ghi.

Kiến trúc hiện có ba loại cụm riêng biệt:

  1. Người phụ trách chính chịu trách nhiệm viết thư cho WAL;
  2. Một bản sao đã sẵn sàng để tiếp quản bài đăng chính;
  3. Các bản sao khác khác với nhiệm vụ đọc WAL.

Hoạt động ghi là bất kỳ hoạt động nào nhằm sửa đổi cấu trúc dữ liệu, bằng cách nhập các phần tử mới hoặc cập nhật và xóa các bản ghi hiện có.

Cấu hình Cụm PostgreSQL

Mỗi cụm có hai thư mục, một chứa các tệp cấu hình của nó và một thư mục khác chứa các nhật ký giao dịch. Chúng nằm trong / etc / postgresql / 11 / $ (cluster) và / var / lib / postgresql / 11 / $ (cluster), tương ứng (trong đó $ (cluster) là tên của cụm).

Tệp postgresql.conf được tạo ngay sau khi cụm được tạo bằng cách chạy chương trình pg_createcluster và các thuộc tính có thể được sửa đổi để tùy chỉnh cụm.

Bạn không nên chỉnh sửa trực tiếp tệp này vì nó chứa hầu hết các thuộc tính. Giá trị của chúng đã được ghi chú, có ký hiệu # ở đầu mỗi dòng và một số dòng khác được chú thích chứa hướng dẫn thay đổi giá trị thuộc tính.

Có thể thêm một tệp khác chứa các thay đổi mong muốn, chỉ cần chỉnh sửa một thuộc tính duy nhất có tên là include, thay thế giá trị mặc định #include =‘’ bằng include =‘postgresql.replication.conf’.

Trước khi bắt đầu cụm, bạn cần có tệp postgresql.replication.conf trong cùng thư mục nơi bạn tìm thấy tệp cấu hình gốc, được gọi là postgresql.conf.

# 1. Block name
create:
# 2. Creates the cluster
pg_createcluster 11 $(cluster) -- --data-checksums
# 3. Copies the file to the directory
cp postgresql.replication.conf /etc/postgresql/11/$(cluster)/
# 4. A value is assigned to the property
sed -i "s|^#include = ''|include = 'postgresql.replication.conf'|g" /etc/postgresql/11/$(cluster)/postgresql.conf

Việc sử dụng --data-checksums trong việc tạo cụm sẽ bổ sung mức độ toàn vẹn cao hơn cho dữ liệu, tốn một chút hiệu suất nhưng rất quan trọng để tránh hỏng các tệp khi được chuyển từ cụm này sang cụm khác.

Các thủ tục được mô tả ở trên có thể được sử dụng lại cho các cụm khác, chỉ cần chuyển một giá trị cho $ (cluster) làm tham số trong quá trình thực hiện chương trình.

# 1. Executes the block 'create' by passing a parameter
sudo make create cluster=primary

Bây giờ, tự động hóa ngắn gọn các tác vụ đã được thiết lập, những gì còn lại phải làm là định nghĩa tệp postgresql.replication.conf theo nhu cầu của từng cụm.

Sao chép trên PostgreSQL

Có thể có hai cách để sao chép một cụm, một cách hoàn chỉnh, cách khác liên quan đến toàn bộ cụm (được gọi là Sao chép trực tuyến) và một cách khác có thể một phần hoặc toàn bộ (được gọi là Sao chép lôgic).

Các cài đặt phải được chỉ định cho một cụm được chia thành bốn loại chính:

  • Máy chủ chính
  • Máy chủ dự phòng
  • Gửi Máy chủ
  • Người đăng ký

Như chúng ta đã thấy trước đó, WAL là một tệp chứa các giao dịch được thực hiện trên cụm và bản sao là việc truyền các tệp này từ cụm này sang cụm khác.

Bên trong cài đặt có trong tệp postgresql.conf, chúng ta có thể thấy các thuộc tính xác định hành vi của cụm liên quan đến tệp WAL, chẳng hạn như kích thước của các tệp đó.

# default values
max_wal_size = 1GB
min_wal_size = 80MB

Một thuộc tính quan trọng khác được gọi là max_wal_senders. Thuộc về một cụm có Máy chủ gửi đặc trưng, ​​là số lượng quy trình chịu trách nhiệm gửi các tệp này đến các cụm khác, phải luôn có giá trị lớn hơn số lượng cụm phụ thuộc vào việc nhận của chúng.

Tệp WAL có thể được lưu trữ để truyền đến một cụm kết nối muộn hoặc đã gặp một số vấn đề khi nhận nó và cần các tệp trước đó liên quan đến thời điểm hiện tại, có thuộc tính wal_keep_searies làm đặc tả cho bao nhiêu phân đoạn tệp WAL sẽ được duy trì bởi một cụm.

Vùng sao chép là một chức năng cho phép cụm lưu trữ các tệp WAL cần thiết để cung cấp cho một cụm khác với tất cả các bản ghi, có tùy chọn max_replication_slots làm thuộc tính của nó.

# default values
max_wal_senders = 10
wal_keep_segments = 0
max_replication_slots = 10

Khi có ý định thuê ngoài việc lưu trữ các tệp WAL này, có thể sử dụng một phương pháp khác để xử lý các tệp này, được gọi là Lưu trữ liên tục.

Lưu trữ Liên tục

Khái niệm này cho phép bạn hướng các tệp WAL đến một vị trí cụ thể, sử dụng chương trình Linux và hai biến đại diện cho đường dẫn của tệp và tên của nó, chẳng hạn như% p và% f, tương ứng.

Thuộc tính này bị tắt theo mặc định, nhưng việc sử dụng nó có thể dễ dàng thực hiện bằng cách rút trách nhiệm của một cụm khỏi việc lưu trữ các tệp quan trọng như vậy và có thể được thêm vào tệp postgresql.replication.conf.

# 1. Creates a directory
mkdir ~/Documents/Severalnines/Archiving

# 2. Implementation on postgresql.replication.conf
archive_mode = on
archive_command = 'cp %p ~/Documents/Severalnines/Archiving/%f'

# 3. Starts the cluster
sudo systemctl start [email protected]

Sau khi khởi tạo cụm, một số thuộc tính có thể cần được sửa đổi và có thể yêu cầu khởi động lại cụm. Tuy nhiên, một số thuộc tính chỉ có thể được tải lại mà không cần khởi động lại toàn bộ một cụm.

Thông tin về các chủ đề này có thể được lấy thông qua các nhận xét có trong tệp postgresql.conf, xuất hiện dưới dạng # (lưu ý:thay đổi yêu cầu khởi động lại).

Nếu đúng như vậy, một cách đơn giản để giải quyết là sử dụng chương trình Linux systemctl, được sử dụng trước đây để khởi động cụm, chỉ cần ghi đè tùy chọn khởi động lại.

Khi không cần khởi động lại hoàn toàn, bản thân cụm có thể gán lại thuộc tính của nó thông qua một truy vấn chạy bên trong chính nó, tuy nhiên, nếu nhiều cụm đang chạy trên cùng một máy, thì cụm đó sẽ được yêu cầu chuyển một tham số chứa giá trị cổng mà cụm được cấp phát trên hệ điều hành.

# Reload without restarting
sudo -H -u postgres psql -c ‘SELECT pg_reload_conf();’ -p 5433

Trong ví dụ trên, thuộc tính archive_mode yêu cầu khởi động lại, trong khi archive_command thì không. Sau phần giới thiệu ngắn gọn về chủ đề này, hãy xem cách một cụm sao có thể sao lưu các tệp WAL đã lưu trữ này bằng cách sử dụng Point In Time Recovery (PITR).

Phục hồi từng điểm trong thời gian sao chép PostgreSQL

Tên gợi ý này cho phép một cụm quay trở lại trạng thái của nó từ một khoảng thời gian nhất định. Điều này được thực hiện thông qua thuộc tính có tên recovery_target_timeline, thuộc tính này dự kiến ​​sẽ nhận được một giá trị ở định dạng ngày, chẳng hạn như 2019-08-22 12:05 GMT hoặc nhiệm vụ mới nhất, thông báo nhu cầu khôi phục cho đến bản ghi hiện có mới nhất.

Chương trình pg_basebackup khi nó chạy sẽ tạo một bản sao của thư mục chứa dữ liệu từ một cụm sang vị trí khác. Chương trình này có xu hướng nhận nhiều tham số, là một trong số chúng -R, tạo một tệp có tên recovery.conf trong thư mục được sao chép, do đó không giống với tệp chứa các tệp cấu hình khác đã thấy trước đó, chẳng hạn như postgresql.conf .

Tệp recovery.conf lưu trữ các tham số được truyền trong quá trình thực thi chương trình pg_basebackup và sự tồn tại của nó là điều cần thiết cho việc triển khai Streaming Replication, bởi vì hoạt động ngược lại với Continuous Archiving có thể được thực hiện.

# 1. Block name
replicate:
# 2. Removes the current data directory
rm -rf /var/lib/postgresql/11/$(replica)
# 3. Connects to primary cluster as user postgres
# 4. Copies the entire data directory
# 5. Creates the file recovery.conf
pg_basebackup -U postgres -d postgresql://localhost:$(primaryPort) -D /var/lib/postgresql/11/$(replica) -P -R
# 6. Inserts the restore_command property and its value
echo "restore_command = 'cp ~/Documents/Severalnines/Archiving/%f %p'" >> /var/lib/postgresql/11/$(replica)/recovery.conf
# 7. The same is done with recovery_target_timeline
echo "recovery_target_timeline = 'latest'" >> /var/lib/postgresql/11/$(replica)/recovery.conf

Khối sao chép được chỉ định ở trên cần được chạy bởi người dùng postgres của hệ điều hành, để tránh xung đột tiềm ẩn với ai là chủ sở hữu của dữ liệu cụm, postgres hoặc người dùng root.

Cụm bản sao vẫn đứng vững, dựa vào nó để bắt đầu sao chép thành công, có quá trình cụm bản sao được gọi là pg_walreceiver tương tác với cụm chính có tên pg_walsender qua kết nối TCP.

# 1. Executes the block ‘replicate’ by passing two parameters
sudo -H -u postgres make replicate replica=replica primaryPort=5433
# 2. Starts the cluster replica
sudo systemctl start [email protected]

Việc xác minh tình trạng của mô hình sao chép này, được gọi là Sao chép trực tuyến, được thực hiện bởi một truy vấn chạy trên cụm chính.

# 1. Checks the Streaming Replication created
sudo -H -u postgres psql -x -c ‘select * from pg_stat_replication;’ -p 5433

Kết luận

Trong blog này, chúng tôi đã chỉ ra cách thiết lập Sao chép luồng không đồng bộ giữa hai cụm PostgreSQL. Mặc dù vậy, hãy nhớ rằng các lỗ hổng bảo mật tồn tại trong đoạn mã trên, chẳng hạn như việc sử dụng người dùng postgres để thực hiện tác vụ như vậy không được khuyến khích.

Việc nhân rộng một cụm mang lại một số lợi ích khi nó được sử dụng theo cách chính xác và có thể dễ dàng truy cập vào các API tương tác với các cụm.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy không có mật khẩu được cung cấp lỗi

  2. Rails:Triển khai đến Heroku, Nhiều vấn đề

  3. Lỗi drop Rails + Postgres:cơ sở dữ liệu đang được người dùng khác truy cập

  4. Phân vùng sao chép hợp lý với PostgreSQL 13

  5. Trả lại các hàng từ INSERT với ON CONFLICT mà không cần cập nhật