• 需求分析
  • 实施阶段
  • 出现问题
  • 新的解决办法
  • 后记

有一年多的下载日志准备一次性的导入到es,虽然通过redis削峰,但是出问题后发现日志信息都堆积在redis缓存里,logstash的indxer处理不过来就导致记日志挂了。

需求分析

现在es服务器里已经有了vsftpd和pureftpd的下载日志,用的不同的索引,所以相互不干扰。但是现在要统计下载量的话需要分别统计不同的索引,所以就需要把它们俩的索引设置成一样的,删除es里pureftpd的所有数据,再重新导入日志到vsftpd的索引里面。

实施阶段


切换到logstash文件目录
# cd /home/logstash/logstash-1.5.3/etc
打开logstash配置文件将type改为和vsftpd的配置文件一样,重启logstash服务


出现问题

问题分析

就是这么简单的一个事,导致了其它服务器大概5个小时没有新的日志到es,然后开始排查问题,定位到logstash indxer出错,报的错是503; 大致意思是输入的数据量太大导致它无法工作,输入的是redis,也就是说redis里面的数据量太大处理不过来导致的。

问题解决

没有其它的解决办法,只能放弃导入pureftpd的日志,把pureftpd的logstash停了。再去redis服务器将redis重新启动,这4个小时存的日志抛弃。


redis-server /etc/redis.conf


已经导入的部分pureftpd的日志是无用的,需要给删除掉


删除数据,不删索引
#curl -XDELETE 'http://192.168.201.145:9200/logstash-vsftp_log-2017*/_query' -d #'{
#	"query" : {
#    "match" : { "ftpType" : "pure-ftpd" }
#	}
#}'

如果里面有空索引还要删除对应的索引


重新启动pureftpd logstash,日志就不用从头开始刷了,只tail的方式存入新日志。

新的解决办法

日志没有导入进去我是不甘心的,但是又不能一次性给批量刷到redis缓存中,不然又会挂掉,也不能不通过缓存直接往es刷,生产环境也不敢随便尝试。所以折中的解决办法,往redis缓存的刷慢点就可以把这个解决了。解决思路是写一个shell脚本把日志文件从头开始每秒刷10-20行到新的文件中,logstash的input设置为新的文件,这样就可以达到慢点刷的效果。

  • 新建一个shell脚本
#!/bin/bash
	
	cd /home/logstash/logstash-1.5.3/pure_solve #切换目录
	
	toltalCount=`cat pureftpd.log |wc -l` #统计日志有多少行
	
	startLine=1	#从开头开始刷
	
	while (($startLine < $toltalCount))		#循环刷
	do
	        endLine=`expr $startLine + 20`	#步值为20
	        sed -n "$startLine,$endLine p" pureftpd.log >> pureftpd_new.log  #开始写
	        startLine=$endLine		#移动步子
	        echo $startLine > sincedb	#记录刷到什么地方了
	done


  • 将logstash shipper的input path设置为新的 /home/logstash/logstash-1.5.3/pure_solve/pureftpd_new.log,启动logstash
  • 执行脚本

后记


今天是年前上班的最后一天,刷了一篇博客,下班后就准备准备回家了,哦耶!