【问题标题】:Cassandra low performance?Cassandra 性能低下?
【发布时间】:2011-06-15 20:00:21
【问题描述】:

对于具有大量插入(1M/天)的项目,我必须选择 Cassandra 或 MongoDB(或其他 nosql 数据库,我接受建议)。 所以我创建了一个小测试来测量写入性能。这是要插入 Cassandra 的代码:

import time
import os
import random
import string
import pycassa

def get_random_string(string_length):
    return ''.join(random.choice(string.letters) for i in xrange(string_length))

def connect():
    """Connect to a test database"""
    connection = pycassa.connect('test_keyspace', ['localhost:9160'])
    db = pycassa.ColumnFamily(connection,'foo')
    return db

def random_insert(db):
    """Insert a record into the database. The record has the following format
    ID timestamp
    4 random strings
    3 random integers"""
    record = {}
    record['id'] = str(time.time())
    record['str1'] = get_random_string(64)
    record['str2'] = get_random_string(64)
    record['str3'] = get_random_string(64)
    record['str4'] = get_random_string(64)
    record['num1'] = str(random.randint(0, 100))
    record['num2'] = str(random.randint(0, 1000))
    record['num3'] = str(random.randint(0, 10000))
    db.insert(str(time.time()), record)

if __name__ == "__main__":
    db = connect()
    start_time = time.time()
    for i in range(1000000):
        random_insert(db)
    end_time = time.time()
    print "Insert time: %lf " %(end_time - start_time)

在 Mongo 中插入的代码与更改连接功能相同:

def connect():
    """Connect to a test database"""
    connection = pymongo.Connection('localhost', 27017)
    db = connection.test_insert
    return db.foo2

结果是在 Cassandra 中插入 ~1046 秒,在 Mongo 中完成 ~437 秒。 假设 Cassandra 比 Mongo 插入数据要快得多。那么,我做错了什么?

【问题讨论】:

  • 你有没有用更多的线程再次测试,如果是,你能分享结果吗?

标签: python mongodb cassandra nosql


【解决方案1】:

Cassandra 中没有与 Mongo 的不安全模式相当的功能。 (我们曾经有一个,但我们把它拿出来了,因为这只是个坏主意。)

另一个主要问题是您正在执行单线程插入。 Cassandra 是为高并发而设计的;您需要使用多线程测试。请参阅http://spyced.blogspot.com/2010/01/cassandra-05.html 底部的图表(实际数字已过时一年以上,但原则仍然适用)。

Cassandra 源代码发行版在 contrib/stress 中包含这样的测试。

【讨论】:

  • 我会做一些线程。谢谢你的回答jbellis!!
【解决方案2】:

如果我没记错的话,Cassandra 允许您指定是否在执行与 MongoDB 等效的“安全模式”插入。 (我不记得 Cassandra 中该功能的名称)

换句话说,Cassandra 可以配置为写入磁盘然后返回,而不是默认的 MongoDB 配置在执行插入后立即返回不知道插入是否成功。这只是意味着您的应用程序永远不会等待来自服务器的通过\失败。

您可以通过在 MongoDB 中使用安全模式来更改该行为,但众所周知这会对性能产生很大影响。启用安全模式,您可能会看到不同的结果。

【讨论】:

  • 是的,你的回答很有道理。现在测试在安全模式下运行,我会发布结果。
  • 糟糕!我用 safe_mode 多运行了 3 次测试,现在平均时间是 698 秒。它比 Cassandra 更多但仍然更好:(
  • 我认为 MongoDB 仍然会更快,但我认为您现在得到了更好的比较。
【解决方案3】:

一旦您有多个节点运行,您将利用 Cassandra 的真正力量。任何节点都可以接受写请求。对客户端进行多线程处理只会将更多请求泛洪到同一实例,这在某一点之后无济于事。

  • 检查 cassandra 日志以了解测试期间发生的事件。一旦 Memtable 已满,Cassandra 将启动磁盘写入(这是可配置的,使其足够大,您将处理 RAM + 提交日志的磁盘写入)。如果在您的测试期间发生对 Memtable 的磁盘写入,那么它会减慢它的速度。我不知道 MongoDB 何时写入磁盘。

【讨论】:

    【解决方案4】:

    我可以建议在这里看看 Membase 吗?它的使用方式与 memcached 完全相同,并且是完全分布式的,因此您可以通过添加更多服务器和/或更多 RAM 来不断扩展写入输入速率。

    对于这种情况,您肯定希望使用客户端 Moxi 以提供最佳性能。请查看我们的 wiki:wiki.membase.org 以获取示例,如果您需要任何进一步的指导,请告诉我...我很乐意引导您完成它,并且我确信 Membase 可以轻松处理此负载。

    【讨论】:

    • 为什么投反对票? OP 说他愿意接受有关使用 NoSQL DB 的建议。
    【解决方案5】:

    创建批处理修改器以执行操作 多次插入、更新和删除 使用尽可能少的往返次数的操作 可能。

    http://pycassa.github.com/pycassa/api/pycassa/columnfamily.html#pycassa.columnfamily.ColumnFamily.batch

    批量修改器帮助我将插入时间减少了至少一半

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 2011-11-03
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多