我正在开发一个多网站系统,它使用Cassandra来处理所有数据需求。
当我第一次安装网站时,它增加了3918页(并且还在增长),其中包含许多字段,附件(如JS文件),页面之间的链接等。
在某些时候,我的测试"集群" (一个节点)决定数据快速上升,超时或最差,Cassandra"崩溃"因为内存不足(OOM)。或多或少,从我所看到的Cassandra分配的2Gb RAM填满,然后,Cassandra通常不会控制其可用RAM并获得OOM。当我没有获得OOM时,我会超时。
C / C ++驱动程序中是否有调用来了解" cluster"很慢,所以我可以等一会儿,而不是像疯了一样推送更多数据?
此时,我唯一能看到的就是我写了一个(INSERT INTO ...
)并得到了一个Timeout错误。更准确地说,这个错误:CASS_ERROR_SERVER_WRITE_TIMEOUT
。我发现等到我开始调整INSERT
以便管理负载之后出现这样的错误是相当难看的。这是唯一的方法吗?!
更新:我能够避免使用OOM,但只能减少首次创建网站时安装的插件数量(我不需要一次安装所有插件)。如果你问我,这不是一个好的解决方案,因为Cassandra节点不应该像那样崩溃。这可能(可能确实发生在许多事件中)发生在生产中,并且认为可能发生的任何时候负载有点太高,一分钟都不能容忍......
答案 0 :(得分:2)
我个人在加载大量数据时所做的是使用异步查询(在Python中可以使用,但我认为你可以在C ++中做同样的事情)。我以异步方式插入数据,并将响应放入列表中。
当我达到某个数字(在我的情况下为1000)时,我浏览我的列表并调用我的所有响应的结果同步阻止,直到我的所有查询都通过。
这样,我可以在不重载群集的情况下发送大量查询。不知道它是否是最有效的方式,但这种方法很有效。
答案 1 :(得分:2)
单节点集群是非典型的(它们不是反模式,但它们不是主要用例)。你必须解决一些传统行为。
1)使用同步查询而不是异步。
2)确保即使在单个节点上也使用真实的一致性级别(QUORUM
),因为使用ANY
会让您不堪重负。
3)测量您自己的查询延迟。如果延迟增加超过某一点(短暂的完全超时),则退出插入率(人为睡眠)。
4)调整连接的cassandra侧。 2GB非常小,要有效地运行,你需要做一些调整。您可能希望调整可记忆刷新阈值以鼓励更频繁的刷新,并可能根据初始文档集的大小显式配置可记忆大小。
答案 2 :(得分:0)
请参阅 Cassandra Loader ,将大量数据输入Cassandra。