Резервное копирование только одного контейнера будет трудной операцией в Riak.
Все решения сводятся к следующим двум шагам:
Перечислите все объекты в ведре.Это сложная часть, поскольку нигде в кластере Riak нет «манифеста» или списка содержимого ни одного сегмента.
Выполните GET для каждого из этих объектов изсписок выше, и запишите его в файл резервной копии.Эта часть, как правило, проста, хотя для максимальной производительности вы хотите убедиться, что вы выполняете эти GET параллельно, многопоточным образом и используете какой-то пул соединений.
КакЧто касается перечисления всех объектов, у вас есть один из трех вариантов.
Одним из них является выполнение операции «Ключи списка потоковой передачи» в сегменте по HTTP (например, /buckets/bucket/keys?keys=stream
) или по буферам протокола - подробности см. В http://docs.basho.com/riak/latest/dev/references/http/list-keys/ и http://docs.basho.com/riak/latest/dev/references/protocol-buffers/list-keys/.Ни при каких обстоятельствах не следует выполнять обычную операцию List Keys без потоковой передачи.(Это приведет к зависанию всего вашего кластера и, в конечном итоге, либо приведет к истечению времени ожидания, либо к сбою, когда количество ключей станет достаточно большим.)
Два - выполнить запрос вторичного индекса (2i), чтобы получить этот список объектов.См. http://docs.basho.com/riak/latest/dev/using/2i/ для обсуждения и предостережений.
И три из них будут, если вы используете Riak Search и можете извлечь все объекты с помощью одного поискового запроса с разбивкой по страницам.(Однако Riak Search имеет ограничение на количество запросов в 10 000 результатов, поэтому этот подход далеко не идеален).
В качестве примера автономного приложения, которое может создавать резервные копии одного сегмента, взгляните на Riak Data Migrator , экспериментальное приложение Java, использующее подход ключей потокового списка в сочетании с эффективными параллельными GET.