Logstash——Logstash將數據推送至Redis

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,在批處理配置下,一個事件包含了多條數據,所以雖然這個時候每個事件進行一次檢測,但是依舊會插入超過限制的數據量。


個人水平有限,上面的內容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關內容。假如我的這篇內容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章