Bạn nên theo dõi những chỉ số nào về việc triển khai PostgreSQL của mình? Loạt bài đăng trên blog này nhằm mục đích cung cấp một tập hợp tối thiểu, bắt đầu của các giao dịch giám sát cần thiết mà bạn nên thực hiện để đảm bảo sức khỏe và sự ổn định của các máy chủPostgres của bạn.
Phần đầu tiên bao gồm các thông số cấp cụm.
Phần 1:Cấp độ cụm
Trong biệt ngữ Postgres, một cụm là một tập hợp cơ sở dữ liệu được quản lý bởi một phiên bản máy chủ singlePostgres. Các tính năng như sao chép và lưu trữ WAL hoạt động ở cấp độ cụm.
1. Phạm vi ID giao dịch
Từ quan điểm của khách hàng bình thường, các tệp dữ liệu của một cụm PostgreSQL sẽ xuất hiện để chứa ảnh chụp nhanh của dữ liệu như được sửa đổi bởi giao dịch cam kết cuối cùng. Tuy nhiên, do kiến trúc MVCC của Postgres, các tệp vật lý không chỉ chứa dữ liệu cho giao dịch gần đây nhất mà còn cho một loạt các giao dịch kết thúc bằng giao dịch mới nhất. (Thường xuyên hút bụi loại bỏ dữ liệu cho các giao dịch cũ hơn.)
Mỗi giao dịch có một số nhận dạng số nguyên 32 bit duy nhất, được gọi là ID giao dịch . Vì nhiều lý do khác nhau, sự khác biệt của ID giao dịch đầu tiên và cuối cùng phải nhỏ hơn 2, tức là khoảng 2 tỷ. Giữ phạm vi thấp hơn giới hạn này là điều bắt buộc phải - đọc câu chuyện đời thực này về những gì sẽ xảy ra nếu không.
Hành động:Liên tục theo dõi phạm vi ID giao dịch, cảnh báo nếu giá trị vượt quá ngưỡng đã đặt.
Cách thực hiện:
-- returns the first and last transactions IDs for the cluster
SELECT oldest_xid::text::int as first,
regexp_replace(next_xid, '^[0-9]+:', '')::int-1 as last
FROM pg_control_checkpoint();
-- returns the transaction ID range for each database
SELECT datname, age(datfrozenxid)
FROM pg_database;
2. Số lượng phụ trợ
Mỗi chương trình phụ trợ đại diện cho một ứng dụng khách được kết nối với máy chủ hoặc một quy trình hệ thống (như nhân viên hút bụi tự động, trình viết nền, v.v.). Mỗi chương trình phụ trợ cũng là một quá trình hệ điều hành sử dụng tài nguyên hệ điều hành như bộ nhớ, bộ ký mã mở, v.v. Quá nhiều chương trình phụ trợ, thường là do quá nhiều máy khách hoặc nhiều truy vấn chạy dài có thể gây áp lực lên tài nguyên hệ điều hành và làm chậm thời gian phản hồi truy vấn cho mỗi máy khách.
Hành động:Theo dõi số lượng phụ trợ tối đa qua mỗi ngày / tuần, điều tra các xu hướng ngày càng tăng.
Cách thực hiện:
-- returns the count of currently running backends
SELECT count(*)
FROM pg_stat_activity;
3. Vị trí sao chép không hoạt động
Các vị trí sao chép được đánh dấu là 'không hoạt động' khi ứng dụng nhân bản được kết nối với vị trí đó ngắt kết nối. Các vị trí sao chép không hoạt động gây ra các tệp WAL, vì chúng sẽ phải được gửi đến máy khách khi nó kết nối lại và các vị trí này trở nên hoạt động. Thật vậy, điều đầu tiên để kiểm tra xem tài khoản tệp WAL của bạn không giảm đi hay không là xem liệu bạn có vùng sao chép không hoạt động hay không.
Các vị trí sao chép thường không hoạt động là kết quả của một ứng dụng khách dự phòng đã bị hủy bỏ, một nô lệ đã bị gỡ xuống, quảng cáo, chuyển đổi dự phòng và những thứ tương tự.
Hành động:Liên tục kiểm tra các vị trí sao chép không hoạt động, cảnh báo nếu có.
Cách thực hiện:
-- returns the count of inactive replication slots
SELECT count(*)
FROM pg_replication_slots
WHERE NOT active;
4. Các phần phụ trợ đang chờ trên ổ khóa
Các câu lệnh SQL có thể làm cho các câu lệnh SQL khác chờ đợi một cách rõ ràng hoặc ngầm định. Ví dụ:chạy "SELECT .. FOR UPDATE" khai báo rõ ràng một khóa cho các hàng đã chọn và chạy một "UPDATE" đặt các khóa dành riêng cho hàng. Các câu lệnh SQL khác khi gặp phải khóa sẽ phải đợi cho đến khi câu lệnh đầu tiên tháo khóa, trước khi tiếp tục thực thi.
Điều này có thể biểu hiện dưới dạng hiệu suất ứng dụng chậm trong quá trình chạy báo cáo hàng tuần, giao dịch / trang web hết thời gian chờ và những thứ tương tự.
Mặc dù không thể tránh được một số lần khóa, nhưng xu hướng ngày càng tăng của những người bán thuốc chờ khóa, thường là các cuộc gọi truy vấn hoặc cấu trúc lại ứng dụng.
Hành động:Theo dõi số lượng phụ trợ tối đa đang chờ khóa qua mỗi ngày / tuần, điều tra các xu hướng ngày càng tăng.
Cách thực hiện:
-- returns the count of backends waiting on locks
SELECT count(*)
FROM pg_stat_activity
WHERE wait_event = 'Lock';
5. Các khoản phụ trợ không hoạt động trong giao dịch
Trong thế giới PostgreSQL, các giao dịch dài hạn không được tốt lắm vì chúng có thể khiến các tệp WAL tích tụ, ngăn cản quá trình hút chân không tự động và hút chân không thủ công, đồng thời sử dụng hết tài nguyên. Không thể làm được gì nhiều đối với các giao dịch thực sự, mất nhiều thời gian để hoàn thành, nhưng có những trường hợp như ứng dụng / tập lệnh hoạt động sai và ứng dụng khách psql không thường xuyên bắt đầu giao dịch nhưng không đóng chúng. Phần hỗ trợ phục vụ những khách hàng như vậy xuất hiện dưới dạng "không hoạt động trong giao dịch".
Phần phụ trợ đang chạy không tải trong giao dịch phải được phát hiện và tắt trước khi chúng bắt đầu ảnh hưởng đến sự ổn định của hệ thống.
Hành động:Liên tục theo dõi số lượng phụ trợ không hoạt động trong giao dịch, xem xét nếu có.
Cách thực hiện:
-- returns the count of backends waiting on locks
SELECT count(*)
FROM pg_stat_activity
WHERE state = 'idle in transaction';
6. Trễ sao chép cho các kết nối đang hoạt động
Khi có các ứng dụng khách sao chép trực tuyến đang hoạt động (như hot standbys) ứng dụng nhân bản lôgic hoạt động, Postgres chạy một chương trình phụ trợ hệ thống được gọi là WAL sender cho mỗi máy khách đang hoạt động (được kết nối). Người gửi WAL có trách nhiệm gửi dữ liệu bản ghi WAL mà khách hàng cần.
Các khách hàng nhân bản thường cố gắng theo kịp càng nhiều càng tốt với bản thảo. Tuy nhiên, đôi khi, tốc độ tạo WAL ở phía chính có thể cao hơn tốc độ mà khách hàng có thể sử dụng chúng. Điều này dẫn đến độ trễ sao chép cho mỗi kết nối nhân rộng.
PostgreSQL cung cấp cơ chế truy vấn để ghi độ trễ (số byte được gửi nhưng không được ghi vào đĩa của khách hàng), độ trễ tuôn ra (số byte được ghi nhưng không bị xóa đĩa của toclient) và độ trễ phát lại (số byte được gửi nhưng không được phát lại vào đĩa của bệnh nhân) tệp cơ sở dữ liệu) cho mỗi người gửi WAL đang hoạt động.
Hành động:Liên tục theo dõi độ trễ sao chép đối với các kết nối đang hoạt động, cảnh báo nếu giá trị vượt quá ngưỡng đã đặt.
Cách thực hiện:
-- returns the write, flush and replay lags per WAL sender, as described above
SELECT write_lsn - sent_lsn AS write_lag,
flush_lsn - write_lsn AS flush_lag,
replay_lsn - flush_lsn AS replay_lag
FROM pg_stat_replication;
7. Trễ sao chép cho các khe sao chép
Không chỉ các ứng dụng khách báo cáo có thể bị trễ, chúng còn có thể biến mất hoàn toàn do sự cố, thay đổi cấu trúc liên kết hoặc lỗi của con người. Nó cũng có thể là do thiết kế, nơi khách hàng không phải lúc nào cũng trực tuyến.
Nếu máy khách được hỗ trợ bởi một khe sao chép, thì tất cả các tệp WAL cần thiết để máy khách tiếp tục từ thời điểm nó dừng lại sẽ được PostgreSQL giữ lại. Các tệp TheWAL sẽ được lưu giữ không xác định - không có cách nào để đặt giới hạn. Khi máy khách kết nối lại, tất cả dữ liệu được giữ lại phải được truyền trực tuyến đến máy khách đầu tiên, điều này có thể liên quan đến nhiều lưu lượng đĩa và mạng trên chính. Ngoài ra, bạn cũng nên theo dõi độ trễ ở cấp độ vị trí.
(Lưu ý:Quy trình người gửi WAL chỉ chạy khi máy khách được kết nối và nó thoát khi máy khách ngắt kết nối. Phương pháp người gửi WAL đo lường mức độ xa aclient không hoạt động khi máy khách bị ngắt kết nối.)
Hành động:Liên tục theo dõi độ trễ sao chép đối với các vị trí sao chép hợp lý, cảnh báo nếu giá trị vượt quá ngưỡng đã đặt.
Cách thực hiện:
-- returns the replication slot lag in bytes
-- (works only for logical replication slots)
SELECT pg_current_wal_lsn() - confirmed_flush_lsn
FROM pg_replication_slots;
8. Số lượng tệp WAL
Quản lý tệp WAL có thể là một nhiệm vụ khó chịu, đặc biệt nếu bạn có WAL lưu trữ hoặc phát trực tuyến ứng dụng sao chép. Số lượng tệp WAL có thể bắt đầu tăng mà không có bất kỳ lý do rõ ràng nào, quá trình lưu trữ WAL có thể không theo kịp tốc độ tạo WAL và tổng kích thước tệp WAL có thể lên tới hàng terabyte.
Ở mức tối thiểu, bạn cần theo dõi số lượng tệp WAL có trong thư mục cơ sở dữ liệu của bạn và đảm bảo số lượng có vẻ hợp lý cho việc triển khai của bạn.
Hành động:Liên tục theo dõi số lượng tệp WAL, cảnh báo nếu giá trị vượt quá ngưỡng đã đặt.
Cách thực hiện:
-- returns the number of WAL files present in the pg_wal directory (v10+)
SELECT count(*)
FROM pg_ls_waldir();
-- same, for v9.x
SELECT count(*)
FROM pg_ls_dir('pg_xlog')
WHERE pg_ls_dir ~ '^[0-9A-F]{24}$';
-- can also count the files physically present in $DBDIR/pg_wal
-- /bin/ls -l $DBDIR/pg_wal | grep -c '^-'
9. Số lượng tệp WAL sẵn sàng lưu trữ
Khi tính năng lưu trữ WAL được bật, PostgreSQL sẽ gọi một tập lệnh người dùng mỗi khi tệpWAL mới được tạo. Tập lệnh được cho là "lưu trữ" tệp WAL duy nhất được gọi (nó thường sao chép nó sang một máy chủ khác hoặc một nhóm S3). Nếu tập lệnh mất quá nhiều thời gian để thực hiện công việc của nó hoặc nếu nó không thành công, tập hợp các tệp WAL sẽ được lưu trữ chồng chất.
Hành động:Liên tục theo dõi số lượng tệp sẵn sàng lưu trữ của WAL, cảnh báo nếu giá trị vượt quá ngưỡng đã đặt.
Cách thực hiện:
-- returns the number of WAL files ready to be archived (v12+)
SELECT count(*)
FROM pg_ls_archive_statusdir()
WHERE name ~ '^[0-9A-F]{24}.ready$';
-- same, for v10+
SELECT count(*)
FROM pg_ls_dir('pg_wal/archive_status')
WHERE pg_ls_dir ~ '^[0-9A-F]{24}.ready$';
-- same, for v9.x
SELECT count(*)
FROM pg_ls_dir('pg_xlog/archive_status')
WHERE pg_ls_dir ~ '^[0-9A-F]{24}.ready$';
-- can also count the *.ready files physically present in $DBDIR/pg_wal/archive_status
-- /bin/ls -l $DBDIR/pg_wal/archive_status | grep -c .ready
Thu thập các chỉ số này
Các phần trên cung cấp các câu lệnh SQL để trích xuất các số liệu cần thiết từ máy chủ Postgres đang chạy. Nếu bạn không muốn tự mình viết kịch bản, hãy xem pgmetrics của công cụ mã nguồn mở. Nó có thể thu thập các chỉ số ở trên, v.v. và báo cáo chúng ở định dạng văn bản và JSON.
Bạn có thể gửi trực tiếp các báo cáo pgmetrics tới dịch vụ thương mại của chúng tôi, pgDash, nơi lưu trữ và xử lý các báo cáo này để hiển thị đồ thị và thực hiện cảnh báo.
Tiếp theo
Các phần tiếp theo trong loạt bài này sẽ bao gồm các chỉ số cấp cơ sở dữ liệu, cấp bảng, cấp chỉ mục và cấp hệ thống. Hãy theo dõi!