之前關於logstash數據源的文章,可以看這裏
Logstash——配置介紹,數據輸入配置(input)
Logstash——Logstash從MySQL中收集數據並輸出添加
之前介紹過如何使用文件系統通過Logstash將數據推送至elasticsearch來實現日誌的線上分析。而這次介紹的是使用redis作爲數據源進行數據操作的方法
Logstash-Redis數據源配置
最開始先看下Redis作爲數據來源時支持的所有配置
input {
jdbc {
### 使用EVAL從Redis返回的事件數,此屬性僅在list模式下起作用。
batch_count =>
### 以“舊名稱”⇒“新名稱”的形式配置重命名的redis命令。
command_map =>
### 指定列表或頻道。["list", "channel", "pattern_channel"]
data_type =>
### Redis數據庫號。
db =>
### Redis服務器的主機名。
host =>
### Redis服務器的unix套接字路徑。
path =>
### Redis列表或通道的名稱。
key =>
### 用於驗證的密碼。默認情況下沒有身份驗證。要連接的端口。
password =>
### 要連接的端口。
port =>
### 啓用SSL支持。
ssl =>
### 運行線程
threads =>
### 超時時間
timeout =>
}
}
完成Logstash從MySQL中收集數據
安裝Logstash
這裏可以看之前的文章安裝Logstash並完成一個簡單的日誌收集功能
Logstash配置
redis作爲數據來源的數據監聽模式
Redis的輸入插件,提供了一個data_type
,不同的參數設置會採用不同的redis命令操作。目前可配置的值爲:
參數值 | redis模式 |
---|---|
list | BLPOP |
channel | SUBSCRIBE |
pattern_channel | PSUBSCRIBE |
- list
其中list,相當於隊列;
- channel 和 pattern_channel
channel相當於發佈訂閱的某個特定的頻道;pattern_channel相當於發佈訂閱某組頻道。
list模式
list模式其實就是隊列模式,我們向redis某個key中插入數據,然後logstash持續的從此key中取出數據
JAVA代碼向redis插入數據
public void pushJob(String value) {
BoundListOperations ops = redisTemplate.boundListOps("key");
ops.leftPush(value);
}
如果使用list模式作爲redis的數據模式的話可以使用下面配置
input {
redis {
key => "logstash-list"
host => "localhost"
password => "root"
port => 6379
db => "0"
data_type => "list"
type => "one"
}
}
output {
elasticsearch {
hosts => "http://localhost:9200"
index => "redis_test_list_one"
user => exception_user # 此爲es的賬號,應用配置時刪除註釋
password => exception # 此爲es的密碼,應用配置時刪除註釋
}
stdout {}
}
當應用list模式的時候,此時監聽的隊列同一時間只可能有一個logstash管道獲得數據,關於這個效果我們可以啓動兩個logstash來進行試驗,當然還有一個更簡單的方法。
下面配置中定義了兩個redis的數據源都指向了一個redis的同一個key。通過type來標記不同的數據通道
input {
redis {
key => "logstash-list"
host => "localhost"
password => "root"
port => 6379
db => "0"
data_type => "list"
type => "one"
}
redis {
key => "logstash-list"
host => "localhost"
password => "root"
port => 6379
db => "0"
data_type => "list"
type => "two"
}
}
output {
stdout { codec => rubydebug }
}
在啓動了上面配置後,當向key插入一條數據後,控制檯可以看到下面效果:
新增的數據,可能出現在one數據通道也可能two數據通道但是只會在其中一個通道出現。並且數據最終被哪個數據通道所獲得也是隨機的。
channel模式
channel相當於發佈訂閱的某個特定的頻道。這裏需要使用redis的channel的方式保存數據。關於JAVA代碼向Redis通道保存數據我之前有介紹過 Redis實現簡單的發佈訂閱以及配置序列化方式
如果使用channel模式作爲redis的數據模式的話可以使用下面配置
input {
redis {
key => "logstash-channel"
host => "localhost"
password => "root"
port => 6379
db => "0"
data_type => "channel"
type => "one"
}
}
output {
elasticsearch {
hosts => "http://localhost:9200"
index => "redis_test_list_one"
user => exception_user # 此爲es的賬號,應用配置時刪除註釋
password => exception # 此爲es的密碼,應用配置時刪除註釋
}
stdout {}
}
和上面一樣我們想測試channel在多個實例監聽其channel的時候可以使用類似配置
input {
redis {
key => "logstash-channel"
host => "localhost"
password => "root"
port => 6379
db => "0"
data_type => "channel"
type => "one"
}
redis {
key => "logstash-channel"
host => "localhost"
password => "root"
port => 6379
db => "0"
data_type => "channel"
type => "two"
}
}
output {
stdout { codec => rubydebug }
}
此時向redis添加數據,數據會出現在logstash的兩個通道中
關於redis的文字編碼
需要注意,當使用java向redis中插入數據時候,可能因爲數據或者key編碼問題。導致key中出現\xac\xed\x00\x05t這樣的亂碼,或者數據爲無法識別的內容時可以參考我之前介紹redis數據序列化的內容。將數據進行處理。
Redis實現簡單的發佈訂閱以及配置序列化方式
關於redis作爲數據源個人看法
和之前介紹的MySql相比,redis提供的隊列以及發佈訂閱的功能可以應用的場景更加豐富。一個輕量級的消息隊列,在對數據安全要求不是非常高的情況下可以滿足絕大多數的需求了。對一些日誌的轉發、一些較大數據的分析都可以通過redis來作爲數據源經過logstash引入的ES進行分析或者其他地方進行處理。
個人水平有限,上面的內容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關內容。假如我的這篇內容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。