ELK Stack:配置metricbeat 7.x以监视Elasticsearch集群

时间:2020-01-09 10:38:15  来源:igfitidea点击:

Elasticsearch ELK Stack教程:

  • 安装和配置带有3个节点的ElasticSearh Cluster 7.5

  • 启用HTTPS并配置SSS/TLS以保护Elasticsearch Cluster

  • 为Elasticsearch Cluster安装和配置带有SSL/TLS的Kibana 7.5

  • 配置Metricbeat 7.5以通过HTTPS监视Elasticsearch集群设置

  • 使用Elasticsearch安装和配置Logstash 7.5

ELK堆栈组件

弹性堆栈(以前称为ELK)提供实现数据驱动的体系结构所需的不同层。

它从Beats,Logstash的摄取层开始,再到Elasticsearch的分布式数据存储,最后再到Kibana的可视化层

Beats介绍

Beats是轻量级数据传送器,已作为代理安装在边缘服务器上,以将操作数据传送到Elasticsearch。
就像Elasticsearch一样,Logstash,Kibana和Beats也是开源产品。
根据使用情况,可以将Beats配置为将数据传送到Logstash以在将事件推送到Elasticsearch之前转换事件。

Elastic.co已构建并维护了多个Beats,例如Filebeat,Packetbeat,Metricbeat,Heartbeat和Winlogbeat。

在本文中,我们将分享配置metricbeat的步骤,以监控Kibana上的elasticsearch集群节点

提示:

我们应该将Metricbeat安装在尽可能靠近要监视的服务的位置。
例如,如果我们有四台运行MySQL的服务器,则建议我们在每台服务器上运行Metricbeat。
这使Metricbeat可以从本地主机访问服务,并且不会引起任何其他网络流量,也不会阻止Metricbeat在出现网络问题时收集指标。
来自多个Metricbeat实例的指标将在Elasticsearch服务器上合并。

生成SSL证书

我们将使用之前为ELK堆栈创建的现有PEM证书来配置SSL上的metricbeat。

/etc/pki下创建目录elasticsearch

# mkdir /etc/pki/elasticsearch

我们可以使用任何其他位置来存储具有足够读取权限的证书。
例如,在server1上,我会将所有server1和CA证书放在/etc/pki/elasticsearch

[root@server1 ~]# ls -l /etc/pki/elasticsearch/
total 12
-rw-r--r--. 1 root root 1200 Dec 27 20:08 ca.crt
-rw-r--r--. 1 root root 1196 Dec 26 06:25 server1.crt
-rw-r--r--. 1 root root 1675 Dec 26 06:25 server1.key

同样,在server2server3上保留我们为相应服务器创建的证书。

Metricbeat概述

  • Metricbeat是一种轻量级的托运人,它定期从操作系统和服务器上运行的服务收集指标。

  • 它通过从服务器上运行的系统和服务(例如Apache,MondoDB,Redis等)收集指标来监视服务器。

  • Metricbeat可以将收集的指标直接推入Elasticsearch或者将其发送到Logstash,Redis或者Kafka。

  • 要监视Elasticsearch群集服务,可以在运行服务的边缘服务器上安装Metricbeat;它也使我们能够从远程服务器收集指标。

  • 但是,建议将其安装在运行服务的边缘服务器上,以监视elasticsearch集群。

重要的提示:

确保安装与Elasticsearch兼容的Metricbeat版本非常重要。
在elasticsearch页面上检查兼容性矩阵

安装Metricbeat

有多种安装metricbeat的方法,我们将使用rpm方法

[root@server1 ~]# curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.5.1-x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 34.1M  100 34.1M    0     0  6796k      0  0:00:05  0:00:05 --:--:-- 7537k
[root@server1 ~]# rpm -vi metricbeat-7.5.1-x86_64.rpm
Preparing packages...
metricbeat-7.5.1-1.x86_64

配置MetricBeat

提示:

在所有群集节点上重复本章中的步骤

配置metricbeat.yml

metricbeat的主要配置文件是/etc/metricbeat下的metricbeat.yml
我们可以通过在metricbeat.yml配置文件的Outputs部分中设置选项来配置Metricbeat以写入特定的输出(elasticsearch集群节点)。

output.elasticsearch:
  hosts: ["https://server1.example.com:9200", "https://server2.example.com:9200", "https://server3.example.com:9200"]
  #Optional protocol and basic auth credentials.
  #protocol: "https"
  username: "elastic"
  password: "Passw0rd"
  ssl.certificate_authorities: ["/etc/pki/elasticsearch/ca.crt"]

其中

  • hosts:要连接的Elasticsearch节点列表。
    事件以循环顺序分配到这些节点。
    如果一个节点不可访问,则事件将自动发送到另一节点。
    可以将每个Elasticsearch节点定义为URL或者IP:PORT。

  • 用户名:用于连接和监视elasticsearch集群的基本身份验证用户名。

  • password:连接和监视elasticsearch集群的基本认证密码。

  • ssl.certificate_authorities:提供用于签署服务器证书的CA证书路径。
    否则,我们可能会得到x509:证书由未知权限错误签名。

配置Kibana端点

从Metricbeat 6.0.0开始,Kibana仪表板通过Kibana API加载到Kibana中。
这需要一个Kibana端点配置。

我们可以在" metricbeat.yml"配置文件的" setup.kibana"部分中配置端点。
这里的192.168.0.14是我们的Kibana服务器的IP

setup.kibana:
  host: "https://192.168.0.14:5601"

这是将加载仪表板的Kibana服务器。
由于我们的Kibana服务器使用SSL,因此我使用了https。

在Metricbeat中启用X Pack监视

由于我们计划使用" x-pack监视",因此我们将此选项更改为" true"。
如果我们希望选择"内部监控",则可以将此值设置为" false"。

monitoring.enabled: true

示例metricbeat.yml配置文件

以下是我的示例" metricbeat.yml"配置文件。

[root@server1 ~]# vim /etc/metricbeat/metricbeat.yml
metricbeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
  
setup.template.settings:
  index.number_of_shards: 1
  index.codec: best_compression
setup.kibana:
  # Kibana Host
  host: "https://192.168.0.14:5601"
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["https://server1.example.com:9200", "https://server2.example.com:9200", "https://server3.example.com:9200"]
  # Optional protocol and basic auth credentials.
  #protocol: "https"
  username: "elastic"
  password: "redhat"
  ssl.certificate_authorities: ["/etc/pki/elasticsearch/ca.crt"]
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
monitoring.enabled: true
setup.template.settings:
  index.number_of_shards: 1
  index.codec: best_compression

配置elasticsearch.yml以启用x-pack监视

Elasticsearch监视功能使用接收管道,因此存储监视数据的集群必须至少具有一个接收节点。
禁用Elasticsearch监视指标的默认集合。
在生产集群上将xpack.monitoring.elasticsearch.collection.enabled设置为false。

xpack.monitoring.elasticsearch.collection.enabled: false

要使用filebeat接收elasticsearch收集数据,我们还可以添加

xpack.monitoring.collection.enabled: true

启用模块以监控Elasticsearch集群

我们可以配置metricbeat来监视使用不同模块的各种服务。

" modules.d"目录包含Metricbeat中所有可用模块的默认配置。
在我们的ELK堆栈中,我们计划使用Metricbeat监视elasticsearch集群,因此我们将启用elasticsearch-xpack模块

[root@server1 ~]# metricbeat modules enable elasticsearch-xpack
Enabled elasticsearch-xpack

接下来,提供安装metricbeat的各个Elasticsearch群集主机的详细信息。
以下是来自" server1"节点的示例输出。
在所有群集节点上重复相同的操作。

[root@server3 server3]# cat /etc/metricbeat/modules.d/elasticsearch-xpack.yml
# Module: elasticsearch
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/7.5/metricbeat-module-elasticsearch.html
- module: elasticsearch
  metricsets:
    - ccr
    - cluster_stats
    - enrich
    - index
    - index_recovery
    - index_summary
    - ml_job
    - node_stats
    - shard
  period: 10s
  hosts: ["https://server1.example.com:9200"]
  username: "elastic"
  password: "Passw0rd"
  ssl.certificate_authorities: ["/etc/pki/elasticsearch/ca.crt"]
  xpack.enabled: true

由于我们已将Elasticsearch配置为使用加密的通信,因此我们必须通过HTTPS访问它。
如果启用了弹性安全功能,则还必须提供用户ID和密码,以便Metricbeat可以成功收集指标。
为此,我将使用弹性内置用户。

可选:在Metricbeat中禁用系统模块。

默认情况下,系统模块处于启用状态。
但是,它收集的信息未显示在Kibana的"监视"页面上。
除非我们希望将该信息用于其他目的,否则请运行以下命令:

# metricbeat modules disable system

由于我们使用的是CentOS环境,因此我们使用systemd来管理我们的所有服务。
因此,我们将使用systemctl启动metricbeat服务

[root@server1 ~]# systemctl start metricbeat

同时启用服务以在重启后自动启动此服务

[root@server1 ~]# vim systemctl enable metricbeat

测试Metricbeat安装

使用任何浏览器登录到Kibana仪表板,然后单击左侧面板中的Stack Monitoring。

如我们所见," my-cluster"是可见的,并且已检测到三个节点。

并且所有这些都使用metricbeat被成功监视。
我们可以单击单个群集节点以获取更多数据。

`要验证Elasticsearch中是否存在服务器的统计信息,请发出以下命令:

[root@server3 ~]# curl --cacert /etc/elasticsearch/certs/ca.crt -u elastic -XGET 'https://192.168.0.11:9200/metricbeat-*/_search?pretty' |less
<Output trimmed>
        "_index" : "metricbeat-7.5.1-2019.12.27-000001",
        "_type" : "_doc",
        "_id" : "jp3LR28Ba1N9j5AYYH1s",
        "_score" : 1.0,
        "_source" : {
          "@timestamp" : "2019-12-27T14:38:27.163Z",
          "agent" : {
            "type" : "metricbeat",
            "ephemeral_id" : "fbe9961f-1575-485e-a3a4-8fc375956611",
            "hostname" : "server2.example.com",
            "id" : "c2a87e15-cb9a-4b29-a546-82b33e43c4d7",
            "version" : "7.5.1"
          },
<Output trimmed>

解决常见错误:

以下是尝试配置metricbeat监视Elasticsearch集群时遇到的一些错误

错误:x509:证书由未知授权机构签名

error: error making http request: Get https://192.168.0.14:5601/api/status: x509: certificate signed by unknown authority

解决方案:由于我们使用的是自签名证书,因此ELK Stack服务在尝试建立连接时可能会抱怨此错误消息。
其中我们必须检查哪个服务在/var/log/messages中引发此错误。

在本文中,我遇到了有关Kibana和Metricbeat的错误,这就是为什么我在两个用来签名所有其他证书的配置文件中都明确定义了CA证书(ca.crt)文件位置的原因。

错误:在选定的时间范围内找不到群集。

UUID:<Cluster_UUID>

Unable to find the cluster in the selected time range. UUID:<Cluster_UUID>

解决方案:没有唯一的方法可以知道此问题的解决方案,因为由于各种原因可能会发生这种情况。
默认情况下,Kibana将尝试每10秒连接到elasticsearch集群,有时这还不够,因此我们可以尝试增加此值

要增加集群超时,我们可以修改" elasticsearch.xml"文件,并在报告此问题的所有集群节点上添加以下设置

xpack.monitoring.collection.cluster.stats.timeout: '30s'

或者我们可以将API请求发送到集群节点

# curl --cacert /etc/elasticsearch/certs/ca.crt -u elastic -X PUT "https://server3.example.com:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
{
  "persistent": {
    "xpack.monitoring.collection.cluster.stats.timeout": "30s"
  }
}
'

如果上述方法不能解决问题,那么恐怕我们将不得不进一步查找相应的Kibana,metricbeat服务中的错误,才能使用journalctl了解根本原因

# journalctl -u service.name

按Ctrl + G进入文件末尾并查看日志消息。

还要检查metricbeat状态是否有任何错误,如果使用HTTPS,请在此处将192.168.0.13替换为群集节点IP /主机名,并更改证书文件的位置。

# curl --cacert /etc/elasticsearch/certs/ca.crt -u elastic:redhat -XGET 'https://192.168.0.13:9200/metricbeat-*/_search?pretty' | less