Статьи

Восстановление Cassandra Priam Backup с помощью sstableloader

Ранее я писал о настройке Cassandra и Priam для резервного копирования и управления кластером. Однако приведенный мною пример для восстановления из резервной копии не применим в каждой ситуации — например, он может не работать на совершенно отдельном кластере. Или в случае частичного восстановления только одной таблицы, а не всей базы данных.

В таких случаях вы можете выполнить восстановление с помощью утилиты sstableloader . Он имеет простой синтаксис:

1
2
3
sudo sstableloader -d 172.35.1.2,172.35.1.3 -ts /etc/cassandra/conf/truststore.jks \
   -ks /etc/cassandra/conf/node.jks -f /etc/cassandra/conf/cassandra.yaml  \
    ~/keyspacename/table-0edcc420c19011e7a8c37656dd492a94

Если вы посмотрите на сгенерированную Priam резервную копию, похоже, что вы можете просто скопировать файлы (например, через s3 aws cp на AWS) для конкретных таблиц и импортировать их с помощью sstableloader. Однако есть одна загвоздка. Чтобы сэкономить место, Priam использует Snappy для сжатия всех файлов. Поэтому, если вы попытаетесь передать их какой-либо утилите Cassandra, она будет жаловаться, что они повреждены.

Поэтому вы должны распаковать их перед использованием sstableloader или чего-либо еще. Но как? Что ж, Priam предлагает услугу для этого — вы вызываете его, передавая абсолютный путь к сжатому файлу и абсолютный путь к месту, где должен быть размещен несжатый файл, и он выполняет простую работу по потоковой передаче оригинала через декомпрессор. Для распаковки всей резервной копии я написал скрипт на python. Он предполагает определенную структуру, но вы можете параметризовать его, чтобы сделать его более гибким. Вот код (извините за неидиоматический Python, я использую его только для простых сценариев):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
#! /usr/bin/env python
# python script used to pass each backup file through the decompression facility of Priam (using Snappy)
# so that it can be used with sstableloader for restore
import os
import requests
 
rootdir = '/home/ec2-user/backup'
target = '/home/ec2-user/keyspace'
 
for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        fullpath = os.path.join(subdir, file)
        parent = os.path.join(fullpath, os.pardir)
        table = os.path.basename(os.path.abspath(parent))
        targetdir = target + "/" + table + "/"
        if not os.path.exists(targetdir):
            os.makedirs(targetdir)
 
        url = 'http://localhost:8080/Priam/REST/v1/cassadmin/decompress?in=' + fullpath + '&out=' + target + "/" + table + "/" + file
        print(url)
        requests.get(url)

Теперь у вас есть распакованные резервные файлы, которые вы можете восстановить с помощью sstableloader. Это может занять некоторое время, если у вас много данных, и вы не должны запускать восстановление в то же время, когда выполняется резервное копирование моментального снимка, так как это может дать сбой (было предупреждено документацией).

И тогда, если вам повезет, все пройдет. К сожалению, бывают случаи, когда это не так. Этот инструмент далек от совершенства, поэтому, например, если вы удалили столбец, восстановление старого sstable не удастся, так как он попытается вставить его в отсутствующий столбец. Это звучит как большая проблема для реальных производственных систем, и об этом сообщалось, но еще не решено . Иногда таблица может просто не восстановиться по неизвестным причинам (сбой во время потоковой передачи, предполагаемые поврежденные данные). В этих случаях вы можете захотеть вывести sstables в JSON, используя sstabledump, а затем преобразовать JSON в CQL, чтобы вставить его. Конечно, нет никакого инструмента для этого, поэтому вот один, написанный на Java . Он не идеален и не поддерживает пользовательские типы, наборы и карты. Обратите внимание, что это, вероятно, не очень хорошая идея для больших таблиц, только для небольших.

Как общее замечание в заключение, очень важно иметь резервные копии, но гораздо важнее иметь возможность восстановить их. Резервное копирование бесполезно, если у вас нет процедуры восстановления. И просто наличие доступных инструментов (например, Priam) не означает, что вы можете выполнить процедуру восстановления, готовую к выполнению. Вы должны выполнять тестовое восстановление активных промежуточных данных, а также полное восстановление в пустом, недавно сформированном кластере, поскольку существуют разные сценарии восстановления.

Опубликовано на Java Code Geeks с разрешения Божидара Божанова, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Восстановление Cassandra Priam Backup с помощью sstableloader

Мнения, высказанные участниками Java Code Geeks, являются их собственными.