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ó.

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

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.

Quá trình cài đặt pinba2 đã không đặc biệt dễ dàng hơn.

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.

olegfedoseev/pinba-server (Tháng 2017 năm XNUMX)

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ó.

olegfedoseev/pinba-influxdb (tháng 2018 năm XNUMX)

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)

ClickHouse-Ninja/Proton (Tháng 2019 năm XNUMX)

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ẫu làm sẵn cho grafana
  • lưu thông tin về bộ đếm thời gian

Nhược điểm:

  • lỗ hổng chết người
  • không có cấu hình nào trong đó bạn có thể định cấu hình tên cơ sở dữ liệu và bảng, địa chỉ và cổng của máy chủ.
  • khi lưu trữ dữ liệu thô, bảng từ điển phụ được sử dụng để lưu trữ địa chỉ trang và tên miền, điều này làm phức tạp các truy vấn tiếp theo
  • những điều nhỏ nhặt khác tiếp theo từ điểm trừ đầu tiên

máy chủ pinba/máy chủ pinba (Tháng 2019 năm XNUMX)

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.

extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002

nhà nhấp chuộ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.

Tạo một vé trên Github.

Ngoài ra hãy ủng hộ bằng lượt thích nhé phiên bản tiếng Anh của bài viết này trên reddit.

Chỉ những người dùng đã đăng ký mới có thể tham gia khảo sát. Đăng nhập, xin vui lòng.

Bạn đang sử dụng hệ điều hành nào trên máy chủ?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • THỤY SĨ

  • Unix

  • Windows

  • khác

114 người dùng bình chọn. 11 người dùng bỏ phiếu trắng.

Bạn đang sử dụng phiên bản php nào trên máy chủ?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • khác

105 người dùng bình chọn. 17 người dùng bỏ phiếu trắng.

Bạn đã bao giờ sử dụng pinba chưa?

  • vâng

  • Không, nhưng tôi muốn

  • không và tôi sẽ không muốn

  • không và chưa từng nghe nói về cô ấy

100 người dùng bình chọn. 14 người dùng bỏ phiếu trắng.

Bạn muốn dùng thử phiên bản nào của máy chủ Pinba?

  • pinba_engine (công cụ mysql)

  • pinba2 (động cơ mysql)

  • bảng ghim (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + Influxdb)

  • pinba-server/pinba-server (go + clickhouse)

  • máy chủ pinba/máy chủ pinba (php + clickhouse)

  • Tôi sẽ tự viết của tôi

  • khác

39 người dùng bình chọn. 47 người dùng bỏ phiếu trắng.

Nguồn: www.habr.com

Thêm một lời nhận xét