Một số vấn đề về bảo mật sẽ phát sinh nếu để pgbouncer_exporter và pgbouncer chạy dưới quyền postgres.
Như các bạn đã biết thì postgres là user đặc thù có mọi quyền hành mặc định trên local với tất cả các version postgres hiện tại.
Hôm nay mình viết vài dòng cũng xem như là gợi ý cho các bạn nào gặp vấn đề như mình và mình cũng note lại thôi. Ai hiểu thì hiểu, không hiểu thì thôi. Blog mình mà, thích là viết thôi.
Đầu tiên mình phải cài pgbouncer trước và cấu hình cũng như kiểm tra các kết nối đến các server postgres.
[databases]Xong test remote thử xem có bị gì không nhé.
template1 = host=serverpostgres dbname=template1 user=usercotheremote port=5432
[pgbouncer]
pool_mode = session
listen_port = 6543
listen_addr = 0.0.0.0
auth_type = any
auth_file = users.txt
logfile = pgbouncer.log
pidfile = pgbouncer.pid
admin_users = prometheus
stats_users = stat_collector
unix_socket_dir = /etc/pgbouncer/
; When server connection is released back to pool:
; ; session - after client disconnects
; ; transaction - after transaction finishes
; ; statement - after statement finishes
;pool_mode = transaction
pool_mode = transaction
server_reset_query = DISCARD ALL
server_reset_query_always = 1
max_client_conn = 65536
default_pool_size = 200
$ sudo -H -u prometheus psql 'host=serverpostgres dbname=template1 user=usercotheremote port=5432'
rồi Ok rồi thì khởi động bằng tay trước khi làm cái systemd autostart nào.
$ sudo -H -u prometheus pgbouncer -v /etc/pgbouncer/pgbouncer.ini
Ở đây mình -v để bật chế độ verbose xem xem có gì hot không. Kệ nó, nếu ổn rồi cứ để đó. Setup tiếp pgbouncer_exporter của thanh niên spreaker trên github nha.
Đại loại công việc của repo này là nó sẽ kết nối bằng user pgbouncer vào pgbouncer mình vừa tạo ở trên listen_port = 6543, nhưng để tiện quản lý mình khi báo thêm ở trên đoạn unix_socket_dir = /etc/pgbouncer/ mục đích của mình là để thằng pgbouncer_exporter kết nối vào thông qua cái socket này thay vì postgresql mặc định như trên trang chủ của pgbouncer hướng dẫn.
safedata@vn01:/var/run/postgresql$ cat /opt/monitoring/prometheus-pgbouncer-exporter/config.ymlhost=/etc/pgbouncer/ dbname=pgbouncer port=6543 user=pgbouncer để ý đoạn này nhé. Mình sẽ ra test xem nó có chạy chưa
# The host on which the exporter should listen to (defaults to 127.0.0.1)
exporter_host: 0.0.0.0
# The port on which the exporter should listen to (defaults to 9100)
exporter_port: 9100
# The list of pgbouncer instances to monitor
pgbouncers:
-
# The pgbouncer connection string. Supports environment variables replacement
# Ie. $(PGBOUNCER_PASS) is replaced with the content of "PGBOUNCER_PASS" environment
# variable if exist, or left untouched if doesn't exist
dsn: host=/etc/pgbouncer/ dbname=pgbouncer port=6543 user=pgbouncer
# The pgbouncer connection timeout in seconds (defaults to 5 seconds)
connect_timeout: 5
# Databases to report metrics for. If omitted or empty, all databases
# will be reported.
include_databases:
# Databases to exclude from metrics reporting. If omitted or empty, all
# databases matching "include_databases" will be reported.
exclude_databases:
- pgbouncer
# Extra labels to add to all metrics exported for this pgbouncer
# instance. Required if you have configured multiple pgbouncers,
# in order to export an unique set of metrics.
extra_labels:
pool_id: 1
sudo -H -u prometheus psql 'host=/etc/pgbouncer/ dbname=pgbouncer port=6543 user=pgbouncer' OK chạy rồi. Thì có nghĩa pgbouncer đã chạy.
Note: Nó đã chạy nhưng không có nghĩa là nó kết nối với toàn bộ database bên remote server posgres. Nên cần hết sức lưu ý bước này, mình gà mờ nên đã tốn tận vài ngày để hiểu những thứ này.
OK giờ các bạn có thể test với lại database khác. Nếu database khác chạy luôn thì không có gì để nói cả.
Tuy nhiên nếu không chạy thì bạn sẽ có nhiều việc phải làm như sau:
Các bạn nhớ lúc nãy mình nói với các bạn để nguyên cái màn hình debug của pgbouncer không? Đấy giờ là lúc nhìn vào nó (kinh nghiệm đó). Các bạn có thể thấy lỗi "ERROR: NOT ALLOWED" thì điều đó có nghĩa là bạn chưa điều chỉnh phần auth_type và bạn cần điều chỉnh lại chỗ này.
Nếu bạn đã điều chỉnh như mình "auth_type = any" thì bạn hãy nhớ phần [databases] bạn phải chỉ rõ là sẽ login bằng user nào. Nếu không nó lại báo lỗi nữa.
Rồi xong. Lỗi thì bao la, nhưng quan trọng là bạn biết cách debug được là OK. Mọi vấn đề sẽ được giải quyết mà không bị bế tắc.
Đến một lúc nào đó bạn cũng sẽ kết nối được database từ bên kia server của posgres bằng pgbouncer trên máy bạn đang thực hiện.
=> Thì cho đến bước này, bạn có thể curl thử port của pgbouncer_exporter để xem thử thành quả. các metrics như :
pgbouncer_stats_sent_bytes_total
pgbouncer_stats_waiting_duration_microseconds
pgbouncer_stats_queries_duration_microseconds
sẽ hiện ra trước mặt bạn cùng với label database. Nếu không hiện ra thì bạn hãy quay lại các bước trên để thực hiện lại nhé.
Thân ái
Những chia sẻ khá hữu ích ạ:)
ReplyDeleteKhông biêt là ai, bí ẩn quá, cho mình xin info với :D
fb: fb.com/tienceh