【问题标题】:cassandra snapshot : Unable to create hard link from errno 1cassandra 快照:无法从 errno 1 创建硬链接
【发布时间】:2014-02-23 12:46:14
【问题描述】:

我在 ubuntu 12.4 中使用 cassandra 1.2.8。

我已经使用了快照命令并且备份过程是好的!

但是现在当我使用这个命令时,我得到如下错误:

   Exception in thread "main" FSWriteError in /var/lib/cassandra/data/english/word_doc  /snapshots/1393155090911/english-word_doc-ic-10-Index.db
at org.apache.cassandra.io.util.FileUtils.createHardLink(FileUtils.java:80)
at org.apache.cassandra.io.sstable.SSTableReader.createLinks(SSTableReader.java:1063)
at org.apache.cassandra.db.ColumnFamilyStore.snapshotWithoutFlush(ColumnFamilyStore.java:1566)
at org.apache.cassandra.db.ColumnFamilyStore.snapshot(ColumnFamilyStore.java:1611)
at org.apache.cassandra.db.Table.snapshot(Table.java:194)
at org.apache.cassandra.service.StorageService.takeSnapshot(StorageService.java:2205)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:74)
at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:277)
at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:112)
at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:46)
at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:226)
at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138)
at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:253)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:856)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:805)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1476)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:98)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1317)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1409)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:839)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:679)
  Caused by: java.io.IOException: Unable to create hard link from /var/lib/cassandra/data/english/word_doc/english-word_doc-ic-10-Index.db to /var/lib/cassandra/data/english/word_doc/snapshots/1393155090911/english-word_doc-ic-10-Index.db (errno 1)
at org.apache.cassandra.utils.CLibrary.createHardLink(CLibrary.java:174)
at org.apache.cassandra.io.util.FileUtils.createHardLink(FileUtils.java:76)
... 40 more

注意:我当前的数据库是我在 cassandra 中恢复的备份版本!

感谢您的帮助:)

编辑:我有两个密钥空间,A 和 B。B 是一个备份版本,我可以在其上恢复并存储更多数据,但 A 不是。我可以毫无问题地从 A 创建备份,但是对于 B,我得到了上述错误!

【问题讨论】:

  • 源文件和目标文件在同一个分区吗?
  • 是的,只有一个节点
  • 您可以尝试以 Cassandra 运行的用户身份运行此命令,看看是否有错误? ln /var/lib/cassandra/data/english/word_doc/english-word_doc-ic-10-Index.db /var/lib/cassandra/data/english/word_doc/snapshots/1393155090911/english-word_doc-ic-10-Index.db
  • @psanford 的意思是如果他们在同一个FS partition 上。但是,由于禁用硬链接访问保护解决了您的问题,这似乎是文件所有权问题,而不是分区问题。

标签: cassandra errno


【解决方案1】:

这似乎是硬链接上的 ubuntu 12.04 安全问题。

使用此命令禁用它:

sudo sysctl -w kernel.yama.protected_nonaccess_hardlinks=0

恢复后,将其重置为原始值:

sudo sysctl -w kernel.yama.protected_nonaccess_hardlinks=1

【讨论】:

  • 以防万一,请记住在拍摄快照后恢复此设置:sudo sysctl -w kernel.yama.protected_nonaccess_hardlinks=1
  • 这可能不是真正的解决方案。见the answer我刚刚添加。
【解决方案2】:

在再次解决这个问题后,我发现我在/var/lib/cassandra/data/.../etcetera 中有一些 root 拥有的文件,这触发了硬链接访问限制。

递归chown/var/lib/cassandra/data 中的所有目录和文件解决了这个问题。

【讨论】:

  • 你使用的是 ubuntu 12.04 吗?我测试了你之前说的,但对我没有用...
  • @طاهر 我在 Ubuntu 12.04 和 14.04 中都遇到了这个问题,这两种情况的根本原因是存在不是用户 cassandra 拥有的文件(在其下发生快照),而是 root (或其他任何事情),这排除了与新内核安全规则的硬链接。如果您的数据目录中没有任何非 cassandra 文件,那么我的修复不会对您产生任何影响。
猜你喜欢
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多