【问题标题】:Cassandra random read speedCassandra 随机读取速度
【发布时间】:2011-03-04 22:49:15
【问题描述】:

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

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

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

我还验证了,如果我请求数据的子集,例如 3,000,000 和 3,001,000 之间的 1,000 条记录,它首先返回缓慢,然后在缓存时,它的速度高达每秒 20,000 次查询,我的磁盘停止快要疯了。

我读到过,人们在 Cassandra 中存储了数十亿条记录,并以每秒 5 到 6k 的速度获取它们,但我无法接近只有 1000 万条记录的记录。知道我做错了什么吗?我需要更改默认设置吗?我在一个带有 6gig 内存的超频 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);

感谢您的任何见解

【问题讨论】:

    标签: nosql cassandra thrift


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,我们会有随机访问者以随机的时间间隔到达我们的网站 - 没有我们会提前知道的分布以获得更多的缓存命中。在这种情况下,我们是否只是受限于磁盘速度?
    • 没有什么是真正随机的。你的真实表现很可能比你的测试更好。话虽这么说,Cassandra 真的用完了盒子上的所有内存吗? 60 次读取/秒对您的硬件来说太可怕了,您很可能遇到了设置问题(嗯,这取决于您的磁盘有多糟糕)。此外,请确保 Cassandra 没有像使用物理内存一样使用交换 - 这会导致 Cassandra 和操作系统各自尝试以相互竞争的方式优化内存页面,从而产生病态的性能问题。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我们绝对不能将它们全部放入内存中,但 1000 万条记录似乎并不多。人们如何处理数十亿条记录??
      • 关键是尽可能多地保存在 RAM 中,而不是磁盘上。要处理数十亿条记录,您需要将它们分布在多台机器上并将它们作为一个整体使用。这是一篇非常好的文章 [1],介绍了如何在 Riak(另一种流行的 NoSQL 解决方案)中实现这一点。本文中讨论的许多方面也适用于 Cassandra,因为它们建立在相同的基本思想之上。 [1]:wiki.basho.com/display/RIAK/An+Introduction+to+Riak
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-18
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 2012-03-22
        • 1970-01-01
        • 2014-06-23
        相关资源
        最近更新 更多