你可以在我之前文章 “Elastic:开发者上手指南” 的 “监视及管理” 找到相关的 Elastic Stack 监控的文章。在那些文章里,所有的理论还是成立的,只不过在最新的 Elastic Stack 8.0 出现后,由于 HTTPS 访问变成了默认的配置,需要有一些额外的配置,而且界面有所改变。在今天的文章中,我来详细地介绍如何在 Elastic Stack 8.0 平台下监控 Elastic Stack。
监控概览
监控集群时,你会从集群中的 Elasticsearch 节点、Logstash 节点、Kibana 实例和 Beats 收集数据。 你还可以使用 Filebeat 收集 Elasticsearch 日志。所有监控指标都存储在 Elasticsearch 中,这使你能够轻松地可视化来自 Kibana 的数据。 默认情况下,监控指标存储在本地索引中。
提示:在生产中,我们强烈建议使用单独的监控集群。 使用单独的监控集群可防止生产集群中断影响你访问监控数据的能力。 它还可以防止监控活动影响生产集群的性能。 出于同样的原因,我们也建议使用单独的 Kibana 实例来查看监控数据。
您可以使用 Metricbeat 收集有关 Elasticsearch、Kibana、Logstash 和 Beats 的数据并将其直接发送到你的监控集群,而不是通过你的生产集群进行路由。 下图说明了具有独立生产和监控集群的典型监控架构:
如果你拥有适当的许可证,则可以将数据从多个生产集群路由到单个监控集群。 有关各种订阅级别之间差异的更多信息,请参阅:订阅 | Elastic Stack 产品和支持 | Elastic。在没有订阅的情况下,你可以使用一个集群监督仅有的一个集群,而不是多余一个的集群。
重要:一般来说,监控集群和被监控的集群应该运行相同版本的堆栈。 监控集群无法监控运行较新版本堆栈的生产集群。 如有必要,监控集群可以监控运行先前主要版本的最新版本的生产集群。
监控是如何工作的?
每个 Elasticsearch 节点、Logstash 节点、Kibana 实例和 Beat 实例根据其持久 UUID 在集群中被认为是唯一的,该 UUID 在节点或实例启动时写入 path.data 目录。
监控文档只是普通的 JSON 文档,通过按指定的收集间隔监控每个 Elastic Stack 组件构建而成。 如果要更改这些索引的模板,请参阅配置索引以进行监控。
Metricbeat 用于收集监控数据并将其直接发送到监控集群。
监控分类
在上面我们详细列举了使用 Metricbeat 的方法来进行 Elastic Stack 的监控。在实际的使用中,其实还有一种比较传统的方法。这个是是使用 Elasticsearch 的监控插件来收集并发送监控数据到 Elasticsearch 中。鉴于此,监控的分类为:
- 使用传统的监控插件收集器来收集监控数据
- 使用 Metricbeat 来进行监控
在下面的文章中,我将详细介绍这两种方法。
安装
如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参阅我之前的文章:
请注意,我们选择 Elastic Stack 8.x 相应的文章来进行安装。在默认的情况下, Elasticsearch 的访问是需要 HTTPS 连接的。
使用传统收集器收集监控数据
我们必须设置如下的配置:
xpack.monitoring.elasticsearch.collection.enabled: true
注意:你可以在每个节点上的 elasticsearch.yml 或整个集群中将此设置指定为动态集群设置。 如果启用了 Elasticsearch 安全功能,你必须具有监控集群权限才能查看集群设置并管理集群权限才能更改它们。
我们可以通过如下的命令来进行设置:
PUT _cluster/settings
{
"persistent": {
"xpack.monitoring.collection.enabled": true
}
}
当我们在 Kibana 中打开监控界面:
从上面的画面中,我们可以看出来推荐的监控方法是使用 Metricbeat。针对传统的收集器监控,我们选择 setuo with self monitoring:
从上面的输出中,我们可以看到 xpack.monitoring.collection.enabled 的默认值为 false。我们点击 Turn on monitoring:
点击上面的 OK 按钮:
经过上的步骤后,我们可以使用如下的命令来进行查看:
GET _cluster/settings
也就是说上面的步骤把设置 xpack.monitoring.elasticsearch.collection.enabled 置为 true。
从上面的画面中,我们可以看出来它自动地监控了 Nodes 及 Kibana。在上面的界面中,我们可以看到 Logs 里没有任何数据。我们需要点击上面的 Filebeat 链接来采集 Elasticsearch 的日志。我们需要安装好 Filebeat。我们可以参考文章 “Elastic:配置 Elasticsearch 服务器 logs” 来采集 Elasticsearch 日志信息。在我的安装中,我们的 Filebeat 的安装和 Elasticsearch 是处于同一目录下的:
$ pwd
/Users/liuxg/elastic
$ find . -type d -depth 1
./kibana-8.4.3
./elasticsearch-8.4.3
./filebeat-8.4.3-darwin-aarch64
在 Filebeat 的安装根目录下,我们在 filebeat.yml 文件的最后部分添加如下的配置:
filebeat.yml
filebeat.modules:
- module: elasticsearch
server:
var.paths:
- ../elasticsearch*/logs/*_server.json
slowlog:
var.paths:
- ../elasticsearch*/logs/*_index_search_slowlog.json
- ../elasticsearch*/logs/*_index_indexing_slowlog.json
gc:
var.paths:
- ../elasticsearch*/logs/gc/log.[0-9]*
- ../elasticsearch*/logs/gc.log
audit:
var.paths:
- ../elasticsearch*/logs/*_audit.json
如上所示,上面的 .json 文件指向 Elasticsearch 的 logs 目录。我们同时需要修改 Elasticsearch 的 output 部分:
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["localhost:9200"]
# Protocol - either `http` (default) or `https`.
protocol: "https"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic"
password: "W_9piB79eNY4VPayzg1+"
ssl.certificate_authorities: ["/Users/liuxg/elastic/elasticsearch-8.4.3/config/certs/http_ca.crt"]
我们需要根据自己的配置进行相应的修改。
我们可以通过如下的命令来检查 output 的部分是否成功:
$ pwd
/Users/liuxg/elastic/filebeat-8.4.3-darwin-aarch64
$ ./filebeat test output
elasticsearch: https://localhost:9200...
parse url... OK
connection...
parse host... OK
dns lookup... OK
addresses: ::1, 127.0.0.1
dial up... OK
TLS...
security: server's certificate chain verification is enabled
handshake... OK
TLS version: TLSv1.3
dial up... OK
talk to server... OK
version: 8.4.3
如果我们看到上面显示的都是 OK,则表示我们的配置是成功的。我们也可以修改如下的部分:
尽管在我们目前的配置中是不不必须的。在我们使用到 module 时,我们需要使用这个来进行 setup。
我们接下来在 Filebeat 的安装目录中执行如下的命令:
./filebeat -e
我们可以看到所有的日志被采集到 Elasticsearch 中。
我们稍等一会儿,就会看到在 Logs 下的文字信息消失了。我们可以点击 Logs 来查看日志:
我们可以看到日志信息。
好了,我们到目前位置完成了使用传统的收集器来采集日志及指标的方法来对 Elasticsearch 集群进行监控。这个方法不好的地方就是,如果这个集群自己挂了,我们看不到任何的更进一步的监控信息。推荐的方法是使用一个单独的监督集群来对生产环境中的集群进行监控。我们需要使用到 Metricbeat。在接下来的文章中,我将详细介绍。