Scribe介紹

Scribe介紹

目錄

  • 是什麼
  • 功能
  • 案例
  • 用法
  • 侷限
  • 其餘

是什麼

  1. 可擴展的分佈式日誌框架
    • 框架(framework)而非系統。
    • Scribe = Scribe服務器 + Scribe API
  2. 可擴展
    • 節點能夠執行邏輯操做(記錄日誌)或者轉發請求。相似Nginx
  3. 分佈式
  4. 無狀態

功能

獨立於應用系統和分析系統的日誌收集服務器編程

  • Scribe從各類數據源上收集數據,放到共享隊列上,而後push到後端的中央存儲系統上。當中央存儲系統出現故障時,scribe能夠暫時把日誌寫到本地文件中,待中央存儲系統恢復性能後,scribe把本地日誌續傳到中央存儲系統上。

良好的水平擴展性能後端

  • 支持多種編程語言,使用Thrift
  • 高性能、低消耗,使用Libevent
  • 多種存儲格式
  • 支持HFDS
  • 能夠與應用集成
  • 靈活的日誌緩存大小
  • 多線程/消息隊列

轉發寫日誌請求緩存

  • 日誌分類
  • 日誌過濾,category

案例

Facebook日誌收集

  • 上百種日誌分類
  • 10000+ Scribe節點
  • 每秒1000000條日誌
  • 天天10000000000條日誌

Twitter的Rainbird系統

  • 統計網站中每一個頁面的點擊次數
  • 統計內部監控數據,Scribe用於收集這些數據
  • 存儲到HDFS中
  • 數據源:JavaScript, RoR,
  • Scala, ...
  • 數據量:7 TB/day

測試

  • 每條日誌1K
  • 3臺機器同時發送,每臺機器循環發送40萬條
  • 耗時最多的機器用了298秒
  • 1.31M/s
  • 0.000745s/K

用法

Python

category='test'
message='hello world'
log_entry = scribe.LogEntry(category, message)
socket = TSocket.TSocket(host='localhost', port=1456)
transport = TTransport.TFramedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(trans=transport, strictRead=False, strictWrite=False)
client = scribe.Client(iprot=protocol, oprot=protocol)
transport.open()
result = client.Log(messages=[log_entry])
transport.close()

PHP

$msg1['category'] = 'hello';
$msg1['message'] = 'world';
$entry1 = new LogEntry($msg1);
$messages = array($entry1);
$socket = new TSocket('183.61.6.104', 1463, true);
$transport = new TFramedTransport($socket);
$protocol = new TBinaryProtocol($transport, false, false);
$scribe_client = new scribeClient($protocol, $protocol);
$transport->open();
$exit_code = $scribe_client->Log($messages);
$transport->close();

侷限

  • 偏向於收集應用層日誌
  • 沒法收集歷史數據
  • 日誌切分是可能發生日誌丟失
  • 單點問題

其餘

設計服務服務器

  • 邏輯處理+請求轉發 Nginx Scribe
  • 無狀態 == 水平擴展性
  • Create a service iff required
  • Create a common framework and toolset that will allow for easier creation of services
  • Use the right language, library and tool for the task

修訂記錄

  1. 2017年06月21日 由PPT修改而來。
相關文章
相關標籤/搜索