1

我正在开发一个使用 Cassandra 来处理其所有数据需求的多网站系统。

当我第一次安装一个网站时,它添加了 3918 个页面(并且还在增长),其中包含许多字段、JS 文件等附件、页面之间的链接等。

在某些时候,我的测试“集群”(一个节点)决定数据很快就会超时,或者最糟糕的是,Cassandra 由于内存不足(OOM)而“崩溃”。或多或少,据我所见,Cassandra 分配的 2Gb RAM 被填满,然后,Cassandra 通常无法控制其可用 RAM 并获得 OOM。当我没有得到 OOM 时,我会超时。

C/C++ 驱动程序中是否有一个调用来知道“集群”是否很慢,所以我可以等待一段时间而不是像疯了一样推送更多数据?

在这一点上,我唯一能看到的是我在写 ( INSERT INTO ...) 并得到一个超时错误。更准确地说,这个错误:CASS_ERROR_SERVER_WRITE_TIMEOUT. 我发现等到我收到这样的错误才开始调整我INSERT的 s 以管理负载是相当难看的。这是唯一的方法吗?!


更新:我能够避免 OOM,但只能通过减少在第一次创建网站时安装的插件数量(我不需要一次安装所有插件)。如果你问我,这不是一个好的解决方案,因为 Cassandra 节点不应该像那样崩溃。这可能(可能确实发生在许多人身上)发生在生产中,并且一旦负载在一分钟内变得有点太高,认为任何时候都可能发生这种情况是无法容忍的......

4

3 回答 3

2

单节点集群是非典型的(它们不是反模式,但它们不是主要用例)。您将不得不解决一些传统行为。

1)使用同步查询而不是异步。

QUORUM2) 确保即使在单个节点上也使用真正的一致性级别 ( ),因为使用ANY会让您不知所措。

3) 测量您自己的查询延迟。如果延迟增加超过某个点(没有完全超时),则降低插入率(人工睡眠)。

4) 调整连接的 cassandra 端。2GB 非常小,要有效运行,您需要进行一些调整。您可能希望调整 memtable 刷新阈值以鼓励更频繁的刷新,并且可能根据初始文档集的大小显式配置 memtable 大小。

于 2016-04-20T00:35:36.913 回答
2

我个人加载大量数据的方法是使用异步查询(这是在 Python 中,但我认为您可以在 C++ 中做同样的事情)。我以异步方式插入数据,并将响应放入列表中。

当我达到某个数字(在我的情况下为 1000)时,我浏览我的列表并调用我所有响应的结果以同步阻止,直到我的所有查询都通过。

这样,我可以发送大量查询而不会使集群过载。不知道这是否是最有效的方法,但这很好用。

于 2016-04-19T09:03:18.950 回答
0

请参阅Cassandra Loader以将大量数据摄取到 Cassandra。

于 2016-04-18T08:46:57.980 回答