kids:知乎日誌系統
- 分散式收集
- 集中存儲
- 實時訂閱
- 不丟(或者盡量不丟)
- 對應用性能影響盡量小
當然,在這之前,我們考察了一些項目,如scribe,但是這個貨依賴thrift,且沒有實時訂閱功能,另外對scribe的xml風格的配置文件表示難以理解:-(。redis有發布/訂閱功能,但是沒有存儲。其他諸如kafka,flume等項目基本都是基於java的,且較重,不合我們的口味。於是我們決定自己寫一個支持訂閱的scribe,同時實現scribe的分散式收集日誌,和redis的發布/訂閱功能。取名為kids,是Kids Is Data Stream的首字母縮寫。
先來看樣例配置文件。對於匯聚節點來說,配置文件通常長成這樣:
ignore_case on;nnnlimit pubsub 32MB 16MB 10min;nnlog {n level info;n file /tmp/kids.log;n}nnlisten {n port 3388;n}nnstore priority {n store null {n topic stat.*; # ignore logs of these topicsn }n store file {n path /log/[topic];n name [date]-[time].log;n rotate 1hour;n }n}n
意思是:每個kids實例都要配置一個store,store有多種類型,比如file類型可以將日誌寫入磁碟,null類型就把日誌丟棄,network則會將日誌轉發給其他kids。priority類型則是依次找第一個滿足要求的store,然後寫入。store可以嵌套。
於是,上面的配置文件意思就很明確了,將stat.*這類topic的日誌全丟棄,其他日誌寫入磁碟,每小時一個文件。對於每台機器上都要裝的搜集節點,配置文件通常長成這樣:ignore_case on;nnnlimit pubsub 32MB 16MB 10min;nnlog {n level error;n file /tmp/kids.log;n}nnlisten {n socket /var/run/kids.sock;n}nnstore multiple {n success any;n# mastern store buffer {n store network primary {n host server1;n port 3388;n }n store file secondary {n path /tmp/kidsbuf;n rotate 10min;n }n }nn# backupn store buffer {n store network primary {n host server2;n port 3388;n }n store file secondary {n path /tmp/kidsbuf2;n rotate 10min;n }n }n}n
意思是,寫入兩個遠程節點中的任意一個,任何一個成功就可以。而寫遠程節點的時候又有備用的文件store,當遠程節點掛了的時候會暫時寫入文件,等恢復再導回去。
至於發布訂閱嘛。很簡單,kids的協議完全兼容redis協議,只要用redis的客戶端,直接subscribe或者psubscribe就可以了。現在我們所有的日誌都已經記錄到這個系統中了。嗯,就是這麼簡單。推薦閱讀:
※10分鐘搭建MySQL Binlog分析+可視化方案
※mysql binlog日誌自動清理及手動刪除
※kids 開源了!
※Spring Boot中logback配置文件載入過程
※您和您所在的開發團隊都是怎麼列印日誌的?又是怎麼使用日誌的?
TAG:日志 |