3

我在 ec2 上运行 nodejs 并将 nodejs stdout 和 sterr 重定向到文件 (>>) 这有以下潜在问题:

  1. EBS 故障可能会停止 nodejs 进程(我想日志记录是同步的)。众所周知,EBS 不如其他一些 AWS 服务可靠。
  2. EC2 实例可能会失败并且 EBS 会丢失(除非已附加)。
  3. EBS 上的日志文件不会跨可用区复制。
  4. 获取日志需要通过 SSH 连接到机器。

理想情况下,我希望将所有日志直接写入 Amazon ElasticCache for Redis,然后再写入 S3。最好的方法是什么?

4

1 回答 1

2

一般来说,将应用程序日志存储在 redis 中是个坏主意。Redis 是一种内存数据存储,您通常不需要将日志存储在内存中。

通常的方法是将日志存储在附加到 ec2 实例的临时磁盘上。这与 EBS 不同,并且更可靠。然后,您可以有一个 cron 作业来定期将日志复制到 S3。这是最常见的方法。

使用上述方法,您可能会丢失一些日志条目。对于大多数应用程序,这种风险是可以接受的。

如果该风险不适用,我建议存储到不在 EC2 实例上的持久存储中。关系数据库是一个好的开始。

Redis 对日志没有意义,除非你在做一些实时分析。如果您可以解释您的用例,我们可以推荐它是否合适。

编辑

1)你要我做一个权衡。选择 Ethermal 以获得价格/性能,如果您不想丢失日志,请选择附加 EBS。我不能同时拥有由基于后台磁盘的存储(在本例中为 S3)支持的 Redis 集群吗?

简短的回答是否定的。elasticcache 上的 redis 实例也具有相同的可用原语 - 临时磁盘和 EBS。如果您关心一致性,那么您必须这样做fsync always,在这种情况下,Redis 必须在每次写入时都写入磁盘。您只是将磁盘写入从 Web 服务器推送到 Redis。

如果您不总是 fsync 或每 2 秒 fsync 一次(这是默认设置) - 您仍然会丢失几秒钟的数据。

但这都是理论。您应该评估您的用例并做出明确的权衡。

2)我希望从尝试过 Redis 解决方案的人那里得到答案,以了解理论与现实世界实践之间的差距。比如redis开始swap的时候会发生什么(喘气)

同样,我认为没有人将一般的 application/node.js 日志写入 Redis。您必须针对您的用例进行尝试,看看它是否适合您。

3)如果我要选择基于快速磁盘(仅附加)的日志存储,我可能会首先考虑 Kafka 或 Cassandra

同意您。Redis 似乎不太适合您的用例,至少从我的理解来看是这样。

于 2014-01-28T03:46:51.083 回答