在之前的文章 “Logstash translate 过滤器简介”,我详细地介绍了如何使用 translate 过滤器来丰富我们的数据。在文章 “运用 Elasticsearch 过滤器来丰富数据”,我也介绍了如何使用 Elasticsearch 过滤器来对数据进行丰富。 尽管 Elasticsearch和 translate过滤器适合较小的工作量,但我们可以通过提供一个可扩展的扩充层来改善此状况,该扩充层不会在单个 Logstash 节点上保持状态。
例如,使用 memcached filter 插件,我们可以对想要匹配的内容进行非常快速的无阻塞查找。例如恶意软件请求,威胁数据(已知的错误IP),甚至静态资源(用于主机查找的服务器IP)。对内存缓存的查找是简单的键/值查找。 memcache 的另一个好处是它不会在更新时阻止。由于我们的读取工作量非常大,因此我们不想在更新扩展密钥时阻止查找。由于内存缓存是易失性的,在重新启动后不会持久存在,因此在刷新数据时应考虑到这一点,并确保将此信息存储在持久性存储中,以便可以根据需要重新填充内存缓存。
利用内存缓存和内存缓存池,我们可以根据需要扩展和推送尽可能多的流量。通过适当的配置,单个内存缓存实例可以保守地每秒处理10万次查询。对于每个内存缓存的文档,他们的建议值是200k +,但通过适当的调整,我们看到的数字甚至更高。在池配置中,这将线性扩展。
新的 memcached filter plugin 支持以下内容:
- 通过一致性哈希的Memcache池
- 命名空间
- Multi- Get/ Multi-Set
下面,我们将运用一个具体的例子来展示如何进行使用。
安装
我们首先来安装 memcached。我在 Ubuntu 20.04 的机器上进行。Memcached 软件包包含在Ubuntu默认仓库中,安装过程非常简单……只需运行以下命令即可将其连同支持工具一起安装……
sudo apt update
sudo apt install memcached libmemcached-tools
运行上述命令后,应已安装 Memcached 服务器并可以使用…要检查其状态,请运行以下命令:
sudo systemctl status memcached
如果没有错误的话,你将看到如下类似的输出:
$ sudo systemctl status memcached
[sudo] password for liuxg:
● memcached.service - memcached daemon
Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor pre>
Active: active (running) since Tue 2020-06-23 09:17:06 CST; 17min ago
Docs: man:memcached(1)
Main PID: 905 (memcached)
Tasks: 10 (limit: 18985)
Memory: 2.5M
CGroup: /system.slice/memcached.service
└─905 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 ->
6月 23 09:17:06 liuxgu systemd[1]: Started memcached daemon.
这就是在 Ubuntu 上安装 Memcached 的方法...服务器应该正在运行并且应该响应请求...以下命令可用于停止,启动和启用Memcached:
sudo systemctl stop memcached.service
sudo systemctl start memcached.service
sudo systemctl enable memcached.service
配置 Memcached
现在已经安装了服务器,可以在/etc/memcached.conf中找到其配置文件。
文件中的默认设置对于大多数环境和应用程序来说已经足够了……但是,对于更高级的设置,请打开文件并进行更改以应用到您的环境中……
例如,Memcached侦听服务器的本地IP地址(127.0.0.1)…如果只希望它侦听其他IP,请编辑文件中的行,使其看起来类似于以下内容:
sudo vi /etc/memcached.conf
然后将本地服务器 IP 替换为您要使用的IP地址。你还可以更改其默认端口号…
# Default connection port is 11211
-p 11211
# Run the daemon as root. The start-memcached will default to running as root if no
# -u command is present in this config file
-u memcache
# Specify which IP address to listen on. The default is to listen on all IP addresses
# This parameter is one of the only security measures that memcached has, so make sure
# it's listening on a firewalled interface.
-l 127.0.0.1
保存文件并退出…然后重新启动 Memcached 服务以应用更改…
使用 Memcached
对 Memcached 还不是很熟的开发者来说,可以参阅链接 https://www.tutorialspoint.com/memcached/memcached_set_data.htm。
Memcached set 命令用于将新值设置为新键或现有键。语法为:
set key flags exptime bytes [noreply]
value
语法中的关键字如下所述-
- key - 它是密钥的名称,通过它存储和从Memcached检索数据。
- flags - 它是服务器与用户提供的数据一起存储的32位无符号整数,在检索到该项目时将与数据一起返回。
- exptime - 它是到期时间,以秒为单位。 0表示没有延迟。 如果exptime超过30天,则Memcached会将其用作UNIX时间戳记过期。
- bytes - 这是数据块中需要存储的字节数。 这是需要存储在 Memcached中 的数据的长度。
- noreply(可选)-它是一个参数,它通知服务器不要发送任何答复。
- value - 它是需要存储的数据。 使用上述选项执行命令后,需要在新行中传递数据。
在以下示例中,我们使用 1.1.1.1 作为键,并在其中设置值为 botip,有效时间为900秒。
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set 1.1.1.1 0 900 5
botip
STORED
get 1.1.1.1
VALUE 1.1.1.1 0 5
botip
END
运行 Logstash
下面是一个完整的示例,包含 logstash 配置文件,输入和输出:
logstash_memcache.conf
input {
stdin {
codec => json
}
}
filter {
memcached {
hosts => ["localhost:11211"]
get => {
"%{ip}" => "threat_src"
}
}
}
output {
stdout {
codec => rubydebug
}
}
在上面我们使用 memcached filter 来丰富我们的数据。当数据和 memcahed 里的数据匹配后,把丰富的数据赋予给 threat_src 字段。运行起我们的 Logstash:
./bin/logstash -f logstash_memcache.conf
我们在 Logstash 的 console 中输入如下的 json:
{ "ip" : "1.1.1.1" }
我们可以看到如下的输出:
在上面,我们可以看出来 thread_srce 的值被赋予 botip。botip 的值是从 Memcached 里来的。
当我们输入如下的 json:
{ "ip" : "2.2.2.2" }
Logstash 的输出为:
由于没有匹配的 ip 为 2.2.2.2 在 Memcached 里,所以没有丰富的数据。
我们接下来按照上面的方法把 2.2.2.2 家进来。
在上面,我们加入了 2.2.2.2 对应的值为 liuxg 5个字母。那么我们再次输入:
{ "ip" : "2.2.2.2" }
这一次,我们看到丰富后的数据。
参考:
【1】https://websiteforstudents.com/install-memcached-with-apache-on-ubuntu-20-04-18-04/
【2】https://www.tutorialspoint.com/memcached/memcached_set_data.htm