Ненавижу быть убийцей, но процесс резервного копирования не так прост, как копирование sstables.Вам необходимо отслеживать, какие узлы фактически генерировали конкретный SSTable (или снимок, содержащий его).
Вам необходимо:
Резервное копирование
- Создать снимок для каждого узла в кластере
- Создать файлкоторый хранит, какие токены принадлежат какому узлу (
nodetool ring
или nodetool info -T
) - Резервное копирование схемы (вы уже делаете это)
Восстановление:
- Создайте новый кластер с тем же числом узлов, что и кластер, для которого вы хотите восстановить
- Для каждого узла в новом кластере настройте initial_token в cassandra.yaml длятокены, полученные на шаге 2 на этапе резервного копирования. (на каждом узле)Пример этого:
initial_token: 1, 2
- Убедитесь, что каталог данных Cassandra пуст
rm /var/lib/cassandra/data
(на каждом узле) - Запустите все узлы в кластере
- Создайтесхема, которую вы зарезервировали.
- Скопируйте sstables из последнего снимка в каталог данных Cassandra (на каждом узле)
- Запустите
nodetool refresh
, чтобы Cassandra загрузила вновь скопированные данные.(на каждом узле)
Быстрый пример с токенами (это может сбивать с толку): допустим, кластер имеет 3 узла, а каждый узел имеет 2 виртуальных токена, поэтому диапазон составляет 1-6.Определенные токены распределены по определенным узлам, самый простой способ убедиться в этом - использовать:
$ nodetool ring
Datacenter: datacenter1
==========
Address Rack Status State Load Owns Token
6
127.0.0.1 rack1 Up Normal 156.55 MiB 33.33% 1
127.0.0.1 rack1 Up Normal 156.55 MiB 33.33% 2
127.0.0.2 rack1 Up Normal 156.54 MiB 33.33% 3
127.0.0.2 rack1 Up Normal 156.54 MiB 33.33% 4
127.0.0.3 rack1 Up Normal 156.55 MiB 33.33% 5
127.0.0.3 rack1 Up Normal 156.55 MiB 33.33% 6
При восстановлении из моментального снимка мне потребуется установить следующий initial_token для каждого узла:
# node 127.0.0.1's cassandra.yaml
initial_token: 1,2
# node 127.0.0.2's cassandra.yaml
initial_token: 3,4
# node 127.0.0.3's cassandra.yaml
initial_token: 5,6
Обычно это автоматизировано, поскольку для виртуальных токенов по умолчанию установлено значение 256.