Skip to main content

Cài Đặt Cluster PostgreSQL Replication

Dưới đây là hướng dẫn chi tiết để thiết lập một cluster PostgreSQL có tính khả dụng cao (highly-available replication cluster) trên Ubuntu 20.04.


Cài Đặt Cluster PostgreSQL Replication Có Tính Khả Dụng Cao trên Ubuntu 20.04

Giới Thiệu

PostgreSQL Replication cho phép bạn tạo bản sao của cơ sở dữ liệu để đảm bảo tính khả dụng cao và cân bằng tải. Bài viết này sẽ hướng dẫn cách thiết lập một cluster PostgreSQL replication trên Ubuntu 20.04.

Quy Hoạch IP

TênIP
Master192.168.80.244
Replica192.168.80.245

PostgreSQL Cluster

Cấu Hình Node Master

1. Tạo User Replication

# Đăng nhập vào PostgreSQL
sudo -u postgres psql

# Tạo role replication
CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'EXAMPLE_PASSWORD';

# Thoát
\q
tip

Đảm bảo thay đổi EXAMPLE_PASSWORD cho phù hợp

2. Cấu Hình PostgreSQL

sudo nano /etc/postgresql/12/main/postgresql.conf

Cập nhật các thông số sau:

listen_addresses = 'localhost,192.168.80.244'
wal_level = logical
wal_log_hints = on

3. Cấu Hình Xác Thực

sudo nano /etc/postgresql/12/main/pg_hba.conf

Thêm vào cuối file:

host    replication     repl_user       192.168.80.245/32           md5
tip

Đảm bảo thay đổi IP theo môi trường thực tế của bạn

4. Khởi Động Lại PostgreSQL

sudo systemctl restart postgresql

Cấu Hình Node Replica

1. Chuẩn Bị Node Replica

# Dừng PostgreSQL
sudo systemctl stop postgresql

# Xóa dữ liệu cũ
sudo rm -rv /var/lib/postgresql/12/main/

2. Sao Chép Dữ Liệu từ Master

sudo pg_basebackup -h 192.168.80.244 -U repl_user -X stream -C -S replica_1 -v -R -W -D /var/lib/postgresql/12/main/
caution

Nhớ thay đổi IP và phiên bản PostgreSQL cho phù hợp

info

Các tham số giải thích:

-h: Địa chỉ IP của master.

-U: Tài khoản sao chép (repl_user).

-D: Đường dẫn tới thư mục dữ liệu trên node replica.

-X stream: Bao gồm các tệp WAL (Write-Ahead Log) trong quá trình sao lưu.

-C: Tạo một khe sao chép (replication slot).

-R: Tạo tệp cấu hình khôi phục và tệp kết nối tới master.

-W: Yêu cầu nhập mật khẩu cho repl_user.

Kết quả sau khi chạy lệnh:

pg_basebackup: initiating base backup, waiting for checkpoint to complete  
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created replication slot "replica_1"
pg_basebackup: write-ahead log end point: 0/2000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: base backup completed

3. Phân Quyền, Cấu Hình và Khởi Động

# Phân quyền
sudo chown postgres -R /var/lib/postgresql/12/main/

Chỉnh lại cấu hình PostgreSQL:

sudo nano /etc/postgresql/12/main/postgresql.conf
warning

Lưu ý:

  • Cấu hình cần giống với master khi bạn sử dụng Tinh Chỉnh PostgreSQL để tạo cấu hình tối ưu.

Khởi động lại PostgreSQL:

sudo systemctl restart postgresql

Kiểm Tra Replication

1. Trên Node Master

-- Tạo database test
CREATE DATABASE testreplica_db;
\c testreplica_db;

-- Tạo bảng test
CREATE TABLE users (
name VARCHAR(30),
country VARCHAR(2)
);

-- Thêm dữ liệu
INSERT INTO users VALUES ('John', 'US');
INSERT INTO users VALUES ('Alice', 'CA');

2. Trên Node Replica

-- Kiểm tra dữ liệu
\c testreplica_db;
SELECT * FROM users;

Xử Lý Sự Cố

Các Vấn Đề Thường Gặp

  1. Không thể kết nối tới master

    • Kiểm tra cấu hình pg_hba.conf
    • Xác nhận IP và port đúng
    • Kiểm tra firewall
  2. Replication bị trễ

    • Kiểm tra băng thông mạng
    • Xem xét WAL settings
    • Theo dõi replication lag

1. Lỗi Replication Slot Khi Chạy pg_basebackup

Nếu gặp lỗi khi chạy pg_basebackup liên quan đến replication slot, thực hiện các bước sau trên node primary:

  1. Kiểm tra các replication slot hiện có:
SELECT * FROM pg_replication_slots;

Kết quả có thể như sau:

slot_name   | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size | two_phase
------------+--------+-----------+---------+----------+-----------+--------+------------+------+--------------+-------------+--------------------+------------+---------------+-----------
replica_1 | | physical | | | f | f | | | | 0/3000060 | | reserved | | f
  1. Xóa replication slot cũ:
SELECT pg_drop_replication_slot('replica_1');
  1. Thực hiện lại pg_basebackup trên node replica:
sudo pg_basebackup -h 192.168.80.244 -U repl_user -X stream -C -S replica_1 -v -R -W -D /var/lib/postgresql/12/main/
tip
  • Đảm bảo thay thế replica_1 bằng tên slot thực tế trong hệ thống của bạn
  • Luôn kiểm tra và xóa slot cũ trước khi tạo slot mới để tránh xung đột
warning

Việc xóa replication slot sẽ làm mất kết nối replica hiện tại. Chỉ thực hiện khi:

  • Bạn chắc chắn slot đó không còn được sử dụng
  • Bạn đang thiết lập lại replica từ đầu

Tài Liệu Tham Khảo