2017-10-09 63 views
0

由於data_file_directories屬性中的更改,我目前因缺少數據而停滯不前。在data_file_directories更改後合併表

這是一個雙錯誤問題。

首先,我們在/var/lib/cassandra/data的數據在一個分離的安裝,並且一切都很好。

一個卡桑德拉昇級(2.1〜3.9),連接錯誤在配置完成後,使我們改變data_file_directories[/var/lib/cassandra/data1, /var/lib/cassandra/data2]

似乎錯誤沒有被注意到,直到/var目錄已滿。這使我們發現了這個問題,並且在一些nodetool removenode之後,該集羣回來了......但是有近2個月的缺失數據。

我想知道是否有可能得到data1data2合併回data

使用nodetool snapshot不是一種選擇,因爲我們不能回到使用data1data2作爲數據存儲。

非常感謝您的幫助,不管它是什麼;)

回答

1

這聽起來像你說的老sstables分別在不同的目錄,那麼你更新了配置停止使用這些目錄,現在用您更新後的配置不再有權訪問寫在那裏的數據,並且您想使用它。

如果您有可用的sstable,則可以將它們複製到當前的data_files_directories中,並將它們加載到服務器中,使用nodetool refresh

但是,請注意,這並非沒有風險 - 這樣做可能會重新刪除已刪除的數據,並且您必須確保不會覆蓋具有相同代的任何文件(文件名中的數字ID)。

0

謝謝傑夫......我試過了,但最終失敗了。不知道我是否錯過了一些東西。

無論如何,我被建議使用sstableloader,並且這樣做似乎有伎倆。 Ifever它可以幫助,我寫了一個小腳本來嘗試採取所有的護理:

#!/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` 

希望這有助於

+0

請注意,對於'sstableloader'正常工作,監聽地址和廣播地址你的cassandra.yaml必須是相同的。 –