Cấu hình Tự sao lưu dự phòng (Asynchronous/Synchronous Streaming Replication) trong PostgreSQL 9.0 +

Ở bài viết Giới thiệu Tính năng Tự Sao lưu Dự phòng (Streaming Replication) tích hợp trong PostgreSQL 9.0+ trong chuyên mục Cập nhật Công nghệ, tôi đã giới thiệu sơ bộ và về các tính năng và mô hình tự động sao lưu dự phòng sẵn có trong PostgreSQL từ phiên bản 9.0 trở lên. Trong bài viết này, tôi sẽ trình bày chi tiết cách cấu hình một hệ thống Tự động Sao lưu dự phòng cho PostgreSQL với cơ chế Đồng bộ (Synchronous) và Bất đồng bộ (Asynchronous) ở mức đơn giản nhất.

Để thực hiện bài lab này, tôi sử dụng hai server Ubuntu Server 12.04 (một Master và một Slave), trên đó tôi cài đặt PostgreSQL 9.2.3 theo Hướng dẫn biên dịch và cài đặt PostgreSQL 9.2 trên Ubuntu 12.04 LTS.

Lưu ý:

  1. Để làm theo hướng dẫn trong bài này, bạn phải có ít nhất là PostgreSQL phiên bản 9.1 vì tính năng Synchronous Streaming Replication chỉ có ở phiên bản PostgreSQL 9.1 trở lên.
  2. Nếu bạn chưa biết cách cài đặt PostgreSQL 9.2, hãy xem Hướng dẫn biên dịch và cài đặt PostgreSQL 9.2 trên Ubuntu 12.04 LTS.

Giả sử:

  1. Master server có IP 192.168.10.151 và Slave server có IP 192.168.10.152.
  2. Bạn đã biết cách sử dụng SSH để đăng nhập giữa các server sử dụng Authentication Key file.

Mô hình thử nghiệm

Cau hinh Streaming Replication PostgreSQL

Bước 1: Cấu Hình Master server

Trên Master server (192.168.10.151), Mở tập tin /usr/local/pgsql/data/postgresql.conf và chỉnh sửa nội dung như sau: 

listen_addresses = '*'
wal_level = hot_standby'
max_wal_senders = 1
  • Nếu bạn muốn sử dụng phương thức tự sao lưu đồng bộ (Synchronous Streaming Replication) thì hãy tìm đến synchronous_standby_names và điền tên của Slave vào. Trong ví dụ này: synchronous_standby_names='slave1'
  • Nếu bạn có nhiều hơn 1 Slave, hay chỉnh sửa giá trị của max_wal_senders lớn hơn hoặc bằng số lượng slave mà bạn áp dụng vào mô hình này nhưng không được lớn hơn giá trị của max_connections (mặc định là 100).

Tiếp theo, Mở tập tin /usr/local/pgsql/data/pg_hba.conf và thêm vào đoạn nội dung sau để cho phép Slave giao tiếp với Master:

host    all             postgres        192.168.10.152/32        trust
host replication postgres 192.168.10.152/32 trust

Khởi động PostgreSQL trên server Master và kiểm tra log xem có lỗi gì không. Nếu bạn đúng làm như các hướng dẫn của tôi thì chắc chắn sẽ không có lỗi gì.

Bước 2: Cấu hình Slave Server

Trên Slave server (192.168.10.152), mở tập tin /usr/local/pgsql/data/postgresql.conf và chỉnh sửa nội dung như sau: 

listen_addresses = '*'
hot_standby = on

Trong thư mục /usr/local/pgsql/data/, tạo tập tin recovery.conf với nội dung như sau

standby_mode = on
primary_conninfo = 'host=192.168.10.151'

Nếu bạn muốn sử dụng phương thức tự sao lưu đồng bộ (Synchronous Streaming Replication) thì hãy sửa giá trị của primary_conninfo thành primary_conninfo = 'host=192.168.10.151 application_name=slave1'

Lưu ý: Trạng thái của PostgreSQL phải là tắt. Đừng khởi động PostgreSQL ở bước này

Bước 3: Đồng bộ dữ liệu giữa Master và Slave

Đăng nhập vào Slave và thực hiện lệnh sau:

rsync -av --exclude pg_xlog --exclude *.conf  postgres@192.168.10.151:/usr/local/pgsql/data/*  /usr/local/pgsql/data/

Như vậy, việc cấu hình master & slave đã hoàn thành. Bước này ta có thể khởi động slave và kiểm tra kết quả. Lúc này, Master server hoạt động ở chế độ đọc & ghi như bình thường, trong khi slave server chỉ hoạt động ở chế độ đọc mà không cho phép ghi dữ liệu.

Lưu ý: Hãy khởi động Master trước rồi hãy khởi động slave

Bước 4: Kiểm tra kết quả

Kiểm tra log file của cả master và slave xem có lỗi gì không

Tạo/xoá thử một cơ sở dữ liệu trên master và kiểm tra xem có được đồng bộ ở bên slave không. Nếu có thì bạn đã thành công. Xin chúc mừng!!!