Redis 伺服器是 logstash 官方推薦的 broker 選擇。Broker 角色也就意味著會同時存在輸入和輸出倆個外掛程式。這裡我們先學習輸入外掛程式。
LogStash::Inputs::Redis 支援三種 data_type(實際上是redis_type),不同的資料類型會導致實際採用不同的 Redis 命令操作: list => BLPOP channel => SUBSCRIBE pattern_channel => PSUBSCRIBE
注意到了麼。這裡面沒有 GET 命令。
Redis 伺服器通常都是用作 NoSQL 資料庫,不過 logstash 只是用來做訊息佇列。所以不要擔心 logstash 裡的 Redis 會撐爆你的記憶體和磁碟。 配置樣本(以下配置不能少,否則logstash會報錯)
input { redis { data_type => "pattern_channel" key => "logstash-*" host => "192.168.0.2" port => 6379 threads => 5 }}
使用方式
基本方法
首先確認你設定的 host 伺服器上已經運行了 redis-server 服務,然後開啟終端運行 logstash 進程等待輸入資料,然後開啟另一個終端,輸入 redis-cli 命令(先安裝好 redis 軟體包),在互動式提示符後面輸入PUBLISH logstash-demochan "hello world":
# redis-cli127.0.0.1:6379> PUBLISH logstash-demochan "hello world"
你會在第一個終端裡看到 logstash 進程輸出類似下面這樣的內容:
{ "message" => "hello world", "@version" => "1", "@timestamp" => "2014-08-08T16:26:29.399Z"}
注意:這個事件裡沒有 host 欄位。(或許這算是 bug……) 輸入 JSON 資料
如果你想通過 redis 的頻道給 logstash 事件添加更多欄位,直接向頻道發布 JSON 字串就可以了。LogStash::Inputs::Redis 會直接把 JSON 轉換成事件。
繼續在第二個終端的互動式提示符下輸入如下內容:
127.0.0.1:6379> PUBLISH logstash-chan '{"message":"hello world","@version":"1","@timestamp":"2014-08-08T16:34:21.865Z","host":"raochenlindeMacBook-Air.local","key1":"value1"}'
你會看到第一個終端裡的 logstash 進程隨即也返回新的內容,如下所示:
{ "message" => "hello world", "@version" => "1", "@timestamp" => "2014-08-09T00:34:21.865+08:00", "host" => "raochenlindeMacBook-Air.local", "key1" => "value1"}
看,新的欄位出現了。現在,你可以要求開發工程師直接向你的 redis 頻道發送資訊好了,一切自動搞定。 小貼士
這裡我們建議的是使用 pattern_channel 作為輸入外掛程式的 data_type 設定值。因為實際使用中,你的 redis 頻道可能有很多不同的 keys,一般命名成 logstash-chan-%{type} 這樣的形式。這時候 pattern_channel 類型就可以協助你一次訂閱全部 logstash 相關頻道。 擴充方式
如上段"小貼士"提到的,之前兩個使用情境採用了同樣的配置,即資料類型為頻道發布訂閱者式。這種方式在需要擴充 logstash 成多節點叢集的時候,會出現一個問題:通過頻道發布的一條資訊,會被所有訂閱了該頻道的 logstash 進程同時接收到,然後輸出重複內容。
你可以嘗試再做一次上面的實驗,這次在兩個終端同時啟動 logstash -f redis-input.conf 進程,結果會是兩個終端都輸出訊息。
這種時候,就需要用 list 類型。在這種類型下,資料輸入到 redis 伺服器上暫存,logstash 則連上 redis 伺服器取走 (BLPOP 命令,所以只要 logstash 不堵塞,redis 伺服器上也不會有資料堆積佔用空間)資料。 配置樣本
input { redis { batch_count => 1 data_type => "list" key => "logstash-list" host => "192.168.0.2" port => 6379 threads => 5 }}
使用方式
這次我們同時在兩個終端運行 logstash -f redis-input-list.conf 進程。然後在第三個終端裡啟動 redis-cli 命令互動:
$ redis-cli 127.0.0.1:6379> RPUSH logstash-list "hello world"(integer) 1
這時候你可以看到,只有一個終端輸出了結果。
連續 RPUSH 幾次,可以看到兩個終端近乎各自輸出一半條目。 小貼士
RPUSH 支援 batch 方式,修改 logstash 配置中的 batch_count 值,作為樣本這裡只改到 2,實際運用中可以更大(事實上 LogStash::Outputs::Redis 對應這點的 batch_event 配置預設值就是 50)。
重啟 logstash 進程後,redis-cli 命令中改成如下發送:
127.0.0.1:6379> RPUSH logstash-list "hello world" "hello world" "hello world" "hello world" "hello world" "hello world"(integer) 3
可以看到,兩個終端也各自輸出一部分結果。而你只用了一次 RPUSH 命令。 推薦閱讀
http://redis.io 轉載自:http://udn.yyuap.com/doc/logstash-best-practice-cn/input/redis.html