Cấu hình Streaming Replication trong PostgreSQL 13

 

1. Giới thiệu Streaming Replication

Streaming Replication là tính năng giúp bạn xây dựng 1 hệ thống database dự phòng cho database PostgreSQL. Hơn thế nữa, nó còn cho phép bạn có thể truy vấn dữ liệu trên database dự phòng được, giúp giảm tải cho database chính.

Streaming Replication hoạt động dựa trên việc chuyển các WAL file từ database chính (hay master) sang database dự phòng (hay slave). Sau đó, áp dụng các WAL file này vào database dự phòng. Trong các tài liệu thường gọi đó là tiến trình recovery, apply hoặc replay.

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

Môi trường giả lập của tôi có 2 server đều đã cài đặt PostgreSQL

1. Server master:

  • IP: 192.168.50.34
  • Hệ điều hành: Red Hat Enterprise Linux Server release 7.9
  • Phiên bản PostgreSQL: 13

2. Server slave:

  • IP: 192.168.50.35
  • Hệ điều hành: Red Hat Enterprise Linux Server release 7.9
  • Phiên bản PostgreSQL: 13

Trên server master, tôi đã khởi tạo 1 cluster PostgreSQL và đã tạo sẵn 1 database có tên testdb

Mô hình mà tôi cần xây dựng như sau:

Mô hình Streaming Replication

3. Thực hiện trên Server Master

1. Đưa PostgreSQL database về archive mode

Kiểm tra database đã ở chế độ archive mode hay chưa

# show archive_mode ;
 archive_mode 
--------------
 on
(1 row)

Nếu chưa, bạn hãy đưa database về chế độ Archive mode

2. Tham số wal_level=replica

Kiểm tra lại tham số wal_level xem giá trị đã là replica hay chưa

# show wal_level ;
 wal_level 
-----------
 replica
(1 row)

Nếu chưa, bạn hãy chạy lệnh sau để thay đổi tham số :

alter system set wal_level=replica;

Và nhớ restart lại instance để giá trị mới có hiệu lực.

pg_ctl restart

3. Cấu hình network giữa primary và standby

Tạo user để đồng bộ

CREATE USER replication WITH REPLICATION PASSWORD 'Abcd1234';

Sau đó, bạn sửa lại file pg_hba.conf để cho phép từ standby có thể kết nối được vào primary thông qua user replication

vi pg_hba.conf

và thêm vào dòng sau:

host  replication     replication     192.168.50.35/32         md5

Sau khi chỉnh xong file pg_hba.conf, bạn nhớ chạy lệnh sau để thay đổi có hiệu lực

pg_ctl reload

Chú ý: Option reload chỉ nạp lại giá trị các tham số chứ không phải restart database, do đó không ảnh hưởng gì đến các giao dịch đang diễn ra trên database.

 

4. Thực hiện trên Server Slave

Như vậy các bước trên master đã xong. Bây giờ chúng ta chuyển sang thao tác trên slave.

1. Backup và restore 

Thực hiện câu lệnh sau

pg_basebackup -h 192.168.50.34 -U replication -p 5432 -D $PGDATA -Fp -Xs -P -R

(Nhớ điền password của user replication)

Câu lệnh trên sẽ kết nối vào master, backup toàn bộ thư mục PGDATA của master và restore sang slave. Option -R sẽ tạo ra trên slave 1 file có tên là standby.signal. File này có nhiệm vụ báo hiệu đây là database slave.

Sau khi restore xong, kết quả có thể trông như sau:

Ngoài ra, nếu bạn kiểm tra file postgresql.auto.conf sẽ thấy có thêm tham số sau (tham số này cũng do option -R tạo ra)

primary_conninfo = 'user=replication password=''Abcd1234'' channel_binding=prefer host=192.168.50.34 port=5432 sslmode=prefer sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

Tham số này để chỉ ra thông tin kết nối đến master, từ đó slave có thể sử dụng để kết nối vào slave để kéo WAL file về.

2. Start database

Sau khi đã restore xong, các bạn hãy start database lên

pg_ctl start

waiting for server to start....2021-06-11 15:52:36.115 +07 [17767] LOG: redirecting log output to logging collector process
2021-06-11 15:52:36.115 +07 [17767] HINT: Future log output will appear in directory "log".
done
server started

Như vậy là xong rồi đấy. Rất đơn giản phải không?

 

5. Kiểm tra kết quả

Bây giờ hãy thử kiểm tra kết quả xem

Đầu tiên bạn xem log của database xem.

cd $PGDATA/log
tail -100f postgresql-Fri.log

Kết quả như sau:

Đoạn log trên cho thấy database hiện đang ở chế độ standby và cho phép các kết nối read-only (chỉ đọc).

Cách tiếp theo để kiểm tra đó là: Bạn thêm dữ liệu vào bên master và kiểm tra slave xem đã có dữ liệu vừa mới thêm hay chưa.

Tôi tạo bảng và thêm dữ liệu mới trên master

Và quay sang slave để kiểm tra:

Như vậy là ok rồi đó. Chúc các bạn thành công.


Related posts

Perform Manual Failover & Switchover with repmgr in PostgreSQL

Configure automatic failover with repmgrd in PostgreSQL

Monitor Streaming Replication trong PostgreSQL