Prohoster > Blog > quản lý > Thống kê và giám sát các tập lệnh PHP trong thời gian thực. ClickHouse và Grafana đến hỗ trợ Pinba
Thống kê và giám sát các tập lệnh PHP trong thời gian thực. ClickHouse và Grafana đến hỗ trợ Pinba
Trong bài viết này tôi sẽ hướng dẫn bạn cách sử dụng pinba với clickhouse và grafana thay vì pinba_engine và pinboard.
Trong một dự án PHP, pinba có lẽ là cách đáng tin cậy duy nhất để hiểu điều gì đang xảy ra với hiệu suất. Đúng, pinba thường chỉ được triển khai khi các vấn đề đã được quan sát thấy và không rõ “đào ở đâu”.
Thường thì không ai biết tập lệnh này hoặc tập lệnh đó được gọi bao nhiêu lần mỗi giây/phút và họ bắt đầu tối ưu hóa “bằng cách chạm”, bắt đầu từ những nơi có vẻ hợp lý hơn.
Một số phân tích nhật ký nginx, trong khi một số khác phân tích các truy vấn cơ sở dữ liệu chậm.
Tất nhiên, pinba sẽ không thừa, nhưng có một số lý do khiến không phải dự án nào cũng có nó.
Và lý do đầu tiên là cài đặt.
Để ít nhiều có được một số loại “sự cạn kiệt” từ việc triển khai Pinba, bạn nên xem các số liệu không chỉ trong những phút cuối cùng mà còn trong một khoảng thời gian dài (từ vài ngày đến vài tháng).
Đối với điều này bạn cần:
cài đặt tiện ích mở rộng cho php (và bạn có thể muốn có mô-đun cho nginx)
biên dịch phần mở rộng cho mysql
cài đặt pinboard và cấu hình cron
Do lượng thông tin về Pinba quá ít nên nhiều người có ấn tượng rằng nó chỉ hoạt động trên PHP5 và từ lâu đã trở thành chuyện quá khứ, nhưng như chúng ta sẽ thấy sau, thực tế không phải vậy.
Bước đầu tiên là đơn giản nhất, tất cả những gì bạn cần làm là chạy lệnh:
apt install php-pinba
Tiện ích mở rộng này có sẵn trong kho lưu trữ lên tới và bao gồm cả php 7.3 và bạn không cần phải biên dịch bất cứ thứ gì.
Sau khi thực hiện lệnh cài đặt, chúng tôi ngay lập tức nhận được một tiện ích mở rộng đang hoạt động thu thập và gửi số liệu cho từng tập lệnh (thời gian chạy, bộ nhớ, v.v.) ở định dạng sinh vật nguyên sinh qua udp tới 127.0.0.1:30002.
Cho đến nay chưa có ai bắt hoặc xử lý các gói UDP này, nhưng điều này không ảnh hưởng tiêu cực đến tốc độ hoặc tính ổn định của các tập lệnh PHP của bạn.
Cho đến gần đây, ứng dụng duy nhất có thể bắt và xử lý các gói UDP này là pinba_engine. Sự miêu tả "đơn giản và ngắn gọn" quá trình cài đặt không khuyến khích mong muốn đọc và nghiên cứu kỹ lại nó. Danh sách phụ thuộc dài hàng km chứa cả tên gói cũng như tên chương trình và liên kết đến các trang riêng lẻ có cài đặt của chúng và những trang này có liên kết riêng đến các phụ thuộc khác. Không ai có thời gian hoặc mong muốn giải quyết chuyện tào lao này.
Có lẽ một ngày nào đó sẽ có thể cài đặt pinba10 bằng một hoặc hai lệnh và không cần phải đọc nhiều tài liệu để hiểu cách thực hiện, nhưng hiện tại thì không phải vậy.
Nếu bạn cài đặt pinba_engine thì đây mới chỉ là một nửa trận chiến. Rốt cuộc, không có bảng ghim bạn sẽ phải giới hạn bản thân ở dữ liệu chỉ trong vài phút qua hoặc bạn sẽ phải tự mình tổng hợp, lưu trữ và trực quan hóa dữ liệu. Thật tốt khi pinboard sử dụng khá đơn giản cài đặt.
Có vẻ như, tại sao lại phải đau khổ như vậy nếu tất cả các số liệu từ php đã được gửi đến cổng udp ở định dạng protobuf và tất cả những gì bạn cần là viết một ứng dụng sẽ bắt chúng và đưa chúng vào một loại bộ lưu trữ nào đó? Rõ ràng, những nhà phát triển nảy ra ý tưởng này đã ngay lập tức ngồi viết ra ý tưởng của riêng họ, một số trong số đó đã xuất hiện trên GitHub.
Sau đây là tổng quan về bốn dự án nguồn mở lưu số liệu trong bộ lưu trữ, từ đó dữ liệu này có thể được truy xuất và hiển thị dễ dàng, chẳng hạn như bằng cách sử dụng grafana.
máy chủ udp đang hoạt động để lưu số liệu vào OpenTSDB. Có lẽ nếu bạn đã sử dụng OpenTSDB trong dự án của mình thì giải pháp này sẽ phù hợp với bạn, nếu không thì tôi khuyên bạn nên bỏ qua nó.
máy chủ udp đang hoạt động, từ cùng một người làm việc vặt, lần này lưu trữ các số liệu trong InfluxDB. Nhiều dự án đã sử dụng InfluxDB để giám sát, vì vậy giải pháp này có thể hoàn hảo cho họ.
Ưu điểm:
FluxDB cho phép tổng hợp các số liệu nhận được và xóa bản gốc sau một thời gian nhất định.
Nhược điểm:
Giải pháp này không lưu thông tin về bộ tính giờ.
InfluxDB sẽ lưu trữ địa chỉ trang của trang dưới dạng thẻ và nếu bạn có nhiều địa chỉ trang duy nhất, điều này sẽ dẫn đến tăng tiêu dùng bộ nhớ truy cập tạm thời. Từ một thời điểm nào đó anh ấy "sẽ bắt đầu ăn mòn ký ức như điên“. (nguồn)
máy chủ udp đang hoạt động, giúp lưu số liệu trong ClickHouse. Đây là giải pháp của bạn tôi. Sau khi làm quen với nó, tôi quyết định đã đến lúc phải đối đầu với Pinbu và Clickhouse.
Ưu điểm:
Clickhouse lý tưởng cho những tác vụ như vậy; nó cho phép bạn nén dữ liệu đến mức bạn có thể lưu trữ tất cả dữ liệu thô ngay cả khi không tổng hợp
nếu được yêu cầu, bạn có thể dễ dàng tổng hợp các số liệu kết quả
máy chủ udp bằng php, lưu số liệu trong ClickHouse. Đây là giải pháp của tôi, là kết quả của việc tìm hiểu pinba, ClickHouse và protobuf. Trong khi sắp xếp toàn bộ đống này, tôi đã viết một “bằng chứng về khái niệm”, điều này thật bất ngờ đối với tôi, không tiêu tốn nhiều tài nguyên (30 MB RAM và ít hơn 1% của một trong tám lõi xử lý), vì vậy tôi quyết định chia sẻ nó với công chúng.
Ưu điểm giống như giải pháp trước, tôi cũng sử dụng các tên thông thường từ pinba_engine ban đầu. Tôi cũng đã thêm một cấu hình cho phép bạn khởi chạy một số phiên bản máy chủ pinbase cùng một lúc để lưu số liệu trong các bảng khác nhau - điều này rất hữu ích nếu bạn muốn thu thập dữ liệu không chỉ từ php mà còn từ nginx.
Nhược điểm - “lỗi chết người” và những điều nhỏ nhặt đó sẽ không phù hợp với cá nhân bạn, nhưng giải pháp của tôi “đơn giản như một chiếc dép” và chỉ bao gồm khoảng 100 dòng mã, vì vậy bất kỳ nhà phát triển PHP nào cũng có thể thay đổi những gì mình không thích trong vài phút.
Nguyên tắc hoạt động
Cổng UDP 30002 được lắng nghe. Tất cả các gói đến được giải mã theo sơ đồ protobuf và được tổng hợp. Mỗi phút một lần, một gói được chèn vào clickhouse vào bảng pinba.requests. (tất cả các thông số được cấu hình trong cấu hình)
Một chút về clickhouse
Clickhouse hỗ trợ các công cụ lưu trữ dữ liệu khác nhau. Cái được sử dụng phổ biến nhất là MergeTree.
Nếu tại một thời điểm nào đó, bạn quyết định lưu trữ dữ liệu tổng hợp mọi lúc và chỉ dữ liệu thô cho dữ liệu cuối cùng thì bạn có thể tạo chế độ xem cụ thể hóa bằng cách nhóm và định kỳ dọn dẹp bảng pinba.requests chính, trong khi tất cả dữ liệu sẽ vẫn ở trong cái nhìn cụ thể hóa. Hơn nữa, khi tạo bảng pinba.requests, bạn có thể chỉ định “engine = Null”, khi đó dữ liệu thô sẽ hoàn toàn không được lưu vào đĩa, đồng thời nó vẫn hiển thị ở chế độ xem cụ thể hóa và được lưu tổng hợp . Tôi sử dụng lược đồ này cho các số liệu nginx, vì trên nginx tôi có số yêu cầu nhiều hơn 50 lần so với trên php.
Vì vậy, bạn đã đi được một chặng đường dài và tôi không muốn bỏ bạn giữa chừng, vì vậy phần sau đây là mô tả chi tiết về cách cài đặt và cấu hình giải pháp của tôi cũng như mọi thứ bạn cần, cũng như những cạm bẫy đã gây ra nhiều con tàu sụp đổ. Toàn bộ quá trình cài đặt được mô tả cho Ubuntu 18.04 LTS và Centos 7; quá trình này có thể hơi khác trên các bản phân phối và phiên bản khác.
Cài đặt
Tôi đặt tất cả các lệnh cần thiết vào Dockerfile để tạo điều kiện cho việc tái tạo các hướng dẫn. Chỉ có những cạm bẫy sẽ được mô tả dưới đây.
php-pinba
Sau khi cài đặt, hãy đảm bảo rằng trong tệp /etc/php/7.2/fpm/conf.d/20-pinba.ini bạn đã bỏ ghi chú tất cả các tùy chọn. Trên một số bản phân phối (ví dụ centos), chúng có thể bị nhận xét.
Trong quá trình cài đặt, clickhouse sẽ yêu cầu bạn đặt mật khẩu cho người dùng mặc định. Theo mặc định, người dùng này có thể truy cập được từ tất cả các IP, vì vậy nếu bạn không có tường lửa trên máy chủ của mình, hãy nhớ đặt mật khẩu cho nó. Điều này cũng có thể được thực hiện sau khi cài đặt trong tệp /etc/clickhouse-server/users.xml.
Điều đáng lưu ý là clickhouse sử dụng một số cổng, bao gồm 9000. Cổng này cũng được sử dụng cho php-fpm trong một số bản phân phối (ví dụ: centos). Nếu bạn đã sử dụng cổng này, bạn có thể thay đổi nó thành cổng khác trong tệp /etc/clickhouse-server/config.xml.
grafana với plugin clickhouse
Sau khi cài đặt Grafana, hãy sử dụng quản trị viên đăng nhập và mật khẩu quản trị viên. Khi bạn đăng nhập lần đầu tiên, Grafana sẽ yêu cầu bạn đặt mật khẩu mới.
Tiếp theo, đi tới menu “+” -> nhập và cho biết số trang tổng quan để nhập 10011. Tôi đã chuẩn bị và tải lên trang tổng quan này để bạn không phải tự làm lại.
Grafana hỗ trợ làm việc với clickhouse thông qua plugin của bên thứ ba, nhưng Grafana không có cảnh báo về plugin của bên thứ ba (đã có vé cho việc này trong vài năm).
máy chủ pinba
Việc cài đặt protobuf và libevent là tùy chọn nhưng sẽ cải thiện hiệu suất máy chủ pinba. Nếu bạn cài đặt pinba-server trong một thư mục không phải /opt thì bạn cũng cần phải sửa kịch bản hệ thống tập tin.
mô-đun pinba cho nginx
Để biên dịch một mô-đun, bạn cần có mã nguồn của cùng một phiên bản nginx đã được cài đặt trên máy chủ của bạn, cũng như các tùy chọn biên dịch giống nhau, nếu không quá trình xây dựng sẽ thành công, nhưng khi kết nối mô-đun, sẽ xuất hiện lỗi đó "mô-đun này không tương thích nhị phân." Các tùy chọn biên dịch có thể được xem bằng lệnh nginx -V
Mẹo vặt
Tất cả các trang web của tôi chỉ hoạt động trên https. Trường lược đồ trở nên vô nghĩa nên tôi sử dụng nó để tách web/console.
Trong các tập lệnh có thể truy cập được từ web, tôi sử dụng:
if (ini_get('pinba.enabled')) {
pinba_schema_set('web');
}
Và trong các tập lệnh console (ví dụ: tập lệnh cron):
if (ini_get('pinba.enabled')) {
pinba_schema_set('console');
}
Trong bảng điều khiển của tôi ở Grafana có một nút chuyển web/bảng điều khiển để xem số liệu thống kê riêng biệt.
Bạn cũng có thể gửi thẻ của mình tới Pinba, ví dụ:
pinba_tag_set('country', $countryCode);
Đó là tất cả.
Hãy trả lời các bình chọn bên dưới bài viết.
Như thường lệ, tôi cảnh báo bạn rằng tôi không tư vấn hay giúp đỡ thông qua tin nhắn cá nhân trên Habr và mạng xã hội.