redis
這篇主要介紹使用redis作爲output的目標
可配置參數
字段 | 參數類型 | 說明 |
---|---|---|
batch | boolean | 當爲true的時候Redis批處理值併發送1個RPUSH命令而不是每個值發送一個命令以推送到列表,要求data_type=“list” |
batch_events | number | 當batch爲true的時候,此參數限制排隊的RPUSH事件數 |
batch_timeout | number | 當batch爲true的時候,此參數限制超時時間 |
congestion_interval | number | 阻塞檢查的時間間隔 |
congestion_threshold | number | 當data_type是list的時候,並且擁有超過congestion_threshold項,則被阻塞,直到有人消費其。假如沒有消費者,Redis將會耗盡內存 |
data_type | string | 可選參數[“list”, “channel”],其實就是Redis隊列類型 |
db | number | Redis數據庫號 |
host | array | 主機名,如果主機列表是一個數組,Logstash將隨機選擇一個主機進行連接,如果該主機斷開連接,則將選擇另一個主機。 |
key | string | Redis列表或通道的名稱 |
password | password | 用於驗證的密碼 |
port | number | 端口號 |
reconnect_interval | number | 重連的時間間隔 |
shuffle_hosts | boolean | |
timeout | number | 超時時間 |
隊列類型選擇
data_type來確定redis隊列類型。可選參數爲list和channel。兩者的具體區別可以查看在使用redis做數據源文章裏面的介紹(Logstash從Redis中收集數據並輸出)[https://blog.csdn.net/qq330983778/article/details/105757604]
開啓批處理
目前僅當data_type爲list時可以使用批處理。和批處理相關的參數batch、batch_events、batch_timeout。
batch
是否開啓批處理,默認關閉
batch_events
單次命令推送多少條數據,默認爲50
batch_timeout
單次命令等待多久,默認爲5s
默認情況下,每次執行一次rpush命令會發送一條數據。開啓批處理後,每條命令發送的數據量取決於batch_events,發送時間取決於batch_timeout。具體看兩個條件哪一個先滿足。
logstash的保護機制
目前僅當data_type爲list時可以使用
congestion_threshold
logstash提供了一個參數congestion_threshold
,主要是限制了redis中數據項中最多可以存在多少元素,當list中的元素大於此參數設置的值後,則會阻塞直到有其他消費者消費list中的數據。此操作主要是防止在沒有消費者的時候,list數據過大導致Redis耗盡內存。此參數默認爲0,表示禁用阻塞檢測
congestion_interval
此參數用來設置阻塞檢測的頻率。默認爲1s。當設置爲0的時候,表示每執行一次rpush則進行一次檢測。
數據推送至redis的配置
下面是使用channel或者list的配置
使用channel
input {
redis {
key => "logstash-redis"
host => "localhost"
password => "dailearn"
port => 6379
db => "0"
data_type => "list"
type => "redis"
codec => plain{
charset=>"UTF-8"
}
}
}
filter {
json {
source => "message"
}
}
output{
redis {
host => "localhost" #這個是標明redis服務的地址
port => 6379
codec => plain
db => 0 #redis中的數據庫,select的對象
key => "logstash-message"#redis中的鍵值
data_type => channel #一般就是list和channel
password => "dailearn"
}
}
使用list做批處理
input {
redis {
key => "logstash-redis"
host => "localhost"
password => "dailearn"
port => 6379
db => "0"
data_type => "list"
type => "redis"
codec => plain{
charset=>"UTF-8"
}
}
}
filter {
json {
source => "message"
}
}
output{
redis {
batch => true
batch_events => 50
batch_timeout => 5
host => "localhost" #這個是標明redis服務的地址
port => 6379
codec => plain
db => 0 #redis中的數據庫,select的對象
key => "logstash-message"#redis中的鍵值
data_type => list #一般就是list和channel
password => "dailearn"
}
}
阻塞檢查的使用
下面是使用list做批處理做阻塞檢查的配置
input {
redis {
key => "logstash-redis"
host => "localhost"
password => "dailearn"
port => 6379
db => "0"
data_type => "list"
type => "redis"
codec => plain{
charset=>"UTF-8"
}
}
}
filter {
json {
source => "message"
}
}
output{
redis {
batch => true
batch_events => 50
batch_timeout => 5
host => "localhost" #這個是標明redis服務的地址
port => 6379
codec => plain
congestion_threshold => 5
congestion_interval => 1
db => 0 #redis中的數據庫,select的對象
key => "logstash-message"#redis中的鍵值
data_type => list #一般就是list和channel
password => "dailearn"
}
stdout {codec => rubydebug {}}
}
測試阻塞檢查
上面的配置中阻塞數被設置爲5(congestion_threshold => 5),那麼現在向logstash中依次發送數據
set one test message。time:1590462390513
set one test message。time:1590462391833
set one test message。time:1590462393645
set one test message。time:1590462394727
set one test message。time:1590462396589
...
雖然配置中設置的5個數據就被阻塞,實際上redis被插入了六條數據。
當被插入5條數據的時候,控制檯輸出正常,但是當redis中數據達到六條的時候控制檯會頻繁的刷新異常信息,並且此時將無法再次插入數據。當然需要注意,多餘的數據只是被阻塞並沒被丟棄,在嘗試消費掉redis的數據後,阻塞的數據還是會被插入到redis中
關於檢查頻率的設置
當把congestion_interval的值設置比較大的時候,可能會使得實際插入的數據多餘限制的值。比如上面例子依次發送數據修改爲一次性發送,就會使得redis中實際的數據遠遠大於需要的數據
批處理和檢查頻率的衝突
上面例子中因爲在一個檢查週期內多條數據被插入,而此時根據文檔我們可以設置congestion_interval => 0
來實現每個事件都進行一次檢查,但是實際上再次模擬上面場景依舊會發現redis中被插入了遠超設置的數據。這是因爲之前的配置中batch => true
,在批處理配置下,一個事件包含了多條數據,所以雖然這個時候每個事件進行一次檢測,但是依舊會插入超過限制的數據量。
個人水平有限,上面的內容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關內容。假如我的這篇內容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。