我有一个运行cassandra 2.1.6的六节点集群。昨天我试图删除列系列并收到消息“列族ID不匹配”。
我尝试运行 nodetool repair ,但修复完成后我得到了同样的消息。然后我尝试从列系列中进行选择,但收到消息“ Column family not found ”。
我运行了以下查询以获取模式中所有列族的列表
从system.schema_columnfamilies中选择columnfamily_name,其中keyspace_name ='xxx';
此时我收到了消息
“找不到 Keyspace'系统。”
我尝试了描述密钥空间命令,确定系统不够在键空间列表中。
然后我在缺少系统键空间的其中一个节点上尝试了 nodetool resetlocalshema ,当无法解决问题时,我尝试了 nodetool rebuild 但得到了重建完成后,相同的消息。
我尝试停止缺少系统键空间的节点并重新启动它们,一旦重启完成后, system 键空间又回来了,我能够成功执行上述查询。但是,我之前尝试删除的表没有列出,因此我尝试重新创建它,并再次收到消息列族ID不匹配。
最后,我关闭了集群并重新启动它...一切都按预期工作。
我的问题是:
系统密钥空间如何/为什么消失?
当从六个节点中的两个节点丢失系统密钥空间时,插入到我的列族中的数据发生了什么变化? (我的应用程序似乎没有任何问题)
是否有一种方法可以自动检测这样的问题,或者我每天必须手动检查我的密钥空间?
有没有办法在不重新启动整个集群的情况下修复缺少的系统密钥空间和/或列系列ID不匹配?
编辑
根据Jim Meyers的建议,我在群集的每个节点上查询 cf_id ,并确认所有节点都返回相同的值。
从system.schema_columnfamilies中选择cf_id,其中columnfamily_name ='customer'允许过滤;
cf_id
--------------------------------------
cbb51b40-2b75-11e5-a578-798867d9971f
然后我在我的数据目录上运行 ls ,可以看到我的几个表有多个条目
客户-72bc62d0ff7611e4a5b53386c3f1c9f9
customer-cbb51b402b7511e5a578798867d9971f
我的应用程序在运行时动态创建表(总是使用 IF NOT EXISTS ),似乎应用程序可能同时在不同的节点上发出相同的create table命令,导致架构不匹配。 自从我重新启动集群后,一切似乎都运行良好。
删除额外文件是否安全?
即 customer-72bc62d0ff7611e4a5b53386c3f1c9f9
答案 0 :(得分:3)
1此问题的原因是CREATE TABLE语句冲突。不要从多个客户端动态生成表,即使使用IF NOT EXISTS也是如此。您需要做的第一件事是修复您的代码,以便不会发生这种情况。只需从cqlsh手动创建表,从而为模式安排时间。始终等待架构协议when modifying schema。
2这是修复:
1)将代码更改为不自动重新创建表格(即使使用IF NOT EXISTS)。
2)运行滚动重启以确保模式跨节点匹配。在集群周围运行nodetool describecluster。检查是否只有一个架构版本。
ON NACH NODE:
3)检查文件系统,看看数据目录中是否有两个目录。
如果有两个或更多的目录:
4)从schema_column_families中识别出哪个cf是“新”ID(当前正在使用中)。
cqlsh -e“select * from system.schema_column_families”| grep
5)将数据从“旧”数据移动到“新”数据并删除旧目录。
6)如果有多个“旧”的,则每个“旧”目录重复5次。
7)运行nodetool refresh
如果只有一个目录:
无需采取进一步行动。
架构冲突将继续成为问题,直到 - CASSANDRA-9424
以下是在Jira上发生并以not a problem
CASSANDRA-8387
答案 1 :(得分:2)
在Cassandra中创建表时,会为其分配一个唯一ID,该ID应在所有节点上相同。不知何故,听起来你的表在所有节点上没有相同的id。我不确定会发生什么,但是当创建表并且多次创建它时可能会出现故障等等。
创建表时,应始终使用IF NOT EXISTS子句。
要检查您的ID是否一致,请在每个节点上尝试:
在cqlsh中,运行“来自system.schema_columnfamilies的SELECT cf_id,其中columnfamily_name ='yourtablename'允许过滤;
在数据目录下查找创建表的键空间名称。您应该看到表的一个目录,看起来像table_name-cf_id。
如果事情是正确的,你应该在所有这些地方看到相同的cf_id。如果你看到不同的东西,那么事情就会失去同步。
系统键空间等其他症状消失我没有其他建议,除了你在软件中遇到某种错误。如果你遇到很多像这样的奇怪症状,那么你可能会遇到某种数据损坏。您可能想要考虑备份数据,以防情况出现并且您需要重建群集。