Giới thiệu về PgBouncer
PgBouncer là một connection pooler (bộ quản lý kết nối) nhẹ cho PostgreSQL. Nó hoạt động như một lớp trung gian giữa ứng dụng và cơ sở dữ liệu PostgreSQL, tối ưu hóa số lượng kết nối bằng cách tái sử dụng chúng. Điều này giảm tải cho PostgreSQL và cải thiện khả năng đáp ứng của hệ thống.
Vấn Đề Với Kết Nối PostgreSQL
PostgreSQL tạo một quy trình riêng cho mỗi kết nối máy khách phục vụ cho kết nối đó. Ví dụ: Nếu có mười kết nối máy khách, PostgreSQL sẽ tạo mười tiến trình và phân bổ bộ nhớ cho mỗi kết nối. Nếu có một trăm kết nối máy khách, thì một trăm tiến trình PostgreSQL Server sẽ phục vụ một trăm kết nối máy khách đó.
Kiểu kiến trúc này được gọi là mô hình Client-Server. Nó chậm, kém hiệu quả và không mở rộng được. Nó bị giới hạn bởi số lượng kết nối máy khách mà máy chủ Cơ sở dữ liệu có thể phục vụ do giới hạn tài nguyên CPU và Bộ nhớ. Khi có quá nhiều kết nối đồng thời:
- Tài nguyên máy chủ cạn kiệt: PostgreSQL phải tạo một tiến trình riêng biệt cho mỗi kết nối.
- Thời gian phản hồi tăng: Hệ thống có thể trở nên chậm chạp hoặc thậm chí không thể đáp ứng.
- Quá tải quản trị kết nối: Việc quản lý hàng trăm hoặc hàng ngàn kết nối không hiệu quả.
PgBouncer Hoạt Động Như Thế Nào?
PgBouncer hoạt động bằng cách:
- Tái sử dụng kết nối: Thay vì tạo một kết nối mới cho mỗi yêu cầu, PgBouncer tái sử dụng các kết nối hiện có.
- Giới hạn số kết nối thực tế: PgBouncer giới hạn số lượng kết nối thực sự đến PostgreSQL, giảm tải tài nguyên máy chủ.
- Tăng tốc độ thiết lập kết nối: Bằng cách sử dụng các kết nối đã có, ứng dụng không phải chờ PostgreSQL thiết lập kết nối mới.
Lợi ích khi sử dụng Pgbouncer
Giảm chi phí kết nối
PostgreSQL, giống như hầu hết các cơ sở dữ liệu quan hệ, phải chịu chi phí đáng kể khi thiết lập kết nối cơ sở dữ liệu. Mỗi kết nối liên quan đến việc sử dụng bộ nhớ và CPU trên máy chủ cơ sở dữ liệu và điều này có thể nhanh chóng leo thang khi tăng cường đồng thời người dùng. Đây là nơi PgBouncer tỏa sáng:
- Tái sử dụng kết nối : PgBouncer duy trì một nhóm kết nối cơ sở dữ liệu có thể được tái sử dụng bởi nhiều kết nối máy khách. Điều này có nghĩa là không cần phải tốn kém khi tạo kết nối cơ sở dữ liệu mới mỗi khi người dùng gửi yêu cầu.
Cải thiện việc sử dụng tài nguyên hệ thống
Với PgBouncer xử lý việc kết nối nhóm, PostgreSQL có thể hoạt động hiệu quả hơn:
- Sử dụng bộ nhớ : Bằng cách giảm thiểu số lượng kết nối đang hoạt động, PgBouncer giảm đáng kể dấu chân bộ nhớ liên quan đến mỗi kết nối. Việc sử dụng tài nguyên hiệu quả này cho phép PostgreSQL xử lý tải cao hơn với cùng phần cứng.
- Chi phí CPU : Giảm tần suất thiết lập và hủy kết nối giúp giải phóng tài nguyên CPU, có thể được sử dụng tốt hơn cho việc xử lý truy vấn và các hoạt động cơ sở dữ liệu khác.
Tăng cường khả năng mở rộng
Khả năng xử lý nhiều yêu cầu của người dùng hơn mà không làm tăng tỷ lệ tiêu thụ tài nguyên sẽ trực tiếp chuyển thành khả năng mở rộng tốt hơn, điều này rất quan trọng đối với các ứng dụng đang phát triển:
- Xử lý tình trạng tăng đột biến lưu lượng truy cập : Trong trường hợp sử dụng ứng dụng tăng đột biến, PgBouncer giúp hấp thụ lượng truy cập tăng đột biến bằng cách quản lý hiệu quả các kết nối khả dụng, ngăn máy chủ cơ sở dữ liệu trở thành nút thắt cổ chai.
- Quản lý đồng thời : PgBouncer cho phép PostgreSQL phục vụ nhiều người dùng cùng lúc bằng cách giảm số lượng kết nối vật lý tới cơ sở dữ liệu, tách biệt nhu cầu kết nối của ứng dụng khỏi khả năng xử lý kết nối của cơ sở dữ liệu.
Đơn giản hóa việc quản lý kết nối
Quản lý số lượng lớn kết nối trực tiếp trong PostgreSQL có thể phức tạp và dễ xảy ra lỗi. PgBouncer đơn giản hóa khía cạnh này bằng cách hoạt động như một trung gian:
- Kiểm soát kết nối tập trung : Với PgBouncer, mọi kết nối đều đi qua một hệ thống thống nhất giúp đơn giản hóa việc giám sát, quản lý và mở rộng môi trường cơ sở dữ liệu.
Cài đặt và cấu hình cho Pgbouncer
Đầu tiên cần chuẩn bị 1 con PostgreSQL và 1 con EC2 instance
Ở đây mình sẽ sử dụng PostgreSql 16.3-R3 và EC2 với cấu hình t3.small chạy hệ điều hành ubuntu 24.04
Bước 1: Cần connect SSH vào con EC2 và thử connect tới database PostgreSql hiện tại của mình
Bước 2: Cài đặt PgBouncer :
sudo apt-get update
sudo apt-get install pgbouncer
PgBouncer configuration:
sudo vi /etc/pgbouncer/pgbouncer.ini
Sau đó thay đổi những config trong file pgbouncer.ini như sau:
[databases]
* = host=endpoint_postgresql port=5432 dbname=dbname
[pgbouncer]
listen_addr = *
listen_port = 6432
auth_type = plain
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
ignore_startup_parameters = extra_float_digits
PgBouncer config user,tạo 1 file userlist bằng lệnh bên dưới:
sudo vi /etc/pgbouncer/userlist.txt
Sau đó thêm user vào trong file định dạng như sau:
"username" "password"
Bước 3: Khởi động lại PgBouncer
sudo service pgbouncer restart
Thử nghiệm với cấu hình db.t4g.micro Postgresql
- Không sử dụng Pgbouncer
Test plan: 50 request/s -> kết quả đều thành công 50/50
Test plan: 80 request/s -> kết quả thành công 74/80
Test plan: 100 request/s -> kết quả thành công 74/100, còn lại đã có lỗi xảy ra do vượt quá connection mà DB có thể chịu tải
2. Sử dụng Pgbouncer
Test plan: 50 request/s -> kết quả đều thành công 50/50
Test plan: 80 request/s -> kết quả đều thành công 80/80
Test plan: 100 request/s -> kết quả đều thành công 100/100
PgBouncer sử dụng một lượng nhỏ tài nguyên (RAM và CPU) cho mỗi kết nối client:
- RAM tiêu thụ: Khoảng 2-4 KB mỗi kết nối client.
- Với cấu hình như trên EC2 t3.small (2 GB RAM):
- Giả sử PgBouncer được phân bổ 500 MB RAM:
(500 MB) / (4 KB/connection) = 125,000 connections
(lý thuyết).- Thực tế: Giới hạn sẽ phụ thuộc vào khá nhiều yếu tố nữa ví dụ như worker xử lý, cấu hình của DB Postgresql, default_pool_size, số lượng request đồng thời cao,... Nên để hệ thống được hoạt động ổn định nên đặt max_connection trong khoảng gấp 30 lần connection thực tế mà Postgresql có thể chịu tải. Như bài toán hiện tại thì DB Postgresql của mình có thể chứa tối đa 80 connection cùng 1 lúc,vậy nếu dùng PgBouncer thì số connection có thể cung cấp là khoảng 2400 connections cùng 1 thời điểm
- Dưới đây là hình ảnh chạy test plan 1000 request với PgBouncer và đã rất dễ dàng để pass qua
Kết luận: Nhìn vào kết quả tết phía trên thì đã thấy được sự khác biệt rõ ràng về hiệu năng xử lý của Pgbouncer
Sử dụng PgBouncer trong thực tế
Trong thực tế PgBoucer có khá nhiều ưu điểm như vậy nhưng lại thiếu mất cân bằng tải,nên khi muốn scale lên khá khó khăn.
Có 1 số cách mà chúng ta có thể khắc phục điều đó để hệ thống hoàn chỉnh hơn ví dụ như :
- Đặt Load Balancer (AWS ALB/ELB, HAProxy, hoặc Nginx) trước nhiều instance PgBouncer.
- Load Balancer sẽ phân phối kết nối từ ứng dụng đến PgBouncer.
- Ưu điểm: Giữ được sự đơn giản của PgBouncer, hỗ trợ mở rộng theo chiều ngang.
- Kết hợp Odyssey và PgBouncer
Link source: https://github.com/yandex/odyssey
Sơ đồ tổng quát:
Client (Ứng dụng) -> Odyssey (Cân bằng tải và Routing) -> PgBouncer (Connection Pooling) -> PostgreSQL Cluster (Primary + Replica)
Phân tách chức năng:
- Odyssey tập trung vào routing và cân bằng tải.
- PgBouncer xử lý connection pooling để giảm tải PostgreSQL backend.
Khả năng mở rộng:
- Odyssey phân phối tải giữa các replica hoặc cluster PostgreSQL.
- PgBouncer tối ưu hóa số lượng kết nối thực sự đến PostgreSQL.
Hiệu suất tối đa:
- Odyssey có hiệu năng tốt trong việc phân phối các query read-only.
- PgBouncer giúp tối ưu kết nối ngay cả khi số lượng client tăng cao.
Quản lý nhiều cluster hoặc database:
- Odyssey hỗ trợ multi-tenancy (nhiều cluster).
- PgBouncer duy trì kết nối nhẹ giữa ứng dụng và Odyssey.
So sánh PgBouncer với một số ứng dụng khác
Ở đây mình sẽ so sánh mang tính chất tương đối giữa PgBouncer, Pgpool-II, và Amazon RDS Proxy
Tính năng | PgBouncer | Pgpool-II | Amazon RDS Proxy |
---|---|---|---|
Loại | Connection Pooler | Connection Pooler, Replication & Monitoring | Managed Connection Pooler |
Hỗ trợ cơ sở dữ liệu | PostgreSQL | PostgreSQL | PostgreSQL (on Amazon RDS) |
Cân bằng tải | Gián tiếp (qua DNS Round-Robin, etc.) | ✓ | ✓ |
Kết nối nhóm | ✓ | ✓ | ✓ |
Sao lưu & phục hồi | ✓ | (Được quản lý bởi Amazon RDS) | |
Hiệu suất | Rất cao | Cao | Cao |
Độ phức tạp | Thấp | Trung bình | Thấp (được quản lý) |
Chi phí | Miễn phí (nguồn mở) | Miễn phí (nguồn mở) | Tính phí (dựa trên mức sử dụng) |
Tổng kết
Trên đây là thông tin về Pgbouncer là gì cũng như hướng dẫn cài đặt và sử dụng nó. VNLab hẹn gặp lại các bạn trong các bài viết khác.