我必须为具有大量插入(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 回答
一旦运行多个节点,您将利用Cassandra的真正力量 . 任何节点都可以接受写请求 . 对客户端进行多线程处理只会将更多请求充斥到同一个实例上,而这些请求在一个点之后无济于事 .
我可以建议在这看看Membase吗?它的使用方式与memcached完全相同,并且完全分布,因此您可以通过添加更多服务器和/或更多RAM来连续扩展写入输入速率 .
对于这种情况,您肯定希望与客户端Moxi一起为您提供最佳性能 . 请查看我们的wiki:wiki.membase.org,如果您需要任何进一步的指示,请告诉我...我很高兴为您提供帮助,我确信Membase可以轻松应对此负载 .
http://pycassa.github.com/pycassa/api/pycassa/columnfamily.html#pycassa.columnfamily.ColumnFamily.batch
批量增变器帮助我减少了至少一半的插入时间
没有相当于Cassandra中Mongo的不安全模式 . (我们曾经有一个,但我们把它拿出来,因为它只是一个坏主意 . )
另一个主要问题是你正在进行单线程插入 . Cassandra专为高并发性而设计;你需要使用多线程测试 . 请参阅http://spyced.blogspot.com/2010/01/cassandra-05.html底部的图表(实际数字已超过一年,但原则仍然正确) .
Cassandra源分布在contrib / stress中包含了这样的测试 .
如果我没有弄错的话,Cassandra允许您指定是否正在执行与MongoDB等效的“安全模式”插入 . (我不记得Cassandra中该功能的名称)
换句话说,Cassandra可能被配置为写入磁盘然后返回而不是默认的MongoDB配置,如果插入成功与否,则在执行插入_1388921之后立即返回 . 它只是意味着您的应用程序永远不会等待来自服务器的pass \ fail .
您可以在MongoDB中使用安全模式来更改该行为,但这已知会对性能产生很大影响 . 启用安全模式,您可能会看到不同的结果 .