Thứ sáu, 31/08/2018 | 00:00 GMT+7

Cách thiết lập bản sao lôgic với PostgreSQL 10 trên Ubuntu 18.04

Khi cài đặt một ứng dụng để production , việc có nhiều bản sao database của bạn thường hữu ích. Quá trình giữ các bản sao database đồng bộ được gọi là sao chép . Việc nhân bản có thể cung cấp khả năng mở rộng theo chiều ngang có tính khả dụng cao cho dung lượng lớn các thao tác đọc đồng thời, cùng với việc giảm độ trễ đọc. Nó cũng cho phép sao chép ngang hàng giữa các server database phân tán theo địa lý.

PostgreSQL là một hệ thống database quan hệ đối tượng open-souce có khả năng mở rộng cao và tuân theo ACID (Atomicity, Consistency, Isolation, Durability) và tiêu chuẩn SQL. Phiên bản 10.0 của PostgreSQL đã giới thiệu hỗ trợ sao chép logic , ngoài sao chép vật lý . Trong một chương trình sao chép logic, hoạt động ghi cao cấp được xem trực tiếp từ một server database tổng thể thành một hoặc nhiều server database bản sao. Trong một sơ đồ sao chép vật lý, các hoạt động ghi binary thay vào đó được truyền trực tuyến từ bản chính đến bản sao, tạo ra một bản sao chính xác từng byte cho nội dung root . Trong trường hợp bạn muốn nhắm đến một tập hợp con dữ liệu cụ thể, chẳng hạn như báo cáo không tải, vá lỗi hoặc nâng cấp, sao chép hợp lý có thể cung cấp tốc độ và tính linh hoạt.

Trong hướng dẫn này, bạn sẽ cấu hình sao chép hợp lý với PostgreSQL 10 trên hai server Ubuntu 18.04, với một server đóng role là chính và server kia là bản sao. Đến cuối hướng dẫn, bạn có thể sao chép dữ liệu từ server chính sang bản sao bằng cách sử dụng sao chép hợp lý.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

Bước 1 - Cấu hình PostgreSQL để tái tạo logic

Có một số cài đặt cấu hình bạn cần sửa đổi để cho phép sao chép hợp lý giữa các server của bạn . Đầu tiên, bạn sẽ cấu hình Postgres để lắng nghe trên network interface riêng thay vì giao diện công khai, vì việc để lộ dữ liệu qua mạng công cộng là một rủi ro bảo mật. Sau đó, bạn sẽ cấu hình các cài đặt thích hợp để cho phép sao chép sang db-replica .

Trên db-master , mở /etc/postgresql/10/main/postgresql.conf , file cấu hình server chính:

  • sudo nano /etc/postgresql/10/main/postgresql.conf

Tìm dòng sau:

/etc/postgresql/10/main/postgresql.conf
... #listen_addresses = 'localhost'         # what IP address(es) to listen on; ... 

Bỏ ghi chú nó bằng cách xóa dấu # và thêm db_master_private_ip_address của bạn để kích hoạt các kết nối trên mạng riêng:

Lưu ý: Trong bước này và các bước tiếp theo, hãy đảm bảo sử dụng địa chỉ IP riêng của server của bạn chứ không phải IP công khai của chúng. Việc để lộ một server database lên internet công cộng là một rủi ro bảo mật đáng kể.

/etc/postgresql/10/main/postgresql.conf
... listen_addresses = 'localhost, db_master_private_ip_address' ... 

Điều này làm cho db-master nghe các kết nối đến trên mạng riêng ngoài giao diện loopback.

Tiếp theo, tìm dòng sau:

/etc/postgresql/10/main/postgresql.conf
... #wal_level = replica                    # minimal, replica, or logical ... 

Bỏ ghi chú nó và thay đổi nó để đặt mức PostgreSQL Write Ahead Log (WAL) thành logical . Điều này làm tăng dung lượng mục nhập trong log , thêm thông tin cần thiết để extract sự khác biệt hoặc thay đổi đối với các tập dữ liệu cụ thể:

/etc/postgresql/10/main/postgresql.conf
... wal_level = logical ... 

Các mục nhập trên log này sẽ được sử dụng bởi server bản sao, cho phép sao chép các hoạt động ghi cấp cao từ bản chính.

Lưu file và đóng nó lại.

Tiếp theo, hãy chỉnh sửa /etc/postgresql/10/main/pg_hba.conf , file kiểm soát các server được phép, xác thực và quyền truy cập vào database :

  • sudo nano /etc/postgresql/10/main/pg_hba.conf

Sau dòng cuối cùng, hãy thêm một dòng để cho phép các kết nối mạng đến từ db-replica . Ta sẽ sử dụng địa chỉ IP riêng của db-replica và chỉ định rằng các kết nối được phép từ tất cả user và database :

/etc/postgresql/10/main/pg_hba.conf
... # TYPE      DATABASE        USER            ADDRESS                               METHOD ... host         all            all             db_replica_private_ip_address/32      md5 

Như vậy, các kết nối mạng đến sẽ được cho phép từ db-replica , được xác thực bằng hàm băm password (md5) .

Lưu file và đóng nó lại.

Tiếp theo, hãy đặt luật firewall của ta để cho phép lưu lượng truy cập từ db-replica đến cổng 5432 trên db-master :

  • sudo ufw allow from db_replica_private_ip_address to any port 5432

Cuối cùng, khởi động lại server PostgreSQL để các thay đổi có hiệu lực:

  • sudo systemctl restart postgresql

Với cấu hình của bạn được đặt để cho phép sao chép hợp lý, bây giờ bạn có thể chuyển sang tạo database , role user và bảng.

Bước 2 - Cài đặt database , role user và bảng

Để kiểm tra chức năng của cài đặt sao chép của bạn, hãy tạo database , bảng và role user . Bạn sẽ tạo ra một example database với một bảng mẫu, sau đó bạn có thể sử dụng để kiểm tra bản sao logic giữa các server của bạn. Bạn cũng cần tạo một user chuyên dụng và gán cho họ các quyền trên cả database và bảng.

Đầu tiên, hãy mở dấu nhắc psql với quyền là user postgres bằng lệnh sau trên cả db-masterdb-replica :

  • sudo -u postgres psql
  • sudo -u postgres psql

Tạo một database mới được gọi là example trên cả hai server :

  • CREATE DATABASE example;
  • CREATE DATABASE example;

Lưu ý: Cuối cùng ; trong các lệnh này là bắt buộc. Trên các phiên tương tác, PostgreSQL sẽ không thực thi các lệnh SQL cho đến khi bạn kết thúc chúng bằng dấu chấm phẩy. Các lệnh meta (những lệnh bắt đầu bằng dấu gạch chéo ngược, như \q\c ) trực tiếp kiểm soát chính ứng dụng client psql và do đó được miễn luật này. Để biết thêm về các lệnh meta và ứng dụng client psql, vui lòng tham khảo tài liệu PostgreSQL .

Sử dụng lệnh \connect meta-command, kết nối với database bạn vừa tạo trên mỗi server :

  • \c example
  • \c example

Tạo một bảng mới được gọi là widgets với các trường tùy ý trên cả hai server :

  • CREATE TABLE widgets
  • (
  • id SERIAL,
  • name TEXT,
  • price DECIMAL,
  • CONSTRAINT widgets_pkey PRIMARY KEY (id)
  • );
  • CREATE TABLE widgets
  • (
  • id SERIAL,
  • name TEXT,
  • price DECIMAL,
  • CONSTRAINT widgets_pkey PRIMARY KEY (id)
  • );

Bảng trên db-replica không cần phải giống với bản sao db-master của nó. Tuy nhiên, nó phải chứa mọi cột đơn có trên bảng tại db-master . Các cột bổ sung không được có NOT NULL hoặc các ràng buộc khác. Nếu họ làm vậy, việc nhân rộng sẽ thất bại.

Trên db-master , hãy tạo một role user mới với tùy chọn REPLICATION và password đăng nhập. Thuộc tính REPLICATION phải được gán cho bất kỳ role nào được sử dụng để sao chép. Ta sẽ gọi user của ta là sammy , nhưng bạn có thể thay thế điều này bằng tên user của bạn . Đảm bảo cũng thay thế my_password bằng password an toàn của bạn :

  • CREATE ROLE sammy WITH REPLICATION LOGIN PASSWORD 'my_password';

Ghi lại password của bạn vì bạn sẽ sử dụng nó sau này trên db-replica để cài đặt sao chép.

Vẫn trên db-master, cấp quyền đầy đủ về các example database với role user mà bạn vừa tạo:

  • GRANT ALL PRIVILEGES ON DATABASE example TO sammy;

Tiếp theo, cấp quyền trên tất cả các bảng có trong database cho user của bạn:

  • GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sammy;

Lược đồ public là một schemas mặc định trong mỗi database mà các bảng được đặt tự động.

Với các quyền này được đặt, bây giờ bạn có thể chuyển sang làm cho các bảng trong database example của bạn có để nhân rộng.

Bước 3 - Cài đặt Ấn phẩm

Các ấn phẩm là cơ chế mà PostgreSQL sử dụng để tạo các bảng có sẵn để nhân rộng. Server database sẽ theo dõi nội bộ tình trạng kết nối và sao chép của bất kỳ server bản sao nào được liên kết với một ấn phẩm nhất định. Trên db-master , bạn sẽ tạo một ấn phẩm, my_publication , sẽ hoạt động như một bản sao chính của dữ liệu sẽ được gửi đến người đăng ký của bạn - trong trường hợp của ta là db-replica .

Trên db-master , hãy tạo một ấn phẩm có tên my_publication :

  • CREATE PUBLICATION my_publication;

Thêm bảng widgets bạn đã tạo trước đó vào nó:

  • ALTER PUBLICATION my_publication ADD TABLE widgets;

Với ấn bản của bạn đã có, giờ đây bạn có thể thêm người đăng ký sẽ lấy dữ liệu từ đó.

Bước 4 - Tạo đăng ký

Đăng ký được PostgreSQL sử dụng để kết nối với các ấn phẩm hiện có. Một ấn phẩm có thể có nhiều đăng ký trên các server bản sao khác nhau và các server bản sao cũng có thể có các ấn phẩm riêng với người đăng ký. Để truy cập dữ liệu từ bảng bạn đã tạo trên db-master , bạn cần tạo đăng ký cho ấn phẩm bạn đã tạo ở bước trước, my_publication .

Trên db-replica , hãy tạo một gói đăng ký có tên là my_subscription . Lệnh CREATE SUBSCRIPTION sẽ đặt tên cho đăng ký, trong khi tham số CONNECTION sẽ xác định chuỗi kết nối với nhà xuất bản. Chuỗi này sẽ bao gồm các chi tiết kết nối server thạc sĩ và thông tin đăng nhập, bao gồm tên user và password bạn đã định nghĩa trước đó, cùng với tên của các example database . , hãy nhớ sử dụng địa chỉ IP riêng của db-master và thay thế my_password bằng password của bạn :

  • CREATE SUBSCRIPTION my_subscription CONNECTION 'host=db_master_private_ip_address port=5432 password=my_password user=sammy dbname=example' PUBLICATION my_publication;

Bạn sẽ thấy kết quả sau xác nhận đăng ký:

Output
NOTICE: created replication slot "my_subscription" on publisher CREATE SUBSCRIPTION

Khi tạo đăng ký, PostgreSQL sẽ tự động đồng bộ hóa mọi dữ liệu đã có từ trước từ bản chính sang bản sao. Trong trường hợp của ta , không có dữ liệu để đồng bộ hóa vì bảng widgets trống, nhưng đây là một tính năng hữu ích khi thêm đăng ký mới vào database hiện có.

Khi đã có đăng ký, hãy kiểm tra cài đặt bằng cách thêm một số dữ liệu demo vào bảng widgets .

Bước 5 - Kiểm tra và khắc phục sự cố

Để kiểm tra bản sao giữa bản chính và bản sao của ta , hãy thêm một số dữ liệu vào bảng widgets và xác minh nó sao chép chính xác.

Trên db-master , hãy chèn dữ liệu sau vào bảng widgets :

  • INSERT INTO widgets (name, price) VALUES ('Hammer', 4.50), ('Coffee Mug', 6.20), ('Cupholder', 3.80);

Trên db-replica , hãy chạy truy vấn sau để tìm nạp tất cả các mục nhập trên bảng này:

  • SELECT * FROM widgets;

Đến đây bạn sẽ thấy:

Output
id | name | price ----+------------+------- 1 | Hammer | 4.50 2 | Coffee Mug | 6.20 3 | Cupholder | 3.80 (3 rows)

Sự thành công! Các mục đã được sao chép thành công từ db-master sang db-replica . Kể từ bây giờ, tất cả các truy vấn INSERT , UPDATEDELETE sẽ được sao chép một chiều trên các server .

Một điều cần lưu ý về ghi truy vấn trên server bản sao là chúng không được sao chép trở lại server chính. PostgreSQL hiện có hỗ trợ hạn chế để giải quyết xung đột khi dữ liệu giữa các server khác nhau. Nếu có xung đột, quá trình sao chép sẽ dừng và PostgreSQL sẽ đợi cho đến khi sự cố được administrator database khắc phục theo cách thủ công. Vì lý do đó, hầu hết các ứng dụng sẽ hướng tất cả các hoạt động ghi tới server chính và phân phối các lần đọc giữa các server bản sao có sẵn.

Đến đây bạn có thể thoát khỏi dấu nhắc psql trên cả hai server :

  • \q
  • \q

Đến đây bạn đã hoàn tất việc kiểm tra cài đặt của bạn , bạn có thể thêm và sao chép dữ liệu của riêng mình.

Xử lý sự cố

Nếu bản sao có vẻ không hoạt động, bước đầu tiên tốt là kiểm tra log PostgreSQL trên db-replica để tìm bất kỳ lỗi nào có thể xảy ra:

  • tail /var/log/postgresql/postgresql-10-main.log

Dưới đây là một số vấn đề phổ biến có thể ngăn không cho sao chép hoạt động:

  • Mạng riêng không được bật trên cả hai server hoặc các server nằm trên các mạng khác nhau;
  • db-master không được cấu hình để lắng nghe các kết nối trên đúng IP mạng riêng;
  • Mức ghi log phía trước trên db-master được cấu hình không chính xác (nó phải được đặt thành logical );
  • db-master không được cấu hình để chấp nhận các kết nối đến từ địa chỉ IP riêng db-replica chính xác;
  • Tường lửa như UFW đang chặn các kết nối PostgreSQL đến trên cổng 5432 ;
  • Có tên bảng hoặc trường không khớp giữa db-masterdb-replica ;
  • Các sammy database role là mất tích các điều khoản cần thiết để truy cập example database trên db-master;
  • Role database sammy thiếu tùy chọn REPLICATION trên db-master ;
  • Role database sammy thiếu các quyền cần thiết để truy cập bảng widgets trên db-master ;
  • Bảng này chưa được thêm vào ấn bản trên db-master .

Sau khi giải quyết (các) vấn đề hiện có, việc nhân rộng sẽ diễn ra tự động. Nếu không, hãy sử dụng lệnh sau để xóa đăng ký hiện có trước khi tạo lại:

  • DROP SUBSCRIPTION my_subscription;

Kết luận

Trong hướng dẫn này, bạn đã cài đặt thành công PostgreSQL 10 trên hai server Ubuntu 18.04 và cấu hình bản sao hợp lý giữa chúng.

Đến đây bạn có kiến thức cần thiết để thử nghiệm với tỷ lệ đọc theo chiều ngang, tính khả dụng cao và phân bố địa lý của database PostgreSQL của bạn bằng cách thêm các server bản sao bổ sung.

Để tìm hiểu thêm về sao chép logic trong PostgreSQL 10, bạn có thể đọc chương về chủ đề này trên tài liệu PostgreSQL chính thức, cũng như các mục thủ công về CREATE PUBLICATIONCREATE SUBSCRIPTION .


Tags:

Các tin liên quan

Cách di chuyển thư mục dữ liệu PostgreSQL đến vị trí mới trên Ubuntu 18.04
2018-07-13
Cách cài đặt và sử dụng PostgreSQL trên Ubuntu 18.04
2018-05-04
Cách sử dụng tìm kiếm toàn văn bản trong PostgreSQL trên Ubuntu 16.04
2017-06-15
Cách bảo mật PostgreSQL chống lại các cuộc tấn công tự động
2017-01-24
Cách sử dụng Postgresql với Ứng dụng Django của bạn trên Debian 8
2016-12-22
Cách di chuyển thư mục dữ liệu PostgreSQL đến vị trí mới trên Ubuntu 16.04
2016-07-27
Cách sử dụng PostgreSQL với Ứng dụng Django của bạn trên Ubuntu 16.04
2016-05-18
Cách cài đặt và sử dụng PostgreSQL trên Ubuntu 16.04
2016-05-04
Cách backup, khôi phục và di chuyển database PostgreSQL với Barman trên CentOS 7
2016-01-20
Cài đặt postgresql 9.4 trên Debian 8
2015-06-11