App Engine - загрузка LocalDatastoreService - не удалось загрузить из резервного хранилища
Мы используем App Engine, Datastore и Java и безуспешно пытаемся скопировать наш производственный Google Datastore в локальную копию.
(Полный сценарий миграции, который я использую, подробно описан в отдельном вопросе Github)
Мы используем следующие для экспорта
gcloud datastore export --namespaces="(default)" gs://$GOOGLE_CLOUD_BUCKET
И затем импорт, который выглядит примерно так
'http://' + $LOCAL_DATASTORE_HOSTNAME + ':' + $LOCAL_DATASTORE_PORT + '/v1/projects/' + $PROJECT_ID + ':import'
При запуске сценария создается "local_db.bin", который кажется правильным, однако затем мы копируем его в требуемое место и запускаем, когда встречаем следующую ошибку.
com.google.appengine.api.datastore.dev.LocalDatastoreService init INFO: Инициализировано локальное хранилище данных: Тип: хранилище с высокой репликацией: \WEB-INF\appengine-генерируемый \local_db.bin com.google.appengine.api.datastore.dev. ИНФОРМАЦИЯ о загрузке LocalDatastoreService: Не удалось загрузить из резервного хранилища, \WEB-INF\appengine-генерируется \local_db.bin java.lang.ClassNotFoundException: com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub$FileProfile на java.net.URLClassLoader.findClass(URLClassLoader.java:382) в java.lang.ClassLoader.loadClass(ClassLoader.java:424)
Если мы затем сохраним новую запись, она уничтожит local_db.bin и создаст новую.
Кто-нибудь знает, где в процессе может быть эта проблема?
ОБНОВИТЬ:
Я следовал точному процессу, который @Chris Halcrow описывает в своем ответе, чтобы повторно импортировать данные. Данные теперь успешно импортируются непосредственно в local_db.bin, который должен видеть App Engine, однако я все еще вижу ошибку.
Мы подозреваем, что может быть проблема с разрешениями. Мы попытались изменить некоторые разрешения IAM для учетной записи, под которой работает AppEngine. В частности, мы попытались добавить роль IAM редактора проектов в учетную запись, которую мы используем для gcloud login
, как описано в активации разрешений хранилища данных для App Engine.
Мы также рассмотрели следующее: какие детали требуют разрешений при использовании скрипта Powershell для экспорта / импорта, подробно описанного в нашем вопросе GitHub.
https://cloud.google.com/datastore/docs/export-import-entities
Мы считаем, что наши текущие роли должны позволять необходимые разрешения, которые это описывает.
1 ответ
Не копируйте файл local_db.bin, так как это может привести к неправильным ссылкам / указателям на память. Вместо этого выполните следующую процедуру:
- Остановите свой локальный AppEngine (завершите работу в консоли или закройте Eclipse/IntelliJ или все, что у него работает)
- Остановите все, что запускает эмулятор хранилища данных (например, завершите процесс, если вы запускаете его через командную строку).
- Определите, где ваш работающий экземпляр AppEngine ищет файл local_db.bin (для приложения Java, которое вы запускаете в локальном экземпляре AppEngine, местоположение по умолчанию относится к каталогу, в котором содержится ваш файл WAR, например
C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\WEB-INF\appengine-generated\local_db.bin
) - Удалить содержимое
appengine-generated
папка - Откройте обычную командную строку Windows (запустите от имени администратора)
cd
в каталог, содержащий ваше приложение AppEngine- Запустите эмулятор, используя следующую команду (убедитесь, что
data-dir
указывает каталог, который вы определили на шаге 3) -gcloud beta emulators datastore start --data-dir=C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\
(см. https://cloud.google.com/datastore/docs/tools/datastore-emulator) - Запишите порт, на котором запускается эмулятор хранилища данных
- Убедитесь, что ваш скрипт импорта DataStore использует этот порт в качестве значения
$LOCAL_DATASTORE_PORT
- Если локальный эмулятор хранилища данных все еще работает, снова запустите сценарий импорта (для сценария Powershell убедитесь, что сценарий запускается при запуске Powershell от имени администратора).
- Если это успешно, вы должны увидеть сообщения в консоли, которые могут выглядеть как некоторые или все из следующих: INFO: Добавление обработчиков в недавно зарегистрированный канал. INFO: Обнаружено соединение HTTP/2. INFO: Обнаружено соединение не HTTP/2. Время до постоянное хранилище данных: 125 мс
- Теперь проверьте ваш файл local_db.bin, например
C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\WEB-INF\appengine-generated\local_db.bin
- вы должны увидеть, что он завышен, чтобы указать, что теперь он содержит ваши данные.