Redis + Logstash 缓存数据导入 Elasticsearch 实战
注意: data_type 类型是 channel时,Redis 数据 必须是 订阅消息 【channel类型 不要指定 db】;数据导入 成功 ,登入kibana 创建指定索引模式 【索引:crawl-%{+YYYY.MM.dd}】,再discover 中查看相关数据
应用场景:将 redis 队列存放的数据导入 elasticsearch,进行全文搜索
一、编写 redis-es.conf ,文件可以存放在: /etc/logstash/conf.d/redis-es.conf
input {
redis {
data_type => "list" # 使用 redis 的list数据类型
host => ["127.0.0.1"]
db => "0"
port => "6379"
key => "crawl" # redis的key
codec => "json" # 数据类型为json,在list中存放的值需要为json
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "crawl-%{+YYYY.MM.dd}" # 指定存放的索引名称
}
stdout { # 导入过程中以json形式显式的输出导入的内容
codec => json_lines
}
}
# 配置完成后,logstash 会自动监听 redis 中数据库为 0 的 并且为 list 类型的 key 为 crawl 的值,如果新增数据,将会弹出数据并经 logstash 导入 es
二、启动 logstash
logstash -f /etc/logstash/conf.d/redis-es.conf
若没有报错,则可以到 redis 中插入数据
redis-cli
127.0.0.1:6379> LPUSH crawl '{"name":"baobao", "age":12}'
(integer) 1
127.0.0.1:6379> LPUSH crawl '{"name":"maomao", "age":13}' # 注意这种json格式才是对的,否则logstash会报错:JSON parse error, original data now in message field
(integer) 1
# 可见push一条,logstash会实时pop一条,然后推送到 elasticsearch
三、查看 Elasticsearch 是否存在相关数据:
curl -H "Content-Type:application/json" -d "{\"from\":0, \"size\":100}" -X POST http://localhost:9200/crawl-2020.03.20/_search?pretty
在末尾能看到 redis 对应的 json 数据写入到 ES 中
...
{
"_index" : "crawl-2020.03.20",
"_type" : "_doc",
"_id" : "h1L79nABFQPU3aGbYsJI",
"_score" : 1.0,
"_source" : {
"@version" : "1",
"name" : "baobao",
"age" : 12,
"@timestamp" : "2020-03-20T08:07:14.655Z"
}
}
]
}
}
注意: data_type 类型是 channel时,Redis 数据 必须是 订阅消息
Pub/Sub(消息发布订阅)
发布订阅类似于消息管道,用来进行系统之间消息解耦,我们可以设定对某个key值(channel频道)进行消息发布及消息订阅,当一个channel上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这就类似于rabbitmq、activemq、rocketmq、kafka等。
6.1 subscribe
订阅指定频道的信息
127.0.0.1:6379> subscribe channel_task
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel_task"
3) (integer) 1
6.2 unsubscribe
取消订阅指定的频道。若不指定则取消订阅所有的频道。
127.0.0.1:6379> unsubscribe channel_task
1) "unsubscribe"
2) "channel_task"
3) (integer) 0
6.3 publish
将信息message发送到指定的频道channel。返回收到消息的客户端数量。
127.0.0.1:6379> publish channel_task add_user_score
(integer) 1 (此时有一个订阅该频道的客户端收到信息)