PostgreSQL phiên bản 10 đã giới thiệu một số tính năng và cải tiến thú vị cho bối cảnh hiện có của PostgreSQL. Một tính năng như vậy là sao chép logic bằng cách sử dụng khung xuất bản và đăng ký. AWS cung cấp hai tùy chọn PostgreSQL được quản lý. Amazon RDS cho PostgreSQL và Amazon Aurora PostgreSQL. Bài đăng này thảo luận về cách sử dụng khung hiện có để tạo bản sao chỉ có quyền đọc tự quản lý từ Amazon RDS cho PostgreSQL hoặc Aurora. Bạn có thể áp dụng quy trình tương tự để tạo bản sao chỉ có quyền đọc trên PostgreSQL dựa trên Amazon Elastic Compute Cloud [Amazon EC2], Amazon RDS for PostgreSQL và Aurora PostgreSQL
Amazon RDS cho PostgreSQL hỗ trợ khung đăng ký và xuất bản từ phiên bản công cụ 10. 4 trở lên. Aurora PostgreSQL hỗ trợ khung đăng ký và xuất bản từ phiên bản công cụ 2. 2 [tương thích với 10. 6] trở lên
Tổng quan về giải pháp
Một triển khai điển hình của Amazon RDS cho cơ sở dữ liệu PostgreSQL và Aurora PostgreSQL liên quan đến việc ghi ứng dụng được cung cấp bởi một phiên bản chính và các lần đọc được giảm tải cho các bản sao được quản lý của AWS. Tuy nhiên, một số trường hợp sử dụng kinh doanh nhất định cũng yêu cầu bạn thiết lập một phiên bản bản sao tự quản lý bổ sung để phục vụ các ứng dụng xuôi dòng độc lập khác chỉ cần hoạt động trên một tập hợp con dữ liệu [chỉ một số cơ sở dữ liệu hoặc một số bảng]. Việc sao chép một phần như vậy cho phép các bản sao riêng lẻ xử lý song song các phần độc lập của khối lượng công việc, do đó làm tăng khả năng mở rộng tổng thể của hệ thống
Với việc giới thiệu bản sao logic bằng cách sử dụng khung đăng ký và xuất bản, vai trò
rds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
9 hiện có thể thiết lập bản sao tự quản lý tùy chỉnh cho PostgreSQL phiên bản 10 trở lên. Vì sao chép logic là một giải pháp cấp cơ sở dữ liệu và có khả năng sao chép một số hoặc tất cả các bảng của cơ sở dữ liệu, bạn vẫn nên xem xét các bản sao chỉ có quyền đọc do AWS tạo cho Amazon RDS for PostgreSQL và Aurora PostgreSQL để phục vụ lưu lượng đọc của ứng dụng sản xuất chính . Để biết thêm thông tin, hãy xem Làm việc với Bản sao chỉ có quyền đọc của PostgreSQL trong Amazon RDS và Sao chép với Amazon Aurora PostgreSQL. Chúng tôi đề cập đến những cân nhắc thêm xung quanh các tính năng của sao chép logic sau trong bài đăng nàySao chép logic sử dụng mô hình xuất bản và đăng ký trong đó người đăng ký lấy dữ liệu từ các ấn phẩm mà họ đăng ký. Sao chép logic bắt đầu bằng cách sao chép ảnh chụp nhanh dữ liệu hiện có ban đầu trên cơ sở dữ liệu của nhà xuất bản. Khi hoàn tất, các thay đổi trên nhà xuất bản [CHÈN, CẬP NHẬT và XÓA] sẽ được chuyển tiếp tới người đăng ký trong thời gian gần như thực. Người đăng ký áp dụng dữ liệu theo cùng thứ tự mà các cam kết đã được thực hiện đối với nhà xuất bản để đảm bảo tính nhất quán của giao dịch
Điều này trái ngược với sao chép vật lý, trong đó các địa chỉ khối chính xác được sử dụng để sao chép từng byte một
Sơ đồ sau đây biểu thị luồng dữ liệu để sao chép và đồng bộ hóa dữ liệu ban đầu
Quy trình bao gồm các bước sau
- Phiên bản nhà xuất bản sử dụng lệnh CREATE PUBLICATION để chỉ định một nhóm bảng có thay đổi dữ liệu nhằm mục đích sao chép
- Phiên bản người đăng ký sử dụng lệnh CREATE SUBSCRIPTION để chỉ định tên và chi tiết kết nối của ấn phẩm
- Việc thực thi thành công CREATE SUBSCRIPTION sẽ kích hoạt kết nối TCP với phiên bản nhà xuất bản
- Một kết nối đến từ người đăng ký sẽ kích hoạt việc tạo một khe sao chép logic tạm thời tại nhà xuất bản [dưới plugin giải mã logic có tên là
0]rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- Đối với ngữ cảnh, một phiên bản PostgreSQL theo dõi các giao dịch của nó trong một loạt các tệp nhị phân 16 MB được sắp xếp có tên là nhật ký ghi trước [WAL]. Bắt đầu với PostgreSQL v11, bạn có thể sửa đổi kích thước WAL trong quá trình khởi tạo phiên bản. Phiên bản Amazon RDS cho PostgreSQL v11 và công cụ Aurora phiên bản 3. 0 [tương thích với PostgreSQL 11. 4] phiên bản có kích thước WAL là 64 MB
- Khe sao chép cho phép phiên bản chính theo dõi khoảng cách phía sau bản dự phòng và ngăn việc xóa các tệp WAL mà bản dự phòng có thể vẫn cần. Các vị trí như vậy khi được sử dụng trong bối cảnh sao chép luồng được gọi là các vị trí sao chép vật lý. Tuy nhiên, trong trường hợp sao chép logic, các vị trí này được sử dụng trong phần bổ sung giải mã [
0, trong trường hợp sử dụng này] chuyển đổi các thay đổi được đọc từ WAL sang giao thức sao chép logic và lọc dữ liệu như đã chỉ định [theo thông số kỹ thuật của ấn phẩm, trong phần này . Giải mã này cho phép trích xuất tất cả các thay đổi liên tục thành một định dạng mạch lạc, dễ hiểu, có thể được giải thích mà không cần biết chi tiết về trạng thái bên trong của cơ sở dữ liệu. Các vị trí như vậy, khi được sử dụng trong bối cảnh sao chép logic, được gọi là các vị trí sao chép logicrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- Theo mặc định, vị trí logic tạm thời được tạo với danh pháp
2, trong đórds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
3 là tên đăng ký được chỉ định với CREATE SUBSCRIPTION. Hành vi này có thể được sửa đổi bằng cách sử dụng tùy chọnrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
4 của lệnhrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- Dữ liệu ban đầu trong các bảng đã đăng ký hiện có được sử dụng để tạo ảnh chụp nhanh và được chuyển đến người đăng ký thông qua lệnh COPY
- Nhân viên đồng bộ ban đầu tại thuê bao nhận ảnh chụp nhanh, ánh xạ tải trọng trong ảnh chụp nhanh tới các bảng cục bộ và áp dụng các hoạt động cần thiết
Sơ đồ sau đây minh họa luồng dữ liệu giao dịch [sau khi ảnh chụp nhanh ban đầu được sao chép]
Quy trình bao gồm các bước sau
- Sau khi quá trình đồng bộ hóa ban đầu hoàn tất, một vị trí cố định được tạo [theo mặc định, có cùng tên với đăng ký] thông qua plugin giải mã logic có tên là
0. Vị trí này tiếp tục tồn tại cùng với tuổi thọ của đăng ký liên quanrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- Quá trình
6 bắt đầu trích xuất tất cả các thay đổi liên tục từ các WAL nhận được [được gọi là giải mã logic]rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- Plugin chuyển đổi các thay đổi được truy xuất từ WAL thành giao thức sao chép logic và lọc dữ liệu theo thông số kỹ thuật xuất bản
- Sau đó, dữ liệu được chuyển đến
7, thiết bị này sẽ ánh xạ thêm tải trọng vào các bảng cục bộ và áp dụng các thay đổi riêng lẻrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
điều kiện tiên quyết
Trước khi triển khai giải pháp này, bạn phải thiết lập bản sao hợp lý. Để biết hướng dẫn về Amazon RDS cho PostgreSQL, hãy xem Bản sao logic cho PostgreSQL trên Amazon RDS. Để biết hướng dẫn về Aurora PostgreSQL, hãy xem Định cấu hình sao chép logic
Cân nhắc với sao chép hợp lý
Một số cân nhắc phổ biến khi sử dụng sao chép logic bao gồm những điều sau đây
- Mỗi ấn phẩm chỉ tồn tại trong một cơ sở dữ liệu
- Khi viết bài này, các ấn phẩm chỉ chứa các bảng. Bạn không thể sao chép những điều sau đây
- Chế độ xem, chế độ xem cụ thể hóa, bảng gốc phân vùng hoặc bảng nước ngoài
- đối tượng lớn. Loại dữ liệu
8 được hỗ trợ và có thể được sử dụng như một giải pháp thay thếrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- trình tự. Các cột nối tiếp hoặc nhận dạng được hỗ trợ bởi các chuỗi được sao chép như một phần của bảng
- Bạn có thể thêm bảng vào nhiều ấn phẩm, nếu cần
- Các ấn phẩm có thể có nhiều người đăng ký
- Mỗi đăng ký nhận các thay đổi thông qua một vị trí sao chép và các vị trí sao chép tạm thời bổ sung được tạo để đồng bộ hóa dữ liệu ban đầu của các bảng có sẵn
- Các định nghĩa lược đồ tại nhà xuất bản không được sao chép cho người đăng ký. Bạn phải tự tạo lược đồ đối tượng tại thuê bao để bắt đầu sao chép đối tượng đó. Ví dụ: một bảng được tạo tại nhà xuất bản [sau khi bắt đầu sao chép] yêu cầu các hành động sau tại người đăng ký
- Tạo một lược đồ tương tự
- Sửa đổi đăng ký [sử dụng ALTER SUBSCRIPTION]. Chúng tôi minh họa quá trình này sau trong bài
- Các bảng được khớp giữa nhà xuất bản và người đăng ký thông qua tên được chỉ định của họ
- Thứ tự các cột trong bảng người đăng ký không cần khớp với thứ tự của nhà xuất bản
- Kiểu dữ liệu của các cột giữa đối tượng của nhà xuất bản và đối tượng của người đăng ký không cần phải khớp miễn là bạn có thể chuyển đổi biểu diễn văn bản của dữ liệu tại nhà xuất bản thành loại dữ liệu đích tại người đăng ký. Ví dụ: xuất bản cột
9 hoạt động với người đăng ký sử dụng cộtrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
10, nhưng sẽ xảy ra lỗi nếu cố gắng xuất bảnrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
9 thành cộtrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
12. Chúng tôi minh họa hành vi này sau trong bàirds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- Bảng người đăng ký cũng có thể có các cột bổ sung không được cung cấp bởi bảng đã xuất bản. Các cột như vậy được điền các giá trị mặc định như được chỉ định trong DDL của bảng người đăng ký
Đang cài đặt
Đối với bài đăng này, chúng tôi sử dụng Amazon RDS cho PostgreSQL [phiên bản 10. 4] làm phiên bản nhà xuất bản và phiên bản PostgreSQL tự quản lý [phiên bản 10. 6] với tư cách là người đăng ký. Nhà xuất bản dự định sao chép tất cả các bảng của cơ sở dữ liệu
rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
13 cho người đăng ký tự quản lýBạn có thể sử dụng cơ sở dữ liệu người đăng ký làm nhà xuất bản cho các cơ sở dữ liệu xuôi dòng khác bằng cách xác định các ấn phẩm của chính nó [cấu hình sao chép theo tầng]. Tuy nhiên, để đơn giản, bài đăng này giả định rằng ứng dụng coi người đăng ký [cơ sở dữ liệu PostgreSQL tự quản lý] là chỉ đọc
Để rõ ràng về hình ảnh, các câu lệnh SQL bao gồm các lời nhắc psql sau [được tùy chỉnh qua tệp psqlrc] cho nhà xuất bản và người đăng ký
14 – Trỏ tới phiên bản nhà xuất bảnrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
15 – Trỏ tới phiên bản người đăng kýrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
Đoạn mã sau liệt kê siêu dữ liệu kết nối và quyền
rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
7Tạo các đối tượng tại nhà xuất bản trước khi thiết lập sao chép
Để tạo các đối tượng của bạn tại nhà xuất bản trước khi thiết lập bản sao, hãy hoàn thành các bước sau
- Tạo một bảng có tên là
16 trong phiên bản nhà xuất bản và điền một số giá trị. Xem đoạn mã saurds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
rds-master=> create table table_before_publication [id1 int, id2 int]; CREATE TABLE rds-master=> insert into table_before_publication values [1,2]; INSERT 0 1 rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
Hiện tại không có vị trí sao chép nào trong phiên bản nhà xuất bản
- Tạo một ấn phẩm cho tất cả các bảng trong cơ sở dữ liệu có tên là
13. Xem đoạn mã saurds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
Rõ ràng từ đoạn mã trước, việc tạo một phiên bản xuất bản không nhất thiết có nghĩa là tạo các vị trí sao chép
- Tạo một đăng ký từ tự quản lý Xem đoạn mã sau
1rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
Bạn cần có một lược đồ tại người đăng ký để quá trình chụp nhanh ban đầu hoàn tất
- Tạo một bảng có tên bảng phù hợp và không nhất thiết phải là một lược đồ phù hợp hoàn chỉnh. Xem đoạn mã sau
3rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
Tạo thành công đăng ký tại phiên bản người đăng ký tự quản lý sẽ kích hoạt tạo vị trí tại nhà xuất bản. Nếu tham số
18 được đặt thành 1 [bật] tại phiên bản nhà xuất bản thì bạn cần cập nhật chuỗi lệnhrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
19 của lệnhrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
30 và bao gồm các tham số SSL nhưrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
31,rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
32, v.v. Để biết thông tin về cách tải xuống chứng chỉ cho RDS PostgreSQL, xem Sử dụng SSL/TLS để mã hóa kết nối với phiên bản CSDLrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- Đối với trường hợp sử dụng này, vì một bảng có sẵn đã có trong nhà xuất bản nên một vị trí tạm thời bổ sung cũng được tạo. Xem đoạn mã sau
9rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
- Xác minh tính nhất quán của dữ liệu giữa nhà xuất bản và tự quản lý Cả ảnh chụp nhanh ban đầu và các thay đổi mới đều phải được sao chép. Xem đoạn mã sau
0rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
Trong mã trước,
33 vàrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
34 được điền bằng các chuỗi trống vàrds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
35 nhận một số nguyên. Để liệt kê trạng thái tại nhà xuất bản, hãy xem đoạn mã saurds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
4rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
Để liệt kê trạng thái tại thuê bao tự quản lý, hãy xem đoạn mã sau
5rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES; CREATE PUBLICATION rds-master=> select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- [0 rows]
Mã trước sử dụng các giá trị sau
- srsubstate đại diện cho trạng thái sao chép
- i - Khởi tạo,
- d – Dữ liệu đang được sao chép,
- s – Đồng bộ hóa,
- r – Feady [sao chép bình thường]
- srsublsn đại diện cho LSN cuối cho các trạng thái s và r
- srsubstate đại diện cho trạng thái sao chép
Tạo các đối tượng tại nhà xuất bản sau khi thiết lập bản sao
Để tạo các đối tượng của bạn tại nhà xuất bản sau khi thiết lập bản sao, hãy xem đoạn mã sau
rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
6Lược đồ phải tồn tại ở thuê bao tự quản lý để sao chép hoạt động. Sau khi tạo, hãy làm mới siêu dữ liệu bằng cách sử dụng
rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
36. Xem đoạn mã saurds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
0Vấn đề chuyển đổi kiểu dữ liệu giữa các lược đồ đối tượng
Chúng tôi đã sao chép thành công đối tượng của nhà xuất bản [với cột
rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
9] sang đối tượng của người đăng ký [với cột rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
10]. Để minh họa thêm về hành vi với các chuyển đổi không tương thích, hãy tạo một bảng có tên rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
39 với loại dữ liệu rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
9 trong phiên bản nhà xuất bản. Xem đoạn mã saurds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
1Tạo một bảng có tên là
rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
39 với kiểu dữ liệu rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
12 trong thể hiện thuê bao. Xem đoạn mã saurds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
2Làm mới đăng ký và xác thực dữ liệu. Xem đoạn mã sau
rds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
3Trong đoạn mã trước, trạng thái đăng ký [
rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
93] vẫn là rds-master=> CREATE PUBLICATION alltables FOR ALL TABLES;
CREATE PUBLICATION
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
94 [dữ liệu đang được sao chép]; . Đánh giá nhanh các bản ghi lỗi do người đăng ký tạo ra phác thảo trạng thái sao chép thực tế. Nhân viên sao chép hợp lý cố gắng đồng bộ hóa ban đầu qua COPY nhưng không chuyển đổi kiểu dữ liệu. Khi nhân viên tiếp tục thử lại, đoạn trích sau đây liên tục được sao chép trong nhật ký lỗi tương ứngrds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
4Cập nhật và xóa trên nhà xuất bản
Siêu dữ liệu của ấn phẩm đề xuất các hoạt động CẬP NHẬT và XÓA được sao chép. Xem đoạn mã sau
rds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
5Tuy nhiên, thao tác CẬP NHẬT không thành công nếu sơ đồ bảng không liên quan đến danh tính bản sao. Xem đoạn mã sau
rds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
6Một bảng đã xuất bản phải có một danh tính bản sao để sao chép các hoạt động CẬP NHẬT và XÓA. Cấu hình này sửa đổi thông tin được ghi vào nhật ký giao dịch [WAL] và giúp xác định các hàng liên quan. Các tùy chọn có thể là như sau
- DEFAULT – Ghi lại giá trị cũ của các cột của khóa chính [nếu có]
- SỬ DỤNG CHỈ MỤC – Ghi lại các giá trị cũ của các cột được bao phủ bởi chỉ mục được đặt tên, phải là duy nhất, không một phần, không thể trì hoãn và chỉ bao gồm các cột được đánh dấu KHÔNG NULL
- ĐẦY ĐỦ – Ghi lại các giá trị cũ của tất cả các cột trong hàng
- NOTHING – Không ghi thông tin gì về hàng cũ
Nếu bất kỳ tùy chọn nào khác FULL được đặt ở phía nhà xuất bản, thì danh tính bản sao bao gồm các cột giống hoặc ít hơn cũng phải được đặt ở phía người đăng ký
Để đơn giản, danh tính bản sao được đặt thành ĐẦY ĐỦ trong bài đăng này. Cấu hình ĐẦY ĐỦ ngụ ý rằng toàn bộ hàng của bảng trở thành khóa và toàn bộ hàng giá trị cũ được lưu trữ. Cách tiếp cận này có thể trở nên không hiệu quả từ quan điểm lưu trữ [so với các tùy chọn khác] và chỉ nên được sử dụng như là phương sách cuối cùng cho các đối tượng không thể có khóa chính hoặc chỉ mục. Ví dụ: bạn có thể sử dụng danh tính bản sao là ĐẦY ĐỦ với các bảng kiểm tra và lịch sử, thường không có khóa chính hoặc chỉ mục được liên kết. Xem đoạn mã sau
rds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
7Dọn dẹp
Sau khi hoàn thành hướng dẫn này, bạn nên dọn sạch tài nguyên của mình. Xem đoạn mã sau
rds-master=> create table table_before_publication [id1 int, id2 int];
CREATE TABLE
rds-master=> insert into table_before_publication values [1,2];
INSERT 0 1
rds-master=> select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
[0 rows]
8Bản tóm tắt
Bài đăng này minh họa nhu cầu song song hóa các phần độc lập của khối lượng công việc và các cách để đạt được điều đó bằng cách sao chép dữ liệu một phần. Bạn có thể sử dụng phương pháp này để đạt được các bản nâng cấp có thời gian ngừng hoạt động thấp, chia cơ sở dữ liệu thành các phân đoạn, thực hiện các thay đổi lược đồ trực tuyến, v.v. Chúng tôi khuyến khích bạn sử dụng khung sao chép logic của PostgreSQL cộng đồng trong môi trường Amazon RDS for PostgreSQL và Aurora PostgreSQL của bạn để thiết lập sao chép một phần dữ liệu mà không cần quản lý tài nguyên trung gian. Như mọi khi, AWS hoan nghênh phản hồi, vì vậy vui lòng để lại suy nghĩ hoặc câu hỏi của bạn trong phần bình luận
Thông tin về các Tác giả
Nikhil Khokhar là Kiến trúc sư giải pháp tại AWS. Anh gia nhập AWS vào năm 2016, chuyên xây dựng và hỗ trợ các giải pháp truyền dữ liệu giúp khách hàng phân tích và khai thác giá trị từ dữ liệu của họ. Khi rảnh rỗi, anh tận dụng kỹ năng in 3D của mình để giải quyết các vấn đề hàng ngày