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

Cách đạt được tính khả dụng cao của PostgreSQL với pgBouncer

Trong thế giới cơ sở dữ liệu, có nhiều khái niệm phổ biến như Tính sẵn sàng cao, Chuyển đổi dự phòng và Tổng hợp kết nối. Tất cả chúng đều là những thứ hữu ích để triển khai trên bất kỳ hệ thống nào và thậm chí là điều bắt buộc trong một số trường hợp.

Kết nối tổng hợp là một phương pháp tạo một nhóm các kết nối và sử dụng lại chúng, tránh việc mở các kết nối mới đến cơ sở dữ liệu mọi lúc, điều này sẽ làm tăng đáng kể hiệu suất của các ứng dụng của bạn. PgBouncer là một trình gộp kết nối phổ biến được thiết kế cho PostgreSQL, nhưng nó không đủ để đạt được Tính khả dụng cao của PostgreSQL vì bản thân nó không có cấu hình đa máy chủ, chuyển đổi dự phòng hoặc phát hiện.

Sử dụng Cân bằng tải là một cách để có Tính sẵn sàng cao trong cấu trúc liên kết cơ sở dữ liệu của bạn. Nó có thể hữu ích cho việc chuyển hướng lưu lượng đến các nút cơ sở dữ liệu lành mạnh, phân phối lưu lượng trên nhiều máy chủ để cải thiện hiệu suất hoặc chỉ để cấu hình một điểm cuối duy nhất trong ứng dụng của bạn để có quá trình cấu hình và chuyển đổi dự phòng dễ dàng hơn. Đối với điều này, HAProxy là một lựa chọn tốt để bổ sung cho trình gộp kết nối của bạn, vì nó là một proxy nguồn mở có thể được sử dụng để triển khai tính khả dụng cao, cân bằng tải và proxy cho các ứng dụng dựa trên TCP và HTTP.

Trong blog này, chúng tôi sẽ sử dụng cả hai khái niệm, Cân bằng tải và tổng hợp kết nối (HAProxy + PgBouncer), để triển khai môi trường Tính sẵn sàng cao cho cơ sở dữ liệu PostgreSQL của bạn.

Cách hoạt động của PgBouncer

PgBouncer hoạt động như một máy chủ PostgreSQL, vì vậy bạn chỉ cần truy cập cơ sở dữ liệu của mình bằng thông tin PgBouncer (Địa chỉ IP / Tên máy chủ và Cổng) và PgBouncer sẽ tạo kết nối đến máy chủ PostgreSQL hoặc nó sẽ sử dụng lại một cái nếu nó tồn tại.

Khi PgBouncer nhận được kết nối, nó sẽ thực hiện xác thực, điều này phụ thuộc vào phương pháp được chỉ định trong tệp cấu hình. PgBouncer hỗ trợ tất cả các cơ chế xác thực mà máy chủ PostgreSQL hỗ trợ. Sau đó, PgBouncer sẽ kiểm tra kết nối đã lưu trong bộ nhớ cache, có cùng tên người dùng + cơ sở dữ liệu kết hợp. Nếu một kết nối được lưu trong bộ nhớ cache được tìm thấy, nó sẽ trả kết nối đó cho máy khách, nếu không, nó sẽ tạo một kết nối mới. Tùy thuộc vào cấu hình PgBouncer và số lượng kết nối đang hoạt động, có thể kết nối mới được xếp hàng đợi cho đến khi nó có thể được tạo hoặc thậm chí bị hủy bỏ.

Hành vi của PgBouncer phụ thuộc vào chế độ gộp được định cấu hình:

  • tổng hợp phiên (mặc định):Khi một máy khách kết nối, một kết nối máy chủ sẽ được chỉ định cho nó trong toàn bộ thời gian máy khách vẫn kết nối. Khi máy khách ngắt kết nối, kết nối máy chủ sẽ được đưa trở lại vào nhóm.
  • tổng hợp giao dịch :Một kết nối máy chủ chỉ được chỉ định cho một máy khách trong một giao dịch. Khi PgBouncer thông báo rằng giao dịch đã kết thúc, kết nối máy chủ sẽ được đưa trở lại nhóm.
  • tổng hợp câu lệnh :Kết nối máy chủ sẽ được đưa trở lại nhóm ngay lập tức sau khi truy vấn hoàn tất. Chế độ này không cho phép các giao dịch nhiều sao kê vì chúng sẽ bị phá vỡ.

Để cân bằng các truy vấn giữa một số máy chủ, về phía PgBouncer, có thể là một ý tưởng hay để làm cho server_lifetime nhỏ hơn và cũng bật server_round_robin. Theo mặc định, các kết nối không hoạt động được sử dụng lại bởi thuật toán LIFO, thuật toán này có thể hoạt động không tốt khi sử dụng bộ cân bằng tải.

Cách cài đặt PgBouncer

Chúng tôi sẽ cho rằng bạn đã triển khai cụm PostgreSQL và HAProxy của mình và nó đang hoạt động, nếu không, bạn có thể theo dõi bài đăng trên blog này để dễ dàng triển khai PostgreSQL để có tính khả dụng cao.

Bạn có thể cài đặt PgBouncer trên mỗi nút cơ sở dữ liệu hoặc trên một máy bên ngoài, trong mọi trường hợp, bạn sẽ có một cái gì đó giống như sau:

Để tải phần mềm PgBouncer, bạn có thể đi tới phần tải xuống PgBouncer hoặc sử dụng kho RPM hoặc DEB. Đối với ví dụ này, chúng tôi sẽ sử dụng CentOS 8 và sẽ cài đặt nó từ kho lưu trữ PostgreSQL chính thức.

Trước tiên, hãy tải xuống và cài đặt kho lưu trữ tương ứng từ trang PostgreSQL (nếu bạn chưa có):

$ wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

$ rpm -Uvh pgdg-redhat-repo-latest.noarch.rpm

Sau đó, cài đặt gói PgBouncer:

$ yum install pgbouncer

Xác minh cài đặt:

$ pgbouncer --version

PgBouncer 1.14.0

libevent 2.1.8-stable

adns: c-ares 1.13.0

tls: OpenSSL 1.1.1c FIPS  28 May 2019

Khi hoàn tất, bạn sẽ có tệp cấu hình mới nằm trong /etc/pgbouncer/pgbouncer.ini:

[databases]

[users]

[pgbouncer]

logfile = /var/log/pgbouncer/pgbouncer.log

pidfile = /var/run/pgbouncer/pgbouncer.pid

listen_addr = 127.0.0.1

listen_port = 6432

auth_type = trust

auth_file = /etc/pgbouncer/userlist.txt

admin_users = postgres

stats_users = stats, postgres

Hãy xem từng thông số sau:

  • Phần cơ sở dữ liệu [cơ sở dữ liệu]: Điều này chứa các cặp khóa =giá trị trong đó khóa sẽ được lấy làm tên cơ sở dữ liệu và giá trị dưới dạng danh sách kiểu chuỗi kết nối libpq của các cặp khóa =giá trị.
  • Phần người dùng [người dùng]: Điều này chứa các cặp khóa =giá trị trong đó khóa sẽ được lấy làm tên người dùng và giá trị dưới dạng danh sách kiểu chuỗi kết nối libpq của các cặp khóa =giá trị của cài đặt cấu hình cụ thể cho người dùng này.
  • logfile :Chỉ định tệp nhật ký. Tệp nhật ký được giữ ở trạng thái mở, vì vậy sau khi xoay vòng kill -HUP hoặc trên bảng điều khiển RELOAD; nên được thực hiện.
  • pidfile :Chỉ định tệp PID. Nếu không có tập hợp pidfile, daemon không được phép.
  • nghe_addr :Chỉ định danh sách địa chỉ nơi lắng nghe các kết nối TCP. Bạn cũng có thể sử dụng * nghĩa là “lắng nghe tất cả các địa chỉ”. Khi không được đặt, chỉ các kết nối ổ cắm Unix mới được chấp nhận.
  • nghe_port: Nghe trên cổng nào. Áp dụng cho cả ổ cắm TCP và Unix. Cổng mặc định là 6432.
  • auth_type: Cách xác thực người dùng.
  • auth_file :Tên của tệp để tải tên người dùng và mật khẩu.
  • admin_users :Danh sách người dùng cơ sở dữ liệu được phân tách bằng dấu phẩy được phép kết nối và chạy tất cả các lệnh trên bảng điều khiển.
  • stats_users :Danh sách người dùng cơ sở dữ liệu được phân tách bằng dấu phẩy được phép kết nối và chạy các truy vấn chỉ đọc trên bảng điều khiển.

Đây chỉ là một mẫu của tệp cấu hình mặc định, vì tệp gốc có 359 dòng, nhưng các dòng còn lại được nhận xét theo mặc định. Để có được tất cả các thông số có sẵn, bạn có thể kiểm tra tài liệu chính thức.

Cách sử dụng PgBouncer

Bây giờ, hãy xem cấu hình cơ bản để làm cho nó hoạt động.

Tệp cấu hình pgbouncer.ini:

$ cat /etc/pgbouncer/pgbouncer.ini

[databases]

world = host=127.0.0.1 port=5432 dbname=world

[pgbouncer]

logfile = /var/log/pgbouncer/pgbouncer.log

pidfile = /var/run/pgbouncer/pgbouncer.pid

listen_addr = *

listen_port = 6432

auth_type = md5

auth_file = /etc/pgbouncer/userlist.txt

admin_users = admindb

Và tệp xác thực:

$ cat /etc/pgbouncer/userlist.txt

"admindb" "root123"

Vì vậy, trong trường hợp này, tôi đã cài đặt PgBouncer trong cùng một nút cơ sở dữ liệu, lắng nghe tất cả các địa chỉ IP và nó kết nối với cơ sở dữ liệu PostgreSQL có tên là “world”. Tôi cũng đang quản lý những người dùng được phép trong tệp userlist.txt bằng mật khẩu văn bản thuần túy có thể được mã hóa nếu cần.

Để bắt đầu dịch vụ PgBouncer, bạn chỉ cần chạy lệnh sau:

$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini

Trong đó -d có nghĩa là "daemon", vì vậy nó sẽ chạy ở chế độ nền.

$ netstat -pltn

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 0.0.0.0:6432            0.0.0.0:*               LISTEN      4274/pgbouncer

tcp6       0      0 :::6432                 :::*                    LISTEN      4274/pgbouncer

Như bạn có thể thấy, PgBouncer đang hoạt động và chờ kết nối trong cổng 6432. Để truy cập cơ sở dữ liệu PostgreSQL, hãy chạy lệnh sau bằng cách sử dụng thông tin cục bộ của bạn (cổng, máy chủ, tên người dùng và tên cơ sở dữ liệu) :

$ psql -p 6432 -h 127.0.0.1 -U admindb world

Password for user admindb:

psql (12.4)

Type "help" for help.



world=#

Hãy nhớ rằng tên cơ sở dữ liệu (world) là cơ sở dữ liệu được định cấu hình trong tệp cấu hình PgBouncer của bạn:

[databases]

world = host=127.0.0.1 port=5432 dbname=world

Giám sát và Quản lý PgBouncer

Thay vì truy cập cơ sở dữ liệu PostgreSQL, bạn có thể kết nối trực tiếp với PgBouncer để quản lý hoặc giám sát nó. Đối với điều này, hãy sử dụng cùng một lệnh mà bạn đã sử dụng trước đó, nhưng thay đổi cơ sở dữ liệu thành “pgbouncer”:

$ psql -p 6432 -h 127.0.0.1 -U admindb pgbouncer

Password for user admindb:

psql (12.4, server 1.14.0/bouncer)

Type "help" for help.



pgbouncer=# SHOW HELP;

NOTICE:  Console usage

DETAIL:

SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION

SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM

SHOW DNS_HOSTS|DNS_ZONES

SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS

SET key = arg

RELOAD

PAUSE [<db>]

RESUME [<db>]

DISABLE <db>

ENABLE <db>

RECONNECT [<db>]

KILL <db>

SUSPEND

SHUTDOWN



SHOW

Bây giờ, bạn có thể chạy các lệnh PgBouncer khác nhau để giám sát nó:

HIỂN THỊ STATS_TOTALS:

pgbouncer=# SHOW STATS_TOTALS;

 database  | xact_count | query_count | bytes_received | bytes_sent | xact_time | query_time | wait_time

-----------+------------+-------------+----------------+------------+-----------+------------+-----------

 pgbouncer |          1 |           1 |              0 |          0 |         0 |          0 |         0

 world     |          2 |           2 |             59 |     234205 |      8351 |       8351 |      4828

(2 rows)

HIỂN THỊ MÁY CHỦ:

pgbouncer=# SHOW SERVERS;

 type |  user   | database | state  |   addr    | port | local_addr | local_port |      connect_time       |      request_time

| wait | wait_us | close_needed |      ptr       |      link      | remote_pid | tls

------+---------+----------+--------+-----------+------+------------+------------+-------------------------+-------------------------

+------+---------+--------------+----------------+----------------+------------+-----

 S    | admindb | world    | active | 127.0.0.1 | 5432 | 127.0.0.1  |      45052 | 2020-09-09 18:31:57 UTC | 2020-09-09 18:32:04 UTC

|    0 |       0 |            0 | 0x55b04a51b3d0 | 0x55b04a514810 |       5738 |

(1 row)

HIỂN THỊ KHÁCH HÀNG:

pgbouncer=# SHOW CLIENTS;

 type |  user   | database  | state  |   addr    | port  | local_addr | local_port |      connect_time       |      request_time

  | wait | wait_us | close_needed |      ptr       |      link      | remote_pid | tls

------+---------+-----------+--------+-----------+-------+------------+------------+-------------------------+-----------------------

--+------+---------+--------------+----------------+----------------+------------+-----

 C    | admindb | pgbouncer | active | 127.0.0.1 | 46950 | 127.0.0.1  |       6432 | 2020-09-09 18:29:46 UTC | 2020-09-09 18:55:11 UT

C | 1441 |  855140 |            0 | 0x55b04a5145e0 |                |          0 |

 C    | admindb | world     | active | 127.0.0.1 | 47710 | 127.0.0.1  |       6432 | 2020-09-09 18:31:41 UTC | 2020-09-09 18:32:04 UT

C |    0 |       0 |            0 | 0x55b04a514810 | 0x55b04a51b3d0 |          0 |

(2 rows)

HIỂN THỊ BÀI VIẾT:

pgbouncer=# SHOW POOLS;

 database  |   user    | cl_active | cl_waiting | sv_active | sv_idle | sv_used | sv_tested | sv_login | maxwait | maxwait_us | pool_

mode

-----------+-----------+-----------+------------+-----------+---------+---------+-----------+----------+---------+------------+------

-----

 pgbouncer | pgbouncer |         1 |          0 |         0 |       0 |       0 |         0 |        0 |       0 |          0 | state

ment

 world     | admindb   |         1 |          0 |         1 |       0 |       0 |         0 |        0 |       0 |          0 | sessi

on

(2 rows)

Và để quản lý nó ...

RELOAD:

pgbouncer=# RELOAD;

RELOAD

TẠM DỪNG:

pgbouncer=# PAUSE world;

PAUSE

KẾT QUẢ:

pgbouncer=# RESUME world;

RESUME

Các lệnh đó chỉ là một ví dụ. Để có danh sách đầy đủ các lệnh, vui lòng tham khảo tài liệu chính thức.

Kết luận

Sử dụng kết hợp PgBouncer + HAProxy + PostgreSQL là một cách tốt để đạt được Tính khả dụng cao cho cụm PostgreSQL của bạn, đồng thời cải thiện hiệu suất cơ sở dữ liệu của bạn.

Như bạn có thể thấy, nếu bạn có sẵn môi trường PostgreSQL, môi trường mà bạn có thể triển khai bằng ClusterControl chỉ trong vài cú nhấp chuột, bạn có thể dễ dàng thêm PgBouncer để tận dụng lợi thế của việc có một bộ gộp kết nối cho hệ thống của mình.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách không tạo tiện ích mở rộng PostgreSQL 9.0 trên nền tảng RPM

  2. Tạo dữ liệu và chất lượng phần cứng

  3. vô hiệu hóa LƯU Ý trong đầu ra psql

  4. Viết một tệp bằng nhiều chuỗi

  5. Chú thích ngủ đông cho kiểu nối tiếp PostgreSQL