千萬級可觀測數據採集器 --iLogtail 代碼完整開源

2022 年 6 月 29 日,阿里雲 iLogtail 開源後迎來首次重大更新,正式發佈完整功能的 iLogtail 社區版。本次更新開源全部 C++ 核心代碼,該版本在內核能力上首次對齊企業版,開發者可以構建出與企業版性能相當的 iLogtail 雲原生可觀測性數據採集器。本次發佈新增日誌文件採集、容器文件採集、無鎖化事件處理、多租戶隔離、基於 Pipeline 的新版配置方式等諸多重要特性,全面增強社區版的易用性和性能,歡迎廣大開發者關注、共建。

可觀測性數據採集挑戰

可觀測性是通過檢查其輸出來衡量系統內部狀態的能⼒。該術語起源於⼏⼗年前的控制理論,最早是匈牙利裔工程師魯道夫 · 卡爾曼提出。在分佈式 IT 系統中,可觀測性典型使⽤種類型的遙測數據⸺⽇志、指標和跟蹤來度量基礎設施、平臺和應用程序,以瞭解他們的運行狀態和過程。這些數據的收集通常由一個與被觀測對象共同運行的採集 Agent 完成。基於雲原生和微服務的現代系統架構下,這些觀測對象比以往分佈更加分散,數量更多且變化更快,使得采集 Agent 面臨如下挑戰:

  1. 高性能,低開銷:現代應用程序通常在數據中心、公共雲和邊緣處彙集了數以千計的服務器、虛擬機、容器中運行,採集 Agent 的每一點性能開銷都會被數以千計地放大。目前衆多開源 Agent 的設計更多的是偏重功能而非性能,單核處理性能普遍在 2-10M/s 左右,而我們希望能達到單核 100M/s 的性能。在採集目標增加、數據量增加、採集延遲、服務端異常等情況下,開源 Agent 內存都會呈現爆炸式增長,而我們希望即使在各種環境下,內存也能處在較低的水位。

  2. 採集穩定準確,故障多級隔離:可觀測性需要比被觀測的系統至少可靠一個數量級。數據採集 Agent 的穩定性,除了保證數據本身採集的準確性外,還需要保證不能影響業務應用,否則將帶來災難性的後果。另一方面,無論怎樣出現問題,都需要儘可能的隔離問題,例如一個 Agent 上有多個採集配置,一個配置出問題,不能影響其他配置。

  3. 大規模配置企業級管控:可觀測數據的應用範圍廣泛,一個企業內部往往存在大量配置,需要 Agent 支持中心化、自動化配置管理能力,代替手工登錄機器修改配置的方式,並且能夠保證配置 Reload 期間數據不丟不重。當 Agent 有多個採集配置時,合理安排資源,既要優先把內存帶寬等資源供給高優先級配置,又要確保低優先級的配置不被 “餓死”,其需要在波峯過後有足夠的 Burst 能力快速追齊數據。

  4. 更原生友好的 K8s 支持:K8s 提供了強悍的運維部署、彈性伸縮、故障恢復能力,極大地便利了分佈式系統的開發和管理,然而日誌採集的問題也隨之而來。K8s 多樣的數據輸出使得同一個 Agent 需要同時支持採集宿主機日誌、容器內日誌、容器 stdout 等多種數據源。K8s 的對業務部署的彈性伸縮能力,要求 Agent 具備容器動態發現、打標的能力,同時也對如何保證數據採集完整性提出了更高的要求。

由於尚無完美解決以上挑戰的開源 Agent,我們選擇自研 iLogtail。iLogtail 的核心定位就是可觀測數據的採集器,幫助開發者構建統一的業務數據採集層,助力可觀測平臺打造各種上層的應用場景。

iLogtail 簡介

iLogtail 是阿里雲日誌服務(SLS)團隊自研的可觀測數據採集 Agent,擁有的輕量級、高性能、自動化配置等諸多生產級別特性,可以署於物理機、虛擬機、Kubernetes 等多種環境中來採集遙測數據。iLogtail 在阿里雲上服務了數萬家客戶主機和容器的可觀測性採集工作,在阿里巴巴集團的核心產品線,如淘寶、天貓、支付寶、菜鳥、高德地圖等也是默認的日誌、監控、Trace 等多種可觀測數據的採集工具。目前 iLogtail 已有千萬級的安裝量,每天採集數十 PB 的可觀測數據,廣泛應用於線上監控、問題分析 / 定位、運營分析、安全分析等多種場景,在實戰中驗證了其強大的性能和穩定性。

iLogtail 發展歷程

iLogtail 的前身源自阿里雲的神農項目,自從 2013 年正式孵化以來,iLogtail 始終在不斷演進。

誕生初期,面對阿里雲自身和早期客戶運維和可觀測性需求,iLogtail 主要解決的是從單機、小規模集羣到大規模的運維監控挑戰,此時的 iLogtail 已經具備了基本的文件發現和輪轉處理能力,可以實現日誌、監控實時採集,抓取毫秒級延遲,單核處理能力約爲 10M/s 。通過 Web 前端可支持中心化配置文件自動下發,支持 3W + 部署規模,上千採集配置項,實現日 10TB 數據的高效採集。

2015 年,阿里巴巴開始推進集團和螞蟻金服業務上雲,面對近千個團隊、數百萬終端、以及雙 11、雙 12 等超大流量數據採集的挑戰,iLogtail 在功能、性能、穩定性和多租戶支持方面都需要進行巨大的改進。至 2017 年前後,iLogtail 已經具備了正則、分隔符、JSON 等多個格式日誌的解析能力,支持多種日誌編碼方式,支持數據過濾、脫敏等高級處理能力,單核處理能力極簡模式下提升到 100M/s,正則、分隔符、JSON 等方式 20M/s+。採集可靠性方面,增加文件發現 Polling 方式兜底、輪轉隊列順序保證、日誌清理丟失保護、CheckPoint 增強;進程可靠性方面,增加異常自動恢復、Crash 自動上報、守護進程等。通過全流程多租戶隔離、多級高低水位隊列、配置級 / 進程級流量控制、臨時降級等機制,支持百萬 + 部署規模,千級別租戶,10 萬 + 採集配置項,實現日 PB 級數據的穩定採集

隨着阿里推進核心業務全面上雲,以及 iLogtail 所屬日誌服務(SLS)正式在阿里雲上商業化,iLogtail 開始全面擁抱雲原生。面對多元的雲上環境、迅速發展的開源生態和大量湧入的行業客戶需求,iLogtail 的發展的重心轉移到解決如何適應雲原生、如何兼容開源協議和如何去處理碎片化需求等問題上。2018 年 iLogtail 正式支持 docker 容器採*集,2019 年支持 containerd 容器採集,2020 年全面升級 Metric 採集,2021 年增加 Trace 支持。通過全面支持容器化、K8S Operator 管控和可擴展插件系統,iLogtail 支持千萬部署規模,數萬內外部客戶,百萬 + 採集配置項,實現日數十 PB 數據的穩定採集。

2021 年 11 月 iLogtail 邁出了開源的第一步,將 Golang 插件代碼開源。自開源以來,吸引了數百名開發者的關注,並且也有不少開發者貢獻了 processor 跟 flusher 插件。今天,C++ 核心代碼也正式開源了,自此開發者可以基於該版本構建完整的雲原生可觀測數據採集方案。

iLogtail 優勢

對於可觀測數據的採集,有很多開源的採集器,例如 Logstash、Fluentd、Filebeats 等。這些採集器的功能非常豐富,但在性能、穩定性、管控能力等關鍵特性方面 iLogtail 因其獨特設計而具備優勢。

C++ 內核重要特性

本次 iLogtail C++ 內核開源全面對齊企業版功能特性,並新增基於 Pipeline 的極簡採集配置項提升社區版易用性。

日誌文件採集

C++ 核心源代碼包含了功能完整的文件發現機制,可以支持通配符和多層次目錄的動態日誌文件監控,並支持日誌輪轉、日誌數、輪轉大小設置。iLogtail 在 Linux 下使用 inotify 作爲文件監控的主要手段,提供了毫秒級延時的數據發現能力,同時爲了兼顧不同操作系統以及支持各類特殊採集場景,iLogtail 同時使用了輪詢作爲的數據的發現方式。通過使用輪詢與事件並存的混合方式,iLogtail 打造了一套兼具性能優勢同時不失魯棒性的文件發現機制。

容器文件採集

iLogtail C++ 內核與插件系統配合可支持全場景的容器數據採集。iLogtail 通過插件發現節點的容器列表並維護容器和日誌採集路徑映射,結合 C++ 內核高效的文件採集能力提供了極致的容器數據採集體驗。iLogtail 支持使用容器標籤、環境變量、K8s 標籤、Pod 名稱、命名空間等多種方式進行容器篩選,爲用戶提供了便利的採集源配置能力。支持 DaemonSet、Sidecar、CRD 等多種部署方式,爲應對不同使用場景提供了靈活的部署能力。而 iLogtail 採用全局容器列表和通過 Kubernetes CRI 協議獲取容器信息的設計,使其在權限和組件依賴上相比其他開源更加輕量級,並且擁有更高的採集效率。

無鎖化事件處理

iLogtail 實現如此高吞吐的祕訣之一是使用了無鎖化事件處理模型。與業界其他開源 Agent 爲每個配置分配獨立線程 / Goroutine 讀取數據不同,iLogtail 數據的讀取只配置了一個線程。由於數據讀取的瓶頸並不在於計算而是磁盤,單線程足以完成所有配置的事件處理以及數據讀取。使用單線程使得 iLogtail 的事件處理和數據讀取都可以在無鎖環境下運行,數據結構更加輕量化,從而取得了相對多線程處理更優的性價比。

多租戶隔離

在生產環境中,一臺服務存在數百個採集配置屬於常態,每個配置的優先級、日誌產生速度、處理方式、上傳目的地址等都有可能不同,因此必須有效解決如何隔離各種自定義配置,保證採集配置 QoS 不因部分配置異常而受到影響的問題。iLogtail 採用基於時間片的採集調度、多級高低水位反饋隊列、事件非阻塞處理、流控 / 停採策略以及配置動態更新等多項關鍵技術,融合實現了兼具隔離性、公平性、可靠性、可控性、性價比五大特性的多租戶隔離方案。經歷了多年雙 11 流量高峯期的考驗,這套方案已經被證明相比其他開源具備較大的穩定性和性價比優勢。

基於 Pipeline 的新版配置方式

簡潔直觀的配置文件對於 Agent 的使用至關重要,iLogtail 早期幾乎全部依賴圖形化配置方式,默認的 JSON 配置文件臃腫冗餘、難以理解。本次升級使用 YAML 格式,除了天然繼承其可讀性強、字符串轉義少、支持多行文本、可添加註釋的優點外,還根據 iLogtail 最近的數據流水線架構,將配置文件重新劃分爲 inputs、processors、aggregators、flushers 四個部分,注重功能配置淡化實現細節,並統一規範了配置項的命名規範,以進一步降低 iLogtail 的配置門檻。

一個最簡配置示例:

enable: true
inputs:
  - Type: file_log
    LogPath: /log
    FilePattern: simple.log
flushers:
  - Type: flusher_stdout

後續展望

2021 年 11 月,我們開源了 iLogtail 功能最豐富、可擴展性最強的 Golang 插件部分,收到了大量開發者的關注和建議。累計收藏 600 + 次,收到建議 60 + 條,PR 120 + 次。C++ 核心模塊是 iLogtail 在性能和資源佔用上相比其他開源採集軟件具備一定優勢的主要因素,希望這次 C++ 核心部分的開源能爲更多的企業帶來資源效率的進一步提升,同時豐富 iLogtail 的產品生態,吸引更多優秀開發者參與社區建設。

在當今雲原生的時代,我們堅信開源纔是 iLogtail 最優的發展策略,也是釋放其最大價值的方法。iLogtail 作爲可觀測領域最基礎的軟件,在各行各業仍然有許多不同場景有待發現。我們希望能夠和開源社區一起共建,持續優化,爭取成爲世界一流的可觀測數據採集器。

相關資料

GitHub: https://github.com/alibaba/ilogtail

社區版用戶手冊:https://ilogtail.gitbook.io/ilogtail-docs

企業版官網:https://help.aliyun.com/document_detail/65018.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Cam_OjPWhcEj77kqC0Q1SA