2014-01-21 23 views
3

我在EC2上运行和的NodeJS stdout和sterr重定向到的NodeJS文件(>>) 这有以下潜在的问题:登录的NodeJS EC2上到Redis的

  1. EBS故障可能停止进程的NodeJS(我想日志记录是同步的)。据了解,EBS比其他一些AWS服务更不可靠。
  2. EC2实例可能失败并且EBS丢失(除非附加)。
  3. EBS上的日志文件不会在可用区域中复制。
  4. 获取日志需要SSH连接到机器。

理想情况下,我希望所有日志都直接写入Amazon ElasticCache for Redis,然后从那里写入S3。什么是最好的方式来做到这一点?

回答

2

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

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

通过上述方法,您可能会失去一些日志条目。对于大多数应用来说,这个风险是可以接受

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

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

编辑

1)你问我做一个权衡。如果您不想丢失日志,请选择Ephermal性价比,并选择附加的EBS。我不能同时拥有由基于背景磁盘的存储支持的Redis群集(在本例中为S3)?

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

如果您不是fsync always或fsync每2s(这是默认值) - 您仍然会丢失秒数的数据。

但这就是全部理论。你应该评估你的用例并做出明确的折衷。

2)我希望得到从别人的答案是尝试提出解决的Redis,学习理论和现实世界的实践之间的差距。例如,当Redis的开始交换(GASP)

同样,我不认为任何人写一般应用/ Node.js的登录到Redis的会发生什么。你必须为你的用例尝试一下,看看它是否适合你。

3)如果我要选择基于一个快速的磁盘(仅追加)日志存储,我可能会考虑卡夫卡或卡桑德拉第一

同意你的看法。 Redis似乎不适合您的用例,至少从我的理解来看。

+0

1.你在问我做一个权衡。如果您不想丢失日志,请选择Ephermal性价比,并选择附加的EBS。我不能同时拥有由基于背景磁盘的存储支持的Redis群集(在本例中为S3)? 2.我曾希望从尝试Redis解决方案的人那里得到答案,以了解理论与现实世界实践之间的差距。例如,当redis开始交换时会发生什么(gasp) 3.如果我选择一个基于快速磁盘(仅附加)的日志存储,我可能首先考虑Kafka或Cassandra。 – itaifrenkel