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ên | IP |
---|---|
Master | 192.168.80.244 |
Replica | 192.168.80.245 |
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
Đả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
Đả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/
Nhớ thay đổi IP và phiên bản PostgreSQL cho phù hợp
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
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
-
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
-
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:
- 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
- Xóa replication slot cũ:
SELECT pg_drop_replication_slot('replica_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/
- Đả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
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