初始化期间发生致命异常 - cassandra服务无法启动

时间:2016-03-04 18:59:54

标签: cassandra datastax-enterprise cassandra-2.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服务。 Fatal exception during initialization

Versions
dse 4.8.2
Cassandra 2.1.11

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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)您可以尝试脱机运行scrub(sstablescrub,请记住它将编写您需要chown所需的root拥有的commitlog段当你完成)。如果这不起作用:

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