Skip to main content

Chuyển Đổi PostgreSQL từ Slave thành Master

1. Giới Thiệu

Trong một số trường hợp, bạn cần chuyển đổi một PostgreSQL slave node thành master độc lập, ví dụ như khi master chính gặp sự cố hoặc cần tái cấu trúc hệ thống. Bài viết này sẽ hướng dẫn chi tiết quy trình thực hiện.

2. Điều Kiện Tiên Quyết

  • PostgreSQL slave node đang hoạt động
  • Quyền truy cập root hoặc sudo
  • Backup dữ liệu quan trọng (nếu có thể)

3. Quy Trình Chuyển Đổi

3.1 Kiểm Tra Trạng Thái Hiện Tại

# Kiểm tra trạng thái replication
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"

# Kiểm tra thời điểm sync cuối cùng
sudo -u postgres psql -c "SELECT pg_last_xact_replay_timestamp();"

# Kiểm tra lag replication
sudo -u postgres psql -c "SELECT now() - pg_last_xact_replay_timestamp() AS replication_lag;"

3.2 Dừng PostgreSQL Service

# Dừng service PostgreSQL
sudo systemctl stop postgresql

3.3 Xóa Các File Recovery và Replication

cd /var/lib/postgresql/[version]/main
sudo rm -f recovery.conf recovery.done recovery.conf.bak
sudo rm -f backup_label backup_label.old
sudo rm -f standby.signal

3.4 Cập Nhật Cấu Hình PostgreSQL

# Backup cấu hình cũ
sudo cp /etc/postgresql/[version]/main/postgresql.conf /etc/postgresql/[version]/main/postgresql.conf.bak

# Chỉnh sửa postgresql.conf
sudo nano /etc/postgresql/[version]/main/postgresql.conf

Xóa hoặc comment các dòng sau:

# primary_conninfo = 'host=master_ip port=5432 ...'
# primary_slot_name = 'replica_slot_name'
# recovery_target_timeline = 'latest'

Thêm hoặc cập nhật các thông số:

listen_addresses = '*'
wal_level = logical
max_wal_senders = 10
max_replication_slots = 10
hot_standby = on

3.5 Khởi Động PostgreSQL

# Khởi động PostgreSQL
sudo systemctl start postgresql

# Kiểm tra status
sudo systemctl status postgresql

3.6 Xác Nhận Chuyển Đổi

# Kiểm tra trạng thái recovery
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
# Kết quả mong đợi: f (false)

# Kiểm tra timeline hiện tại
sudo -u postgres psql -c "SELECT timeline_id FROM pg_control_checkpoint();"

# Kiểm tra các replication slots
sudo -u postgres psql -c "SELECT * FROM pg_replication_slots;"

3.7 Cập Nhật Các Ứng Dụng (Nếu Cần)

# Cập nhật connection string trong các ứng dụng
# Ví dụ: postgresql://user:password@new_master_ip:5432/dbname

4. Xử Lý Sự Cố

4.1 PostgreSQL Không Khởi Động

# Kiểm tra log
sudo tail -f /var/log/postgresql/postgresql-[version]-main.log

# Kiểm tra quyền thư mục data
sudo ls -la /var/lib/postgresql/[version]/main/

4.2 Vấn Đề Về Replication Timeline

# Kiểm tra WAL files
sudo -u postgres psql -c "SELECT * FROM pg_walfile_name_offset(pg_current_wal_lsn());"

# Kiểm tra timeline history
sudo -u postgres psql -c "SELECT * FROM pg_control_checkpoint();"

5. Rollback Plan

Nếu cần rollback về trạng thái slave:

# 1. Dừng PostgreSQL
sudo systemctl stop postgresql

# 2. Khôi phục file cấu hình
sudo cp /etc/postgresql/[version]/main/postgresql.conf.bak /etc/postgresql/[version]/main/postgresql.conf

# 3. Tạo lại standby.signal
sudo touch /var/lib/postgresql/[version]/main/standby.signal

# 4. Khởi động lại PostgreSQL
sudo systemctl start postgresql
Lưu ý quan trọng
  1. Luôn backup dữ liệu trước khi thực hiện chuyển đổi
  2. Đảm bảo WAL segments đã được replay đầy đủ
  3. Kiểm tra kỹ các thông số cấu hình trước khi khởi động lại
  4. Có kế hoạch rollback trong trường hợp cần thiết

6. Tài Liệu Tham Khảo