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.