You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cassandra中read_repair与additional_write_policy属性的版本问询

问题详情

连接Amazon Keyspaces创建Cassandra表时出现以下错误:

2023-09-11 13:57:55,961 [info] c.a.l.s.r.c.CassandraCluster - Connected to Cassandra cluster: Amazon Keyspaces
2023-09-11 13:57:55,961 [info] c.a.l.s.r.c.CassandraCluster - Creating schema using file '/tmp/schema.cql', keyspace: '<keyspace>'
2023-09-11 13:57:55,981 [warn] c.a.l.s.r.c.CassandraCluster - Schema operation failed: Unknown property 'read_repair'
2023-09-11 13:57:55,983 [warn] c.a.l.s.r.c.CassandraCluster - Schema operation failed: Unknown property 'additional_write_policy'
2023-09-11 13:57:55,983 [info] c.a.l.s.r.c.CassandraCluster - Finished creating schema
Oops, cannot start the server.
com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Error injecting constructor, com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured table wilshire_dev_lineage_stats.stats
  at com.ac.lineage.stats.repository.cassandra.CQLExecutor.<init>(CQLExecutor.java:30)
  while locating com.ac.lineage.stats.repository.cassandra.CQLExecutor
    for the 2nd parameter of com.ac.lineage.stats.repository.cassandra.CassandraRepository.<init>(CassandraRepository.java:47)
  at com.ac.lineage.stats.repository.cassandra.CassandraRepository.class(CassandraRepository.java:41)
  while locating com.ac.lineage.stats.repository.cassandra.CassandraRepository
  while locating com.ac.lineage.stats.repository.StatisticsRepository
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured table wilshire_dev_lineage_stats.stats
        at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:49)
        at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:35)
        at com.datastax.driver.core.AbstractSession.prepare(AbstractSession.java:86)
        at com.ac.lineage.stats.repository.cassandra.CQLExecutor.<init>(CQLExecutor.java:37)
        at com.ac.lineage.stats.repository.cassandra.CQLExecutor$$FastClassByGuice$$7a988c18.newInstance(<generated>)
        at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:89)
        at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
        at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
        at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
        at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:42)
        at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:65)
        at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:113)
        at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
        at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
        at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
        at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:168)
        at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:39)
        at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:62)
        at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:213)
        at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
        at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:111)
        at com.google.inject.Guice.createInjector(Guice.java:87)
        at com.google.inject.Guice.createInjector(Guice.java:78)
        at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:200)
        at play.inject.guice.GuiceBuilder.injector(GuiceBuilder.java:211)
        at play.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.java:121)
        at play.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.java:32)
        at play.api.ApplicationLoader$JavaApplicationLoaderAdapter$1.load(ApplicationLoader.scala:181)
        at play.core.server.ProdServerStart$.start(ProdServerStart.scala:53)
        at play.core.server.ProdServerStart$.main(ProdServerStart.scala:29)
        at play.core.server.ProdServerStart.main(ProdServerStart.scala)
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured table wilshire_dev_lineage_stats.stats
        at com.datastax.driver.core.Responses$Error.asException(Responses.java:181)
        at com.datastax.driver.core.SessionManager$4.apply(SessionManager.java:250)
        at com.datastax.driver.core.SessionManager$4.apply(SessionManager.java:219)
        at com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AbstractTransformFuture.java:213)
        at com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AbstractTransformFuture.java:202)
        at com.google.common.util.concurrent.AbstractTransformFuture.run(AbstractTransformFuture.java:118)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:829)

本地Cassandra版本信息:

[cqlsh 6.1.0 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]

使用的建表语句:

CREATE TABLE keyspace.stats_summary (
    dataset_id text,
    snapshot_end timestamp,
    snapshot_start timestamp,
    dataview_name text,
    datamodel_id text,
    summary text,
    PRIMARY KEY (dataset_id, snapshot_end, snapshot_start, dataview_name, datamodel_id)
) WITH CLUSTERING ORDER BY (snapshot_end DESC, snapshot_start DESC, dataview_name ASC, datamodel_id ASC)
AND additional_write_policy = '99p'
AND bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND cdc = false
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND default_time_to_live = 0

移除additional_write_policy等属性后可成功创建表,现咨询:

  1. read_repair和additional_write_policy属性是在Cassandra的哪个版本中新增的?
  2. 如何自行查询这些属性的引入版本?

解答

1. 属性引入版本

  • additional_write_policy:Cassandra 4.0版本新增的表级配置,用于多数据中心场景下定义额外的写入一致性策略,支持如99p这类百分比形式的配置。
  • read_repair:Cassandra 4.0版本新增,用来替代3.x版本中的read_repair_chance和dclocal_read_repair_chance,提供更灵活的读修复策略配置选项。

你的本地环境是Cassandra 3.11.2,而Amazon Keyspaces基于Cassandra 3.x兼容栈,因此不支持这两个4.0才引入的属性,这就是报错的核心原因。

2. 自行查询属性引入版本的方法

  • 查看版本发布说明:Cassandra每个大版本的官方发布文档会详细列出新增的配置项、功能,比如4.0的release notes会明确标注这两个属性的新增信息。
  • 溯源源码提交:在Cassandra的代码仓库中,搜索目标属性的关键字,找到首次引入该属性的代码提交记录,查看提交对应的版本标签,即可确定引入版本。
  • 跨版本测试验证:在不同版本的Cassandra实例中,尝试添加目标属性创建表,如果某个版本支持则会成功创建并在DESCRIBE TABLE结果中显示该属性,否则会抛出类似"Unknown property"的错误,以此判断属性的引入版本。
  • 查阅CQL规范:CQL规范版本与Cassandra版本对应,查看对应CQL版本的官方规范文档,确认目标属性是否在该版本中被定义。

内容的提问来源于stack exchange,提问作者BKV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:00:56