如何设计在 AWS 上运行的服务器监控系统

Posted

技术标签:

【中文标题】如何设计在 AWS 上运行的服务器监控系统【英文标题】:How to design a server monitoring system running on AWS 【发布时间】:2021-03-02 06:39:54 【问题描述】:

我正在构建某种形式的监控代理应用程序,该应用程序在 AWS EC2 机器上运行。 我需要能够向在特定 EC2 实例上运行的代理发送命令,并且只有在该实例上运行的代理才能接收并对其采取行动。新的 EC2 实例可以在任何时间点来来去去。 我可以使用 kinesis 并为那里的所有实例推送所有命令,代理可以选择针对它们的命令。这样做的问题是代理将不得不接收大量不适合他们的命令并将其过滤掉。

我也可以为每个实例使用 SQS,但这需要在每次配置新实例时创建/删除 SQS。

想知道是否已经有类似场景的proven solutions

【问题讨论】:

如果你不想使用 SSM 的运行命令,那么 SQS 可能是要走的路。我没有看到“每次配置新实例时创建/删除 SQS”的问题。它可以通过 UserData 轻松获得,用于创建实例,并通过 CW 事件终止。 问题是,当出现问题并且代理或 EC2 实例关闭时,SQS 将挂在那里。从技术上讲,可以实施清理程序,但我正在寻找更简单的解决方案 @Tamerlane ,还有问题吗?或者,如果答案有帮助,您可以接受。 【参考方案1】:

不完全清楚监控系统消息的数量。

但在我看来,所描述的架构要求如下:

    EC2 实例上的代理正在(经常?)轮询一些集中式服务,这是一个基于轮询的架构 正在发送的消息将发送到特定的预定 EC2 实例,该实例是基于推送的架构

为了支持这两个选项而不显着过滤消息,我建议您尝试使用中间 PubSub 系统,例如 Kafka,它可以在 AWS 上由 MSK 管理。

然后区分实例,create a Kafka topic以 EC2 实例 ID 命名

这应该为您提供一个唯一的主题,实例将很容易知道该主题可以访问由它自己的实例 ID 表示的主题上的消息。

您还可以通过将消息发送到由其 EC2 实例 ID 命名的集群中的主题,将 Producer messages 发送/推送到特定 EC2 实例。

由于有许多 EC2 实例来来去去,您最终会遇到许多主题。要处理大量主题,您可以在每个 EC2 终止事件上触发和notify CloudWatch,并检查 CloudWatch 以查看哪些 EC2 实例已终止,因此它们的主题需要删除。

或者,您可以在 EC2 终止事件事件上 trigger a Lambda directly 并通过将实例 ID 表示的文件创建到 S3 存储桶来记录它,您可以使用额外的 Lambda 来查看它,该 Lambda 将从当他们的实例 ID 出现在 Kafka 集群时。

【讨论】:

@tamerlane,你的想法?【参考方案2】:

据我观察,AWS SWF 可能是这里的选项。由于 Amazon SWF 旨在协调分布式应用程序组件的工作,并为各种平台提供 SDK。更深入的了解请参考官方常见问题解答。 https://aws.amazon.com/swf/faqs/

【讨论】:

【参考方案3】:

AWS 已经提供了一项功能齐全的功能。我宁愿使用它而不是重新发明***,因为它是一种强大、集成良好且经过验证的解决方案,成千上万的 AWS 客户正在利用它来获得对其实例队列的运营洞察:

AWS Systems Manager Agent (SSM Agent) 是一款可以在 EC2 实例上安装和配置的软件(它预装在许多默认 AMI 上,包括两个版本的 Amazon Linux、Ubuntu 和各种版本的 Windows Server) . SSM 代理使更新、管理和配置这些资源成为可能。该代理处理来自 AWS 云中 Systems Manager 服务的请求,然后按照请求中的指定运行它们。然后,SSM 代理使用 Amazon 消息传递服务将状态和执行信息发送回 Systems Manager 服务。

您可以了解有关 AWS Systems Manager 及其提供的功能的广度和深度的更多信息here。

【讨论】:

鉴于代理的性质、业务逻辑等......我们必须开发它,而 SSM 代理将无法工作。【参考方案4】:

您是否考虑过使用简单通知服务?每个新的 EC2 实例都可以使用例如订阅一个主题。 http,并删除以前的订阅者。

这样,无论 EC2 轮换如何,主题都将保持不变。

值得注意的是,SNS 支持订阅过滤器,因此它可以决定将哪些消息传递到哪个端点。

【讨论】:

是的,SNS 是我正在考虑的选项之一。但是删除订阅不是一种选择,因为我可以随时接收要分发到不同实例的消息。不过,我可以做的是为每个代理添加/删除对 SNS 主题的 SQS 订阅。似乎太扭曲了,好像代理粉碎队列会挂在那里。 hmm.. 也许您可以使用 Route53 创建唯一的 DNS 名称,将其分配给 EC2 并使用该地址进行订阅。然后在启动时将该域名重新分配给新机器即可。

以上是关于如何设计在 AWS 上运行的服务器监控系统的主要内容,如果未能解决你的问题,请参考以下文章

网监后台管理系统设计思路

网监后台管理系统设计思路

如何在 AWS 上设计多区域 SaaS 解决方案?

如何让 WebSocket 服务器在 aws 上运行

我不明白如何让领域服务器在 AWS AMI 上运行

软件性能测试笔记