![将 Google Cloud SQL 慢日志导出到 ELK 堆栈](https://linux22.com/image/752585/%E5%B0%86%20Google%20Cloud%20SQL%20%E6%85%A2%E6%97%A5%E5%BF%97%E5%AF%BC%E5%87%BA%E5%88%B0%20ELK%20%E5%A0%86%E6%A0%88.png)
我偶然发现了一个问题并决定寻求建议,最终找到了有相同业务需求(和问题)的人。
摘要 - 我们最近将我们的一个客户的 SQL 服务从自托管 MySQL 迁移到 Google CloudSQL MySQL 5.7 服务,现在我们正在寻找一种方法来允许我们的客户访问/查看和分析他们自托管 ELK 堆栈中的 MySQL 慢日志。
这以前不是问题,因为我们可以访问 SQL 服务慢速日志文件,并设法在 Elasticsearch 中“跟踪”、导出和索引这些日志。下面显示了之前特定 Elasticsearch MySQL 慢速日志单个文档的简单示例: https://prnt.sc/sjitys
请注意,每份文件均包含:
Time
User@Host
Query_time
timestamp
选择/插入/更新/删除查询,并能够根据 lock_time、rows_queried、rows_affected、rows_returned 等分析数据。
下面是 MySQL 慢速日志在我们的客户端无权访问的 GCP 日志查看器中显示的示例: https://user-images.githubusercontent.com/9348708/80950753-2418bf80-8dff-11ea-9a00-3f5131b5e0f3.png
因此我们的目标是以类似于以前的方式将 MySQL 慢日志流式传输到 ELK 堆栈。
为了实现我们的目标,我们尝试通过 Pub/Sub 导出器提取 GCP MySQL 慢速日志(https://cloud.google.com/logging/docs/export) 并将日志流式传输到 ELK 堆栈。为此,我们做了以下工作:1. 使用以下过滤器创建日志接收器 (日志路由器):resource.type="cloudsql_database" logName="projects/XXX/logs/cloudsql.googleapis.com%2Fmysql-slow.log" 并导出到 Google 的 Pub/Sub 接收器服务 2. 在 Google Computer Engine VM 上,我们安装并配置了名为 pubsubbeat 的文件导出服务 (服务类似于 filebeat 的 pubsub 输入方法),以将 SQL 慢日志从 GCP 流式传输到相关 VM 上的文件 3. 配置 filebeat 服务以跟踪 VM 上 GCP 导出的日志,并使用include_lines: [‘textPayload’]
仅包含 GCP 提取的每个 JSON 对象中的重要信息
注意:GCP MySQL 慢速日志通过 google-fluentd 代理访问,并使用单一数据类型 LogEntry 表示,该数据类型为所有日志条目定义某些通用数据并承载单独的有效负载。格式为 JSON,每行日志都封装到单独的 JSON 对象中。示例:https://prnt.sc/sep2zk
直接的问题 - Pub/Sub 为实现其高可用性和吞吐量做出了一些权衡,不幸的是,消息的顺序混乱就是其中之一 - 换句话说,MySQL 慢日志的顺序是混合的,我们无法通过定义它以“^# Time”字符串开头来正确地封装每个单独的慢日志对象 - 相反,我们有以下格式:https://prnt.sc/seoztj
因此,如果有人分享他们如何将多行日志文件(或直接将 MySQL 慢日志)从 GCP 导出到外部日志分析系统(作为 ELK 堆栈),以便我们更好地理解在这种情况下最好的方法是什么,这将会很有帮助?
答案1
这是对的。Pub/Sub 不保证交付顺序。您可以按以下方式订购发布时间。 有一些样品在 Pub/Sub 文档中。
或者,您可以将数据流管道添加到方程式中,并让其为您排序数据。然后,您可以根据客户的业务需求运行批处理作业。这种方法需要大量配置工作,而且成本会高得多。
我强烈建议您查看上面的一些示例,看看它们是否适合您的需求。