我已经实现了logstash(在测试中),如下面提到的架构。
组件分解
但我对redis有点困惑。使用这个场景我将在Logstash服务器和一个redis上运行3个java进程,这将需要hugh ram。
问题 我可以只使用一个logstash和弹性搜索吗?或者最好的方法是什么?
答案 0 :(得分:8)
我实际上是在我公司设置logstash,redis,elasticsearch,kibana(又名ELK架构)。
我在虚拟机之间分配了进程。虽然您可以将它们放在同一台机器上,但如果机器死机会发生什么?然后,您将同时保留索引器和群集。
您还遇到无法在Elasticsearch上正确复制分片的问题。由于您只有一台服务器,因此不会复制分片,并且您的群集运行状况将始终为黄色。您需要添加足够的服务器以避免split-brain scenario。
为什么要保留Redis?
由于Redis可以与多个logstash索引器进行通信,因此一个关键点是,这使得索引对于您的发货人而言是透明的,因为如果一个索引器发生故障,交替发生器将获得负载。这使您的设置具有高可用性。
这不仅仅是发送日志并将其编入索引和搜索的问题。虽然您的设置可能会在非常小的情况下工作,但人们使用ELK设置的东西是数百台服务器,甚至数千台,因此ELK架构可以扩展。所有这些服务器也需要通过名为Puppet的东西进行远程管理。
最后,如果您尚未阅读,我建议您阅读James Turnbull的 The Logstash Book 。
以下是迄今为止帮助我的一些推荐书籍:
答案 1 :(得分:8)
如果将所有实例放在计算机中,则只能使用一个logstash和elasticsearch。 Logstash使用文件输入插件直接读取syslog文件。
否则,您必须使用两个logstash和redis。这是因为logstash没有任何缓冲机制,因此需要redis作为其代理来缓冲日志事件。 Redis不使用更多的ram。当logstash从中读取日志事件时,内存将释放。如果redis使用大型ram,则必须添加logstash workers以便更快地处理日志。
答案 2 :(得分:2)
您应该只运行logstash
的一个实例。设计logstash
能够拥有多个输入通道和输出通道。
input {
# input instances
syslog {
# add other settings accordingly
type => "syslog"
}
redis {
# add other settings accordingly
type => "redis"
}
}
filter {
# add other settings accordingly
}
output {
# output instances
if [type] == "syslog" {
redis {
# add other settings accordingly
}
}
else if [type] == "redis" {
elasticsearch {
# add other settings accordingly
}
}
}