摘要:如果管理着几百台机器,一天老板问:今天哪台机器宕机了?影响了多少个用户订单请求?是谁的代码?可能你需要使用splunk了。
1 SPLUNK简介
1.1 什么是splunk
Splunk is software that indexes IT data from any application, server or network device that makes up your IT infrastructure. It’s a powerful and versatile search and analysis engine that lets you investigate, troubleshoot, monitor, alert, and report on everything that’s happening in your entire IT infrastructure from one location in real time.
简言之,Splunk索引log,根据log,检索查询某段时间内的系统状态。
1.2 谁需要使用Splunk
Splunk is versatile and thus has many uses and many different types of users. System administrators, network engineers, security analysts, developers, service desk, and support staff — even Managers, VPs, and CIOs — use Splunk to do their jobs better and faster.
-
管理者用splunk生成报表或dashboard监控和总结系统的健康程度、性能、行为、容量。
-
系统管理员用splunk监控严重的系统错误,系统负载,性能指标。
-
网络工程师用splunk分析网络问题。
-
应用工程师用splunk分析业务数据:Splunk官网的tutorial就是利用apache log进行商店的业务统计的例子。分析哪些商品被浏览的最多,哪些商品被下订单最多,哪天服务器挂了并影响了多少次浏览或订单,昨日的TOP N最受欢迎的商品,昨日的订单总量和销售额。根据APACHE的log,不需要开发另外一个系统,就可以使用splunk基于log来对海量的数据进行统计,分析出业务数据(当然,splunk不会对数据进行合并,比如365天的数据合并为1年,因此如果要做一个在线的报表系统如:百度统计,splunk并不是一个好选择,除非用户愿意获取一个汇总的数值时等待1分钟甚至更长的时间)。
1.3 Splunk的功能
生成报表:a) 日志具有时间的特点,splunk会对时间维度建索引。因此猜想:splunk的扩容方案很可能是通过时间维度来划分的。历史数据也不需要重新再索引;只需要把这段时间新增的数据追加到老数据的倒排链尾端即可,倒排链的基本顺序不用调整。B) 支持用户自定义数据的扩展SCHEMA,用户可以提供ID映射到name的文件,在统计时生成的报表就把ID转换为name,这样生成的报表比较适合你的老板看。
记录(行)为检索和报表统计单位:Splunk是全文索引,对于apache、system等常见服务的log进行了模式定制,能够根据日志的格式,提取出一些字段,这些字段可用于条件查询。Splunk用于展现和报表统计的基本单位是:一条记录(行)。(比如统计今日apache服务器收到多少POST请求)。
索引和检索都具有流式特点: a) Splunk的索引具有流式的特点:不停的索引,经索引的内容,立刻就能检索出来。 b) Splunk的检索具有流式的特点:不停加载检索结果,直至全部检索完毕,可以控制是否停止检索,按照时间维度逆时检索。因此猜想:其倒排结构仅仅根据时间有关。
丰富的查询表达式:a) 搜索引擎常见的高级查询:AND/OR/NOT的各种组合。b) 类似于SQL的select in:SUB-SEARCH。C) 支持pipe与内建统计命令(chart, timechart, stat, eval, count),pipe把查询结果输出给统计命令,统计命令输出的结果为一个报表,报表的字段、x/y轴的名字自定义。
查询结果或报表的管理:可以存储查询结果或报表;可以定制一个dashboard,上面有很多个panel,每个panel是一个报表;多用户间设置报表的ACCESS。
丰富的索引数据源:支持本地、异地的数据。异地数据需要在异地的机器上安装splunk的客户端。可以配置的数据源为多个host上的数据。
Splunk的索引字段主要有5个:
-
Host:日志来自那台主机
-
Source type: 日志的类别
-
Source: 日志的文件名
-
Time: 日志的日期
-
Content: log的每一行
Splunk对以上5个字段建索引,但是却可以根据日志的格式,提取出一些字段用于查询时的条件过滤。比如,对于apache服务器的log,有GET/POST,那么可以查询GET的记录有多少个。
补充点内容:
Fields从event中被抽取发生在两个阶段:indexing和search。indexing阶段的Fields被称之为Default Fields.
Default Fields有以下:internal fields(_raw,_indextime,_cd,都是系统的相关信息),default fields(host, index, linecount, punct, source, sourcetype, splunk_server, timestamp),default datetime fields(date_hour, date_mday, date_minute, date_month, date_second, date_wday, date_year, date_zone)
_raw代表原始数据,比如可以用来做正则表达式规则匹配。_cd代表event在index中的位置。由2个数字构成,32位整数代表index bucket桶号,64位整数代表桶内便宜。尽内部使用。
linecount代表一个event发生的行数。比如检索:40 linecount=40 host=corp1 NOT 400
代表搜索host等于corp1,然后包含40且不包含400的event的次数等于40的event。
也就是说,索引的时候可能会对linecount进行聚合;检索的时候,对每个event进行过滤。
每一次搜索行为,是一个job。搜索结果会被保存10分钟,如果想在这10分钟之后再看这个结果或跟别人分享,那么需要save这个job。
考虑二次检索行为(select in),我理解splunk会首先完成第一次检索,然后在第一次检索的结果中,再进行第二次检索。经过判断,如果第一次检索的逻辑中没有聚合性质的操作,那么可以一边做第一次检索,一边在第一次检索的当前结果中进行第二次检索,并流式得动态展示内容。