4

介绍

我正在使用 Cassandra 1.2 集群(7 个节点,复制因子 3)在 Python 中编写一个应用程序,并且我正在使用 cql 库(CQL 3.0)从 Python 访问 Cassandra。

问题

该应用程序的构建方式是,当尝试对未配置的列族运行 cql 语句时,它会自动创建表并重试 cql 语句。例如,如果我尝试运行它:

SELECT * FROM table1

并且 table1 不存在,那么应用程序将为 table1 运行相应的 CREATE TABLE 并重试之前的选择。问题是,在创建表后 SELECT(重试)失败并出现以下错误:

Request did not complete within rpc_timeout

问题

我假设集群需要一些时间来传播表的创建或类似的东西?如果我在创建表和重试 select 语句之间等待几秒钟,一切正常,但我想确切地知道为什么以及是否有更好的方法。也许让创建表在返回之前等待更改传播?有没有办法做到这一点?

提前致谢

4

1 回答 1

1

我假设您正在使用 cqlsh。cqlsh 的默认一致性级别是一个意味着它将在第一个节点完成后返回,但不一定在所有节点完成之前返回。如果您阅读,则不能保证从具有已完成表的节点中读取。您可以通过打开跟踪来检查这一点,但这会影响性能。

您可以强制执行一致性,这应该使创建等待直到在所有节点上创建表。

CREATE TABLE ... USING CONSISTENCY ALL
于 2013-10-01T14:04:59.787 回答