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

Kết nối PostgreSQL Pooling với PgBouncer

Tổng hợp kết nối là một cách đơn giản nhưng hiệu quả để cải thiện hiệu suất của các ứng dụng của bạn và giảm tải trên các máy chủ PostgreSQL của bạn. Đọc tiếp để tìm hiểu thêm về cách sử dụng PgBouncer để gộp các kết nối PostgreSQL.

Tại sao nên gộp Kết nối lại?

PostgreSQL có một kiến ​​trúc xử lý kết nối khá nặng. Đối với kết nối eachincoming, người quản lý bưu điện (daemon Postgres chính) tạo ra một quy trình mới (thường được gọi là backend ) để xử lý nó. Mặc dù thiết kế này mang lại sự ổn định và cách ly tốt hơn, nhưng nó không làm cho nó đặc biệt hiệu quả trong việc xử lý các kết nối tồn tại trong thời gian ngắn. Ứng dụng khách Postgres mới kết nối với thiết lập TCP, tạo quy trình và khởi tạo chương trình phụ trợ - tất cả đều tốn kém về thời gian và tài nguyên hệ thống.

Tất nhiên, điều này chỉ là một vấn đề nếu các kết nối được tạo quá thường xuyên và bị loại bỏ mà không sử dụng lại. Thật không may, không có gì lạ khi có một cụm nút mạng chạy các ứng dụng được viết bằng PHP hoặc các ngôn ngữ khác cần kết nối với cơ sở dữ liệu một lần mỗi lần tải trang. Các công việc hàng loạt nhanh chóng tạo ra rất nhiều kết nối liên tiếp nhanh chóng cũng rất phổ biến. Sử dụng chia sẻ kết nối trong các tình huống như vậy có thể giảm đáng kể tải trên Máy chủ PostgreSQL của bạn và cải thiện đáng kể độ trễ truy vấn.

Với kết nối tổng hợp, các máy khách kết nối với một máy chủ proxy duy trì một tập hợp các kết nối trực tiếp đến máy chủ PostgreSQL thực. Thông thường, các bệnh nhân không (và không nên) nhận ra rằng họ được kết nối với một máy chủ ủy quyền thay vì máy chủ thực tế. Proxy có thể chạy trên cùng một nút như theclient (ví dụ, trên mỗi nút web), trong trường hợp đó, các máy khách có thể kết nối với proxy thông qua các ổ cắm miền Unix có chi phí kết nối rất thấp. Ngay cả khi proxy nằm trên một nút khác và máy khách cần kết nối TCP để truy cập proxy, thì vẫn có thể tránh được phần phụ trợ Postgres mới.

PgBouncer là gì?

PgBouncer là một bộ gộp kết nối đơn nhị phân mã nguồn mở, nhẹ, dành cho PostgreSQL. Nó có thể gộp các kết nối vào một hoặc nhiều cơ sở dữ liệu (trên các máy chủ có thể khác nhau) và phục vụ các máy khách qua các ổ cắm miền TCP vàUnix.

PgBouncer duy trì một nhóm kết nối cho từng người dùng duy nhất, ghép nối cơ sở dữ liệu. Nó thường được định cấu hình để phân phối một trong những kết nối này cho một kết nối mới đến và đưa nó trở lại nhóm khi máy khách ngắt kết nối. Bạn có thể định cấu hình PgBouncer để gộp mạnh hơn, để nó có thể nhận và trả lại kết nối cho nhóm tại giao dịch hoặc ranh giới sao kê thay vì ranh giới kết nối. Tuy nhiên, có một số hậu quả không mong muốn có thể xảy ra.

Bạn sẽ có thể cài đặt PgBouncer bằng trình quản lý gói của bản phân phối của bạn:

# RedHat/CentOS/..
$ sudo yum install pgbouncer

# Debian/Ubuntu/..
$ sudo apt-get install pgbouncer

Nó cũng có sẵn từ các repo Postgres APT và YUM tiêu chuẩn, có thể được sử dụng nếu các gói phân phối của bạn đã cũ hoặc bị hỏng.

PgBouncer dựa trên một tệp cấu hình chính, thường được lưu trữ dưới dạng /etc/pgbouncer/pgbouncer.ini . Bạn có thể gọi pgbouncer dưới dạng dịch vụ systemd hoặc chỉ cần chạy nó ngay cả khi không có đặc quyền của người dùng cấp trên với đường dẫn đến tệp cấu hình này.

Để mang lại hiệu quả, hãy tạo cơ sở dữ liệu db1 và người dùng user1 trên máy chủ của chúng tôi:

$ sudo -u postgres psql
psql (10.6 (Debian 10.6-1.pgdg90+1))
Type "help" for help.

postgres=# create user user1 password 'user1pass';
CREATE ROLE
postgres=# create database db1 owner user1;
CREATE DATABASE
postgres=#

Khách hàng sẽ kết nối với cơ sở dữ liệu db1 với tên người dùng user1 andpassword user1pass . Mục tiêu của chúng tôi là làm cho khách hàng kết nối với PgBouncer trong đó sẽ ủy quyền và gộp các kết nối với máy chủ thực tế.

Bây giờ, hãy tạo một tệp (ở bất kỳ đâu) với các nội dung sau:

[databases]
db1 = host=localhost dbname=db1

[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 16432
auth_file = userlist.txt

Chúng tôi cũng cần tạo một tệp “userlist.txt” trong cùng một thư mục, với tên người dùng và mật khẩu (đã băm) của người dùng mà PgBouncer sẽ cho phép kết nối. Tạo “userlist.txt” với nội dung sau:

"user1" "md5638b81c77071ea624d1ad4adb1433540"

Giá trị thứ hai là MD5 của “user1passuser1”, có tiền tố là “md5”. Đây là quy ước Postgres thông thường.

Bây giờ hãy bắt đầu PgBouncer ở phía trước:

$ /usr/sbin/pgbouncer pgbouncer.ini
2019-02-05 11:46:18.011 10033 LOG file descriptor limit: 1024 (H:1048576), max_client_conn: 100, max fds possible: 130
2019-02-05 11:46:18.012 10033 LOG listening on 127.0.0.1:16432
2019-02-05 11:46:18.013 10033 LOG listening on unix:/tmp/.s.PGSQL.16432
2019-02-05 11:46:18.014 10033 LOG process up: pgbouncer 1.9.0, libevent 2.0.21-stable (epoll), adns: c-ares 1.12.0, tls: OpenSSL 1.1.0j  20 Nov 2018

Bây giờ chúng tôi đã khởi động PgBouncer đang nghe trên 127.0.0.1 TCP cổng 16432, cũng như trên ổ cắm miền Unix /tmp/.s.PGSQL.16432 . “Cơ sở dữ liệu” duy nhất có sẵn trên máy chủ proxy này là db1 . Người dùng duy nhất có thể kết nối với máy chủ này là user1 . Hãy thử kết nối với psql :

$ psql -U user1 -p 16432 -h localhost db1
Password for user user1:
psql (10.6 (Debian 10.6-1.pgdg90+1))
Type "help" for help.

db1=> select inet_server_addr(), inet_server_port();
 inet_server_addr | inet_server_port
------------------+------------------
 127.0.0.1        |             5432
(1 row)

db1=>

Máy khách (psql) kết nối thành công với localhost:16432, nhưng bạn có thể thấy rằng kết nối thực sự đang được ủy quyền cho localhost:5432.

Bạn có thể thử ngắt kết nối và kết nối lại một vài lần, sau đó kiểm tra xem còn bao nhiêu kết nối trên máy chủ thực tế:

postgres=# select count(*) from pg_stat_activity
postgres-#   where datname='db1' and usename='user1';
 count
-------
     1
(1 row)

PgBouncer sẽ không ngắt kết nối thực khi máy khách ngắt kết nối. Bạn có thể định cấu hình các kết nối tối thiểu, tối đa và dành riêng mà PgBouncer sẽ duy trì cho mỗi nhóm trong tệp cấu hình.

Triển khai PgBouncer

Bạn cài đặt và chạy PgBouncer ở đâu? Có những câu trả lời khác nhau, với những ưu điểm khác nhau:

  • Trên nút máy chủ Postgres :Bạn có thể cài đặt nó cùng với chính PostgreSQLserver, trên cùng một nút. Các máy khách kết nối với PgBouncer khác với cổng Postgres. Điều này có tác dụng là một Postgres “nâng cao” mà kết nối tổng hợp trong nội bộ. Bạn cũng chỉ phải duy trì một bản sao của các tệp cấu hình cho PgBouncer. Mặt khác, điều này thực sự có thể chạy một cái gì đó khác trên nút máy chủ PostgreSQL, điều này có thể không dễ dàng hoặc không được phép (tường lửa, chính sách) hoặc thậm chí có thể (AWSRDS).
  • Trên các nút ứng dụng khách :Bạn có thể cài đặt PgBouncer trong mỗi nút máy khách, ví dụ như nút web chạy Apache và PHP, và các tập lệnh PHP kết nối với localPgBouncer. Điều này có lợi thế là không phải làm phiền quá trình thiết lập máy chủ và cấu hình nhóm có thể được sử dụng để giữ cho tải máy chủ có thể dự đoán được. lưu lượng truy cập, máy chủ có thể bị quá tải nhanh chóng.
  • Dưới dạng một cụm độc lập :Tùy chọn thứ ba để có một cụm các nút PgBouncer độc lập, không trạng thái, được hỗ trợ bởi bộ cân bằng tải TCP như HAProxy. Thissetup, mặc dù phức tạp hơn hai tùy chọn còn lại, nhưng cung cấp khả năng cấu hình và kiểm soát tối đa.

Quản trị

PgBouncer cho phép người dùng được đánh dấu là quản trị viên kết nối với cơ sở dữ liệu ảo có tên “pgbouncer” và ra lệnh để điều khiển máy chủ và xem số liệu thống kê. Để thử điều này, trước tiên hãy đánh dấu “user1” là quản trị viên bằng cách sửa đổi tệp pgbouncer.ini:

[databases]
db1 = host=localhost dbname=db1

[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 16432
auth_file = userlist.txt
admin_users = user1

Bây giờ user1 có thể kết nối với cơ sở dữ liệu có tên “pgbouncer”:

$ psql -U user1 -p 16432 -h localhost pgbouncer
Password for user user1:
psql (10.6 (Debian 10.6-1.pgdg90+1), server 1.9.0/bouncer)
Type "help" for help.

pgbouncer=#

Từ đây, bạn có thể thực hiện nhiều việc khác nhau như bật hoặc tắt cơ sở dữ liệu cụ thể, kiểm tra và tải lại cấu hình, v.v.:

pgbouncer=# RELOAD;
RELOAD
pgbouncer=# DISABLE db1;
DISABLE
pgbouncer=# ENABLE db1;
ENABLE
pgbouncer=# SHOW FDS;
 fd |  task  | user  | database |   addr    | port  |     cancel     | link | client_encoding | std_strings | datestyle | timezone  | pa
----+--------+-------+----------+-----------+-------+----------------+------+-----------------+-------------+-----------+-----------+---
  6 | pooler |       |          | 127.0.0.1 | 16432 |              0 |    0 |                 |             |           |           |
  7 | pooler |       |          | unix      | 16432 |              0 |    0 |                 |             |           |           |
  9 | server | user1 | db1      | 127.0.0.1 |  5432 | 45404395804679 |    0 | UTF8            | on          | ISO, MDY  | localtime |
(3 rows)

Giám sát

Ngoài ra còn có các lệnh để hiển thị các số liệu thống kê khác nhau về PgBouncer, bao gồm:

  • Thống kê trên mỗi cơ sở dữ liệu về thời lượng truy vấn, thời gian chờ của khách hàng, mức sử dụng mạng, số lượng giao dịch
  • Thống kê theo nhóm về số lượng máy khách đang hoạt động và đang chờ, kết nối máy chủ nhàn rỗi và máy chủ đã sử dụng

Thống kê được truy xuất bằng các lệnh kiểu “SHOW xyz”, như lệnh này để tìm nạp các thống kê liên quan đến nhóm:

pgbouncer=# SHOW POOLS;
-[ RECORD 1 ]---------
database   | db1
user       | user1
cl_active  | 0
cl_waiting | 0
sv_active  | 0
sv_idle    | 0
sv_used    | 1
sv_tested  | 0
sv_login   | 0
maxwait    | 0
maxwait_us | 0
pool_mode  | session
-[ RECORD 2 ]---------
database   | pgbouncer
user       | pgbouncer
cl_active  | 1
cl_waiting | 0
sv_active  | 0
sv_idle    | 0
sv_used    | 0
sv_tested  | 0
sv_login   | 0
maxwait    | 0
maxwait_us | 0
pool_mode  | statement

Đọc thêm

Trang chủ PgBouncer có thêm chi tiết về tất cả các tính năng và tùy chọn cấu hình khác nhau của PgBouncer.

  • Trang chủ PgBouncer
  • Kho lưu trữ PgBouncer GitHub
  • Postgres Wikihas thông tin về tổng hợp kết nối
  • Pgpool là anotheroption để tổng hợp kết nối

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Quay lại phiên bản readline 6.x trong Homebrew để sửa Postgresql?

  2. Cách tốt nhất để tính kết quả trước khi LIMIT được áp dụng

  3. Bí danh tham chiếu trong mệnh đề WHERE

  4. Đếm tổng tích lũy trong Postgresql

  5. PostgreSQL Tạo chỉ mục