Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Cơ Sở Dữ Liệu

Giải Thích PostgreSQL Replication: High Availability & Disaster Recovery

Với replication, bạn sao chép dữ liệu từ một database server, gọi là source, sang server khác, gọi là replica. Replication là tính năng database mạnh mẽ, cung cấp high availability và hỗ trợ disaster recovery.

Giới thiệu

Bạn cũng có thể tạo replica server để dùng cho mục đích test và báo cáo, giảm tải cho production Online Transactional Processing (OLTP) databases. Bài viết này giúp bạn hiểu các loại replication khác nhau trong PostgreSQL® và các bước cần thiết để triển khai streaming replication của database PostgreSQL.

Chi tiết Replication

Bây giờ, đã đến lúc hiểu các replication mode, model, và loại replication trong PostgreSQL cũng như học về write-ahead logging.

Chế độ Asynchronous và Synchronous

Sơ đồ sau hiển thị các mode của PostgreSQL replication:

Giải Thích PostgreSQL Replication: High Availability & Disaster Recovery

Trong replication asynchronous, source server không cần chờ acknowledgment hoàn thành transaction từ replica server. Các transaction replication xếp hàng trên replica server, và hai server có thể out-of-sync trong một thời gian xác định cho đến khi xử lý hoàn tất.

Trong mode replication synchronous, source server chờ acknowledgment từ replica server, hoặc các server, rằng mỗi replication transaction hoàn tất trước khi tiếp tục. Cả source và replica server phải available mọi lúc. Nếu nhận được message transaction-failed từ replica, thì source server rollback transaction đó. Trong mode replication này, source và replica server luôn in sync. Nhược điểm là nếu replica server down hoặc không thể hoàn thành transaction, source server chuyển sang trạng thái hung.

Mô hình Replication Single- và Multi-source

Với replication Single-source, bạn chỉ có một source server và một hoặc nhiều replica server. Source gửi replication transaction đến tất cả replica.

Replica server chỉ có thể chấp nhận thay đổi từ source server. Nếu chúng nhận thay đổi từ non-source server, replica không replicate những transaction đó về source.

Trong replication Multi-source, bạn có nhiều hơn một source server. Nếu một table row thay đổi trên một source database, source server đó replicate thay đổi đến counterpart table rows trên các source server khác. Để model này thành công, bạn cần dùng conflict resolution schemes để ngăn chặn duplicate primary keys và các vấn đề khác.

Các loại Replication

Có ba loại replication:

  • Streaming Replication: PostgreSQL cung cấp loại này từ phiên bản 9 trở lên. Replica có sẵn cho chạy read-only select queries. Yêu cầu chính là source và replica database phải cùng major version.
  • Cascading replication: Được giới thiệu trong PostgreSQL 9.2, loại replication này cho phép bạn replicate từ standby server thay vì trực tiếp từ source server. Điều này có thể giảm tải cho source server.
  • Logical replication: Bạn có thể dùng loại này để replicate một tập dữ liệu hoặc database object được chọn, hoặc replicate giữa các major version PostgreSQL khác nhau. Trong logical replication, bạn có thể dùng standby server cho writes, nhưng nó có một số hạn chế. Nó không thể replicate Truncate, large objects như (lob, blob, clob), sequences, schemas, và DDL.

Write-Ahead Logging

Trước khi bắt đầu dùng streaming replication, bạn nên hiểu write-ahead logging (WAL) và cách nó hoạt động.

Trong PostgreSQL, hệ thống trước tiên lưu mọi thay đổi làm cho database trong một log file trước khi lưu chúng trong data file, và các thay đổi này gọi là WAL records. Mọi WAL record có một số duy nhất gọi là log sequence number (LSN).

Với streaming replication trong PostgreSQL, replica database server dùng WAL file để replicate thay đổi trên source database server.

Ba tiến trình bắt buộc đóng vai trò quan trọng trong streaming replication trên database PostgreSQL:

  • WAL sender
  • WAL receiver
  • Startup

Một WAL sender process chạy trên source server, trong khi WAL receiver và startup processes chạy trên replica server. Khi bạn bắt đầu replication, các sự kiện sau xảy ra:

  1. WAL receiver process gửi LSN cho đến khi replica replay WAL data đến master.
  2. WAL sender process trên source sau đó gửi WAL data đến replica cho đến khi đạt LSN mới nhất do WAL receiver gửi.
  3. Tiếp theo, WAL receiver ghi WAL data do WAL sender gửi vào WAL segments.
  4. Startup process trên replica replay dữ liệu được ghi vào WAL segment.
  5. Cuối cùng, streaming replication bắt đầu.

Test case

Dưới đây là các bước thiết lập streaming replication trong PostgreSQL giữa một source và một replica:

Bước một

Đầu tiên, chúng ta cần đảm bảo cả source và replica server đã cấu hình passwordless SSH authentication. Nếu chưa, chúng ta cần cấu hình nó bằng ssh-keygen.

Để tìm hiểu về cấu hình passwordless SSH, xem https://linuxize.com/post/how-to-setup-passwordless-ssh-login/.

Source node 192.168.24.28 Replica node 192.168.24.29 Username `postgres` trên cả source và replica. 

Bước hai

Chạy các lệnh sau trên cả hai server để tắt firewall:

$ sudo systemctl stop firewalld $ sudo systemctl disable firewalld 

Bước ba

  1. Trên source server, vào data directory:

     cd /var/lib/pgsql/11/data 
  2. Chỉnh sửa file postgresql.conf và thực hiện các thay đổi sau:

     archive_mode = on archive_command = 'cp %p /var/lib/pgsql/archive/%f' max_wall_senders = 5 wal_keep_segment =32 wal_level = replica listen_addresses = '*' 
  3. Thêm entry IP replica server trong pg_hba.conf:

     host postgres postgres (ip_address)192.168.24.29/32 trust host replication postgres (ip_address)192.168.24.29/32 trust 
  4. Với mọi thay đổi trong pg_hba.conf, reload service:

     $ /usr/local/pgsql_11/bin/pg_ctl -D /var/lib/pgsql/11/ reload 
  5. Tạo thư mục archive /var/lib/pgsql/archive/ nếu chưa tồn tại.

  6. Khởi động lại server để phản ánh thay đổi.

Bước bốn

Trên replica server:

  1. Vào data directory và dừng service:

     $ /usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data/ stop 
  2. Xóa mọi thứ khỏi data directory trên replica và thử kết nối đến source bằng lệnh sau:

     $ /usr/pgsql-11/bin/psql -h 192.168.24.28 
  3. Nếu hoạt động, bắt đầu base backup từ replica:

     $ cd /var/lib/pgsql/11/data $ /usr/pgsql-11/bin/pg_basebackup -D /var/lib/pgsql/11/data/ -X fetch -h 192.168.24.28 -R -P 

Các lệnh này sao chép tất cả dữ liệu từ data directory của source database sang replica data directory và tạo file recovery.conf.

Bước năm

Sau khi base backup hoàn tất, bạn cần kiểm tra file recovery.conf. Bất kỳ server nào có file recovery.conf trong data directory là replica server và chứa thông tin source server. Thực hiện các sửa đổi sau:

Standby_mode = 'on' Primary_conninfo = 'user=postgres host=192.168.24.28 port=5432' 

File nên trông như sau:

$ Vi recovery.conf Standby_mode = 'on' Primary_conninfo = 'user=postgres passfile=''/home/postgres/.pgpass'' host=192.168.24.28 port=5432 sslmode=disable sslcompression=0 target_session_attrs=any' 

Bước sáu

Bây giờ khởi động server và xác thực thay đổi:

  1. Đăng nhập source:

     /usr/local/pgsql_11/bin/psql Postgres=# Postgres=# Select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 1934 usesysid | 26712 usename | postgres application_name | walreceiver client_addr | 192.168.24.29 client_hostname | client_port | 52143 backend_start | 2020-11-07 11:30:31.035614-05 backend_xmin | state | streaming sent_lsn | 0/50000E34 write_lsn | 0/50000E34 flush_lsn | 0/50000E34 replay_lsn | 0/50000E34 write_lag | flush_lag | replay_lag | sync_priority | 0 sync_state | async 
  2. Đăng nhập replica:

     /usr/local/pgsql_11/bin/psql Postgres=# Postgres=# Select * from pg_is_in_recovery(); Pg_is_in_recovery ---------------------------------- t 
  3. Kiểm tra bằng lệnh OS-level từ source:

     $ ps -ef|grep sender postgres 1934 1718 0 11:31 ? 00:00:00 postgres: wal sender process replicator 192.168.24.29(52143) streaming 0/50000E34 
  4. Kiểm tra bằng lệnh OS-level từ replica:

     $ ps -ef|grep receiver postgres 1358 1748 0 11:31 ? 00:00:04 postgres: wal receiver process streaming 0/50000E34 
  5. (tùy chọn) Mặc định replication ở asynchronous mode. Để chuyển sang synchronous replication, vào source server và thực hiện thay đổi sau cho postgresql.conf:

     synchronous_standby_names='*' in 

    Sau đó, restart services:

     $ /usr/local/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/ restart 

Kết luận

Bài viết giải thích các loại replication và các bước thiết lập streaming replication. Bạn thường dùng điều này (đặc biệt trong analytics) để cung cấp read-only replica giảm tải cho primary server.

Nó cũng hữu ích nếu bạn cần môi trường high availability hoặc failover sang hot standby server nếu primary down.

Tìm hiểu thêm về dịch vụ Data của chúng tôi.

Sử dụng tab Feedback để đưa ra nhận xét hoặc đặt câu hỏi. Bạn cũng có thể bắt đầu cuộc trò chuyện với chúng tôi.