首页 > 解决方案 > cassandra 会在同时执行的两个并行创建键空间命令上失败吗

问题描述

我们已经经历过,如果我们推出 DDL cql 脚本,这将并行更改现有表,那么很有可能将键空间破坏到我们需要重新创建它的程度。

我们现在已经序列化了这个过程,包括该键空间的创建。现在有一个激烈的讨论,如果 cassandra 明确支持并行创建不同的键空间。

我想,这没关系,但由于集群很大,我们想有第二个意见,所以我在这里问:

我们可以安全地假设,在 cassandra 中并行创建不同的键空间是安全的吗?

标签: cassandraddlcqldatastax-java-driver

解决方案


在当前版本的 Cassandra 中这是不可能的 - 您需要在每个 DDL 语句之后等待模式协议,包括创建其他键空间。通常驱动程序会等待一段时间(默认为 10 秒)以确认集群中的所有节点都具有相同的模式版本。根据驱动程序,您可以显式检查模式协议 - 无论是在执行语句后返回的结果集中,还是通过集群元数据。例如,在 Java 中,它可能如下所示:

Metadata metadata = cluster.getMetadata();
for (int i = 0; i < commands.length; i++) {
    System.out.println("Executing '" + commands[i] + "'");
    ResultSet rs = session.execute(commands[i]);
    if (!rs.getExecutionInfo().isSchemaInAgreement()) {
        while (!metadata.checkSchemaAgreement()) {
             System.out.println("Schema isn't in agreement, sleep 1 second...");
             Thread.sleep(1000);
        }
    }
}

新版本的 Cassandra 将在这方面进行改进,例如,通过CASSANDRA-13426(已提交到 4.0)和CASSANDRA-10699(尚未完成)


推荐阅读