【问题标题】:error reading saved cache and system table while starting Cassandra启动 Cassandra 时读取保存的缓存和系统表时出错
【发布时间】:2012-08-07 06:55:08
【问题描述】:

我在运行 Cassandra Daemon 时遇到了以下异常。我从 1.2 主干运行。

WARN 14:47:51,038 error reading saved cache /home/manuzhang/cassandra/saved_caches/system-local-KeyCache-b.db
java.lang.NullPointerException
    at org.apache.cassandra.cache.AutoSavingCache.loadSaved(AutoSavingCache.java:141)
    at org.apache.cassandra.db.ColumnFamilyStore.<init>(ColumnFamilyStore.java:237)
    at org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:340)
    at org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:312)
    at org.apache.cassandra.db.Table.initCf(Table.java:332)
    at org.apache.cassandra.db.Table.<init>(Table.java:265)
    at org.apache.cassandra.db.Table.open(Table.java:110)
    at org.apache.cassandra.db.Table.open(Table.java:88)
    at org.apache.cassandra.db.SystemTable.checkHealth(SystemTable.java:284)
    at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:168)
    at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:318)
    at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:361)

这里是保存缓存的地方:

manuzhang@manuzhang-U24E:~/cassandra/saved_caches$ ls -l
total 12
-rw-rw-r-- 1 manuzhang manuzhang 156 Aug  7 13:09 system-local-KeyCache-b.db
-rw-rw-r-- 1 manuzhang manuzhang  60 Aug  7 13:09 system-schema_columnfamilies-KeyCache-b.db
-rw-rw-r-- 1 manuzhang manuzhang  60 Aug  7 13:09 system-schema_columns-KeyCache-b.db

另外,加载系统表文件失败。

ERROR 17:03:16,637 Fatal exception during initialization
org.apache.cassandra.config.ConfigurationException: Found system table files, but they    couldn't be loaded!
at org.apache.cassandra.db.SystemTable.checkHealth(SystemTable.java:303)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:201)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:349)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:392)

现在我能够重现每 3 次 Cassandra 运行的加载系统表故障(之后我会清理所有文件)。这里抛出异常:

/**
 * One of three things will happen if you try to read the system table:
 * 1. files are present and you can read them: great
 * 2. no files are there: great (new node is assumed)
 * 3. files are present but you can't read them: bad
 * @throws ConfigurationException
 */
public static void checkHealth() throws ConfigurationException
{
    Table table;
    try
    {
        table = Table.open(Table.SYSTEM_TABLE);
    }
    catch (AssertionError err)
    {
        // this happens when a user switches from OPP to RP.
        ConfigurationException ex = new ConfigurationException("Could not read system table!");
        ex.initCause(err);
        throw ex;
    }
    ColumnFamilyStore cfs = table.getColumnFamilyStore(LOCAL_CF);

    String req = "SELECT cluster_name FROM system.%s WHERE key='%s'";
    UntypedResultSet result = processInternal(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 table 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', '%s')";
        processInternal(String.format(req, LOCAL_CF, LOCAL_KEY, DatabaseDescriptor.getClusterName()));
        return;
    }

    String savedClusterName = result.one().getString("cluster_name");
    if (!DatabaseDescriptor.getClusterName().equals(savedClusterName))
        throw new ConfigurationException("Saved cluster name " + savedClusterName + " != configured name " + DatabaseDescriptor.getClusterName());
}

三个运行与评论中的三个条件完全对应。

第一次运行时“没有文件”,因为它是一个全新的节点。

在第二次运行中,“文件在那里,您可以阅读它们”。

在第三次运行中,“文件在那里,但您无法读取它们”,我检查了 result.isEmpty() 和 result.one.has("cluster_name") 都返回 false。

实际上,我对“无法加载”异常感到困惑。这是什么意思?我认为这不是文件系统权限问题,因为当前用户已授予 r/w 权限。

删除所有相关文件后,上述问题就消失了,但我不想每次运行 Cassandra 时都这样做。

这已经困扰了我很长一段时间。

一个不相关的问题是我认为 Cassandra@stackoverflow 没有得到社区足够的关注。你同意吗?

任何想法或建议将不胜感激。

谢谢。

【问题讨论】:

  • 为什么你运行的是 cassandra trunk,而不是发布的版本?
  • @sbridges 如果您按照 Cassandra wiki 下载代码库,您就会得到这样的结果;而且我还可以阅读一些新的东西,比如虚拟节点
  • 你能用官方版本重现你的问题吗,cassandra.apache.org/download
  • @sbridges 还没有尝试过。会有区别吗?即便如此,这也不能解决我的后备箱问题。
  • 尝试用已发布的版本重现它。我不知道主干有多稳定,但它很容易出现错误。

标签: cassandra


【解决方案1】:

我在 2 个场景中遇到过这个问题。

  1. 我尝试在不删除集群数据的情况下更改分区器(不能这样做)另请查看 mailing list 以获取说明。
  2. 我第一次以超级用户身份运行 cassandra 进程sudo ./cassandra 创建了必要的数据/日志/缓存目录,只有超级用户才有权限,然后重新启动 cassandra 并以普通用户身份运行该进程(以及因此无权使用超级用户运行的进程创建的目录中的文件)。

我知道您解决了问题,但这可能对其他开发人员有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2016-08-01
    • 2012-03-19
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多