如何做一个同步删除和创建键空间在卡桑德拉



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

 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)

)}

但是无法创建keyspace。从日志中,我只能看到一个警告,说明

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

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

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

如果您只是想从一个表中删除所有数据,您应该考虑使用TRUNCATE,它可以从表中删除所有数据,同时保留其模式,即:

TRUNCATE test.table_tracker;

应该谨慎地执行模式更改,因此您应该尽可能避免这样做。此外,在所有版本的cassandra中都有一些不同的问题,围绕快速删除和重新创建键空间,因此截断路由更加可靠。

您可能遇到的一个问题是,也许您在执行每个操作后没有等待模式协议,这可能是有问题的,特别是在后续操作中操作相同的键空间/表的情况下。java驱动程序(以及spark连接器)在模式更改之间的等待时间最多可配置。有关如何等待协议的指导,请参阅java驱动程序元数据文档中的指导,即:

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

最新更新