解决 我正在测试3个节点上的更新,其中一个节点上的时间落后1秒,所以当更新一行时,写入时间总是在时间戳之后,cassandra不会更新行。我同步所有节点的时间,并解决了问题。
修改 我仔细检查了结果,所有插入都成功,部分更新失败。没有错误/异常消息
我有一个cassandra集群(Cassandra 2.0.13),它包含5个节点。使用python(2.6.6) cassandra driver(2.6.0c2)
将数据插入数据库。我的服务器系统是Centos6.X
以下代码是我如何连接到cassandra并获取会话。我提供了最多2个节点的ip地址,并选择了密钥空间。
def get_cassandra_session():
"""creates cluster and gets the session base on key space"""
# be aware that session cannot be shared between threads/processes
# or it will raise OperationTimedOut Exception
if CLUSTER_HOST2:
cluster = cassandra.cluster.Cluster([CLUSTER_HOST1, CLUSTER_HOST2])
else:
# if only one address is available, we have to use older protocol version
cluster = cassandra.cluster.Cluster([CLUSTER_HOST1], protocol_version=1)
session = cluster.connect(KEY_SPACE)
return session
对于每一行,我有17列,如果数据库中不存在该键,我将使用session
插入键和其余列的默认值,然后更新特定列的值。
def insert_initial_row(session, key):
session.execute(INITIAL_INSERTION_STATEMENT, tuple(INITIAL_COLUMNS_VALUES))
def update_columnX(session, key, column):
session.execute("INSERT INTO " + TABLE + "(" + KEY + "," + COLUMN_X + ") VALUES(%s, %s)", (key, column))
def has_found(session, key):
"""checks key is in database or not"""
query = "SELECT " + "*" + " FROM " + KEY_SPACE + "." + TABLE \
+ " WHERE " + KEY + " = " + "'" + key + "'"
# returns a list
row = session.execute(query)
return True if row else False
以下是我如何调用它们:
for a_key in keys_set:
"""keys_set contains 100 no duplicate keys"""
if has_found(session, a_key):
update_columnX(session, a_key, "column x value")
else:
"""the key is not in db, initialize it with all default values, then update column x"""
insert_initial_row(session, a_key)
if has_found(sessin, a_key):
update_columnX(session, a_key, "column x value")
else:
logger.error("not initialized correctly...")
我试图插入100行并更新每一行的columnX,但只有部分100行可以更新,其余行columnX是默认值。insert_initial_row
已被调用并初始化所有默认值100行,但update_columnX
没有。事件我将一致性级别更改为Quorum,它根本没有帮助。 “未正确初始化...”从未打印过,我在print
中添加了update_columnX
行并且该行打印了100次,因此调用了100次,但并非所有这些都更新了。
有什么想法吗?请帮忙。
由于
答案 0 :(得分:2)
如果您的session.execute写入不成功(它们未达到所需的一致性级别),则驱动程序将引发以下异常之一:
您可以尝试tracing您的查询,并了解每次写入究竟发生了什么。这将显示操作中涉及的协调器和副本节点以及请求在每个节点中花费的时间。