国内应该大部分用户都没有在Elastic原厂开工单的经历,但如果您曾联系过Elastic的售后寻求帮助,很可能他们会要求您运行支持诊断工具(support-diagnostics)并在您的支持案例中提供诊断输出。这是一种常见的做法,但很多人可能不知道为什么,也不知道这个工具能干什么。因此,本博客将为大家介绍support-diagnostics的作用,及其输出的内容。
简而言之,support-diagnostics有助于我们了解集群的状态。例如,它有助于:
- 隔离集群性能问题
- 优化集群配置
- 字段映射问题疑难解答
- 收集有关集群状态的一般信息
运行该工具虽然无法保证帮助我们解决每个 Elasticsearch 上的问题,但它确是故障排除过程中的一大利器,一旦掌握,故障排查,快人一步。
优先考虑数据隐私和安全
在我们开始之前,先简要介绍一下隐私。support-diagnostics会收集有关节点健康状况和其他集群元数据的运行时信息。但它不会收集存储在集群中的实际源事件或文档数据。
而在本博客的后面,我们还会介绍如何清除您可能也认为敏感的元数据(IP、主机名、索引名称等)来进一步清理这些文件。
安装和设置
运行要求
- JDK - Oracle 或 OpenJDK,1.8-13。
- 由于可能导致 TLS 错误的 JSSE 相关问题,不支持 IBM JDK。
- Elasticsearch 版本 7 的重要说明: Elasticsearch 现在包含一个默认使用的捆绑 JVM。对于通过
Jstack
它检索线程转储的诊断,必须使用与运行 Elasticsearch 相同的 JVM 执行。诊断实用程序将尝试查找用于运行它正在询问的进程的 JVM 的位置。如果无法这样做,您可能需要通过设置JAVA_HOME
为/bin
包含包含的 JDK 目录的目录来手动配置位置。例如,<path to Elasticsearch 7 deployment>/jdk/Contents/Home
。
- 该主机的系统用户帐户(不是 elasticsearch 登录名)必须具有足够的权限才能运行这些命令并访问日志(通常在/var/log/elasticsearch 中)以获得完整的诊断集合。
- 如果您使用内置安全性进行身份验证,则提供的用户 ID 必须具有执行诊断 URL 的权限。除非您对定制您自己的帐户和角色的调用非常熟悉,否则建议使用超级用户角色。
下载和安装
- 找到最新版本
- 将下载的文件解压缩到您要运行的目录中。这可以与您希望询问的 Elasticsearch、Kibana 或 Logstash 主机位于同一主机上,也可以位于远程服务器或工作站上。您也可以在 Docker 容器中运行它。
使用单个命令运行大量API 调用
Elasticsearch 提供了许多 API 可以查询集群信息。因此,当我们对问题进行故障排除时,从这些 API 中转储尽可能多的信息而不是手动运行它们是非常有用且方便的。support-diagnostics能帮助我们做到这一点。
运行单一的支持诊断命令可以避免用户从几十个不同的单独API调用中收集输出。把这个输出压缩成一个单一的压缩文件,们可以使用这些文件来诊断分片问题、性能瓶颈、字段映射问题以及更多。
由于它是一个 Java 应用程序,因此诊断对操作系统没有要求,因此它几乎可以在安装了 Java 虚拟机 (JVM) 的任何地方运行。
我们可以通过以下命令
代码语言:javascript复制./diagnostics.sh
or
代码语言:javascript复制.diagnostics.bat
运行诊断工具。具体的各种命令可以参阅: https://github.com/elastic/support-diagnostics#running-from-the-command-line,运行后将提示一些用户输入并查询多个 Elasticsearch API 以生成文本和 json 文件的压缩 zip 存档。您可以在Support Diagnostic .yml 文件中查看它创建的文件的完整列表以及填充它们的 API 。
如果您想了解有关创建这些文件的 API 的更多信息,请参阅REST API 文档。
使用压缩文件的工具分析集群健康
此时,您将得到一个可能有几 MB 大小的输出 zip,表示执行诊断时 Elasticsearch 集群的配置和状态。解压之后的文件,包含了几乎所有我们分析问题时需要的资料
我们可以使用可视化分析工具(原厂特有,不对外提供),对结果进行分析:
可以查看集群与节点的基础配置,注意,所有有问题的项,这个工具都很贴心的用黄色和红色警示,告诉我们需要注意或者修复。
也可以查看索引和分片的信息。未分配或者状态异常的分片都会被提示
还可以查看类似Hot Threads这种性能排错时需要关注的内容,并且可以快速的过滤关键信息:
上面能做的东西不少,主要看我们在不同的场景下需要哪些数据进行分析。如果这里没有的内容,我们可以直接到压缩文件里找。
快速批量优化
我们甚至可以通过这些文件帮助我们做快速优化。
比如,我们要批量修改某个配置项,这里的例子是修改索引生命周期,我们可以找到这个ilm_policies.json
,在里面统一修改后,重新import到集群当中:
如果我们将某些最佳实践固化,完全可以通过这种方式批量的在所有管理集群中进行修改。
脱敏能力
对你们中的一些人来说,元数据隐私可能和操作数据隐私一样重要。如果你是这种情况,诊断器可以在其输出中用自动生成的字符混淆特定字符或 "标记",并在输出文件中保持一致。只需在 yml 文件中的标记列表中定义您希望清理的字符,然后执行scrub
命令:
Example tokens in a yml file
代码语言:javascript复制tokens:
- 'node-[d?]*'
- 'cluster-630'
- 'disk1'
- 'data-one'
Example scrub command
代码语言:javascript复制./scrub.sh -a /path/to/my/diagoutput/diagnostics-20180621-161231.tar.gz -o /home/adminuser/sanitized-diags -c /home/adminuser/sanitized-diags/scrub.yml
诊断工具将用生成的脱敏字符替换在诊断中找到的每个标记。例如data-one
,将会被some_string_value_1
替代并贯穿诊断输出。更多文件脱敏选项可以在诊断程序库的文件清理部分中找到。
最后
Support Diagnostic 是一个“实时”的实用程序,它始终在更新。尝试使用最新版本来访问来自新 API 调用的内容,修改新的监控数据导出等实验性功能,或者只是从所做的一般改进中受益。
希望这有助于解释什么是支持诊断,您可以使用它做什么,以及它如何帮助支持确保您的集群以最佳性能运行。进一步探索其 API,在存储库中提供反馈,或将其用于您自己的 Elastic 故障排除目的。