標籤:

kids 開源了!

在線上穩定跑了兩年之後,我們決定將 kids 開源啦!

如前面的文章所說,kids 是一個日誌聚合系統。眾所周知,日誌是每個互聯網公司的大金礦,所以,它是知乎最重要的系統之一。知乎所有的日誌都是通過這個系統聚合併存儲的。

我們怎麼用的?

在知乎,我們所有的機器上都部署了 kids,並配置成 agent 模式,負責轉發本機應用產生的日誌到上游kids。最上游會有一個中心 server,配置持久化的 store,來負責持久化。當然,最上游的server也是最大的消息訂閱的地方。如下圖:

kids 實現細節

聚合方面,kids 實現了 Scribe 的設計,但是,XML配置文件實在不友好,於是用Ragel 和 lemon 寫了個更加清新的配置文件。

在 pub/sub 方面,我們移植了 Redis 的實現,這樣就實現了 Redis 的 pub/sub 結合Scribe 的存儲功能。

在線程模型上,我們採用了 master 線程接收連接,worker 線程做處理的模式。結構如下:

所有的客戶端連接由 master 線程接收,master 然後將連接平均分給各個處理線程。之後客戶端的所有命令都由 worker 線程處理。

所有的worker線程共享一個全局隊列,每個 worker 維護自己的一個隊列指針,master 有個定時任務負責釋放已被所有消費者消費的消息。

同時,有一個單獨的IO線程來處理存儲和轉發相關的 IO。這樣可以充分利用多核並行化。

所有的線程之間的通知是用 socketpair 來非同步通知,盡量減少同步調用,有利於吞吐量的上升。kids 里現在僅剩的同步調用就是寫磁碟。

開源之後

把代碼公開出來只是開源的第一步,這給了 kids 這個項目帶來了更加多的可能性和更大的生命力,我們會持續維護它,把它推向更簡單,更穩定和更實用。

短期,我們會加強監控方面的改進。以及加強高負載情況下的日誌轉發的可靠性。

如果你有其他想法,那就提交 issue 或者 pull request 吧:-)

想試試?代碼在這裡:zhihu/kids · GitHub

推薦閱讀:

Spring Boot中logback配置文件載入過程
您和您所在的開發團隊都是怎麼列印日誌的?又是怎麼使用日誌的?

TAG:日志 |