1. Cài đặt PostgreSQL 16 trên Ubuntu 24.04
Bước đầu tiên là thêm repository chính thức của PostgreSQL để có thể cài đặt phiên bản mới nhất (16.x) thay vì phiên bản mặc định trong apt của Ubuntu.
Thư mục /etc/apt/sources.list.d cần được cập nhật để trỏ về nguồn của PostgreSQL. Sau đó, cập nhật bảng gói phần mềm và cài đặt gói.
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - 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-16 postgresql-contrib-16 -y
Kết quả mong đợi: Hệ thống báo thông tin cài đặt thành công, không có lỗi dependency. Dịch vụ PostgreSQL sẽ tự động khởi động sau khi cài đặt.
Để xác nhận phiên bản đã cài đặt, chạy lệnh kiểm tra phiên bản từ user postgres.
sudo -u postgres psql --version
sudo systemctl status postgresql
Kết quả mong đợi: Hiển thị dòng psql (PostgreSQL) 16.x và trạng thái dịch vụ là active (running).
2. Cấu hình Write-Ahead Log (WAL) và Replication
Để Debezium có thể đọc các thay đổi dữ liệu từ PostgreSQL, cơ sở dữ liệu phải ghi log thay đổi ở mức độ logic (logical) thay vì chỉ vật lý (physical). Đồng thời, ta cần tăng giới hạn số lượng slot và sender để hỗ trợ nhiều connector hoặc nhiều luồng đồng thời.
Tập tin cấu hình chính nằm tại /etc/postgresql/16/main/postgresql.conf. Chúng ta sẽ chỉnh sửa 3 tham số quan trọng: wal_level, max_replication_slots, và max_wal_senders.
Sử dụng lệnh sed để thay thế trực tiếp hoặc chỉnh sửa thủ công. Dưới đây là cách thay thế an toàn bằng sed trên Ubuntu 24.04:
sudo sed -i 's/#wal_level = .*/wal_level = logical/' /etc/postgresql/16/main/postgresql.conf
sudo sed -i 's/#max_replication_slots = .*/max_replication_slots = 10/' /etc/postgresql/16/main/postgresql.conf
sudo sed -i 's/#max_wal_senders = .*/max_wal_senders = 10/' /etc/postgresql/16/main/postgresql.conf
Kết quả mong đợi: Các dòng trong file cấu hình đã được thay đổi, bỏ dấu # và đặt giá trị mới. Không có lỗi syntax khi chạy lệnh.
Tập tin /etc/postgresql/16/main/postgresql.conf sau khi chỉnh sửa cần có nội dung tương ứng như sau (chỉ hiển thị các dòng liên quan):
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10
Để cấu hình có hiệu lực, cần khởi động lại dịch vụ PostgreSQL. Đây là bước bắt buộc vì các tham số này chỉ được đọc khi server khởi động.
sudo systemctl restart postgresql
Kết quả mong đợi: Dịch vụ khởi động lại thành công, không báo lỗi về tham số.
Verify: Kiểm tra lại các tham số đang chạy trong database.
sudo -u postgres psql -c "SHOW wal_level;"
sudo -u postgres psql -c "SHOW max_replication_slots;"
sudo -u postgres psql -c "SHOW max_wal_senders;"
Kết quả mong đợi:
- wal_level trả về giá trị logical.
- max_replication_slots trả về 10.
- max_wal_senders trả về 10.
3. Tạo User Replication và Replication Slot
Debezium cần một tài khoản database có quyền REPLICATION để kết nối và đọc WAL log. Ngoài ra, cần tạo một Replication Slot để PostgreSQL giữ lại các log WAL chưa được xử lý, đảm bảo connector không bị mất dữ liệu khi bị ngắt kết nối tạm thời.
Đầu tiên, đăng nhập vào shell của user postgres để tạo user. Giả sử ta đặt tên user là debezium và password là password123 (trong thực tế hãy dùng password mạnh hơn).
sudo -u postgres psql -c "CREATE USER debezium WITH REPLICATION LOGIN PASSWORD 'password123';"
Kết quả mong đợi: Dòng thông báo CREATE ROLE.
Tiếp theo, tạo Replication Slot. Tên slot này phải trùng khớp với tham số slot.name trong cấu hình Debezium Connector (sẽ dùng ở Phần 5). Giả sử tên slot là debezium_slot.
sudo -u postgres psql -c "SELECT pg_create_logical_replication_slot('debezium_slot', 'pgoutput');"
Kết quả mong đợi: Trả về ID của slot đã tạo (ví dụ: debezium_slot | 0/123456).
Để cho phép user debezium kết nối từ xa (từ Debezium connector chạy trên container hoặc server khác), cần chỉnh sửa file pg_hba.conf.
Thêm dòng cấu hình vào cuối file /etc/postgresql/16/main/pg_hba.conf để cho phép kết nối MD5 (hoặc scram-sha-256 tùy phiên bản) từ mọi địa chỉ IP (0.0.0.0/0) cho user debezium.
echo "host replication debezium 0.0.0.0/0 md5" | sudo tee -a /etc/postgresql/16/main/pg_hba.conf
Kết quả mong đợi: Dòng cấu hình được thêm vào cuối file.
Khởi động lại PostgreSQL để áp dụng quyền truy cập mới.
sudo systemctl reload postgresql
Kết quả mong đợi: Dịch vụ reload thành công.
Verify kết quả toàn bộ phần
Thực hiện kiểm tra tổng hợp để đảm bảo user, slot và quyền hạn đã được thiết lập đúng. Chạy lệnh kiểm tra trạng thái slot và quyền của user.
sudo -u postgres psql -c "SELECT slot_name, slot_type, active FROM pg_replication_slots;"
sudo -u postgres psql -c "\du debezium"
Kết quả mong đợi:
- Bảng pg_replication_slots hiển thị dòng debezium_slot với slot_type là logical và active là f (chưa active vì connector chưa chạy).
- Lệnh \du hiển thị user debezium với quyền Replication.
Thử kết nối từ user debezium để đảm bảo quyền đăng nhập hoạt động.
PGPASSWORD='password123' psql -h localhost -U debezium -d postgres -c "SELECT 1;"
Kết quả mong đợi: Trả về số 1 thành công, không bị lỗi permission denied hoặc authentication failed.
Điều hướng series:
Mục lục: Series: Triển khai Database Change Data Capture với Debezium và Kafka trên Ubuntu 24.04
« Phần 3: Triển khai Debezium Connector cho PostgreSQL
Phần 5: Cấu hình và khởi động Debezium Connector »