Khi nói đến tổng hợp kết nối trong thế giới PostgreSQL, PgBouncer có lẽ là lựa chọn phổ biến nhất. Đó là một tiện ích rất đơn giản thực hiện đúng một việc - nó nằm giữa cơ sở dữ liệu và các máy khách và sử dụng giao thức PostgreSQL, mô phỏng một máy chủ PostgreSQL. Một ứng dụng khách kết nối với PgBouncer với cùng một cú pháp mà nó sẽ sử dụng khi kết nối trực tiếp với PostgreSQL - PgBouncer về cơ bản là ẩn.
PgBouncer được hầu hết các nhà cung cấp PostgreSQL DBaaS hỗ trợ và được sử dụng rộng rãi trong cộng đồng. Trong bài đăng trên blog này, chúng tôi sẽ giải thích cách hoạt động của PgBouncer, ưu và nhược điểm của việc sử dụng nó cũng như cách thiết lập trình gộp kết nối. Nếu bạn muốn biết thêm về tổng hợp kết nối nói chung hoặc tự hỏi liệu nó có phù hợp với việc triển khai của bạn hay không, hãy xem Tổng hợp kết nối PostgreSQL của chúng tôi:Phần 1 - Bài đăng Ưu điểm và Nhược điểm.
Chuỗi tổng hợp kết nối PostgreSQL
|
---|
PgBouncer hoạt động như thế nào?
Khi PgBouncer nhận được kết nối máy khách, trước tiên nó thực hiện xác thực thay mặt cho máy chủ PostgreSQL. PgBouncer hỗ trợ tất cả các cơ chế xác thực mà máy chủ PostgreSQL hỗ trợ, bao gồm cấu hình truy cập dựa trên máy chủ lưu trữ (lưu ý:chúng tôi không thể định tuyến các kết nối sao chép thông qua PgBouncer). Nếu mật khẩu được cung cấp, việc xác thực có thể được thực hiện theo hai cách:
- PgBouncer trước tiên sẽ kiểm tra tệp userslist.txt - tệp này chỉ định một tập hợp (tên người dùng, mật khẩu được mã hóa md5). Nếu tên người dùng tồn tại trong tệp này, mật khẩu sẽ được khớp với giá trị đã cho. Không có kết nối với máy chủ PostgreSQL được thực hiện.
- Nếu xác thực chuyển qua được thiết lập và không tìm thấy người dùng trong tệp userslist.txt, PgBouncer sẽ tìm kiếm auth_query. Nó kết nối với PostgreSQL với tư cách là người dùng được xác định trước (mật khẩu phải có trong tệp userslist.txt) và thực thi truy vấn xác thực để tìm mật khẩu của người dùng và khớp mật khẩu với giá trị được cung cấp.
Sau khi xác thực thành công:
- PgBouncer kiểm tra kết nối đã lưu trong bộ nhớ cache, có cùng tên người dùng + kết hợp cơ sở dữ liệu.
- Nếu tìm thấy kết nối được lưu trong bộ nhớ cache, kết nối đó sẽ trả về kết nối đó cho ứng dụng khách.
- Nếu không tìm thấy kết nối đã lưu trong bộ nhớ cache, nó sẽ tạo một kết nối mới, miễn là việc tạo kết nối mới không:
- Tăng số lượng kết nối đến> pool_size
- Tăng số lượng kết nối từ máy khách lên> max_client_connections
- Tăng số lượng kết nối với cơ sở dữ liệu lên> max_db_connections
- Tăng số lượng kết nối từ người dùng lên> max_user_connections
- Tất cả các giá trị này có thể được xác định trong cài đặt PgBouncer.
- Nếu việc tạo kết nối mới vi phạm bất kỳ cài đặt nào, PgBouncer sẽ xếp hàng đợi kết nối đó cho đến khi có thể tạo kết nối mới, ngoại trừ trường hợp nó vi phạm hạn chế max_client_connections.
Lưu ý - Thời gian của các bước sau xác thực hơi khác nhau dựa trên chế độ PgBouncer. Trong chế độ tổng hợp giao dịch hoặc câu lệnh, các bước sau xác thực chỉ được thực hiện khi khách hàng bắt đầu thực hiện một giao dịch / câu lệnh. Chúng tôi thảo luận thêm về các chế độ gộp bên dưới. - Nếu vi phạm hạn chế max_client_connections, nó sẽ hủy kết nối.
Dựa trên tổng hợp , PgBouncer chờ cơ hội để trả kết nối trở lại cơ sở dữ liệu:
- Ở chế độ gộp phiên, kết nối chỉ được trả về nhóm khi khách hàng đóng phiên.
- Trong chế độ gộp giao dịch, một kết nối chỉ được trả lại cho nhóm khi khách hàng hoàn thành một giao dịch (thường là một lần khôi phục hoặc một cam kết được thực thi). Do đó, các tính năng dựa trên phiên không được hỗ trợ trong chế độ này. Không có gì đảm bảo rằng hai giao dịch chạy trên cùng một kết nối PgBouncer của máy khách sẽ chạy trên cùng một kết nối máy chủ PgBouncer.
- Trong chế độ gộp câu lệnh, một kết nối được trả về nhóm ngay sau khi một câu lệnh được thực thi. Tại đây, tính năng autocommit luôn được bật.
Trước khi trả kết nối trở lại cơ sở dữ liệu, PgBouncer chạy truy vấn đặt lại để loại bỏ tất cả thông tin phiên - điều này giúp an toàn khi chia sẻ kết nối giữa các máy khách. Có thể định cấu hình truy vấn này dựa trên nhu cầu của ứng dụng.
Chế độ gộp giao dịch được sử dụng thường xuyên nhất, mặc dù chế độ gộp phiên có thể hữu ích cho các khối lượng công việc cụ thể. Bạn có thể đọc thêm về PgBouncer trên trang Wiki của họ.
Tổng hợp kết nối PostgreSQL:Phần 2 - PgBouncerNhấp để TweetTại sao nên chọn PgBouncer?
Có nhiều lý do khiến PgBouncer là lựa chọn phổ biến nhất khi nói đến tổng hợp kết nối trong PostgreSQL. Dưới đây là một số tính năng tốt nhất và ưu điểm mà PgBouncer cung cấp:
- Chế độ gộp - Bằng cách cung cấp cho người dùng quyền quyết định khi nào một kết nối được quay trở lại nhóm, PgBouncer có thể hỗ trợ một loạt các trường hợp sử dụng. Và, vì thiết lập này ở cấp tổng hợp, bạn có thể sử dụng chế độ giao dịch (hiệu suất tốt hơn) cho các kết nối cơ sở dữ liệu thông thường của mình và chế độ phiên chỉ khi bạn yêu cầu các tính năng như câu lệnh đã chuẩn bị!
- Cài đặt &Sử dụng dễ dàng - PgBouncer là một trong những trình đánh cắp kết nối PostgreSQL dễ dàng thiết lập nhất và nó cũng không yêu cầu thay đổi mã phía máy khách.
- Xác thực thông qua - PgBouncer là một trong số ít phần mềm đánh cắp kết nối “phần mềm trung gian” có thể xác thực an toàn người dùng mà không cần truy cập vào mật khẩu của họ (ở dạng bản rõ hoặc được mã hóa). Điều này làm cho PgBouncer an toàn hơn và dễ bảo trì hơn nhiều - bạn không cần cập nhật PgBouncer mỗi khi người dùng cập nhật mật khẩu của họ.
- Nhẹ - Đó là một quá trình duy nhất và tất cả các lệnh từ máy khách và phản hồi từ máy chủ đều qua PgBouncer mà không cần bất kỳ xử lý nào. Vì vậy, nó không cần phải 'xem' toàn bộ nội dung cùng một lúc và do đó, duy trì một bộ nhớ rất nhỏ.
- Khả năng mở rộng &Hiệu suất - Như chúng ta sẽ thảo luận chi tiết hơn trong phần cuối của loạt bài, PgBouncer có thể cải thiện đáng kể các giao dịch mỗi giây mà máy chủ PostgreSQL của bạn có thể hỗ trợ và nó mở rộng quy mô rất tốt cho một số lượng rất lớn khách hàng.
PgBouncer không làm gì?
PgBouncer, trong khi một trình tổng hợp kết nối tuyệt vời, không hỗ trợ cân bằng tải tự động hoặc tính khả dụng cao. Nó khuyên bạn nên sử dụng các công cụ linux phổ biến khác như HAProxy để tạo một kiến trúc hỗ trợ các tính năng này.
Hãy xem kiến trúc PostgreSQL mẫu cho các lần đọc cân bằng tải bên dưới:
Lưu ý - Nút chính (tất cả các nút này sẽ sao chép từ) không được hiển thị trong sơ đồ.
Cách thiết lập PgBouncer
Nếu bạn có triển khai ScaleGrid PostgreSQL, bạn có thể thiết lập PgBouncer trong một vài cú nhấp chuột. Chuyển đến chế độ xem chi tiết của cụm PostgreSQL của bạn và nhấp vào biểu tượng PgBouncer. Khi bạn chọn “Bật PgBouncer”, bạn sẽ thấy các tùy chọn cấu hình để tùy chỉnh chế độ gộp và kích thước nhóm - bạn có thể chấp nhận các giá trị mặc định (đừng lo, bạn có thể thay đổi chúng bất cứ lúc nào mà không cần thời gian chết) và nhấp vào Bật!
Và thế là xong! Bạn rất tốt để đi.
Nếu bạn có triển khai không phải ScaleGrid, PgBouncer sẽ được phân phối như một phần của kho lưu trữ PostgreSQL và có thể được cài đặt bằng các trình quản lý gói tương ứng. Để có hướng dẫn chi tiết hơn hoặc để xây dựng từ nguồn, bạn có thể làm theo hướng dẫn từ blog của họ.
Sau khi được cài đặt, PgBouncer chỉ yêu cầu bạn thiết lập một vài thông số cấu hình để bắt đầu và chạy:
- Danh sách (tên người dùng, mật khẩu được mã hóa md5) để xác thực ứng dụng khách hoặc thiết lập xác thực thông qua để triển khai an toàn hơn.
- Interfaces / IP:các cổng để lắng nghe các kết nối đến.
- Định nghĩa về hồ bơi. ‘Pool’ là tên mà khách hàng sử dụng làm tên cơ sở dữ liệu khi kết nối với PgBouncer - nó có thể được ánh xạ tới một chuỗi kết nối đầy đủ (máy chủ, cổng, dbname và người dùng). Định nghĩa đơn giản nhất có dạng:
* = host=
Điều này sẽ tạo nhóm động cho từng tổ hợp dbname + người dùng và kết nối với máy chủ đã xác định bằng cách sử dụng cổng, dbname và tên người dùng do người dùng cung cấp.
Và thế là xong! Bạn có thể thiết lập và chạy rất nhanh với PgBouncer. Tuy nhiên, có nhiều cài đặt khác phải được điều chỉnh cho bất kỳ phân phối sản xuất nào - những cài đặt đó nằm ngoài phạm vi của bài đăng blog này, nhưng bạn có thể đọc thêm về chúng trong tổng quan về cấu hình PgBouncer này.
Tuy nhiên,PgBouncer không phải là tùy chọn duy nhất để gộp kết nối PostgreSQL - trong bài đăng tiếp theo của chúng tôi, chúng tôi sẽ thảo luận về Pgpool-II, có thể là chính đối thủ cạnh tranh với PgBouncer. Hãy theo dõi bài đăng thứ tư của chúng tôi trong loạt bài bốn phần này, nơi chúng tôi so sánh PgBouncer với Pgpool-II.