学习 Cassandra(五):踩坑

问题一:读超时

Cassandra Driver 抛异常 Cassandra timeout during read query at consistency ONE (1 responses were required but only 0 replica responded)

查看 Cassandra 日志,看到 WARN 日志如下:

WARN  [ReadStage-1] 2018-02-27 09:07:57,545 ReadCommand.java:522 - Read 3925 live rows and 29353 tombstone cells for 此处省略 CQL 语句 (see tombstone_warn_threshold)  

文档:http://cassandra.apache.org/doc/latest/configuration/cassandra_config_file.html#tombstone-warn-threshold

tombstone_warn_threshold 是 Cassandra 配置文件 cassandra.yml 的配置项,当查询扫描超过了这个数量的 tombstone,数据库就会发出警告

tombstone_warn_threshold 默认值为 1000

Cassandra 执行删除操作,并不真正删除数据,而是使用 tombstone 标识删除 cell,待 gc_grace_seconds 秒之后,才真正将数据删除

大量的 tombstone 将会降低查询性能

解决该问题的方法,就是修改 Cassandra 表属性 gc_grace_seconds,将 gc_grace_seconds 默认值 864000(10天)修改为 86400(1天):

alter table <table_name> with gc_grace_seconds = 86400  

问题二:无法重命名字段

执行 CQL:

alter table <表名> rename <字段名> to <新字段名>;  

报错:InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot rename non PRIMARY KEY part <字段名>"

Cassandra 只可以重命名主键字段!惊不惊喜!!!意不意外!!!🤷‍

原因,可以参考这篇文章:Understanding How CQL3 Maps to Cassandra’s Internal Data Structure

解决办法:

alter table <表名> drop <字段名>;  
alter table <表名> add <新字段名> <字段类型>;