6

我们仍在为我们的数据存储评估 Cassandra。作为一个非常简单的测试,我在本地机器上的 Keyspace1/Standard1 列族中插入了 4 列的值,总计大约 100 字节的数据。然后我用行键尽可能快地读回来。我可以以 160,000/秒的速度读回它。伟大的。

然后我放入一百万个类似的记录,所有的键都以 XY 的形式出现,其中 X 在 (1..10) 中,Y 在 (1..100,000) 中,我查询了一条随机记录。性能下降到每秒 26,000 个查询。这仍然远高于我们需要支持的查询数量(大约 1,500/秒)

最后,我从 1.1 到 10.1000000 放入一千万条记录,并随机查询这 1000 万条记录中的一条。每秒 60 个查询的性能非常糟糕,我的磁盘像疯了一样颠簸。

我还验证了,如果我要求数据的子集,比如 3,000,000 到 3,001,000 之间的 1,000 条记录,它首先会缓慢返回,然后当它们缓存时,它的速度会高达每秒 20,000 次查询,并且我的磁盘不再发疯。

我读到过,人们在 Cassandra 中存储了数十亿条记录,并以每秒 5-6k 的速度获取它们,但只有 1000 万条记录,我无法接近这一点。知道我做错了什么吗?我需要更改默认设置吗?我在一个带有 6gigs ram 的超频 Core i7 盒子上,所以我不认为它是机器。

这是我获取记录的代码,我将这些记录生成到 8 个线程中,以通过行键从一列中请求一个值:

ColumnPath cp = new ColumnPath(); cp.Column_family = "标准1"; cp.Column = utf8Encoding.GetBytes("site"); 字符串键 = (1+sRand.Next(9)) + "." + (1+sRand.Next(1000000)); ColumnOrSuperColumn logline = client.get("Keyspace1", key, cp, ConsistencyLevel.ONE);

感谢您的任何见解

4

4 回答 4

4

纯粹随机读取是关于您的操作系统(如果您设置了键或行缓存,还有 Cassandra)尝试执行的缓存的最坏情况行为。

如果您查看 Cassandra 源代码分发中的 contrib/py_stress,它有一个可配置的 stdev 来执行随机读取,但有些键比其他键更热。这将更能代表大多数现实世界的工作负载。

于 2010-06-17T15:00:14.320 回答
3

添加更多 Cassandra 节点并为它们提供大量内存 (-Xms / -Xmx)。您拥有的 Cassandra 实例越多,数据将跨节点进行分区,并且更有可能在内存中或更容易从磁盘访问。尝试扩展单个工作站级 CPU 将非常有限。另外,检查默认的 -Xms/-Xmx 设置。我认为默认值是 1GB。

于 2010-06-17T17:34:19.590 回答
-1

看起来您没有足够的 RAM 将所有记录存储在内存中。

如果您交换到磁盘,那么您就有麻烦了,并且性能预计会显着下降,尤其是在您随机读取的情况下。

您还可以尝试对其他一些流行的替代品进行基准测试,例如RedisVoltDB

于 2010-06-17T13:12:39.977 回答
-7

VoltDB当然可以处理这种级别的读取性能以及使用服务器集群进行写入和操作。作为内存解决方案,您需要构建一个足够大的集群来将所有数据保存在 RAM 中。

于 2010-07-01T11:39:06.580 回答