Каков наилучший способ резервного копирования данных в Google App Engine?
Google сам предлагает два решения.
http://code.google.com/appengine/docs/python/tools/uploadingdata.html
Один из них является новым и экспериментальным и требует, чтобы вы запускали отдельную команду (и отдельно вводили свое имя пользователя и пароль) для каждого типа данных, которые вы хотите создать резервную копию.
Другой требует, чтобы вы дважды записывали информацию о структуре всех видов ваших данных, информацию, которая уже неявна в вашем файле моделей. (У нас есть 25 различных типов данных, поэтому я чувствителен к подобным вещам. Плюс это будет означать, что будущие изменения должны быть сделаны в 3-х местах.)
Тогда есть решение Aral Balkan (google для "gaebar" ), но его код в Github не обновляется примерно через год, и он дополнительно сообщает людям о внесении некоторых изменений в внутренние компоненты App Engine (что кажется рискованным, поскольку они меняются в каждой версии).
Я думаю, что я склоняюсь к не экспериментальному решению Google, но все они кажутся довольно плохими.
Ответы
Ответ 1
Вот более явное описание bulkloader.py no-config для резервного копирования и восстановления. Я не знаю, когда возникает эта проблема (переполнение стека).
Удаление данных из fooapp в файл с именем dump1.bin:
python2.5 /usr/local/google_appengine/bulkloader.py \
--dump --url http://fooapp.appspot.com/remote-api-url \
--filename dump1.bin
У вас должен быть включен удаленный API. remote-api-url
может быть _ah/remote_api
в зависимости от вашей конфигурации.
Загрузка данных из dump1.bin в локальный экземпляр dev:
python2.5 /usr/local/google_appengine/bulkloader.py \
--restore --url http://localhost:8080/remote-api-url \
--filename dump1.bin --application fooapp
Это предполагает UNIX-подобную систему и что appengine устанавливается в /usr/local/google _appengine.
Я не знаю, работает ли он с Java, но это может быть.
Ответ 2
Посмотрите AppRocket (механизм репликации с открытым исходным кодом, который синхронизирует хранилище данных Google App Engine и базу данных MySQL). Проект кажется активным.
Ответ 3
Что не так с функциональностью --dump? Да, вы должны загружать каждый вид отдельно, но это будет иметь место с любым решением. Если вам просто нужны резервные копии, это точно соответствует вашим требованиям.