App Engine - загрузка LocalDatastoreService - не удалось загрузить из резервного хранилища - PullRequest
4 голосов
/ 07 марта 2019

Мы используем 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.чтобы загрузить из резервного хранилища, \ 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 и создает новый.

Кто-нибудь знает, где в процессе может быть эта проблема?

ОБНОВЛЕНИЕ:

Я следовал точному процессу, который @Крис Хэлкроу описывает в своем ответе повторный импорт данных.Данные теперь успешно импортируются непосредственно в local_db.bin, который должен видеть App Engine, однако я все еще вижу ошибку.

Мы подозреваем, что может быть проблема с разрешениями.Мы попытались изменить некоторые разрешения IAM для учетной записи, под которой работает AppEngine.В частности, мы попытались добавить роль IAM редактора проектов в учетную запись, которую мы используем для нашего gcloud login, как описано в , активировать разрешения хранилища данных для App Engine .

We 'Мы также рассмотрели следующее: какие детали требуют разрешений при использовании скрипта Powershell для экспорта / импорта, подробно описанного в нашем вопросе GitHub.

https://cloud.google.com/datastore/docs/export-import-entities#permissions

Мы считаем, что наши текущие роли должны позволятьнеобходимые разрешения, которые это описывает.

1 Ответ

2 голосов
/ 02 апреля 2019

Не копируйте файл local_db.bin, так как это может привести к неправильным ссылкам / указателям на память.Вместо этого следуйте следующей процедуре:

  1. Остановите локальный AppEngine (завершите работу в консоли или закройте Eclipse / IntelliJ или все, что у него работает)
  2. Остановите все, что работает в эмуляторе DataStore(например, завершите процесс, если вы запускаете его через командную строку).
  3. Определите, где ваш работающий экземпляр 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)
  4. Удалить содержимое папки appengine-generated
  5. Открыть обычную командную строку Windows (запуск от имени администратора)
  6. cd в каталоге, содержащемваше приложение AppEngine
  7. Запустите эмулятор, используя следующую команду (убедитесь, что 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#starting_the_emulator)
  8. Обратите внимание напорт, на котором запускается эмулятор DataStore
  9. Убедитесь, что ваш скрипт импорта DataStore использует этот порт в качестве значения $LOCAL_DATASTORE_PORT
  10. Когда ваш локальный эмулятор DataStore все еще работает, снова запустите сценарий импорта (для сценария Powershell убедитесь, что вы запускаете сценарий при запуске Powershell от имени администратора)
  11. В случае успеха вы должны увидетьсообщения в консоли, которые могут выглядеть как некоторые или все из следующих: INFO: добавление обработчиков в недавно зарегистрированный канал. INFO: обнаруженное соединение HTTP / 2. INFO: обнаруженное соединение не HTTP / 2. Время для сохранения хранилища данных: 125 мс
  12. Теперь проверьте ваш файл local_db.bin, например C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\WEB-INF\appengine-generated\local_db.bin - вы должны увидеть, что он завышен, чтобы показать, что теперь он содержит ваши данные.
...