1

开始通过 opscenter 修复整个集群,一个节点出现以下错误。

ERROR [CompactionExecutor:530] 2016-03-04 18:25:39,893  CassandraDaemon.java:227 - Exception in thread Thread[CompactionExecutor:530,1,main]
java.lang.AssertionError: /data/cass_data/data/system/local-7ad54392bcdd35a684174e047860b377/system-local-ka-3046-Data.db
        at org.apache.cassandra.io.sstable.SSTableReader.getApproximateKeyCount(SSTableReader.java:268) ~[cassandra-all-2.1.11.908.jar:2.1.11.908]
        at org.apache.cassandra.db.compaction.CompactionTask.runMayThrow(CompactionTask.java:151) ~[cassandra-all-2.1.11.908.jar:2.1.11.908]
        at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) ~[cassandra-all-2.1.11.908.jar:2.1.11.908]
        at org.apache.cassandra.db.compaction.CompactionTask.executeInternal(CompactionTask.java:73) ~[cassandra-all-2.1.11.908.jar:2.1.11.908]
        at org.apache.cassandra.db.compaction.AbstractCompactionTask.execute(AbstractCompactionTask.java:59) ~[cassandra-all-2.1.11.908.jar:2.1.11.908]
        at org.apache.cassandra.db.compaction.CompactionManager$BackgroundCompactionCandidate.run(CompactionManager.java:262) ~[cassandra-all-2.1.11.908.jar:2.1.11.908]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_60]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_60]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_60]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_60]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]

试图杀死进程 id 并启动 dse 服务,得到以下错误并且没有启动 cassandra 服务。 初始化期间的致命异常

Versions
dse 4.8.2
Cassandra 2.1.11

可能是什么问题呢?运行修复如何停止 cassandra 服务?

4

2 回答 2

3

您的系统密钥空间已损坏。从第一个错误开始,似乎某些表数据也已损坏。因此,您的磁盘/文件系统可能存在一些问题。要让节点重新启动,您需要从最近的备份中恢复系统密钥空间,或者删除系统密钥空间文件夹,确保您在 cassandra.yaml 中设置了令牌,然后您应该能够启动节点,它将重新创建它。

于 2016-03-04T19:15:10.913 回答
1

正在执行的代码非常简单:

    Keyspace keyspace;
    try
    {
        keyspace = Keyspace.open(Keyspace.SYSTEM_KS);
    }
    catch (AssertionError err)
    {
        // this happens when a user switches from OPP to RP.
        ConfigurationException ex = new ConfigurationException("Could not read system keyspace!");
        ex.initCause(err);
        throw ex;
    }

    ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(LOCAL_CF);

    String req = "SELECT cluster_name FROM system.%s WHERE key='%s'";
    UntypedResultSet result = executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY));

    if (result.isEmpty() || !result.one().has("cluster_name"))
    {
        // this is a brand new node
        if (!cfs.getSSTables().isEmpty())
            throw new ConfigurationException("Found system keyspace files, but they couldn't be loaded!");

        // no system files.  this is a new node.
        req = "INSERT INTO system.%s (key, cluster_name) VALUES ('%s', ?)";
        executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), DatabaseDescriptor.getClusterName());
        return;
    }

它能够打开system密钥空间,然后尝试从中读取system.local,但失败了。这意味着 system.local 表/数据丢失或损坏。

sstable 被打印出来,所以我们知道它在磁盘上。它有-ka-版本控制,所以我们知道它是 2.1。下一个最可能的选择是它以某种方式损坏 - 测试损坏似乎应该很容易,但在 2.1 的许多版本中,校验和(-Digest.sha1文件)实际上是 adler32 校验和(不是 sha1),而且,它可能不适合压缩sstables(如 system.local 表)。因此,检查腐败将是困难的。

我相信你有两个可行的选择:

1)您可以尝试脱机运行擦洗(请sstablescrub记住,它将编写一个根拥有的提交日志段,您chown在完成时需要该段)。如果这不起作用:

2)您可以擦除系统密钥空间,并将节点重新加入集群(有或没有replace_address)。

于 2016-03-04T19:17:31.457 回答