Cấu hính Logical Replication PostgreSQL

Theo tài liệu PostgreSQL, Logical Replication là một giải pháp đồng bộ dữ liệu ở mức logic. Ở đây có 2 thuật ngữ, bạn cần hiểu rõ ý nghĩa:

   Đồng bộ dữ liệu có thể hiểu là cơ chế giúp 1 bảng (hay rộng ra là 1 đối tượng) “bắt chước” các sự thay đổi từ 1 bảng khác. VD: Khi insert dữ liệu vào bảng A, thì bảng B cũng được insert đúng dữ liệu đó.

   Thuật ngữ logic ở đây đối nghịch với thuật ngữ physic. Hiểu một cách đơn giản, logic là các đối tượng ở mức trên cùng, mà user có thể tương tác được như table, view. Còn physic là đối tượng thực sự ở bên dưới ổ đĩa, thứ mà user không nhìn thấy (như datatabase, tablespace, datafile)

Link từ trang document của PostgreSQL: https://www.postgresql.org/docs/current/logical-replication.html

Tóm lại, Logical Replication là 1 giải pháp đồng bộ dữ liệu đối với từng table.

Việc đồng bộ dữ liệu ở mức độ physic có nghĩa là bạn sẽ phải đồng bộ toàn bộ database. Thế nhưng giả sử bây giờ bạn chỉ cần đồng bộ một vài bảng thôi thì giải pháp Logical Replication mới có thể làm được.

Trên thực tế, giải pháp Logical Replication phù hợp cho việc xây dựng hệ thống báo cáo, do nó rất linh hoạt, và database được đồng bộ có thể đọc và ghi dữ liệu trên đó được.


   Nguyên tắc hoạt động

Logical Replication đồng bộ dữ liệu dựa trên WAL file.
Đọc thêm  PostgreSQL WAL là gì?

Khi có thay đổi trên 1 bảng A nào đó, thay đổi đó sẽ được ghi vào WAL file. Sau đó, một tiến trình gọi là logical decode sẽ chuyển hóa thay đổi đó thành các câu lệnh SQL, gửi sang database đích và thực hiện trên bảng A’ được cấu hình logical replication đồng bộ với bảng A.

Logical Replication sử dụng mô hình publication – subscription. Tức là, ở đầu publication, các bảng cần đồng bộ sẽ được thêm vào 1 nhóm gọi là publication, publication có nhiệm vụ ghi lại những câu lệnh thay đổi trên các bảng đó. Ở đầu còn lại – subscription, sẽ kết nối với publication để lấy ra các câu lệnh thay đổi và thực thi trên các bảng đích.

Trong bài viết này tôi sẽ hướng dẫn các bạn cách cấu hình một mô hình Logical Replication.


   Chuẩn bị môi trường

Đầu tiên các bạn cần chuẩn bị môi trường như sau:

   Hai máy chủ giả lập cho hệ thống chính (gọi là master) và hệ thống đồng bộ (replication).

   IP hệ thống master: 10.239.43.106

   IP hệ thống replication: 10.239.43.102

   Hai máy chủ này phải kết nối được với nhau thông qua cổng mặc định của PostgreSQL là 5432

   Trên hai máy chủ này tôi sẽ cài phiên bản 13 và đã khởi tạo một Database Cluster.

   Trong Database Cluster trên hệ thống master tôi có một database tên là prod có một bảng là khach_hang có cấu trúc như sau:

CREATE TABLE public.khach_hang (
id int4 NOT NULL,
hoten varchar NULL,
email varchar NULL,
dienthoai varchar NULL,
diachi varchar NULL,
CONSTRAINT khach_hang_pk PRIMARY KEY (id)
);

Nhu cầu tôi cần bây giờ đó là đồng bộ bảng này sang database report nằm trên hệ thống replication.


   Các bước tiến hành

Các bước cần tiến hành như sau

   Tạo user và gán quyền

Đầu tiên tôi cần cấu hình kết nối để từ máy chủ replication có thể kết nối vào PostgreSQL trên máy chủ master

Bạn kết nối với database có chứa bảng khach_hang, ở đây là prod

$ psql prod
psql (13)
Type "help" for help.

prod=#

Bạn tạo user

CREATE ROLE replica WITH REPLICATION LOGIN PASSWORD 'Abcd1234';
GRANT ALL PRIVILEGES ON DATABASE prod TO replica ;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO replica ;

Ở đây, tôi đã tạo 1 user đặt tên là replica với password “Abcd1234”. User này sẽ sử dụng để cho subscription kết nối với publication. User này cần các quyền trên database prod để có thể hoạt động được đầy đủ chức năng.

   Cấu hình kết nối

Tiếp theo, bạn cần cấu hình để cho phép từ hệ thống replication có thể kết nối với database prod bằng user replica

Bạn sử dụng vi để mở file pg_hba.conf ra, và thêm vào dòng sau:

host    replication     replica           10.239.43.102/32        md5
Đọc thêm  Cấu hình kết nối trong PostgreSQL với pg_hba.conf

   Thay đổi tham số

Để Logical Replication có thể hoạt động được, cần phải đặt tham số wal_level=logical

alter system set wal_level=logical;

restart instance

pg_ctl restart

   Tạo publication

Bây giờ đến bước tạo publication, bạn thực hiện lệnh sau:

CREATE PUBLICATION pub;

Sau đó bạn thêm bảng khach_hang vào publication pub

ALTER PUBLICATION pub ADD TABLE public.khach_hang;

   Tạo subscription

Như vậy là chúng ta đã xong các bước ở trên database prod rồi đó. Bây giờ chúng ta sẽ chuyển sang hệ thống replication, và kết nối vào database report.

Chúng ta tạo 1 bảng có cùng tên và cấu trúc với bảng khach_hang ở trên database report

$ psql report
psql (13)
Type "help" for help.

report=#
CREATE TABLE public.khach_hang (
id int4 NOT NULL,
hoten varchar NULL,
email varchar NULL,
dienthoai varchar NULL,
diachi varchar NULL,
CONSTRAINT khach_hang_pk PRIMARY KEY (id)
);

Cuối cùng chúng ta tạo subscription trên report để kết nối với publication trên prod

CREATE SUBSCRIPTION sub CONNECTION 'host=10.239.43.106 port=5432 
password=Abcd1234 user=replica dbname=prod' 
PUBLICATION pub;

Như vậy là hoàn thành rồi đó. Cuối cùng chúng ta kiểm tra kết quả thôi

   Kiểm tra

Bây giờ tôi sẽ thêm dữ liệu vào bảng khach_hang trên database prod

INSERT INTO public.khach_hang (id,hoten,email,dienthoai,diachi)
    VALUES (1,'duy','[email protected]','0987654321','Việt Nam');

Kiểm tra lại trên database report:

 

Với các thao tác UPDATE, DELETE, bạn có thể tự thử nghiệm nhé.

Chú ý:

Giả sử dữ liệu trên bảng khach_hang ở database prod đã có sẵn, thì khi chúng ta tạo subscription, ngay lập tức, dữ liệu trên đó sẽ được chuyển hóa thành câu lệnh COPY và chuyển sang bên report luôn

Như vậy là xong rồi đó, nếu anh em muốn tôi thực hiện các bài lab nào khác, anh em cứ gửi yêu cầu lên group “Kho tài liệu kiến thức database” nhé

https://www.facebook.com/groups/khotailieukienthucdatabase

Nói chung, tôi cũng khá bận nên có thể sẽ trễ vài hôm mới phản hồi các bạn được, mong anh em hết sức thông cảm.

 

Nguồn: https://dangxuanduy.com/

Xin cho tôi được biết, bạn cảm thấy bài viết này như thế nào? Ý kiến của bạn sẽ giúp tôi nâng cao chất lượng bài viết của mình.

    Hãy chia sẻ bài viết này nếu bạn thấy có ích nhé
    0 0 votes
    Article Rating
    Subscribe
    Notify of
    guest
    0 Comments
    Inline Feedbacks
    View all comments