Splunk

来自 ArchWiki

Splunk 是一款专有的数据挖掘产品。来自维基百科

Splunk 是一款软件,通过 Web 风格的界面,大规模搜索、监控和分析应用程序、系统和 IT 基础设施生成的机器数据。Splunk 捕获、索引和关联实时数据到一个可搜索的存储库,从中它可以生成图表、报告、警报、仪表板和可视化效果。
Splunk 旨在使整个组织可以访问机器数据,并识别数据模式,提供指标,诊断问题,并为业务运营提供情报。Splunk 是一种横向技术,用于应用程序管理、安全和合规性,以及商业和 Web 分析。

Splunk 的许可基于每日索引的数据量 MB。免费许可证允许每天最多 500 MB 的数据,但缺少一些功能,例如访问控制、警报/监控和 PDF 生成。

Splunk 为数据提供了一个相当高级的搜索界面。原始数据由正则表达式集(其中许多是内置的)解析以提取字段;这些字段允许使用一种具有相当独特语义的查询语言,但对于熟悉 SQL 或其他结构化数据查询语言的用户来说是可识别的。

Splunk 的在线文档对公众开放且相当全面。其中大部分采用类似 Unix 的 man 页面格式,特别是对于搜索和配置文件参考。本文将重点介绍 Splunk 鲜为人知的功能或缺陷,以及如何在 Arch Linux 中健康地运行它。

安装

现在有一个 splunkAUR 软件包用于安装,它将创建 splunk 用户和组,安装 Splunk,并安装 systemd 单元文件。

还有一个 splunkforwarderAUR 软件包,它将安装 Splunk 通用转发器。

手动安装

登录 splunk.com 获取 Splunk 或 Splunk 通用转发器的下载链接,并使用 wget 下载它

$ wget -O splunk.tgz <url goes here>

解压 tarball

$ tar -xvf splunk.tgz

对于简单的部署,通常将解压后的目录移动到 /opt/

Splunk 的安装目录通常称为 $SPLUNKHOME。您可以在 .bashrc 中设置它并将其添加到您的路径

export SPLUNK_HOME=/opt/splunk
export PATH=$PATH:$SPLUNK_HOME/bin

它有一个相当健壮的 CLI 界面,所有配置都存储在 .ini 风格的配置文件中。

启动

Splunk 有两个主要组件:splunkd 守护进程和 splunkweb 服务,一个 cherrypy Web 应用程序。

如果使用 AUR 软件包,您可以通过启动 systemd splunk 服务来运行两者。

或者使用 Splunk 二进制文件运行

# splunk start

性能

Splunk 社区的传统观点是 Splunk 的性能很大程度上受 IO 限制,但这可能是一个基于 Splunk 传统用例的假设。某些强大的操作具有单线程实现,它们的大部分时间都占用单个核心,而几乎不访问磁盘。

如果您监控这些,很容易看到 Splunk 在做什么

$ iostat -d -x 5
$ top

您遇到由 Splunk 的实现细节(而不是您自己的硬件)引起的瓶颈的一个迹象是,您主要看到一个核心 100% 占用,磁盘使用率几乎为零,而 splunkd 在额外核心上偶尔出现活动峰值,因为它访问磁盘以获取更多事件。

如果您在让 Splunk 利用您的硬件方面遇到问题,请考虑以下因素

搜索语义

Splunk 的大部分搜索功能都由 MapReduce 实现提供支持。它在分布式环境中功能强大且非常有用,但高级搜索语言抽象可能会掩盖许多错误,这些错误本质上会在管道的早期强制执行 reduce 操作,从而消除 Splunk 并行化其操作的能力,无论是在分布式环境还是在单个实例上。

一个简单的经验法则是,任何(在朴素实现中)需要查看每个“事件”才能完成其工作的操作都不会被并行化。这尤其适用于 transaction 命令,它是 Splunk 最有用的功能之一。

分布式环境

Splunk 旨在在分布式环境中运行;通常的假设是每个实例都在单独的机器上,但在具有四个或更多逻辑核心和快速磁盘(例如固态驱动器)的机器上,可以通过设置多个 Splunk 实例来显着提高性能。

如果您在单台机器上运行多个 Splunk 实例,则需要注意以下几个设置

  • serverName - 在 server.conf 的 [general] 节中
  • splunkd 和 splunkweb 的 mgmthostport 和 httpport 分别在 web.conf 的 [settings] 节中

您可以设置第三个实例作为“搜索头”,它将搜索分派给索引器(“搜索对等点”),或者您可以设置两个索引器都意识到另一个。

如果您使用专用搜索头,您不妨禁用索引器上的 Web 界面

 # splunk disable webserver
 # splunk restart

索引

多个索引器意味着在它们之间拆分数据。要么设置它们的 inputs.conf 以监控源数据的不同子集,要么设置一个单独的“转发器”实例,该实例使用自动负载均衡功能在它们之间进行轮询。

不要尝试通过 indexes.conf 中的静态路径或符号链接使两个索引器从同一个索引读取 - 这会将重复数据删除结果的责任推到搜索头,并消除在首先分配工作的好处。

调试与管理

Splunk 的 CLI 未被充分利用。

它对于调试您的配置文件非常有用

# splunk btool props list

或者用于添加一次性文件进行测试,而不是必须配置 inputs.conf 来监控目录

# splunk add oneshot <file> -sourcetype mysourcetype -host myhost -index myindex

在测试时注意使用特殊的测试索引 - 通常无法从索引中删除数据,一旦添加数据,除非完全擦除它。

自定义命令

根据 这里,Splunk 允许用户在搜索管道期间调用任意 Python 或 Perl 脚本。这对于克服 Splunk 框架的限制、查找外部数据源等非常有用。它也是构建宏的快捷方式,这些宏将自动将数据推送到其他位置或执行 Splunk 功能之外的任意作业。

Splunk 文档以及界面都散布着警告,即使用自定义命令会严重影响搜索性能。实际上,只要搜索命令没有做一些愚蠢的事情,自定义命令通常具有非常低的占用空间,并且在单独的进程中执行,该进程可以使用 CPU 和内存资源,而 Splunk 主要绑定到单个核心。Splunk 将使用数据块重复生成自定义命令(除非 streaming = false,在这种情况下,命令会获取整个数据集),并在等待外部脚本输出其结果并退出时执行自己的工作。

Splunk 附带一个预打包的 Python 2.7.2 二进制文件,并且不会使用系统 Python 安装执行命令。这可能会使使用通过 pipeasy_install 安装的软件包或您自己的库变得困难。

没有什么可以阻止您使用诸如 fork 和/或 execv 之类的调用来绕过此限制并加载系统 Python 安装。或者,使用它在更快的环境中处理数据,无论是使用编译后的程序还是更快的 Python 解释器(如 pypy)。

配置

commands.conf 指南在某种程度上具有误导性。特别是

streaming = [true|false]
 * Specify whether the command is streamable.
 * Defaults to false.

这里的“streaming”实际上只是告诉 Splunk 是否可以安全地使用任意大小(通常在 50K 行范围内)的离散数据块重复生成您的命令来传递;它不会告诉默认的 splunk.Intersplunk 库实际提供一个流式接口来处理数据。

库 API

内置解释器可用的 Splunk 库没有真正的文档。尝试直接检查模块

$SPLUNK_HOME/bin/splunk cmd python
#(in python interpreter)
import splunk.Intersplunk
help(splunk.Intersplunk)

splunk.Intersplunk 的源代码表明,它基本上在将数据提供给命令之前解析进程 stdin 中的整个输入集。除非命令需要拥有整个数据集才能完成其工作 - 通常只是一小部分用例 - 否则这是极其低效的。

该库很容易替换。从 Splunk 传入的数据包含几个带有 key:value 对的标头行,后跟一个换行符,然后是标头行和适当的数据。在 Python 中,读入标头行并存储或丢弃它们,然后使用 csv.Readercsv.DictReader 对象 - 一次处理一行数据,使用 csv.Writercsv.DictWriter 将结果行推回 Splunk 搜索管道。