开始通过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服务?
答案 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
)。