Cassandra:未配置的表

时间:2019-05-16 18:53:25

标签: cassandra cassandra-3.0 cassandra-driver

TLDR;虽然system_schema.tables已经包含该表的记录,但该表仍然无法访问

我正在尝试同时使用Cassandra。 Cassandra版本:[cqlsh 5.0.1 | Cassandra 3.11.3 | CQL spec 3.4.4 | Native protocol v4]

我有两个使用cassandra-driver==3.16.0的Python脚本,用于在不同进程中运行的Consumer和Producer。

生产者创建并填充表时,消费者等待直到使用运行CQL语句的Python脚本创建表:

table_exists = False
while not table_exists:
    cql = SimpleStatement(
        "SELECT table_name FROM system_schema.tables WHERE keyspace_name = 'test_keyspace' AND table_name = 'test_table'"
    )
    results = cassandra_session.execute(cql)
    table_exists = bool(results.current_rows)

语句的结果至少包含一条记录后,我得出一个结论,即表已创建,并尝试使用SELECT进行读取:

SELECT * FROM test_keyspace.test_table WHERE ...

但是有时候,我会得到非常烦人的错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/stress.py", line 128, in runner
    for r in select(TEST_KEYSPACE, table_name):
  File "/stress.py", line 63, in select
    results = cassandra_session.execute(statement)
  File "cassandra/cluster.py", line 2171, in cassandra.cluster.Session.execute
  File "cassandra/cluster.py", line 4062, in cassandra.cluster.ResponseFuture.result
cassandra.InvalidRequest: Error from server: code=2200 [Invalid query] message="unconfigured table test_table"

根据我发现的信息,当使用尚未创建的表执行SELECT语句时发生错误。 因此,尽管system_schema.tables已包含有关该表的记录,但该表尚不可访问。

也许有一种更可靠的方法来检查表的可访问性?还是常见的解决方法?

1 个答案:

答案 0 :(得分:1)

通过单节点Cassandra设置,我目睹了结构更改不会立即传播。即创建一个表,然后将其插入表中,由于表不存在,插入将失败。然后,您检查该表是否存在,并且在那里。然后,由于已经过去了一段时间,因此需要插入工作。

我设法使单节点Cassandras表现一致的唯一方法是在每次结构更改后引入一秒钟的等待时间。这对我来说很好,因为Single Node Cassandras仅用于本地开发方案。在生产环境中,我只是禁用等待。