扩展Logstash(使用redis / elasticsearch)


16

在超过12个centos 5.8服务器的群集上,我使用本机logstash托运人部署了logstash,后者将发/var/log/*/*.log回中央Logstash服务器。

我们尝试使用rsyslogd作为托运人,但是由于rsyslogd的ImFile模块中存在错误,如果远程端不响应,则日志会堆积在内存中。

当前,我们使用Redis作为传输机制,因此logstash01已在本地运行redis,这些日志绑定到VLAN的IP。

因此,logstash-shipper在logstash01上发送到redis。logstash01发送给在单独进程中运行的Elasticsearch。

这就是我们所看到的。Elasticsearch有141个被阻止的线程。跟踪elasticsearch父级显示:

futex(0x7f4ccd1939d0, FUTEX_WAIT, 26374, NULL

这是来自Elasticsearch的Jstack

这是logstash的jstack

因此,..昨晚,某些Web服务器(日志被logstash拖尾)发疯了,平均负载超过500。

在logstash01上,有这个

Dec 19 00:44:45 logstash01 kernel: [736965.925863] Killed process 23429 (redis-server) total-vm:5493112kB, anon-rss:4248840kB, file-rss:108kB

所以OOM杀手杀死了Redis的服务器,然后指原木堆放在内存里面是已上市的东西..而服务器上莫名其妙意味着阿帕奇获取其短裤的扭曲。(坦率地说,我不确定如何,我只是假设它在拖尾日志)。

这是我关于事件如何发生的理论:

  1. 我们的流量高峰。
  2. 生成了大量日志。
  3. 这些存储在Redis中,因为logstash / elasticsearch似乎每秒只能处理300-400个新事件。
  4. Redis已完全填满,OOM杀手无意识地宰了它。
  5. Redis停止接受新项目。
  6. 现在,项目开始在远程主机端堆积。
  7. 一切都疯了。Apache停止接受请求。(为什么?)。

问题是:

  1. 如果只有日志拖尾,为什么apache会发疯。是因为拖尾的东西阻碍了Apache的写作?

  2. 有没有使弹性搜索更快/更好/具有弹性的明智方法?

  3. 是否有一种明智的方法可以使Redis具有弹性并且不会因为OOM而死亡

  4. 我设置的方式是否存在根本缺陷,还是每个人都有此问题?

-编辑-

@lusis的一些规格。

admin@log01:/etc/init$ free -m
             total       used       free     shared    buffers     cached
Mem:          7986       6041       1944          0        743       1157
-/+ buffers/cache:       4140       3845
Swap:         3813       3628        185

Filesystem             Size  Used Avail Use% Mounted on
/dev/sda2               19G  5.3G   13G  31% /
udev                   3.9G  4.0K  3.9G   1% /dev
tmpfs                  1.6G  240K  1.6G   1% /run
none                   5.0M     0  5.0M   0% /run/lock
none                   3.9G     0  3.9G   0% /run/shm
/dev/sda1               90M   72M   14M  85% /boot
/dev/mapper/data-disk  471G  1.2G  469G   1% /data

/dev/sda2 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext2 (rw)
/dev/mapper/data-disk on /data type ext3 (rw)
/data/elasticsearch on /var/lib/elasticsearch type none (rw,bind)

log01:/etc/init$ top 
top - 14:12:20 up 18 days, 21:59,  2 users,  load average: 0.20, 0.35, 0.40
Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
Cpu0  :  3.0%us,  1.0%sy,  0.0%ni, 95.7%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu1  : 12.0%us,  1.0%sy,  0.0%ni, 86.6%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu2  :  4.7%us,  0.3%sy,  0.0%ni, 94.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  5.6%us,  1.3%sy,  0.0%ni, 93.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  5.3%us,  1.3%sy,  0.0%ni, 93.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  6.4%us,  1.0%sy,  0.0%ni, 92.3%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   8178120k total,  6159036k used,  2019084k free,   761780k buffers

1
我在使用ES和这些超酷设置时遇到了问题。我现在正在用python编写自己的简单syslog接收器。解决的唯一方法是提前开始并继续添加ES节点,从而增加logstash的大小……噩梦。我相信apache确实会阻止日志文件的写入,因此如果无法将其写入日志文件,则可能会出现问题。
Abhishek Dujari

回复:rsyslog问题,Bitbucket也由于rsyslog问题而中断。他们写了关于它以及如何解决它的博客
James O'Gorman

Answers:


22

您的帖子对规范的描述不多(LS索引器上的内存,日志量或其他内容),但我将尽我所能尽力回答您的问题。免责声明:我是logstash开发人员之一-

  1. Apache疯了可能是logstash进程起作用的副作用。我暂时将其放在一边。

  2. 使ES f / b / s合理的方法是添加更多ES节点。真的很容易。它们甚至根据网络拓扑自动发现彼此。在这个行业工作了17年之后,我再也没有见过像ElasticSearch这样的水平扩展。

  3. 要f / b / s Redis,请不要使用任何Redis集群。较新版本的Logstash可以在内部进行Redis负载平衡。Redis输出在插件配置中支持Redis主机列表,并且支持也将添加到输入端以进行匹配。在过渡期间,您可以在索引器/消费者端使用多个Redis输入定义。

  4. 除了说听起来像是您要尝试使用单个主机(可能功率不足的主机)做很多事情之外,我无法回答这个问题。

任何良好的扩展过程都始于将并置的组件分解为不同的系统。我没有看到您的配置,但logstash的“瓶颈”在过滤器中的地方却没有。根据您要执行的转换次数,可能会影响Logstash进程的内存使用量。

Logstash的工作原理与乐高玩具一样。您可以使用2x4砖块,也可以使用两个2x2砖块来完成同一任务。除了原木外,使用较小的砖块比使用单个大砖块实际上更坚固。

我们通常提供的一些一般建议是:

对于apache,您可以尝试以下方法:http : //cookbook.logstash.net/recipes/apache-json-logs/

  • 将事物分解为多个组成部分在我关于logstash的每一次讨论中,我都将其描述为类固醇的Unix管道。您可以根据需要使管道尽可能长或短。您可以通过水平移动职责来扩展logstash。这可能意味着要延长流水线,但就延迟开销而言,我们没有在统计学上谈论任何相关内容。如果您对网络有更大的控制权(例如,不在EC2上),则可以通过标准的流量隔离来做一些令人惊奇的事情。

另请注意,logstash邮件列表非常活跃,因此您应该始终从此处开始。清理并整理您的配置,因为这是最好的起点。

有些公司(例如Sonian)将ElasticSearch扩展到PB级,还有一些公司(例如Mailchimp和Dreamhost)将Logstash扩展到疯狂的水平。可以办到。


我已经贴了一些系统信息到第q
汤姆·奥康纳

我会说8G的动力不足,这取决于日志的数量和保留它们的时间。我将从将Redis和Logstash移至另一台服务器开始。您是否正在使用Logstash或作为单独服务运行ES?
lusis 2013年

1
这是一项独特的服务。在圣诞节之前,我采取了大胆的举措,并关闭了redis对磁盘行为的持久性,整个过程变得更加稳定。
Tom O'Connor 2013年

apache-json-logs链接已损坏。有替代品吗?
凯特·埃博纳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.