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:
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.