首先给大家介绍一下logstash是什么样的产品。
下面引用官网的话术:
LOGSTASH
集中、转换和存储数据
Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。
Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。
简单的说,logstash 就是一个服务于elasticearch的,将有用的数据进行整理成elasticsearch规范的数据,然后存入elasticsearch库中。(个人理解,请勿喷。)
现在有一个需求,我们需要将发送到rabbimq的数据进行收集然后存入es中,或许有同学会问,为什么不直接调用es api直接操作数据,这里笔者想说一下,通过消息的形式将数据放入es,只是为了优化系统性能,通过消息的形式对es进行操作,对于服务器的并发量很高的情形,是一个很好的策略和方法。
好了废话不多说,下面开始给大家讲解一下总体思路。
(说明一下,本文章不讨论rabbitmq,还有elasticsearch 以及 logstash的配置和安装,以下操作都是建立在环境搭建完之后 ,实现rabbitmq对es的操作的配置操作。)
1.首先logstash要使用rabbitmq,我们需要在logstash里面下载一个的插件 logstash-input-rabbitmq ,我们需要是通过rabbitmq输入数据,所以使用input 插件,另一个插件就是output插件,因为是要输出数据到es, 顾名思义,我们就需要在logstash下载logstash-output-elasticsearch 的插件。
2.如果上面的插件已经安装成功,就可以修改logstash的配置文件信息了。
下面给大家贴出管道的配置文件 , 文件一个分为三个部分,分别为 input filter output。
1)新增的logstash管道的配置文件,以下红色字体只是注释实际情况需要删除。
input {
rabbitmq {
host => "rabbitmq的ip:5672"
vhost => "/"
user => "rabbitmq用户名称"
password => "rabbimq密码"
durable => true
exchange => "pro.community.exchange" (此处是说明:这个选项是配置指定rabbimq的交换器,告诉logstash 从rabbitmq的哪个交换器读数据。)
exchange_type => "direct" (交换器类型)
key => "route.logstash.es.create" (这个是routingkey)
queue => "community_topic_create" (rabbimq队列名称)
}
}
filter {
}
output {
elasticsearch {
action => "create" (对es的操作行为,具体可以看官网,这里是新增索引填create)
hosts => ["elasticsearch的ip:9200"]
user => "elastic"
password => "密码"
index => "索引名称"
document_id => "%{documentId}" (指定es文档id,便于修改和删除)
document_type => "%{documentType}"
}
}
2)删除
input {
rabbitmq {
host => "rabbitmq的ip:5672"
vhost => "/"
user => "rabbitmq用户名称"
password => "rabbimq密码"
durable => true
exchange => "pro.community.exchange" (此处是说明:这个选项是配置指定rabbimq的交换器,告诉logstash 从rabbitmq的哪个交换器读数据。)
exchange_type => "direct" (交换器类型)
key => "route.logstash.es.delete" (这个是routingkey)
queue => "community_topic_delete" (rabbimq队列名称)
}
}
filter {
}
output {
elasticsearch {
action => "delete"
hosts => ["elasticsearch的ip:9200"]
user => "elastic"
password => "密码"
index => "索引名称"
document_id => "%{documentId}"
document_type => "%{documentType}"
}
}
3, update
input {
rabbitmq {
host => "rabbitmq的ip:5672"
vhost => "/"
user => "rabbitmq用户名称"
password => "rabbimq密码"
durable => true
exchange => "pro.community.exchange"
exchange_type => "direct"
key => "route.logstash.es.update"
queue => "community_topic_update"
}
}
filter {
mutate {
update => { "topicName" => "%{topicName}" } (更新需要指定映射的字段,其中%{}里面的是json数据字段对应的值。)
update =>{"content" => "%{content}" }
update => { "title" => "%{title}" }
update =>{ "mode" => "%{mode}" }
}
}
output {
elasticsearch {
action => "update"
hosts => ["elasticsearch的ip:9200"]
user => "elastic"
password => "密码"
index => "索引名称"
document_id => "%{documentId}"
document_type => "%{documentType}"
}
}