如何在 cassandra 中进行同步删除和创建键空间?

How to do a sync drop and create keyspace in cassandra?

我不想要键空间中任何表中的任何数据。所以我决定删除键空间(如果存在)并立即创建它。我正在使用下面的代码来实现相同的目的。

 CassandraConnector(conf).withSessionDo { session =>
  session.execute(s"DROP KEYSPACE if EXISTS $keyspace")
  session.execute("""CREATE KEYSPACE if NOT EXISTS %s
  WITH replication = {'class':'SimpleStrategy','replication_factor':'1'};""".format(keyspace)

) }

但是创建键空间失败。从日志中我只能看到一条警告,指出

Received a DROPPED notification for table test.table_tracker, but this keyspace is unknown in our metadata.

我也尝试过使用 python cassandra 驱动程序。但结果是一样的。 我相信存在一些竞争条件并且删除键空间发生异步(如果我错了请纠正我)。

如何同步删除和创建键空间?

如果您只想删除 table(s) 中的所有数据,您应该考虑使用 TRUNCATE,它会删除 table 中的所有数据,同时保留其架构,即:

TRUNCATE test.table_tracker;

应谨慎执行模式更改,因此应尽可能避免。此外,所有版本的 cassandra 都存在许多不同的问题,围绕快速删除和重新创建密钥空间,因此截断路由更加可靠。

您可能 运行 遇到的一个问题是,您可能在执行每个操作后没有等待模式协议,这可能会出现问题,尤其是在后续操作中操作相同 keyspace/table 的情况下. java-驱动程序(以及 spark 连接器)只会在架构更改之间等待一段可配置的时间。有关如何等待协议的指导,请参阅 java-driver metadata doc 中的此指导,即:

if (cluster.getMetadata().checkSchemaAgreement()) {
    // schema is in agreement
} else {
    // schema is not in agreement
}