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

Tổng quan về sao chép lôgic trong PostgreSQL

PostgreSQL là một trong những cơ sở dữ liệu mã nguồn mở tiên tiến nhất trên thế giới với rất nhiều tính năng tuyệt vời. Một trong số đó là Streaming Replication (Sao chép vật lý) đã được giới thiệu trong PostgreSQL 9.0. Nó dựa trên các bản ghi XLOG được chuyển đến máy chủ đích và được áp dụng ở đó. Tuy nhiên, nó dựa trên cụm và chúng ta không thể thực hiện sao chép một cơ sở dữ liệu hoặc một đối tượng đơn lẻ (sao chép có chọn lọc). Trong những năm qua, chúng tôi đã phụ thuộc vào các công cụ bên ngoài như Slony, Bucardo, BDR, v.v. để sao chép có chọn lọc hoặc một phần vì không có tính năng nào ở cấp cốt lõi cho đến khi PostgreSQL 9.6. Tuy nhiên, PostgreSQL 10 đã đưa ra một tính năng gọi là Logical Replication, qua đó chúng tôi có thể thực hiện sao chép cấp cơ sở dữ liệu / đối tượng.

Logical Replication sao chép các thay đổi của các đối tượng dựa trên nhận dạng sao chép của chúng, thường là một khóa chính. Nó khác với sao chép vật lý, trong đó sao chép dựa trên các khối và sao chép từng byte. Logical Replication không cần một bản sao nhị phân chính xác ở phía máy chủ đích và chúng tôi có khả năng viết trên máy chủ đích không giống như Physical Replication. Tính năng này bắt nguồn từ mô-đun pglogical.

Trong bài đăng trên blog này, chúng ta sẽ thảo luận về:

  • Cách thức hoạt động - Kiến trúc
  • Tính năng
  • Các trường hợp sử dụng - khi nó hữu ích
  • Hạn chế
  • Làm thế nào để đạt được điều đó

Cách hoạt động - Kiến trúc sao chép lôgic

Logical Replication thực hiện khái niệm xuất bản và đăng ký (Publication &Subscription). Dưới đây là sơ đồ kiến ​​trúc cấp cao hơn về cách nó hoạt động.

Kiến trúc sao chép lôgic cơ bản

Việc xuất bản có thể được xác định trên máy chủ chính và nút mà nó được xác định được gọi là "nhà xuất bản". Ấn phẩm là một tập hợp các thay đổi từ một bảng hoặc một nhóm bảng. Nó ở cấp độ cơ sở dữ liệu và mỗi ấn phẩm tồn tại trong một cơ sở dữ liệu. Nhiều bảng có thể được thêm vào một ấn phẩm duy nhất và một bảng có thể có trong nhiều ấn phẩm. Bạn nên thêm các đối tượng một cách rõ ràng vào một ấn phẩm ngoại trừ nếu bạn chọn tùy chọn "TẤT CẢ CÁC BẢNG" cần có đặc quyền của người dùng cấp trên.

Bạn có thể giới hạn các thay đổi của các đối tượng (CHÈN, CẬP NHẬT và XÓA) được sao chép. Theo mặc định, tất cả các kiểu hoạt động đều được sao chép. Bạn phải có một danh tính sao chép được định cấu hình cho đối tượng mà bạn muốn thêm vào một ấn phẩm. Điều này là để sao chép các hoạt động CẬP NHẬT và XÓA. Danh tính sao chép có thể là một khóa chính hoặc chỉ mục duy nhất. Nếu bảng không có khóa chính hoặc chỉ mục duy nhất, thì bảng có thể được đặt thành bản sao nhận dạng "đầy đủ", trong đó bảng nhận tất cả các cột làm khóa (toàn bộ hàng trở thành khóa).

Bạn có thể tạo một ấn phẩm bằng cách sử dụng TẠO XUẤT BẢN. Một số lệnh thực tế được đề cập trong phần "Cách đạt được".

Đăng ký có thể được xác định trên máy chủ đích và nút mà nó được xác định được gọi là "người đăng ký". Kết nối với cơ sở dữ liệu nguồn được xác định trong đăng ký. Nút người đăng ký cũng giống như bất kỳ cơ sở dữ liệu postgres độc lập nào khác và bạn cũng có thể sử dụng nút này như một ấn phẩm cho các đăng ký khác.

Đăng ký được thêm bằng cách sử dụng CREATE SUBSCRIPTION và có thể dừng / tiếp tục bất kỳ lúc nào bằng cách sử dụng lệnh ALTER SUBSCRIPTION và bị xóa bằng cách sử dụng DROP SUBSCRIPTION.

Sau khi đăng ký được tạo, bản sao lôgic sẽ sao chép ảnh chụp nhanh của dữ liệu trên cơ sở dữ liệu của nhà xuất bản. Sau khi hoàn tất, nó sẽ đợi các thay đổi delta và gửi chúng đến nút đăng ký ngay khi chúng xảy ra.

Tuy nhiên, những thay đổi được thu thập như thế nào? Ai gửi chúng đến mục tiêu? Và ai là người áp dụng chúng tại mục tiêu? Sao chép logic cũng dựa trên kiến ​​trúc tương tự như sao chép vật lý. Nó được thực hiện bởi các quy trình “walsender” và “apply”. Vì nó dựa trên giải mã WAL, ai là người bắt đầu giải mã? Quá trình walsender chịu trách nhiệm bắt đầu giải mã logic của WAL và tải plugin giải mã logic tiêu chuẩn (pgoutput). Plugin chuyển đổi các thay đổi được đọc từ WAL sang giao thức sao chép hợp lý và lọc dữ liệu theo đặc điểm kỹ thuật xuất bản. Sau đó, dữ liệu được chuyển liên tục bằng cách sử dụng giao thức sao chép trực tuyến tới trình xử lý ứng dụng, giao thức này ánh xạ dữ liệu tới các bảng cục bộ và áp dụng các thay đổi riêng lẻ khi chúng được nhận, theo đúng thứ tự giao dịch.

Nó ghi lại tất cả các bước này trong các tệp nhật ký trong khi thiết lập nó. Chúng ta có thể xem các thông báo trong phần "Làm thế nào để đạt được nó" ở phần sau của bài đăng.

Các tính năng của sao chép lôgic

  • Logical Replication sao chép các đối tượng dữ liệu dựa trên nhận dạng bản sao của chúng (thường là một
  • khóa chính hoặc chỉ mục duy nhất).
  • Máy chủ đích có thể được sử dụng để ghi. Bạn có thể có các chỉ mục và định nghĩa bảo mật khác nhau.
  • Logical Replication có hỗ trợ nhiều phiên bản. Không giống như sao chép trực tuyến, sao chép lôgic có thể được đặt giữa các phiên bản khác nhau của PostgreSQL (tuy nhiên,> 9.4)
  • Bản sao lôgic thực hiện lọc dựa trên sự kiện
  • Khi được so sánh, Bản sao lôgic có độ khuếch đại ghi ít hơn so với Bản sao truyền trực tuyến
  • Các ấn phẩm có thể có nhiều đăng ký
  • Sao chép lôgic cung cấp khả năng lưu trữ linh hoạt thông qua sao chép các tập hợp nhỏ hơn (thậm chí cả các bảng được phân vùng)
  • Tải máy chủ tối thiểu so với các giải pháp dựa trên trình kích hoạt
  • Cho phép phát trực tuyến song song giữa các nhà xuất bản
  • Bản sao lôgic có thể được sử dụng để di chuyển và nâng cấp
  • Việc chuyển đổi dữ liệu có thể được thực hiện trong khi thiết lập.

Các trường hợp sử dụng - Khi nào thì sao chép lôgic là hữu ích?

Điều rất quan trọng là phải biết khi nào sử dụng Logical Replication. Nếu không, bạn sẽ không nhận được nhiều lợi ích nếu trường hợp sử dụng của bạn không phù hợp. Vì vậy, đây là một số trường hợp sử dụng về thời điểm sử dụng Logical Replication:

  • Nếu bạn muốn hợp nhất nhiều cơ sở dữ liệu thành một cơ sở dữ liệu duy nhất cho mục đích phân tích.
  • Nếu yêu cầu của bạn là sao chép dữ liệu giữa các phiên bản PostgreSQL chính khác nhau.
  • Nếu bạn muốn gửi các thay đổi gia tăng trong một cơ sở dữ liệu đơn lẻ hoặc một tập hợp con của cơ sở dữ liệu tới các cơ sở dữ liệu khác.
  • Nếu cấp quyền truy cập vào dữ liệu sao chép cho các nhóm người dùng khác nhau.
  • Nếu chia sẻ một tập hợp con của cơ sở dữ liệu giữa nhiều cơ sở dữ liệu.

Hạn chế của việc sao chép lôgic

Logical Replication có một số hạn chế mà cộng đồng đang tiếp tục nỗ lực để khắc phục:

  • Các bảng phải có cùng tên đủ điều kiện giữa xuất bản và đăng ký.
  • Các bảng phải có khóa chính hoặc khóa duy nhất
  • Sao chép lẫn nhau (hai chiều) không được hỗ trợ
  • Không sao chép giản đồ / DDL
  • Không sao chép các trình tự
  • Không sao chép TRUNCATE
  • Không sao chép các Đối tượng Lớn
  • Đăng ký có thể có nhiều cột hơn hoặc thứ tự cột khác nhau, nhưng loại và tên cột phải khớp giữa Xuất bản và Đăng ký.
  • Đặc quyền của người dùng cấp cao để thêm tất cả các bảng
  • Bạn không thể phát trực tuyến qua cùng một máy chủ lưu trữ (đăng ký sẽ bị khóa).
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức

Cách đạt được sự tái tạo logic

Dưới đây là các bước để đạt được Nhân bản lôgic cơ bản. Chúng ta có thể thảo luận về các tình huống phức tạp hơn sau.

  1. Khởi tạo hai phiên bản khác nhau để xuất bản và đăng ký và bắt đầu.

    C1MQV0FZDTY3:bin bajishaik$ export PATH=$PWD:$PATH
    C1MQV0FZDTY3:bin bajishaik$ which psql
    /Users/bajishaik/pg_software/10.2/bin/psql
    C1MQV0FZDTY3:bin bajishaik$ ./initdb -D /tmp/publication_db
    
    C1MQV0FZDTY3:bin bajishaik$ ./initdb -D /tmp/subscription_db
  2. Các thông số sẽ được thay đổi trước khi bạn bắt đầu phiên bản (đối với cả phiên bản đăng ký và xuất bản).

    C1MQV0FZDTY3:bin bajishaik$ tail -3 /tmp/publication_db/postgresql.conf
    listen_addresses='*'
    port = 5555
    wal_level= logical
    
    
    C1MQV0FZDTY3:bin bajishaik$ pg_ctl -D /tmp/publication_db/ start
    waiting for server to start....2018-03-21 16:03:30.394 IST [24344] LOG:  listening on IPv4 address "0.0.0.0", port 5555
    2018-03-21 16:03:30.395 IST [24344] LOG:  listening on IPv6 address "::", port 5555
    2018-03-21 16:03:30.544 IST [24344] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5555"
    2018-03-21 16:03:30.662 IST [24345] LOG:  database system was shut down at 2018-03-21 16:03:27 IST
    2018-03-21 16:03:30.677 IST [24344] LOG:  database system is ready to accept connections
     done
    server started
    
    C1MQV0FZDTY3:bin bajishaik$ tail -3 /tmp/subscription_db/postgresql.conf
    listen_addresses='*'
    port=5556
    wal_level=logical
    
    C1MQV0FZDTY3:bin bajishaik$ pg_ctl -D /tmp/subscription_db/ start
    waiting for server to start....2018-03-21 16:05:28.408 IST [24387] LOG:  listening on IPv4 address "0.0.0.0", port 5556
    2018-03-21 16:05:28.408 IST [24387] LOG:  listening on IPv6 address "::", port 5556
    2018-03-21 16:05:28.410 IST [24387] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5556"
    2018-03-21 16:05:28.460 IST [24388] LOG:  database system was shut down at 2018-03-21 15:59:32 IST
    2018-03-21 16:05:28.512 IST [24387] LOG:  database system is ready to accept connections
     done
    server started

    Các thông số khác có thể được đặt ở chế độ mặc định cho thiết lập cơ bản.

  3. Thay đổi tệp pg_hba.conf để cho phép sao chép. Lưu ý rằng các giá trị này phụ thuộc vào môi trường của bạn, tuy nhiên, đây chỉ là một ví dụ cơ bản (cho cả phiên bản đăng ký và xuất bản).

    C1MQV0FZDTY3:bin bajishaik$ tail -1 /tmp/publication_db/pg_hba.conf
     host     all     repuser     0.0.0.0/0     md5
    C1MQV0FZDTY3:bin bajishaik$ tail -1 /tmp/subscription_db/pg_hba.conf
     host     all     repuser     0.0.0.0/0     md5
    
    C1MQV0FZDTY3:bin bajishaik$ psql -p 5555 -U bajishaik -c "select pg_reload_conf()"
    Timing is on.
    Pager usage is off.
    2018-03-21 16:08:19.271 IST [24344] LOG:  received SIGHUP, reloading configuration files
     pg_reload_conf
    ----------------
     t
    (1 row)
    
    Time: 16.103 ms
    C1MQV0FZDTY3:bin bajishaik$ psql -p 5556 -U bajishaik -c "select pg_reload_conf()"
    Timing is on.
    Pager usage is off.
    2018-03-21 16:08:29.929 IST [24387] LOG:  received SIGHUP, reloading configuration files
     pg_reload_conf
    ----------------
     t
    (1 row)
    
    Time: 53.542 ms
    C1MQV0FZDTY3:bin bajishaik$
  4. Tạo một vài bảng thử nghiệm để sao chép và chèn một số dữ liệu trên phiên bản Publication.

    postgres=# create database source_rep;
    CREATE DATABASE
    Time: 662.342 ms
    postgres=# \c source_rep
    You are now connected to database "source_rep" as user "bajishaik".
    source_rep=# create table test_rep(id int primary key, name varchar);
    CREATE TABLE
    Time: 63.706 ms
    source_rep=# create table test_rep_other(id int primary key, name varchar);
    CREATE TABLE
    Time: 65.187 ms
    source_rep=# insert into test_rep values(generate_series(1,100),'data'||generate_series(1,100));
    INSERT 0 100
    Time: 2.679 ms
    source_rep=# insert into test_rep_other  values(generate_series(1,100),'data'||generate_series(1,100));
    INSERT 0 100
    Time: 1.848 ms
    source_rep=# select count(1) from test_rep;
     count
    -------
       100
    (1 row)
    
    Time: 0.513 ms
    source_rep=# select count(1) from test_rep_other ;
     count
    -------
       100
    (1 row)
    
    Time: 0.488 ms
    source_rep=#
  5. Tạo cấu trúc của các bảng trên phiên bản Đăng ký vì Logical Replication không sao chép cấu trúc.

    postgres=# create database target_rep;
    CREATE DATABASE
    Time: 514.308 ms
    postgres=# \c target_rep
    You are now connected to database "target_rep" as user "bajishaik".
    target_rep=# create table test_rep_other(id int primary key, name varchar);
    CREATE TABLE
    Time: 9.684 ms
    target_rep=# create table test_rep(id int primary key, name varchar);
    CREATE TABLE
    Time: 5.374 ms
    target_rep=#
  6. Tạo ấn phẩm trên phiên bản Publication (cổng 5555).

    source_rep=# CREATE PUBLICATION mypub FOR TABLE test_rep, test_rep_other;
    CREATE PUBLICATION
    Time: 3.840 ms
    source_rep=#
  7. Tạo đăng ký trên phiên bản Suscription (cổng 5556) cho ấn phẩm đã tạo ở bước 6.

    target_rep=# CREATE SUBSCRIPTION mysub CONNECTION 'dbname=source_rep host=localhost user=bajishaik port=5555' PUBLICATION mypub;
    NOTICE:  created replication slot "mysub" on publisher
    CREATE SUBSCRIPTION
    Time: 81.729 ms

    Từ nhật ký:

    2018-03-21 16:16:42.200 IST [24617] LOG:  logical decoding found consistent point at 0/1616D80
    2018-03-21 16:16:42.200 IST [24617] DETAIL:  There are no running transactions.
    target_rep=# 2018-03-21 16:16:42.207 IST [24618] LOG:  logical replication apply worker for subscription "mysub" has started
    2018-03-21 16:16:42.217 IST [24619] LOG:  starting logical decoding for slot "mysub"
    2018-03-21 16:16:42.217 IST [24619] DETAIL:  streaming transactions committing after 0/1616DB8, reading WAL from 0/1616D80
    2018-03-21 16:16:42.217 IST [24619] LOG:  logical decoding found consistent point at 0/1616D80
    2018-03-21 16:16:42.217 IST [24619] DETAIL:  There are no running transactions.
    2018-03-21 16:16:42.219 IST [24620] LOG:  logical replication table synchronization worker for subscription "mysub", table "test_rep" has started
    2018-03-21 16:16:42.231 IST [24622] LOG:  logical replication table synchronization worker for subscription "mysub", table "test_rep_other" has started
    2018-03-21 16:16:42.260 IST [24621] LOG:  logical decoding found consistent point at 0/1616DB8
    2018-03-21 16:16:42.260 IST [24621] DETAIL:  There are no running transactions.
    2018-03-21 16:16:42.267 IST [24623] LOG:  logical decoding found consistent point at 0/1616DF0
    2018-03-21 16:16:42.267 IST [24623] DETAIL:  There are no running transactions.
    2018-03-21 16:16:42.304 IST [24621] LOG:  starting logical decoding for slot "mysub_16403_sync_16393"
    2018-03-21 16:16:42.304 IST [24621] DETAIL:  streaming transactions committing after 0/1616DF0, reading WAL from 0/1616DB8
    2018-03-21 16:16:42.304 IST [24621] LOG:  logical decoding found consistent point at 0/1616DB8
    2018-03-21 16:16:42.304 IST [24621] DETAIL:  There are no running transactions.
    2018-03-21 16:16:42.306 IST [24620] LOG:  logical replication table synchronization worker for subscription "mysub", table "test_rep" has finished
    2018-03-21 16:16:42.308 IST [24622] LOG:  logical replication table synchronization worker for subscription "mysub", table "test_rep_other" has finished

    Như bạn có thể thấy trong thông báo NOTICE, nó đã tạo một khe sao chép để đảm bảo việc dọn dẹp WAL sẽ không được thực hiện cho đến khi ảnh chụp nhanh ban đầu hoặc các thay đổi delta được chuyển đến cơ sở dữ liệu đích. Sau đó, người gửi WAL bắt đầu giải mã các thay đổi và áp dụng sao chép hợp lý đã hoạt động khi cả pub và sub đều được khởi động. Sau đó, nó bắt đầu đồng bộ hóa bảng.

  8. Xác minh dữ liệu trên phiên bản Đăng ký.

    target_rep=# select count(1) from test_rep;
     count
    -------
       100
    (1 row)
    
    Time: 0.927 ms
    target_rep=# select count(1) from test_rep_other ;
     count
    -------
       100
    (1 row)
    
    Time: 0.767 ms
    target_rep=#

    Như bạn thấy, dữ liệu đã được sao chép thông qua ảnh chụp nhanh ban đầu.

  9. Xác minh các thay đổi delta.

    C1MQV0FZDTY3:bin bajishaik$ psql -d postgres -p 5555 -d source_rep -c "insert into test_rep values(generate_series(101,200), 'data'||generate_series(101,200))"
    INSERT 0 100
    Time: 3.869 ms
    C1MQV0FZDTY3:bin bajishaik$ psql -d postgres -p 5555 -d source_rep -c "insert into test_rep_other values(generate_series(101,200), 'data'||generate_series(101,200))"
    INSERT 0 100
    Time: 3.211 ms
    C1MQV0FZDTY3:bin bajishaik$ psql -d postgres -p 5556 -d target_rep -c "select count(1) from test_rep"
     count
    -------
       200
    (1 row)
    
    Time: 1.742 ms
    C1MQV0FZDTY3:bin bajishaik$ psql -d postgres -p 5556 -d target_rep -c "select count(1) from test_rep_other"
     count
    -------
       200
    (1 row)
    
    Time: 1.480 ms
    C1MQV0FZDTY3:bin bajishaik$

Đây là các bước để thiết lập cơ bản của Logical Replication.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres là cơ sở dữ liệu tuyệt vời nhất - Lý do thứ 2:Giấy phép

  2. Truy vấn bảng chéo PostgreSQL

  3. Hàm thực thi nhanh hơn mà không có công cụ sửa đổi NGHIÊM TÚC?

  4. ngủ đông không thể nhận giá trị trình tự tiếp theo

  5. Cách sao lưu và khôi phục cơ sở dữ liệu PostgreSQL