2014-08-28 160 views
2

我有一个Node.js应用程序,它通过Websocket连接接收数据并将每个消息推送到Azure Redis缓存。它将一组持久的消息存储在一个变量中以供下游使用,并定期同步该缓存中的数组。位错综复杂,但稍后我想分离出写入缓存的一半应用程序的一半,从中读取它的一半。Azure Redis缓存数据丢失?

在格林威治标准时间02:00左右,基于Azure门户统计数据,我似乎已开始在该同步上发生“缓存未命中”,这种状态持续了几个小时,之后我才在05:00左右再次获得“缓存命中”。

缓存未命中对应于CPU使用率的突然增加,最高时间为05:00左右。当我说高峰时,我的意思是达到81%,而之前的最高达到6%左右。因此,在05:00左右,CPU达到峰值,然后回落到正常状态,“缓存未命中”消失,但查看缓存内存使用情况,我从约37.4mb降至约3.85mb,我怀疑这是“空”状态),并且该应用程序正在使用的列表已被清空。

应用程序针对缓存运行的唯一函数是LPUSH和LRANGE,没有任何能够移除数据的功能,并且如果有人想知道,当CPU增加内存使用量时没有任何东西表明流氓数据的增加出现了。

它只是基本计划,所以我并不期望它是无懈可击的或任何东西,但即使没有标准计划的复制功能,我曾预计它不能完全清除自己的位置 - 我的印象是,Redis定期将自己写入磁盘,并从错误中恢复。

所有这一切,是我问这个问题的办法:

  1. 没有任何人有任何想法可能在这里发生了什么?

  2. 如果这是一些别人已经能够无意中触发自己,有没有我应该使用所有可能导致它失败这样灾难性同一缓存中查找任何陷阱出来,我可能有其他用途?

  3. 我会欢迎大家合唱团的人告诉我标准计划不会遇到这种问题,因为我已经为此付出了代价,并且很高兴认为这是正确的呼叫。

提前很多感谢..

回答

2

这里我的想法:

Azure的Redis的缓存在内存中存储信息。默认情况下,它不会在磁盘上保存“备份”,因此,您有内存中的信息,出于某种原因服务器重新启动并丢失了数据。

PS:看到这个反馈,没有选择使用Azure的Redis的缓存尚未http://feedback.azure.com/forums/169382-cache/suggestions/6022838-redis-cache-should-also-support-persistence

+0

顺便说一句:内存中的东西无论您选择的是基本计划还是标准计划。 – 2014-09-17 20:44:03

0

詹姆斯,使用标准的实例应该给你很大的提高可用性坚持在磁盘上的信息。

使用基本层对主节点(或硬件故障)进行的任何Azure Fabric更新都会导致您丢失所有数据。

即使在标准层中,Azure Redis缓存也不支持持久性(写入磁盘/ blob)。但是,标准层确实会为您提供一个复制的从属节点,如果您的主服务器出现故障,则可以接管该节点。

2
  1. 请确保您没有使用基本计划。基本计划不假设SLA,并且从我的经验来看,它经常丢失数据
  2. 标准计划提供SLA并使用2个Redis缓存实例。它非常稳定,并没有丢失我们的数据,尽管这种情况仍然存在。
  3. 现在,如果您要将Azure Redis用作数据库,但不是缓存,则需要利用已在Azure Redis Cache Premium层中提供的数据持久性功能:https://azure.microsoft.com/en-us/documentation/articles/cache-premium-tier-intro(请参阅Redis数据持久性)