Beats:运用 Filebeat 把 MQTT 数据导入到 Elasticsearch

物联网(IoT)描述了嵌入传感器,软件和其他技术的物理对象(“物”)网络,目的是通过 Internet 与其他设备和系统进行数据连接和交换。物联网是一张很大的网,它比互联网更大,更为广泛。随着物联网的发展,大量的数据可以上传到 Elasticsearch 中,并作为理想的存储空间。Elasticsearch 可以存储 PB 级的数据并实时分析数据。Elasticsearch 可以用甚至运用机器学习对数据进行异常分析,并作出异常报警。 MQTT 协议被广泛使用于物联网中。使用 MQTT 输入读取用于小型和移动设备的,使用轻量级消息传递协议传输的数据,该协议针对高延迟或不可靠的网络进行了优化。那么我们该如果把 MQTT 的数据传入到 Elasticsearch 中呢?

在 Elastic Stack 中的 filebeat 已经对这种协议进行了支持。我们可以使用 MQTT input 来作为 filebeat 的输入。此输入连接到 MQTT 代理,订阅选定的主题并将数据解析为公共消息行。 一切都发生在行过滤,多行和 JSON 解码之前,因此此输入可以与这些设置结合使用。

在今天的例子中我将展示如何使用 filebeat 把数据导入到 Elasticsearch 中。你也可以参阅我之前的文章 “Elastic: 把 MQTT 数据传入到 Elasticsearch”。在今天的展示中,我将使用两个电脑来进行展示:

Beats:运用 Filebeat 把 MQTT 数据导入到 Elasticsearch_第1张图片

如上图所示,我们将在 MacOS 的电脑上部署 Elastic Stack,而使用另外一台 Ubuntu 20.04 的机器来安装 filebeat 及 MQTT。MQTT 客户端可以向 MQTT broker 发送信息,这个信息会发送到 filebeat。最终 filebeat 把收到的信息发送到 Elasticsearch 进行存储及分析。

 

安装

Elastic Stack 安装

我们可以参阅之前的文章 “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 的界面:

Beats:运用 Filebeat 把 MQTT 数据导入到 Elasticsearch_第2张图片

 

安装 MQTT broker 以及客户端

在 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 服务已经被成功安装。

 

安装 Filebeat

在 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

 

发送数据到 Elasticsearch

到目前为止,我们已经完成了所有的安装。我们在 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 中了。

你可能感兴趣的:(Elastic,Beats,elasticsearch,大数据)