由于data_file_directories
属性的更改,我目前因缺少数据而陷入困境。
这是一个双错误问题。
首先,我们在/var/lib/cassandra/data
上有一个单独的挂载数据,一切都很好。
在cassandra升级后(从2.1到3.9),配置错误使我们将data_file_directories
更改为[/var/lib/cassandra/data1, /var/lib/cassandra/data2]
。
似乎错误在我们将/var
目录填满之前未被注意到。这使我们发现了这个问题,在一些nodetool removenode
之后,集群又回来了......但是有近2个月的数据缺失。
我想知道是否可以将data1
和data2
合并回data
。
使用nodetool snapshot
不是一个选项,因为我们无法再使用data1
和data2
作为数据存储。
非常感谢你的帮助,无论它是什么;)
答案 0 :(得分:1)
听起来你说旧的sstables在不同的目录中,然后你更新了配置以停止使用这些目录,现在使用更新的配置你不再能够访问那里写的数据,并且您想要使用它。
如果您有可用的sstables,可以将它们复制到当前data_files_directories
并使用nodetool refresh
将它们加载到服务器中。
但请注意,这并非没有风险 - 这样做可能会重新删除已删除的数据,并且您必须确保不会覆盖具有相同代码的任何文件(文件名中的数字ID)。
答案 1 :(得分:0)
谢谢杰夫......我试过但最终失败了。不确定我是否错过了什么。
无论如何,我被建议使用sstableloader
,并且这样做似乎就可以了。我觉得它可能会有所帮助,我写了一个小脚本试图照顾所有这些:
#!/bin/sh
DATADIRS=/var/lib/cassandra/data1
KEYSPACES="keyspace1 keyspace2"
NODES=192.168.10.21,192.168.10.22
backup=1
exec_cmd=""
test_mode=0
while [ "$#" != "0" ] ; do
case ${1} in
-nb|-nobackup|--nb|--no-backup)
backup=0
;;
-t|-test|--t|--test)
exec_cmd=echo
test_mode=1
;;
-x)
set -x
;;
*)
echo Unknown option ${1}, ignoring it.
;;
esac
shift
done
echo Started at : `date`
for keyspace in ${KEYSPACES} ; do
for datadir in ${DATADIRS} ; do
# Create backup dir if needed.
if [ "${backup}" = "1" ] ; then
${exec_cmd} mkdir -p ~/cassandra/`basename ${datadir}`/${keyspace}
fi
# Get the list of tables.
kstables=`find ${datadir}/${keyspace} -maxdepth 1 -mindepth 1 -type d`
# Now load tabled within active cassandra nodes.
for d in ${kstables} ; do
echo $d : `date`
# Cannot use exec_cmd because of the pipe in the command.
if [ "${test_mode}" = "1" ] ; then
echo nice -n 10 sstableloader -d ${NODES} $d \> /dev/null
else
${exec_cmd} nice -n 10 sstableloader -d ${NODES} $d >/dev/null
fi
# Backup table dir if needed
if [ "${backup}" = "1" ] ; then
${exec_cmd} mv $d ~/cassandra/data1/${keyspace}
else
${exec_cmd} rm -rf $d
fi
done
done
done
echo Finished at : `date`
希望这有帮助