Cassandra更新失败

时间:2015-07-06 21:48:33

标签: cassandra python-2.6 datastax

解决 我正在测试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次,但并非所有这些都更新了。

有什么想法吗?请帮忙。

由于

1 个答案:

答案 0 :(得分:2)

如果您的session.execute写入不成功(它们未达到所需的一致性级别),则驱动程序将引发以下异常之一:

  1. Unavailable - 没有足够的实时副本来满足请求的一致性级别,因此协调节点立即使请求失败,而不将其转发给任何副本。
  2. Timeout - 在cassandra超时之前,副本没有回应协调员。
  3. Write timeout - 副本在写入超时之前没有响应协调器。在cassandra.yaml中配置。读取存在类似的超时,读取和写入超时在yaml中单独配置。
  4. Operation timeout - 操作花费的时间超过指定的客户端超时。在应用程序代码中进行配置。
  5. 您可以尝试tracing您的查询,并了解每次写入究竟发生了什么。这将显示操作中涉及的协调器和副本节点以及请求在每个节点中花费的时间。