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等属性后可成功创建表,现咨询:
read_repair和additional_write_policy属性是在Cassandra的哪个版本中新增的?- 如何自行查询这些属性的引入版本?
解答
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
相关产品推荐
相关产品推荐

