首页 文章

Cassandra 表现不佳?

提问于
浏览
8

我必须为具有大量插入(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秒 . 它_1188918_比Mongo插入数据快得多 . 所以, What i'm doing wrong?

5 回答

  • 1

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

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

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

    对于这种情况,您肯定希望与客户端Moxi一起为您提供最佳性能 . 请查看我们的wiki:wiki.membase.org,如果您需要任何进一步的指示,请告诉我...我很高兴为您提供帮助,我确信Membase可以轻松应对此负载 .

  • 4

    创建批处理mutator,使用尽可能少的往返进行多次插入,更新和删除操作 .

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

    批量增变器帮助我减少了至少一半的插入时间

  • 2

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

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

    Cassandra源分布在contrib / stress中包含了这样的测试 .

  • 12

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

    换句话说,Cassandra可能被配置为写入磁盘然后返回而不是默认的MongoDB配置,如果插入成功与否,则在执行插入_1388921之后立即返回 . 它只是意味着您的应用程序永远不会等待来自服务器的pass \ fail .

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

相关问题