Computer >> Máy Tính >  >> Lập trình >> Cơ sở dữ liệu

Nhân rộng trong PostgresSQL

Với tính năng sao chép, bạn sao chép dữ liệu từ một máy chủ cơ sở dữ liệu, nguồn , đến một máy chủ khác, bản sao . Nhân bản là một tính năng cơ sở dữ liệu mạnh mẽ, cung cấp tính khả dụng cao và hỗ trợ khôi phục sau thảm họa.

Giới thiệu

Bạn cũng có thể tạo máy chủ bản sao để sử dụng cho mục đích kiểm tra và báo cáo, giảm tải cho cơ sở dữ liệu Xử lý Giao dịch Trực tuyến (OLTP) sản xuất. Bài đăng này giúp bạn hiểu các kiểu sao chép khác nhau trong PostgreSQL® và các bước cần thiết để thực hiện sao chép trực tuyến của cơ sở dữ liệu PostgreSQL.

Chi tiết bản sao

Bây giờ, đã đến lúc hiểu các chế độ sao chép, mô hình và kiểu sao chép trongPostgreSQL và tìm hiểu về ghi nhật ký ghi trước.

Chế độ không đồng bộ và đồng bộ

Sơ đồ sau đây cho thấy các chế độ sao chép PostgreSQL:

Nhân rộng trong PostgresSQL

Trong không đồng bộ nhân bản, máy chủ nguồn không cần đợi xác nhận hoàn thành giao dịch từ máy chủ bản sao. Các giao dịch sao chép xếp hàng trên máy chủ bản sao và hai máy chủ có thể không đồng bộ hóa trong một thời gian cụ thể cho đến khi quá trình xử lý hoàn tất.

Trong đồng bộ chế độ nhân bản, máy chủ nguồn chờ xác nhận từ máy chủ đó, hoặc các máy chủ, rằng mỗi giao dịch sao chép đã hoàn tất trước khi tiếp tục. Cả hai máy chủ nguồn và máy chủ bản sao phải luôn sẵn sàng. Nếu nó nhận được thông báo atransaction-fail từ bản sao, thì máy chủ nguồn sẽ khôi phục giao dịch đó. Trong chế độ sao chép này, máy chủ nguồn và máy chủ bản sao luôn đồng bộ hóa. Hạn chế là nếu máy chủ bản sao gặp sự cố hoặc không thể hoàn thành giao dịch, máy chủ nguồn sẽ chuyển sang trạng thái treo.

Mô hình sao chép một nguồn và đa nguồn

Với Nguồn đơn sao chép, bạn chỉ có một máy chủ nguồn và một hoặc nhiều máy chủreplica. Nguồn gửi các giao dịch sao chép tới tất cả các bản sao.

Máy chủ bản sao chỉ có thể chấp nhận các thay đổi từ máy chủ nguồn. Nếu chúng nhận được các trao đổi từ một máy chủ không phải nguồn, các bản sao sẽ không sao chép các giao dịch đó trở lại nguồn.

Trong Đa nguồn nhân rộng, bạn có nhiều hơn một máy chủ nguồn. Nếu một bảng thay đổi hàng trên một cơ sở dữ liệu nguồn, máy chủ nguồn đó sẽ sao chép các thay đổi đối với các hàng đối ứng trên các máy chủ nguồn khác. Để mô hình này thành công, bạn cần sử dụng các lược đồ phân giải liên kết để ngăn chặn các khóa chính trùng lặp và các vấn đề khác.

Các loại sao chép

Có ba loại sao chép:

  • Nhân rộng Truyền trực tuyến :PostgreSQL đã cung cấp loại sao chép này trong phiên bản 9 trở lên. Bản sao có sẵn cho các truy vấn chọn chỉ chạy. Yêu cầu chính đối với loại này là cơ sở dữ liệu nguồn và bản sao phải là cùng một phiên bản chính.
  • Sao chép theo tầng :Được giới thiệu trong PostgreSQL 9.2, kiểu sao chép của anh ấy cho phép bạn sao chép từ máy chủ dự phòng thay vì trực tiếp từ máy chủ nguồn. Điều này có thể giảm tải trên máy chủ nguồn.
  • Sao chép lôgic :Bạn có thể sử dụng kiểu này để sao chép một đối tượng ordatabase tập dữ liệu đã chọn hoặc để sao chép giữa các phiên bản chính khác nhau của PostgreSQL. Sao chép nội khoa, bạn có thể sử dụng máy chủ dự phòng để ghi, nhưng nó có các phản ứng tương tự. Nó không thể sao chép Truncate, các đối tượng lớn như (lob, blob, clob), chuỗi, lược đồ và DDL.

Viết trước nhật ký

Trước khi bắt đầu sử dụng tính năng sao chép trực tuyến, bạn nên hiểu về ghi nhật ký ghi trước (WAL) và cách thức hoạt động của nó.

Trong PostgreSQL, trước tiên hệ thống lưu bất kỳ thay đổi nào được thực hiện đối với cơ sở dữ liệu trong tệp nhật ký trước khi lưu chúng vào tệp dữ liệu và những thay đổi này được gọi là bản ghi WAL. Mỗi bản ghi WAL đều có một số duy nhất được gọi là số thứ tự nhật ký (LSN).

Với sao chép trực tuyến trong PostgreSQL, máy chủ cơ sở dữ liệu bản sao sử dụng tệp WAL để sao chép các thay đổi trên máy chủ cơ sở dữ liệu nguồn.

Ba quy trình bắt buộc đóng một vai trò quan trọng trong việc sao chép trực tuyến trên cơ sở dữ liệu PostgreSQL:

  • Người gửi WAL
  • Bộ thu WAL
  • Khởi động

Quá trình người gửi WAL chạy trên máy chủ nguồn, trong khi bộ thu WAL và các quy trình khởi động chạy trên máy chủ bản sao. Khi bạn bắt đầu sao chép, sự kiện sau:

  1. Quá trình bộ thu WAL gửi LSN cho đến khi bản sao phát lại dữ liệu WAL cho bản chính.
  2. Quá trình người gửi WAL trên nguồn sau đó sẽ gửi dữ liệu WAL đến bản sao cho đến khi xóa được LSN mới nhất do người nhận WAL gửi.
  3. Tiếp theo, người nhận WAL ghi dữ liệu WAL do người gửi WAL gửi đến các phân đoạn WAL.
  4. Quá trình khởi động trên bản sao phát lại dữ liệu được ghi vào phân đoạn WAL.
  5. Cuối cùng, quá trình sao chép phát trực tuyến bắt đầu.

Trường hợp thử nghiệm

Dưới đây là các bước để thiết lập sao chép luồng trong PostgreSQL giữa nguồn và onereplica:

Bước một

Trước tiên, chúng ta cần đảm bảo rằng cả máy chủ nguồn và máy chủ bản sao đều có cấu hình SSHauthentication không mật khẩu. Nếu không, chúng ta cần định cấu hình nó bằng cách sử dụng ssh-keygen .

Để tìm hiểu về cấu hình SSH không cần mật khẩu, hãy 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` on both source and replica.

Bước hai

Chạy các lệnh sau trên cả hai máy chủ để dừng tường lửa:

$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

Bước ba

  1. Trên máy chủ nguồn, hãy chuyển đến thư mục dữ liệu:

     cd /var/lib/pgsql/11/data
    
  2. Chỉnh sửa postgresql.conf gửi 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 mục nhập địa chỉ IP của máy chủ bản sao vào 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. Đối với mọi thay đổi trong pg_hba.conf , tải lại dịch vụ:

     $ /usr/local/pgsql_11/bin/pg_ctl -D /var/lib/pgsql/11/ reload
    
  5. Tạo / var / lib / pgsql / archive / lưu trữ thư mục nếu nó không tồn tại.

  6. Khởi động lại máy chủ để phản ánh các thay đổi.

Bước bốn

Trên máy chủ bản sao:

  1. Đi tới thư mục dữ liệu và dừng dịch vụ:

     $ /usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data/ stop
    
  2. Xóa mọi thứ khỏi thư mục dữ liệu trên bản sao và cố gắng kết nối với nguồn bằng cách sử dụng lệnh sau:

     $ /usr/pgsql-11/bin/psql -h 192.168.24.28
    
  3. Nếu nó hoạt động, hãy bắt đầu sao lưu cơ sở từ bản sao:

     $ 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ừ thư mục dữ liệu của cơ sở dữ liệu nguồn sang thư mục bản sao và tạo recovery.conf tệp.

Bước năm

Sau khi sao lưu cơ sở hoàn tất, bạn cần kiểm tra recovery.conf các tập tin. Bất kỳ máy chủ nào có recovery.conf tệp trong thư mục dữ liệu là một máy chủ bản sao và chứa thông tin của máy chủ nguồn. Thực hiện các sửa đổi sau:

Standby_mode = ‘on’
Primary_conninfo = ‘user=postgres host=192.168.24.28 port=5432’

Tệp sẽ xuất hiện 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ờ hãy khởi động máy chủ và xác thực các thay đổi:

  1. Đăng nhập vào nguồn:

     /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 vào bản sao:

     /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 cấp hệ điều hành từ nguồn:

     $ 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 cấp hệ điều hành từ bản sao:

     $ ps -ef|grep receiver
    
     postgres  1358 
     1748  0 11:31 ?        00:00:04 postgres: wal receiver process   streaming 0/50000E34
    

    Giao dịch của người gửi và người nhận phải giống nhau và bản sao luôn ở chế độ chỉ đọc.

  5. (tùy chọn) Theo mặc định, sao chép ở chế độ không đồng bộ. Để thay đổi thành sao chép đồng bộ, hãy chuyển đến máy chủ nguồn và thực hiện thay đổi sau đối với postgresql.conf :

     synchronous_standby_names=’*’ in 
    

    Sau đó, khởi động lại các dịch vụ:

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

Kết luận

Bài đăng này giải thích các loại sao chép và các bước để thiết lập sao chép trực tuyến. Bạn thường sử dụng điều này (đặc biệt là trong phân tích) để cung cấp một bản sao chỉ đọc để khởi động máy chủ chính.

Nó cũng hữu ích nếu bạn cần một môi trường có tính khả dụng cao hoặc chuyển đổi dự phòng sang máy chủ dự phòng nếu máy chủ chính gặp sự cố.

Tìm hiểu thêm về các dịch vụ Dữ liệu của chúng tôi.

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