system_schema.tables和数据目录中记录的表ID何时更改,Cassandra如何读取目录以获取最新架构
查看数据目录cd $ CASSANDRA_DATA / keyspace /,我看到两个目录
drwxr-xr-x 4个cassandra用户4096年6月27日20:47 deviceData-c31406e0eda011e88cce75b7a7f02232
drwxr-xr-x 3个cassandra用户4096年6月30日15:22 deviceData-a0ba3490f28511e88cce75b7a7f02232
查询表架构时,我看到
select keyspace_name, table_name, id from system_schema.tables where keyspace_name='devices' ;
keyspace_name | table_name | id
------------------------------------------------------------------------------
devices | deviceData | a0ba3490f28511e88cce75b7a7f02232
所以我的问题是:导致id改变的原因(它是alter statement),以及C *如何决定使用哪种结构。
答案 0 :(得分:1)
应该只有一个,但是如果您删除表并重新创建它,将会有第二个表ID。
如果在不同的节点上同时调用CREATE TABLE
,它们可能会使用一个表ID创建它,然后与其余集群模式融合并切换到新的表ID,则也存在竞争情况。如果您在日志中看到任何cfid不匹配错误,则启动群集会解决此问题。有计划在将来的版本中修复此问题,但3.x仍然像这样卡住。
答案 1 :(得分:0)
一个表在整个生命周期中只有一个UUID(和一个tablename-UUID目录)。执行表创建语句时,会在协调器节点上分配UUID。这些目录在处理模式更改通知时在副本上创建。
在删除表并使用相同的名称重新创建后,可以获得不同的tablename-UUID目录。一次只有一个具有给定名称的表处于活动状态。
如果尝试同时在两个不同的节点上创建具有给定名称的表,则也可以以两个目录结尾。不过,您不应该尝试这样做(https://github.com/scylladb/scylla/issues/420)