【问题标题】:Cassandra 2.1 system schema missing缺少 Cassandra 2.1 系统架构
【发布时间】:2015-10-13 02:22:06
【问题描述】:

我有一个运行 cassandra 2.1.6 的六节点集群。昨天我尝试删除列族并收到消息“列族 ID 不匹配”。

我尝试运行 nodetool repair,但修复完成后,我收到了相同的消息。然后我尝试从列族中进行选择,但收到消息“找不到列族”。

我运行以下查询以获取架构中所有列族的列表
select columnfamily_name from system.schema_columnfamilies where keyspace_name = 'xxx';
此时我收到了消息 “Keyspace 'system' not found.

我尝试了 describe keyspaces 命令,果然 system 不在键空间列表。

然后,我在缺少 system 键空间的节点之一上尝试了 nodetool resetlocalshema,当未能解决问题时,我尝试了 nodetool rebuild 但得到了重建完成后的相同消息。

我尝试停止缺少 system 键空间的节点并重新启动它们,一旦重新启动完成,system 键空间又回来了,我能够执行以上查询成功。但是,我之前尝试删除的表未列出,因此我尝试重新创建它并再次收到消息列族 ID 不匹配

最后,我关闭了集群并重新启动它......一切都按预期工作。

我的问题是:
系统密钥空间如何/为什么消失了?
当六个节点中的两个节点缺少系统键空间时,插入我的列族的数据发生了什么? (我的应用程序似乎没有任何问题)
有没有一种方法可以自动检测此类问题,或者我是否必须每天手动检查我的键空间?
有没有办法在不重新启动整个集群的情况下修复丢失的 system 键空间和/或 列族 ID 不匹配

编辑
根据 Jim Meyers 的建议,我在集群的每个节点上查询了 cf_id 并确认所有节点都返回相同的值。

从 system.schema_columnfamilies 中选择 cf_id,其中 columnfamily_name = 'customer' 允许过滤;

cf_id
--------------------------------------
cbb51b40-2b75-11e5-a578-798867d9971f

然后我在我的数据目录上运行 ls,可以看到我的一些表有多个条目
客户-72bc62d0ff7611e4a5b53386c3f1c9f9
客户-cbb51b402b7511e5a578798867d9971f

我的应用程序在运行时动态创建表(总是使用 IF NOT EXISTS),似乎应用程序同时在不同的节点上发出了相同的创建表命令,从而导致架构不匹配。 自从我重新启动集群后,一切似乎都运行良好。

删除多余的文件是否安全?
customer-72bc62d0ff7611e4a5b53386c3f1c9f9

【问题讨论】:

  • 请在此节点的数据目录中发布ls
  • 我认为可能。将发布您需要采取的修复措施。

标签: cassandra


【解决方案1】:

1 此问题的原因是 CREATE TABLE 语句冲突。不要从多个客户端动态生成表,即使使用 IF NOT EXISTS。您需要做的第一件事是修复您的代码,以免发生这种情况。只需从 cqlsh 手动创建表,让架构有时间解决。始终等待架构协议when modifying schema

2 这是解决方法:

1) 将您的代码更改为不自动重新创建表(即使使用 IF NOT EXISTS)。

2) 运行滚动重启以确保跨节点的架构匹配。在集群周围运行 nodetool describecluster。检查是否只有一个模式版本。

在每个节点上:

3) 检查你的文件系统,看看你的数据目录中是否有两个目录存放有问题的表。

如果有两个或更多目录:

4) 从 schema_column_families 中确定哪个 cf ID 是“新”ID(当前正在使用)。

cqlsh -e "select * from system.schema_column_families"|grep

5) 将数据从“旧”目录移动到“新”目录并删除旧目录。

6) 如果有多个“旧”目录,则对每个“旧”目录重复 5。

7) 运行 nodetool 刷新

如果只有一个目录:

无需进一步操作。

期货

架构冲突将继续成为一个问题,直到 - CASSANDRA-9424

这是一个发生在 Jira 上并以 not a problem CASSANDRA-8387 关闭的示例

【讨论】:

  • HI phact,这上面有开放的 jira 票吗?文档没有提到 create table if not exists 会受到竞争条件的影响,所以这似乎是一个错误。
  • 听起来目前最安全的做法是在自动创建模式时使用某种领导者选举或指定客户端。
  • IMO 指定客户端 + 在驱动程序上使用等待模式协议 API。
  • 请澄清第 5 步。我只是复制所有文件还是复制 Data.db 文件?另外,一旦数据被复制,我假设我可以删除旧目录,对吗?
  • 是的,将所有数据从“旧”目录移动到“新”目录并 rm 旧目录。
【解决方案2】:

当您在 Cassandra 中创建表时,会为其分配一个唯一 ID,该 ID 在所有节点上都应相同。不知何故,听起来您的表在所有节点上都没有相同的 id。我不确定这是怎么发生的,但可能是在创建表时出现了故障,并且它被创建了多次,等等。

创建表时应始终使用 IF NOT EXISTS 子句。

要检查您的 id 是否一致,请在每个节点上尝试:

  1. 在 cqlsh 中,运行“SELECT cf_id from system.schema_columnfamilies where columnfamily_name ='yourtablename' 允许过滤;

  2. 查看创建表的键空间名称下的数据目录。您应该会看到表的单个目录,类似于 table_name-cf_id。

如果一切正常,您应该在所有这些地方看到相同的 cf_id。如果你看到不同的,那么事情就会不同步。

系统键空间消失等其他症状除了您在软件中遇到某种错误之外,我没有其他建议。如果你得到很多像这样的奇怪症状,那么你可能有某种数据损坏。您可能需要考虑备份您的数据,以防万一出现问题并且您需要重建集群。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2022-08-20
    相关资源
    最近更新 更多