- vừa được xem lúc

Triển khai Postgresql Repmgr + HAProxy auto failover và tự động detect master-slave

0 0 1

Người đăng: tecklens

Theo Viblo Asia

Chào các bạn 👋. Lâu lâu mới có thời gian viết bài chia sẻ với anh em.

Series này mình sẽ hướng dẫn từng bước cài đặt PostgreSQL theo mô hình 3 node + repmgr auto failover và cài HAProxy để cân bằng tải và tự động detect master-slave

Series gồm 2 phần:

  1. Cài đặt PostgreSQL trên 3 node và triển khai tự động failover với repmgr
  2. Triển khai HAProxy với external check để tự phát hiện master - slave

Phần 1: Cài đặt PostgreSQL trên 3 node và triển khai tự động failover với repmgr

Chúng ta sẽ đi thẳng vào thiết lập và cài đặt luôn.

Bạn nào có nhu cầu tìm hiểu xem postgresql là gì, repmgr là gì có thể tham khảo bài viết sau:

Thiết lập thì sẽ bao gồm 3 máy chủ (mình thì cài on-promise, các bạn có thể dùng docker container): một máy master và 2 máy standby. Với sự trợ giúp của công cụ repmgr, khi master gặp sự cố, nó sẽ tự động chọn một master mới, và các standby còn lại sẽ tự replication đến master mới này. Điều này đảm bảo cụm PostgreSQL của chúng tôi luôn sẵn sàng cao và có khả năng xử lý các tình huống chuyển đổi dự phòng.

Mặc dù các bước được cung cấp hữu ích cho việc trải nghiệm thực tế với sao chép và chuyển đổi dự phòng PostgreSQL, nhưng điều quan trọng cần lưu ý là các cấu hình này có thể không phù hợp trong môi trường sản xuất. Các cấu hình được cung cấp mang tính tùy biến hơn, giúp quy trình đơn giản và dễ hiểu hơn.

Nói một cách đơn giản:

  1. Nó thiết lập 1 cụm PostgreSQL có tính khả dụng cao với khả năng chuyển đổi dự phòng tự động bằng cách sử dụng ba máy chủ: master + 2 standby (có thể nhiều standby hơn đối với các ứng dụng read heavy).
  2. Công cụ repmgr + repmgrd được sử dụng để tạo điều kiện sao chép và chuyển đổi dự phòng.
  3. Server master được đăng ký vào cụm và server standby được tạo bằng cách sao chép (clone) master.
  4. Tất cả server đều được đăng ký vào cụm bằng repmgr.
  5. repmgrd giám sát cụm và hỗ trợ chuyển đổi dự phòng tự động. Nó liên tục kiểm tra tình trạng hoạt động của master và 2 standby để đảm bảo chúng hoạt động bình thường.
  6. Nếu master ngừng hoạt động, repmgrd sẽ tự động chọn một master mới trong danh sách stadnby, ưu tiên node-id nhỏ hơn.
  7. Điều này đảm bảo cụm PostgreSQL vẫn khả dụng và hoạt động trong các tình huống chuyển đổi dự phòng.

Chuẩn bị server:

Giả sử chúng ta sẽ chuẩn bị 3 máy chủ có IP như sau:

14.0.xx.1 -> master node1
14.0.xx.2 -> master node2
14.0.xx.3 -> master node3

Cài đặt PostgreSQL, repmgr

# PostgresSQL
sudo apt update # Add PostgreSQL 17 repository
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' # Add Signing Key
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg sudo apt update sudo apt install postgresql-17

Kiểm tra version và đảm bảo nó đã là PostgreSQL 17:

psql --version

Cài rempgr sau khi cài PostgreSQL

sudo apt install postgresql-17-repmgr

Lệnh này sẽ cài cả repmgr và repmgrd

Thiết lập master trước

Nếu master của bạn đã có dữ liệu thì nên sao lưu lại thư mục dữ liệu trước:

systemctl stop postgresql -> cp -r /var/lib/postgresql/17/main /root/backup_postgres

Đầu tiên, chúng ta cần cấu hình cho master PostgreSQL các mục sau:

  • listen_address: Cho phép PostgreSQL chấp nhận kết nối từ bất kỳ địa chỉ nào (hoặc chỉ từ mạng nội bộ), giúp master và standby có thể giao tiếp với nhau.
  • max_wal_sendersmax_replication_slots: Các tham số này kiểm soát số lượng kết nối đến máy chủ dự phòng có thể thực hiện để nhận dữ liệu WAL. Chúng đảm bảo rằng standby không bị quá tải dữ liệu và master có thể gữi dữ liệu WAL đến standby một cách hiệu quả.
  • wal_levelhot_standby: Các thiết lập này cho phép master ghi dữ liệu WAL cần thiết để standby hoạt động chính xác. Bằng cách bật hot_standby, server standby có thể được sử dụng cho các truy vấn readonly, cho phép sử dụng tài nguyên hiệu quả hơn.
# update /etc/postgresql/17/main/postgresql.conf
# 14.0.xx.1,14.0.xx.2,14.0.xx.3
listen_address='*' max_wal_senders = 10 max_replication_slots = 10 wal_level = replica
hot_standby = on archive_mode = on archive_command = '/bin/true'
# thêm xuống dưới /etc/postgresql/17/main/pg_hba.conf host replication repmgr 14.0.xx.1/32 md5
host repmgr repmgr 14.0.xx.1/32 md5
host replication repmgr 14.0.xx.2/32 md5
host repmgr repmgr 14.0.xx.2/32 md5
host replication repmgr 14.0.xx.3/32 md5
host repmgr repmgr 14.0.xx.3/32 md5 # lưu ý là phải chỉnh để cả backend truy cập được nữa (qua pg_hba.conf này)
# ví dụ đối với test: host all all 0.0.0.0/0 scram-sha-256

Sau đó khởi động lại PostgreSQL:

sudo systemctl start postgresql

Tạo databse repmgr cho repmgr lưu metadata ở đấy

sudo -u postgres psql CREATE USER repmgr WITH SUPERUSER LOGIN PASSWORD 'dhnrepmgr2025';
CREATE DATABASE repmgr OWNER repmgr; # use repmgr
CREATE EXTENSION repmgr;

Đăng ký master vào cụm

Với cấu hình PostgreSQL và repmgr đã sẵn sàng, giờ đây chúng ta có thể sử dụng công cụ repmgr để đăng ký node master và cụm. ĐIều này sẽ cho phép repmgr theo dõi tình trạng của master, cũng như bất kỳ node standby nào, và tọa điều kiện chuyển đổi dự phòng trong trường hợp master gặp sự cố.

Bằng cách chạy lệnh repmgr primary register trên nút master, chúng ta sẽ tạo ra một bản ghi của node master trong metadata của repmgr và cho phép các node khác trong cụm nhận dạng. Điều này sẽ cho phép repmgr thực hiện các tác vụ như giám sát sao chép và theo dõi trạng thái của master.

# tạo file /etc/repmgr/17/repmgr.conf
node_id=1
node_name=node1
conninfo='host=14.0.xx.1 user=repmgr dbname=repmgr password=password connect_timeout=2'
data_directory = '/var/lib/postgresql/17/main' 

Sau đó đăng ký node master:

sudo -iu postgres
repmgr -f /etc/repmgr/17/repmgr.conf primary register

Kết quả sẽ hiện ra node master đã được đăng ký, có thể xem lại bằng: repmgr -f /etc/repmgr/17/repmgr.conf cluster show

ID Name Role Status Upstream Location Priority Timeline Connection string
1 node1 primary * running default 100 1 host=14.0.xxx.1 user=repmgr dbname=repmgr

Thiết lập máy chủ phụ

Khi master đã hoạt động và đang chờ các máy chủ dự phòng tham gia cụm, bước tiếp theo là clone master để tạo các standby, Các máy standby sẽ đóng vai trò là bản sao của master, cho phép nó hoạt động ở chế độ read-only và nhận tất cả các thay đổi được thực hiện trên master.

Sau khi các standby được đăng ký với cụm, nó sẽ có thể đồng bộ hóa dữ liệu với master và duy trì trạng thái "hot standby", sẵn sàng đảm nhiệm vai trò master trong trường hợp chuyển đổi dự phòng. Điều này sẽ giúp đảm bảo tính khả dụng và độ tin cậy cao cho cụm PostgreSQL, cũng như tăng khả năng mở rộng khả năng đọc của PostgreSQL, khi có thể thêm nhiều standby vào cụm một cách nhanh chóng.

# update /etc/postgresql/17/main/postgresql.conf
# 14.0.xx.1,14.0.xx.2,14.0.xx.3
listen_address='*' max_wal_senders = 10 max_replication_slots = 10 wal_level = replica
hot_standby = on archive_mode = on archive_command = '/bin/true'
# thêm xuống dưới /etc/postgresql/17/main/pg_hba.conf host replication repmgr 14.0.xx.1/32 md5
host repmgr repmgr 14.0.xx.1/32 md5
host replication repmgr 14.0.xx.2/32 md5
host repmgr repmgr 14.0.xx.2/32 md5
host replication repmgr 14.0.xx.3/32 md5
host repmgr repmgr 14.0.xx.3/32 md5 

Chỉnh sửa giống hệt master để có khả năng được 1 standby được đẩy lên master.

 # chúng ta sẽ sử dụng user postgres cho các bước tiếp theo sudo -iu postgres
# bước bổ sung, kiểm tra standby có thể kết nối với máy chủ chính hay không
psql 'host=14.0.xx.1 user=repmgr dbname=repmgr connect_timeout=2'

Tạo một bản sao từ master cho standby

node_id=2
node_name=node2
conninfo='host=14.0.xx.2 user=repmgr dbname=repmgr password=password connect_timeout=2' data_directory='/var/lib/postgresql/17/main' 

Tương tự với node 3

Chạy lệnh clone dữ liệu:

repmgr -h 14.0.xx.1 -U repmgr -d repmgr -f /etc/repmgr/17/repmgr.conf standby clone --force

Khởi động lại PostgreSQL: sudo systemctl start postgresql

Và xem lại các cluster: repmgr -f /etc/repmgr/17/repmgr.conf cluster show

Bật repmgrd để giám sát và failover

Để kích hoạt giám sát và tự động failover, chúng ta cần thiết lập repmgrd trên tất cả các node PostgreSQL.

Bắt đầu bằng các đăng nhập vào từng node và đăng ký (resgister) chúng với repmgrd bằng lệnh sau"

repmgrd -f /etc/repmgr/17/repmgr.conf -d

Khi mọi thứ đã hoạt động trơn tru, đã đến lúc mô phỏng lỗi node master và xem cụm sẽ phục hổi như thế nào sau khi bị lỗi.

Để thực hiện việc này, chúng ta có thể mô phỏng sự cố trên master bằng cách dừng PostgreSQL. Khi master ngừng hoạt động, repmgr sẽ tự động nâng cấp node standby phù hợp nhất làm master mới, và standby khác sẽ follow master mới. Chúng ta có thể quan sát điều này bằng cách chạy lệnh repmgr cluster show để hiển thị trạng thái của cụm.

Trong bài viết phần 2 tôi sẽ hướng dẫn cấu hình HAProxy để tự kiểm tra và phát hiện master-slave cho các ứng dụng (trong trường hợp thử nghiệm của tôi là với typeorm). Giúp anh em đỡ phải cấu hình thủ công tay sau khi repmgrd tự động chuyển đổi dự phòng.

Mong mọi người ủng hộ.

Bình luận

Bài viết tương tự

- vừa được xem lúc

002: Hiểu về Index để tăng performance với PostgreSQL P1

Bài viết nằm trong series Performance optimization với PostgreSQL. Từ bài này sẽ liên quan nhiều đến practice nên các bạn chuẩn bị env và data trước.

0 0 510

- vừa được xem lúc

003: Hiểu về Index để tăng performance với PostgreSQL P2

Bài viết nằm trong series Performance optimization với PostgreSQL. . . B-Tree index.

0 0 548

- vừa được xem lúc

004: Hiểu về Index để tăng performance với PostgreSQL P3

Bài viết nằm trong series Performance optimization với PostgreSQL. . 1) What. Trước khi đi vào chi tiết, cùng xem lại nhiệm vụ, tính chất của hash function:.

0 0 134

- vừa được xem lúc

Hiểu về Join để tăng performance với PostgreSQL

Bài viết nằm trong series Performance optimization với PostgreSQL. Chúng ta biết có 4 loại join cơ bản sau:. . .

0 0 197

- vừa được xem lúc

006: Partitioning data với PostgreSQL P1

Bài viết nằm trong series Performance optimization với PostgreSQL. 1) Horizontal & Vertical partitioning.

0 0 83

- vừa được xem lúc

007: Partitioning data với PostgreSQL P2

Bài viết nằm trong series Performance optimization với PostgreSQL. . . Partition by list.

0 0 101