物联网(IoT)描述了嵌入传感器,软件和其他技术的物理对象(“物”)网络,目的是通过 Internet 与其他设备和系统进行数据连接和交换。物联网是一张很大的网,它比互联网更大,更为广泛。随着物联网的发展,大量的数据可以上传到 Elasticsearch 中,并作为理想的存储空间。Elasticsearch 可以存储 PB 级的数据并实时分析数据。Elasticsearch 可以用甚至运用机器学习对数据进行异常分析,并作出异常报警。 MQTT 协议被广泛使用于物联网中。使用 MQTT 输入读取用于小型和移动设备的,使用轻量级消息传递协议传输的数据,该协议针对高延迟或不可靠的网络进行了优化。那么我们该如果把 MQTT 的数据传入到 Elasticsearch 中呢?
在 Elastic Stack 中的 filebeat 已经对这种协议进行了支持。我们可以使用 MQTT input 来作为 filebeat 的输入。此输入连接到 MQTT 代理,订阅选定的主题并将数据解析为公共消息行。 一切都发生在行过滤,多行和 JSON 解码之前,因此此输入可以与这些设置结合使用。
在今天的例子中我将展示如何使用 filebeat 把数据导入到 Elasticsearch 中。你也可以参阅我之前的文章 “Elastic: 把 MQTT 数据传入到 Elasticsearch”。在今天的展示中,我将使用两个电脑来进行展示:
如上图所示,我们将在 MacOS 的电脑上部署 Elastic Stack,而使用另外一台 Ubuntu 20.04 的机器来安装 filebeat 及 MQTT。MQTT 客户端可以向 MQTT broker 发送信息,这个信息会发送到 filebeat。最终 filebeat 把收到的信息发送到 Elasticsearch 进行存储及分析。
我们可以参阅之前的文章 “Elastic:菜鸟上手指南” 来在本地部署 Elastic Stack。在运行 Elasticsearch 之前,我们需要做如下的调整:
network.host: 0.0.0.0
discovery.type: single-node
我通过设置 network.host 为 0.0.0.0,这样使得 Elasticsearch 绑定于它所有的网络接口上。这样 localhost:9200 可以访问 Elasticsearch,而它的 private IP 地址: mac:9200 也是可以访问的。之所以这么做,是因为另外一台电脑 Ubuntu 需要对它进行访问,所有我们不能只板顶 localhost:9200。
针对 Kibana 的安装,我们不需要做任何特别的配置即可。等安装好 Elastic Stack 后,我们可以直接访问 Kibana 的界面:
在 Ubuntu 20.04 的版本中,它不能想我在穷之前的文章 “Elastic: 把 MQTT 数据传入到 Elasticsearch” 所描述的那样直接进行安装 MQTT broker,这是因为之前的那个版本是 Ubuntu 18.04。如果你打入如下的命令:
sudo apt-get update
sudo apt-get install -y python-paho-mqtt
上面的命令导致安装失败。我们需要按照如下的方法来进行安装:
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update
sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients
sudo apt clean
等安装好后,我们可以使用如下的命令来检查 mosquitto 服务是否已经被成功运行:
service mosquitto status
如果你看到上面的 active 状态,那么表明 mosquitto 服务已经被成功安装。
在 Ubuntu 20.04 的机器上,我们可以使用如下的命令来进行安装:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.1-linux-x86_64.tar.gz
tar xzvf filebeat-7.10.1-linux-x86_64.tar.gz
当然,我们也可以采用 deb 的安装方式:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.1-amd64.deb
sudo dpkg -i filebeat-7.10.1-amd64.deb
在这里,我使用了最新的 7.10.1 的发行版来进行安装。你需要依据你自己的 Elasticsearch 的发行版本做相应的调整。理论上讲需要和 Elastcsearch 一致的大的发行版本号相同。
我们进入到 filebeat 的配置文件 filebeat.yml 中进行修改。在这里,我们采用第一种安装方法。我们来修改已有的 filebeat.yml 文件:
filebeat.yml
filebeat.inputs:
- type: mqtt
hosts:
- tcp://localhost:1883
topics:
- test
tags: ["mqtt_test"]
fields:
app_id: "engine"
...
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["mac:9200"]
...
在上面,我添加了如下的部分:
- type: mqtt
hosts:
- tcp://localhost:1883
topics:
- test
tags: ["mqtt_test"]
fields:
app_id: "engine"
这里添加了对 mqtt 的支持。我们填入了 MQTT broker 的地址 tcp://localhost:1883,同时我添加了想要监听的 test topic。为了方便进行统计和搜索,我添加了 tags 以及 fields。这些依赖于你自己的应用的需求而设置。
为了能够使得数据能够到达 MacOS 的电脑,我们修改了 output.elasticsearch 部分,这是使得数据能够导入到 Elasticsearch 中。我们使用如下的命令来运行 filebeat:
./filebeat -e
到目前为止,我们已经完成了所有的安装。我们在 Ubuntu OS 电脑的 terminal 中打入如下的命令:
mosquitto_pub -m "this is so nice" -t "test"
然后我们在 MacOS 的电脑上进行查看:
GET filebeat-7.10.1/_search
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "filebeat-7.10.1-2021.01.11-000001",
"_type" : "_doc",
"_id" : "EiXn8HYByAmDKr1llqJE",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2021-01-11T10:04:36.917Z",
"message" : "this is so nice",
"mqtt" : {
"qos" : 0,
"retained" : false,
"topic" : "test",
"duplicate" : false,
"message_id" : 0
},
"tags" : [
"mqtt_test"
],
"input" : {
"type" : "mqtt"
},
"fields" : {
"app_id" : "engine"
},
"host" : {
"containerized" : false,
"ip" : [
"192.168.0.4",
"fe80::76dc:60a9:72bc:6b13",
"192.168.122.1",
"172.17.0.1"
],
"mac" : [
"1c:69:7a:0f:5b:05",
"94:e6:f7:be:e2:d6",
"52:54:00:d8:80:5e",
"52:54:00:d8:80:5e",
"02:42:7d:13:fd:d9"
],
"hostname" : "liuxgu",
"name" : "liuxgu",
"architecture" : "x86_64",
"os" : {
"name" : "Ubuntu",
"kernel" : "5.4.0-58-generic",
"codename" : "focal",
"platform" : "ubuntu",
"version" : "20.04.1 LTS (Focal Fossa)",
"family" : "debian"
},
"id" : "65e5a6f1012248ab8c3802e90b108b7d"
},
"agent" : {
"type" : "filebeat",
"version" : "7.10.1",
"hostname" : "liuxgu",
"ephemeral_id" : "a52ff3af-bc21-402b-9ae7-2bf942345dbd",
"id" : "07e79686-f3fc-4444-8620-42e1c83cd82f",
"name" : "liuxgu"
},
"ecs" : {
"version" : "1.6.0"
}
}
}
]
}
}
从上面我们可以看出来刚才输入的信息 “this is so nice” 以及被成功地导入到 Elasticsearch 中了。