2014-01-21 19 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