在data_file_directories更改后合并表

时间:2017-10-09 15:05:58

标签: merge storage restore cassandra-3.0

由于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个月的数据缺失。

我想知道是否可以将data1data2合并回data

使用nodetool snapshot不是一个选项,因为我们无法再使用data1data2作为数据存储。

非常感谢你的帮助,无论它是什么;)

2 个答案:

答案 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`

希望这有帮助