从 Cassandra 2.x 迁移到 3.x:schema_keyspaces 表消失了。你如何查询系统键空间?

Dou*_*eri 6 migration cassandra system-tables

我刚刚从 Cassandra 2.x 迁移到 3.x(特别是 3.4)。现在系统表已经完全改变了,这些改变不在文档中。如果您查看系统表的当前 CQL 文档,它们仅描述了 2.X 中的系统架构。

Cassandra 2.X 及更高版本的 CQL 3.3 文档

有没有人有详细说明此更改的访问文档?如何查询以查看哪些键空间可用?

有一个名为“system_schema”的新系统键空间,但其中只有两个表:system_schema.tablessystem_schema.columns。所以我不知道在哪里寻找我需要的信息(我需要能够有效地执行DESCRIBE KEYSPACES命令,但在 cqlsh 之外)。

答案是这样的:SELECT keyspace_name FROM system_schema.tables;这样做的新方法吗?

Aar*_*ron 5

有一个名为“system_schema”的新系统键空间,但其中只有两个表:

好的,您的升级中一定出了点问题,因为那是不对的。当我检查 system_schema 3.4 时,我看到:

[cqlsh 5.0.1 | Cassandra 3.4 | CQL spec 3.4.0 | Native protocol v4]
Use HELP for help.
aploetz@cqlsh> use system_schema ;
aploetz@cqlsh:system_schema> desc tables;

tables     triggers    views    keyspaces  dropped_columns
functions  aggregates  indexes  types      columns  
Run Code Online (Sandbox Code Playgroud)

该键空间中肯定有两个以上的表。

如何查询以查看哪些键空间可用?

执行此操作的新方法是查询 system_schema.keyspaces:

aploetz@cqlsh:system_schema> SELECT * FROM keyspaces;

 keyspace_name          | durable_writes | replication
------------------------+----------------+-------------------------------------------------------------------------------------
        zeroreplication |           True |       {'DC1': '0', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
            system_auth |           True | {'class': 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
          system_schema |           True |                             {'class': 'org.apache.cassandra.locator.LocalStrategy'}
          experfy_class |           True |       {'DC1': '1', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
                 system |           True |                             {'class': 'org.apache.cassandra.locator.LocalStrategy'}
          stackoverflow |           True |       {'DC1': '1', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
              eqcontrol |           True |       {'DC1': '1', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
Run Code Online (Sandbox Code Playgroud)

system.schema_keyspaces 和 system_schema.keyspaces 之间的主要区别在于 system_schema.keyspaces 只有 3 列而不是两列(strategy_classstrategy_options合并为replication)。


Dou*_*eri 1

所以我发现有一个更好的方法:通过API。我从这个答案中得到了这个想法:

/sf/answers/2462764391/

您需要直接访问键空间元数据。因此,如何访问架构元数据的示例如下:

Cassandra CPP 驱动程序:UDF 元数据

这个想法是获取指向 CassSchemaMeta 对象的指针,然后您可以访问所有键空间、表、列、函数等。

http://datastax.github.io/cpp-driver/api/struct.CassSchemaMeta/

附带说明一下,我需要这些信息,以便支持 C++ 中的模式细读。我们创建了一个提供 C++ 绑定的包装库,并且这里支持 Schema 内容:

https://github.com/m2osw/libcaswrapper