PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tổng hợp kết nối PostgreSQL:Phần 4 - PgBouncer so với Pgpool-II

Trong các bài đăng trước của chúng tôi trong loạt bài này, chúng tôi đã nói sơ qua về việc sử dụng PgBouncer và Pgpool-II, kiến ​​trúc nhóm kết nối và ưu nhược điểm của việc tận dụng một để triển khai PostgreSQL của bạn. Trong bài đăng cuối cùng của chúng tôi, chúng tôi sẽ so sánh chi tiết về tính năng và so sánh kết quả của hiệu suất PgBouncer so với Pgpool-II cho dịch vụ lưu trữ PostgreSQL của bạn!

Các tính năng xếp chồng lên nhau như thế nào?

Hãy bắt đầu bằng cách so sánh các tính năng của PgBouncer với Pgpool-II:

PgBouncer

Pgpool-II

Tiêu thụ tài nguyên Nó chỉ sử dụng một quy trình nên rất nhẹ. PgBouncer đảm bảo dung lượng bộ nhớ nhỏ, ngay cả khi xử lý các tập dữ liệu lớn. Người chiến thắng! Nếu chúng ta yêu cầu N kết nối song song, điều này sẽ phân chia N quá trình con. Theo mặc định, có 32 quy trình con được chia nhỏ.
Khi nào các kết nối được sử dụng lại? PgBouncer xác định một nhóm cho mỗi người dùng + kết hợp cơ sở dữ liệu. Điều này được chia sẻ giữa tất cả các máy khách, do đó, một kết nối tổng hợp có sẵn cho tất cả các máy khách. Người chiến thắng! Pgpool-II xác định một quy trình cho mỗi quy trình con. Chúng tôi không thể kiểm soát quy trình con nào mà khách hàng kết nối với. Ứng dụng khách chỉ được hưởng lợi từ kết nối tổng hợp nếu nó kết nối với kết nối con mà trước đó đã phân phát kết nối cho tổ hợp cơ sở dữ liệu + người dùng này.
Chế độ gộp PgBouncer hỗ trợ ba chế độ khác nhau:phiên (kết nối được trả về nhóm khi máy khách ngắt kết nối), giao dịch (được trả về nhóm khi khách hàng cam kết hoặc khôi phục) hoặc câu lệnh ( kết nối trở lại nhóm sau khi thực hiện mỗi câu lệnh). Người chiến thắng! Pgpool-II chỉ hỗ trợ chế độ tổng hợp phiên - hiệu quả của việc tổng hợp phụ thuộc vào hành vi tốt từ khách hàng.
Tính khả dụng cao Không được hỗ trợ. Tính khả dụng cao của PostgreSQL được hỗ trợ thông qua các quy trình theo dõi tích hợp sẵn Pgpool-II. Người chiến thắng!
Cân bằng tải Không được hỗ trợ - PgBouncer khuyến nghị sử dụng HAProxy để có tính khả dụng cao và cân bằng tải. Hỗ trợ cân bằng tải tự động - thậm chí còn đủ thông minh để chuyển hướng các yêu cầu đọc đến các standby và ghi vào các bản chính. Người chiến thắng!
Hỗ trợ nhiều cụm Một phiên bản PgBouncer có thể chạy trước một số cụm PostgreSQL (một nút hoặc bộ sao). Điều này có thể giảm chi phí cho phần mềm trung gian khi sử dụng nhiều cụm PostgreSQL. Người chiến thắng! (Lưu ý - lợi thế này chỉ dành cho các trường hợp cụ thể) Pgpool-II không hỗ trợ nhiều cụm.
Điều khiển kết nối PgBouncer cho phép giới hạn kết nối trên mỗi nhóm, mỗi cơ sở dữ liệu, mỗi người dùng hoặc mỗi khách hàng. Người chiến thắng! Pgpool-II chỉ cho phép giới hạn số lượng kết nối tổng thể.
Hàng đợi kết nối PgBouncer hỗ trợ xếp hàng ở cấp ứng dụng (tức là PgBouncer duy trì hàng đợi). Người chiến thắng! Pgpool-II hỗ trợ xếp hàng ở cấp hạt nhân - điều này có thể khiến pg_bench trên CentOS 6 bị đóng băng.
Xác thực Xác thực chuyển qua được hỗ trợ thông qua PgBouncer. Người chiến thắng! Pgpool-II không hỗ trợ xác thực chuyển qua - người dùng và mật khẩu được mã hóa md5 của họ phải được liệt kê trong một tệp và được cập nhật theo cách thủ công mỗi khi người dùng cập nhật mật khẩu của họ.Pgpool-II không hỗ trợ xác thực không cần mật khẩu thông qua chứng chỉ PAM hoặc SSL. Tuy nhiên, chúng phải được thiết lập bên ngoài hệ thống PostgreSQL, trong khi PgBouncer có thể tải nó xuống máy chủ PostgreSQL.
Quản trị PgBouncer cung cấp cơ sở dữ liệu ảo báo cáo nhiều số liệu thống kê hữu ích. Pgpool-II cung cấp giao diện quản trị chi tiết, bao gồm GUI. Người chiến thắng!
Xác thực dựa trên máy chủ Được hỗ trợ. Bị ràng buộc! Được hỗ trợ. Bị ràng buộc!
Hỗ trợ SSL Hỗ trợ đầy đủ. Bị ràng buộc! Hỗ trợ đầy đủ. Bị ràng buộc!
Sao chép logic Không được hỗ trợ qua PgBouncer. Bị ràng buộc! Được hỗ trợ thông qua Pgpool-II, nhưng điều này được thực hiện bằng cách gửi truy vấn ghi tới tất cả các nút và thường không được khuyến nghị. Bị ràng buộc!
Giấy phép ISC - rất dễ chịu, về cơ bản cho phép sử dụng tất cả. Bị ràng buộc! Giấy phép tùy chỉnh - được phép như nhau. Bị ràng buộc!

Điểm mấu chốt - Pgpool-II là một công cụ tuyệt vời nếu bạn cần cân bằng tải và tính sẵn sàng cao. Tổng hợp kết nối gần như là một phần thưởng mà bạn nhận được cùng với. PgBouncer chỉ làm một việc, nhưng nó thực sự rất tốt. Nếu mục tiêu là giới hạn số lượng kết nối và giảm tiêu thụ tài nguyên, thì PgBouncer sẽ thắng.

Việc sử dụng cả PgBouncer và Pgpool-II trong một chuỗi cũng hoàn toàn ổn - bạn có thể có PgBouncer để cung cấp kết nối gộp, kết nối với Phiên bản Pgpool-II cung cấp tính khả dụng cao và cân bằng tải. Điều này mang lại cho bạn điều tốt nhất của cả hai thế giới!

Tổng hợp kết nối PostgreSQL:Phần 4 - PgBouncer so với Pgpool-IIClick To Tweet

Kiểm tra hiệu suất

Trong khi PgBouncer có vẻ là lựa chọn tốt hơn về mặt lý thuyết, lý thuyết thường có thể gây hiểu lầm. Vì vậy, chúng tôi đã đối đầu trực tiếp giữa hai bộ xử lý kết nối bằng cách sử dụng công cụ pgbench tiêu chuẩn, để xem cái nào cung cấp thông lượng giao dịch mỗi giây tốt hơn thông qua một bài kiểm tra điểm chuẩn. Để có biện pháp tốt, chúng tôi cũng đã chạy các thử nghiệm tương tự mà không có trình tổng hợp kết nối.

Điều kiện Kiểm tra

Tất cả các bài kiểm tra điểm chuẩn của PostgreSQL đều được chạy trong các điều kiện sau:

  1. Pgbench được khởi tạo bằng hệ số tỷ lệ 100.
  2. Đã tắt tính năng tự động hút bụi trên phiên bản PostgreSQL để tránh bị can thiệp.
  3. Không có khối lượng công việc nào khác đang hoạt động vào thời điểm đó.
  4. Đã sử dụng tập lệnh pgbench mặc định để chạy các bài kiểm tra.
  5. Đã sử dụng cài đặt mặc định cho cả PgBouncer và Pgpool-II, ngoại trừ max_children *. Tất cả các giới hạn PostgreSQL cũng được đặt thành mặc định.
  6. Tất cả các bài kiểm tra đều chạy dưới dạng một luồng, trên máy một CPU, 2 lõi, trong thời gian 5 phút.
  7. Buộc pgbench tạo kết nối mới cho mỗi giao dịch bằng cách sử dụng tùy chọn -C. Điều này mô phỏng khối lượng công việc của ứng dụng web hiện đại và là lý do toàn bộ để sử dụng trình tổng hợp!

Chúng tôi chạy mỗi lần lặp lại trong 5 phút để đảm bảo loại bỏ tiếng ồn trung bình. Đây là cách phần mềm trung gian được cài đặt:

  • Đối với PgBouncer, chúng tôi đã cài đặt nó trên cùng một hộp với (các) máy chủ PostgreSQL. Đây là cấu hình chúng tôi sử dụng trong các cụm PostgreSQL được quản lý của chúng tôi. Vì PgBouncer là một quy trình rất nhẹ nên việc lắp đặt nó vào hộp không ảnh hưởng đến hiệu suất tổng thể.
  • Đối với Pgpool-II, chúng tôi đã kiểm tra cả khi phiên bản Pgpool-II được cài đặt trên cùng một máy như PostgreSQL (trên cột hộp) và khi nó được cài đặt trên một máy khác (cột hộp tắt). Đúng như mong đợi, hiệu suất sẽ tốt hơn nhiều khi Pgpool-II ra mắt vì nó không phải cạnh tranh với máy chủ PostgreSQL về tài nguyên.

Điểm chuẩn thông lượng

Dưới đây là kết quả giao dịch mỗi giây (TPS) cho từng tình huống trên một loạt các khách hàng:

Số lượng khách hàng Không gộp chung PgBouncer Pgpool-II (trên hộp) Pgpool-II (ngoài hộp)
10 16,96 26,86 15,52 18,22
20 16,97 27,19 15,67 18,28
40 16,73 26,77 15,33 18.3
80 16,75 26,64 15,53 18.13
100 16,51 26,73 15,66 18.45
200 Kết nối bị hủy bỏ. 26,93 Kết nối bị hủy khi max-children> 200, pgbench bị treo ở giá trị max-children nếu <=100. Kết nối bị hủy khi max-children> 200, pgbench bị treo ở giá trị max-children nếu <=100.

Pgpool-II bị treo khi pg_bench được chạy với nhiều máy khách hơn max_children. Vì vậy, chúng tôi đã tăng max_children để phù hợp với số lượng khách hàng cho mỗi lần chạy thử nghiệm.

Nếu chúng tôi tính toán phần trăm tăng TPS khi sử dụng trình tổng hợp kết nối, thì đây là những gì chúng tôi nhận được:

Số lượng khách hàng PgBouncer Pgpool-II (trên hộp) Pgpool-II (rời hộp)
10 58,37% - 8,49% 7,43%
20 60,22% - 7,66% 7,72%
40 60,01% - 8,37% 9.38%
80 59,04% - 7,28% 8.24%
100 61,90% - 5,15% 11,75%

* Cải tiến thuật toán =(với pooler - without) / without

Lời cuối cùng

Như bạn có thể thấy từ kết quả kiểm tra hiệu suất, kết nối được định cấu hình tốt và bộ gộp kết nối phù hợp có thể tăng đáng kể thông lượng giao dịch, ngay cả với một số lượng khách hàng khá nhỏ. Trình đánh cắp kết nối đặc biệt hữu ích cho việc hỗ trợ xếp hàng của họ - khi số lượng khách hàng vượt quá số lượng khách hàng tối đa được hỗ trợ bởi máy chủ PostgreSQL, PgBouncer vẫn có thể duy trì tốc độ giao dịch, trong khi các kết nối trực tiếp đến PostgreSQL bị hủy bỏ.

Tuy nhiên, trình tổng hợp kết nối được định cấu hình kém thực sự có thể giảm hiệu suất như chúng ta đã thấy với thiết lập Pgpool-II tại đây. Một phần của vấn đề là sử dụng Pgpool-II nhân đôi số lượng quy trình đang chạy trên cùng một máy chủ - chúng tôi phải chạy Pgpool-II trên một máy chủ riêng biệt để có được hiệu suất tốt. Nhưng ngay cả khi đó, PgBouncer vẫn quản lý để cung cấp hiệu suất tốt hơn cho số lượng khách hàng tương đối nhỏ này.

Ngoài ra, hãy lưu ý rằng thử nghiệm ở đây thực sự được tạo ra một cách hoàn hảo cho Pgpool-II - vì khi N> 32, số lượng khách hàng và số lượng quy trình con là như nhau và do đó, mỗi kết nối lại được đảm bảo để tìm một quy trình được lưu trong bộ nhớ cache. Ngay cả khi đó, PgBouncer vẫn là giải pháp thay thế nhanh hơn.

Vì vậy, thử nghiệm của chúng tôi cho thấy PgBouncer là lựa chọn tốt hơn nhiều để tổng hợp kết nối. Tuy nhiên, điều quan trọng cần nhớ là mặc dù bộ gộp kết nối là hoàn toàn bắt buộc đối với hầu hết các khối lượng công việc thực tế, việc bạn có được nhiều hơn bằng cách sử dụng nhóm phía máy khách hay phần mềm trung gian như PgBouncer hay không tùy thuộc vào ứng dụng của bạn. Các mẫu truy cập dữ liệu sẽ đóng một vai trò nào đó, cũng như các độ trễ liên quan dựa trên kiến ​​trúc của bạn. Chúng tôi khuyên bạn nên kiểm tra khối lượng công việc của mình dựa trên cả hai và sau đó quyết định cách hành động tốt nhất - không có giải pháp thay thế nào tốt hơn cho thử nghiệm!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psql:máy chủ đã đóng kết nối một cách bất thường

  2. Gọi một thủ tục được lưu trữ trong một thủ tục được lưu trữ

  3. Lấy tên tháng từ một ngày trong PostgreSQL

  4. Sử dụng regex ở WHERE trong Postgres

  5. Giới thiệu về PostgreSQL