2017-10-09 19 views
0

Je suis actuellement bloqué avec des données manquantes en raison de changements dans la propriété data_file_directories.Fusion de tables après la modification d'un fichier data_file_directories

Il s'agit d'un problème à deux erreurs. Tout d'abord, nous avions des données dans /var/lib/cassandra/data sur un montage séparé, et tout allait bien.

Après une mise à niveau Cassandra (de 2.1 à 3.9), une erreur de configuration nous a fait changer le data_file_directories en [/var/lib/cassandra/data1, /var/lib/cassandra/data2].

On dirait que l'erreur est passée inaperçue jusqu'à ce que le répertoire /var soit complet. Cela nous a fait découvrir le problème, et après quelques nodetool removenode, le cluster est revenu ... mais avec presque 2 mois de données manquantes.

Je voudrais savoir s'il est possible d'obtenir ce data1 et data2 fusionné en data.

L'utilisation de nodetool snapshot n'est pas une option car nous ne pouvons pas revenir en arrière en utilisant data1 et data2 comme stockage de données.

Merci beaucoup pour votre aide, quoi que ce soit;)

Répondre

1

On dirait que vous avez dit que les anciens sstables étaient dans des répertoires différents, alors vous la config pour mis à jour cesser d'utiliser ces répertoires, et maintenant avec la configuration mise à jour vous n'avez plus accès aux données qui y ont été écrites, et vous souhaitez l'utiliser. Si les sstables sont disponibles, vous pouvez les copier dans le data_files_directories actuel et les charger dans le serveur avec nodetool refresh. Notez cependant que cela n'est pas sans risque, car cela risque de ressusciter les données supprimées et vous devez vous assurer de ne pas écraser les fichiers de même génération (identification numérique dans le nom de fichier).

0

Merci Jeff ... Je l'ai essayé mais il a échoué à la fin. Je ne sais pas si j'ai raté quelque chose.

Quoi qu'il en soit, il m'a été suggéré d'utiliser sstableloader, et faire cela semblait être un truc. IFever il peut aider, je l'ai écrit un petit script pour essayer de prendre soin de tous que:

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

Hope this helps

+0

S'il vous plaît noter que, pour 'sstableloader' fonctionne correctement, l'adresse et l'adresse écouter diffusion de votre cassandra.yaml doit être identique. –