PHP腳本即時統計和監控。 ClickHouse 和 Grafana 來幫助 Pinba

在本文中,我將告訴您如何將 pinba 與 clickhouse 和 grafana 一起使用,而不是 pinba_engine 和 pinboard。

在 PHP 專案中,pinba 可能是了解效能變化的唯一可靠方法。 確實,拼巴通常只有在已經觀察到問題並且不清楚「在哪裡挖掘」的情況下才會實施。

通常沒有人知道這個或那個腳本每秒/分鐘被調用多少次,他們開始「透過觸摸」進行最佳化,從那些看起來更合乎邏輯的地方開始。

有些分析 nginx 日誌,而有些分析緩慢的資料庫查詢。

當然,拼巴不會是多餘的,但有幾個原因導致並不是每個項目都有它。

PHP腳本即時統計和監控。 ClickHouse 和 Grafana 來幫助 Pinba

第一個原因是安裝。

為了或多或少地從Pinba 的實施中獲得某種“排氣”,非常希望不僅能看到最後幾分鐘的指標,而且還能看到很長一段時間(從幾天到幾個月)的指標。

為此你需要:

  • 安裝 php 擴充功能(並且您可能需要 nginx 模組)
  • 編譯mysql擴展
  • 安裝 pinboard 並配置 cron

由於Pinba的資訊量很少,許多人的印像是它只適用於PHP5並且早已成為過去,但正如我們稍後會看到的,事實並非如此。

第一步是最簡單的,您所需要做的就是執行命令:

apt install php-pinba

此擴充功能在 php 7.3 及之前版本的儲存庫中可用,您無需編譯任何內容。

執行安裝命令後,我們立即收到一個工作擴展,它以以下格式收集和發送每個腳本的指標(運行時間、記憶體等) 原蟲 通過 udp 到 127.0.0.1:30002。

到目前為止,還沒有人捕獲或處理這些 UDP 資料包,但這不會以任何方式對 PHP 腳本的速度或穩定性產生負面影響。

直到最近,唯一能夠捕獲和處理這些 UDP 資料包的應用程式是 拼巴引擎。 描述 ”簡單明了「安裝阻礙了再次閱讀和深入研究的慾望。 長達一公里的依賴項列表包含包的名稱和程序的名稱以及其安裝的各個頁面的鏈接,並且這些依賴項有自己的其他依賴項的鏈接。 沒有人有時間或意願去處理這些垃圾。

安裝過程 拼霸2 沒有 特別容易.

也許有一天,我們可以用一兩個命令來安裝 pinba10,而不必閱讀一堆材料來了解如何做到這一點,但目前情況並非如此。

如果您確實安裝了 pinba_engine,那麼這只是成功的一半。 畢竟,沒有 插板 您必須將自己限制在最近幾分鐘的資料範圍內,或者您必須自行聚合、儲存和視覺化資料。 很好,pinboard 使用起來很簡單 安裝.

看起來,如果php 的所有指標都已經以protobuf 格式發送到udp 端口​​,而您所需要的只是編寫一個應用程式來捕獲它們並將它們放入某種存儲中,那麼為什麼還要遭受這樣的痛苦呢? 顯然,那些提出這個想法的開發人員立即坐下來寫下自己的想法,其中一些最終發佈在 GitHub 上。

以下是四個開源專案的概述,這些專案將指標保存在儲存中,可以輕鬆檢索和視覺化這些數據,例如使用 grafana。

olegfedoseev/pinba-伺服器 (2017年XNUMX月)

將指標儲存到 OpenTSDB 的 udp 伺服器。 也許如果您已經在專案中使用 OpenTSDB,那麼這個解決方案會適合您,否則我建議跳過它。

奧列格費多謝耶夫/pinba-influxdb (2018年XNUMX月)

udp 伺服器正在運行,來自同一個 哈瀏覽器,這次將指標儲存在 InfluxDB 中。 許多專案已經在使用 InfluxDB 進行監控,因此這個解決方案可能非常適合他們。

優點:

  • 數據庫 它允許 聚合收到的指標,並在指定時間後刪除原始指標。

缺點:

  • 此解決方案不保存有關計時器的資訊。
  • InfluxDB 會將網站頁面位址儲存為標籤,如果您有許多唯一的頁面位址,這將導致 消費增加 隨機存取記憶體。 從某個時刻起他“會開始瘋狂吞噬記憶«。 ()

ClickHouse-Ninja/Proton (2019年XNUMX月)

udp 伺服器運行,將指標保存在 ClickHouse 中。 這是我朋友的解決方案。 在熟悉了它之後,我決定是時候與 Pinbu 和 Clickhouse 競爭了。

優點:

  • Clickhouse 是此類任務的理想選擇;它允許您壓縮數據,以便即使沒有聚合也可以存儲所有原始數據
  • 如果需要,您可以輕鬆聚合結果指標
  • grafana 的現成模板
  • 儲存定時器信息

缺點:

  • 致命缺陷
  • 沒有配置可以配置資料庫和表格的名稱、伺服器的位址和連接埠。
  • 儲存原始資料時,使用輔助字典表來儲存頁位址和網域位址,這使得後續查詢變得複雜
  • 第一個減號之後的其他小事情

pinba 伺服器/pinba 伺服器 (2019年XNUMX月)

php 中的 udp 伺服器,將指標保存在 ClickHouse 中。 這是我的解決方案,是了解pinba、ClickHouse和protobuf的結果。 當我整理這整堆東西時,我寫了一個“概念驗證”,出乎我意料的是,它並沒有消耗大量資源(30 MB RAM 和八個處理器核心之一的不到1%),所以我決定與公眾分享。

優點與之前的解決方案相同,我也使用了原始 pinba_engine 中的常用名稱。 我還添加了一個配置,允許您一次啟動多個 pinbase 伺服器實例,以便將指標保存在不同的表中 - 如果您不僅想從 php 收集數據,還想從 nginx 收集數據,這非常有用。
缺點 - “致命缺陷”和那些不適合你個人的小事情,但我的解決方案“像拖鞋一樣簡單”,僅包含大約 100 行程式碼,因此任何 PHP 開發人員都可以更改他不喜歡的內容幾分鐘後。

的操作原理

監聽UDP埠30002,所有傳入的封包依protobuf方案解碼並聚合。 每隔一分鐘,就會將一個資料包插入 clickhouse 的 pinba.requests 表中。 (所有參數都配置在 配置)

關於 Clickhouse 的一些知識

Clickhouse支援不同的資料儲存引擎。 最常用的是MergeTree。

如果在某個時刻您決定存儲所有時間的聚合數據,而僅存儲最後一個數據,那麼您可以創建一個帶有分組的物化視圖,並定期清理主 pinba.requests 表,而所有數據將保留在物化視圖。 而且,在建立pinba.requests表時,可以指定“engine = Null”,那麼原始資料根本不會儲存到磁碟,同時仍然會出現在物化視圖中,並且被聚合保存。 我將這個方案用於 nginx 指標,因為在 nginx 上我的請求比 php 多 50 倍。

所以,你已經走了很長一段路,我不想讓你半途而廢,所以下面是我的解決方案的安裝和配置以及你需要的一切的詳細描述,以及導致不止一艘船的陷阱墜毀。 整個安裝過程針對 Ubuntu 18.04 LTS 和 Centos 7 進行描述;該過程在其他發行版和版本上可能略有不同。

安裝

我將所有必要的命令放入 Dockerfile 以促進指令的可重複性。 下面僅描述陷阱。

php拼巴

安裝後,請確保在 /etc/php/7.2/fpm/conf.d/20-pinba.ini 檔案中取消註解所有選項。 在某些發行版(例如 centos)上,它們可能會被註解掉。

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

點擊之家

在安裝過程中,clickhouse會要求您為預設使用者設定密碼。 預設情況下,可以從所有 IP 存取該用戶,因此如果您的伺服器上沒有防火牆,請務必為其設定密碼。 這也可以在安裝後在 /etc/clickhouse-server/users.xml 檔案中完成。

另外值得注意的是,clickhouse 使用多個端口,包括 9000。該端口在某些發行版(例如 centos)中也用於 php-fpm。 如果您已使用此端口,則可以在 /etc/clickhouse-server/config.xml 檔案中將其變更為另一個連接埠。

帶有 clickhouse 插件的 grafana

安裝Grafana後,使用登入名稱admin和密碼admin。 當您第一次登入時,Grafana 會要求您設定新密碼。

接下來,前往“+”->匯入選單並指定要匯入的儀表板編號 10011。 我準備並上傳了這個儀表板,這樣您就不必再次自己做。

Grafana 支援透過第三方插件與 clickhouse 合作,但 Grafana 沒有針對第三方插件的警報(多年來一直有此問題)。

拼巴伺服器

安裝 protobuf 和 libevent 是可選的,但可以提高 pinba-server 的效能。 如果您將 pinba-server 安裝在 /opt 以外的資料夾中,那麼您還需要修正 系統腳本 文件。

nginx 的 pinba 模組

編譯模組時,需要與伺服器上已安裝的nginx版本相同的源碼,以及相同的編譯選項,否則建置成功,但連接模組時會拋出錯誤“該模組不相容於二進位。” 可以使用 nginx -V 指令查看編譯選項

生活技巧

我的所有網站都只能在 https 上運作。 schema 欄位變得毫無意義,所以我用它來分隔 Web/控制台。

在可從網路存取的腳本中,我使用:

if (ini_get('pinba.enabled')) {
    pinba_schema_set('web');
}

在控制台腳本(例如 cron 腳本)中:

if (ini_get('pinba.enabled')) {
    pinba_schema_set('console');
}

在我的 Grafana 儀表板中,有一個 Web/控制台開關,用於單獨查看統計資料。

您也可以將您的標籤傳送到 Pinba,例如:

pinba_tag_set('country', $countryCode);

僅此而已。

請回答文章下方的民調。

像往常一樣,我警告您,我不會透過 Habr 和社交網路上的個人訊息提供建議或幫助。

在 Github 上建立票證。

還請大家按讚支持 英文版 本文 在 Reddit 上.

只有註冊用戶才能參與調查。 登入, 請。

您在伺服器上使用什麼作業系統?

  • Ubuntu

  • CentOS的

  • Debian

  • Gentoo的

  • 紅帽

  • Fedora

  • openSUSE的

  • 蘇斯

  • Unix的

  • Windows

  • 其他

114 位用戶投票。 11 名用戶棄權。

您在伺服器上使用什麼版本的 php?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • 其他

105 位用戶投票。 17 名用戶棄權。

你用過pinba嗎?

  • 是的

  • 不,但我願意

  • 不,我不想

  • 不,沒聽過她

100 位用戶投票。 14 名用戶棄權。

您想嘗試哪個版本的 Pinba 伺服器?

  • pinba_engine(mysql引擎)

  • pinba2(mysql引擎)

  • 記事板(php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

  • pinba-伺服器/pinba-伺服器(go + clickhouse)

  • pinba伺服器/pinba伺服器(php + clickhouse)

  • 我自己來寫

  • 其他

39 位用戶投票。 47 名用戶棄權。

來源: www.habr.com

添加評論