Реалистичный метод резервного копирования данных для Parse.com

Мы создаем приложение для iOS с Parse.com, но до сих пор не можем найти правильный способ эффективного резервного копирования данных.

В качестве предпосылки у нас есть и будет МНОГО строк хранилища данных. Скажем, у нас есть класс с 1 миллионом строк, предположим, что у нас есть его резервная копия, а затем мы хотим вернуть его в Parse после опасной ситуации (например, потери данных на производстве).

Несколько решений, которые мы рассмотрели, следующие:

1) Использовать внешний сервер для резервного копирования

Резервное копирование: - используйте REST API для постоянного резервного копирования данных на удаленный сервер MySQL (мы выбрали MySQL для целей индивидуальной аналитики, так как для нас гораздо быстрее и проще обрабатывать данные с помощью MySQL)

ImportBack: а) — воссоздать объекты JSON из резервной копии MySQL и использовать REST API для отправки обратно в Parse. Скажем, мы используем пакетную операцию, которая позволяет одновременно создавать 50 объектов с помощью 1 запроса, и предположим, что на каждый запрос требуется 1 секунда, 1 миллион наборов данных будет передан в Parse за 5,5 часов.

б) - воссоздать один файл JSON из резервной копии MySQL и использовать панель инструментов для импорта данных вручную. Мы только что попробовали этот метод с файлом из 700 000 записей: потребовалось около 2 часов, чтобы индикатор загрузки остановился и показал количество строк на левой панели, но теперь он никогда не открывается на правой панели (он говорит «время работы истекло» ) и прошло более 6 часов с момента начала загрузки.

Таким образом, мы не можем полагаться на 1.b, а восстановление 1.a после аварии занимает слишком много времени (если у нас есть 10 миллионов записей, это будет примерно 55 часов = 2,2 дня).

Сейчас мы думаем о следующем:

2) Постоянно копировать данные в другое приложение

Создайте следующее в Parse: - Рабочее приложение: A - Приложение для репликации: B Таким образом, пока A находится в производстве, каждый отдельный запрос будет дублироваться в B (постоянно используя фоновое задание). Недостатком, конечно же, является то, что он съест предел пакета A, поскольку он просто удвоит количество запросов. Так что не идеально думать о масштабировании.

Нам нужно что-то вроде AWS RDS, которое дает возможность ежедневного автоматического резервного копирования. Интересно, как это может быть сложно для Parse, поскольку он основан на инфраструктуре AWS.

Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи по этому поводу, буду рад поделиться ноу-хау.

P.S.:

Мы заметили важный недостаток в приведенной выше 2) идее.

Если мы реплицируем с помощью REST API, все идентификаторы объектов всех классов будут изменены, поэтому все отношения 1to1 или 1toMany будут нарушены.

Поэтому мы думаем о том, чтобы поместить uuid для каждого класса объектов.

Есть ли проблемы с этим методом? Одна вещь, которую мы хотим достичь, это query.include("ObjectName") (или в Obj-C "includeKey"), но я полагаю, что это будет невозможно, если мы не будем основывать логику нашего приложения на objectId.

Ищете обходной путь для этой проблемы; но будет ли управление на основе UUID работать в логике хранилища данных Parse?


person dcc    schedule 09.07.2014    source источник


Ответы (5)


Parse никогда не терял производственных данных. Хотя мы в настоящее время не предлагаем автоматическое резервное копирование, вы можете запросить его в любое время, и мы работаем над тем, чтобы сделать все это еще лучше. Кроме того, в большинстве случаев проще импортировать файл экспорта JSON через браузер данных, чем с помощью пакета REST.

person Fosco    schedule 09.07.2014
comment
Тот факт, что вы никогда не теряли данные, не означает, что вы никогда не потеряете данные. - person Pier-Luc Gendreau; 09.07.2014
comment
Мы также делаем резервные копии на случай, если это когда-нибудь произойдет. Вам не нужно будет восстанавливать в этом случае (но все же хорошо хранить резервные копии, даже если только для других целей, таких как загрузка/работа с данными в другом месте). - person Fosco; 09.07.2014
comment
привет Фоско, спасибо за ваше продолжение. Пожалуйста, уточните следующее: в случае, если мы потеряем наши данные в Parse DataStore (из-за человеческих ошибок, хакерских атак или по любой другой причине), можем ли мы, например, написать/позвонить вам по электронной почте и попросить о немедленном восстановлении из ваших резервных копий? Как часто вы выполняете резервное копирование в DataStore (сколько лет будет восстановленный набор данных?). Если мы не знаем об этом, я не думаю, что разработчики могут полагаться на это, поэтому, пожалуйста, будьте более точны в деталях. - person dcc; 14.07.2014
comment
Нет, в настоящее время мы не восстанавливаем по запросу или для исправления ошибок разработчика/приложения... только в том маловероятном случае, когда Parse потеряет данные. Не совсем уверен в частоте, но предположил бы, что это больше, чем ежедневно. - person Fosco; 14.07.2014
comment
Спасибо, Фоско. Я ценю, что вы нашли время, чтобы ответить на этот вопрос. Я был бы признателен, если бы вы могли указать более точную частоту резервного копирования (не могли бы вы еще раз уточнить у ответственных лиц?). И, пожалуйста, имейте в виду, что эта функция восстановления по требованию будет ОЧЕНЬ БОЛЬШИМ плюсом для тех, кто планирует использовать Parse для производства. Так что буду с нетерпением ждать реализации... - person dcc; 14.07.2014
comment
Для разработчика приложения это БОЛЬШОЙ пробел. Пользователи должны иметь возможность получить резервную копию данных. Возможно, ограничьте количество экземпляров резервного копирования. Платите больше, чтобы получить больше резервных копий. - person Ichibanpanda; 05.12.2014
comment
В удивительной в других отношениях системе управления пользователями (Parse) ОЧЕНЬ серьезным недостатком является то, что не дается осмысленный способ восстановления поврежденной базы данных пользователей. Даже если Parse не потеряет мои пользовательские данные, вполне вероятно, что я как разработчик все испорчу. Прямо сейчас я полностью летаю без сети, когда вношу изменения в свой код управления пользовательскими данными. Метод импорта JSON нереалистичен. По крайней мере, насколько я могу судить, нет способа восстановить отношения, которые связаны с пользовательскими данными (восстановление дампов наивным способом не похоже). - person Mark Watkins; 31.01.2015
comment
Тот факт, что Parse до сих пор не предлагает полноценного решения для резервного копирования/восстановления, ужасает и совсем не внушает уверенности в возможности масштабирования для больших приложений. Учитывая такое положение вещей, кто в здравом уме станет основывать приложение на Parse, если они надеются охватить миллионы пользователей? Отсутствие четкого ответа на этот вопрос даже от сотрудников Parse также ужасает. Я назначил награду за этот вопрос на случай, если ответ еще не появился. - person Jack Senechal; 23.07.2015
comment
Возможности полного резервного копирования/восстановления по-прежнему нет? - person cavalcade; 11.12.2015
comment
Вскоре? Такая же история уже много лет. Совершенно немыслимо, что до сих пор нет возможности автоматизировать резервное копирование ваших данных разбора. - person hermanschutte; 13.01.2016
comment
Это не так уж немыслимо, когда у вас 600 000 приложений... но серьезно, примерно через неделю будет что-то новое. - person Fosco; 23.01.2016

Я могу подтвердить, что сегодня Parse потерял мои данные. Или, по крайней мере, так казалось.

После нескольких ошибок, обнаруженных в нескольких приложениях (по согласованию с учетной записью Parse Status в Твиттере), мы не смогли получить данные для приложения без каких-либо ошибок.

Это произошло потому, что исчез целый столбец одного из наших классов (указатель типа), и данных больше не было на панели инструментов.

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

Поэтому мы решили воссоздать столбец вручную. Случайно воссоздание столбца с тем же именем и типом решило проблему, и данные все еще были там ... Я не могу это объяснить, но я действительно подумал, и приложение отреагировало так, как если бы данные были потеряны.

Таким образом, опция автоматического резервного копирования и восстановления является обязательной, а не опциональной.

person vpx    schedule 20.12.2014
comment
спасибо, что поделились своим опытом, это очень ценный анекдот для всех пользователей Parse. Знаете ли вы, собирается ли Parse внедрить функцию автоматического резервного копирования и восстановления даже для Enterprise? - person dcc; 28.12.2014
comment
Честно говоря, ваше первоначальное заявление о том, что Parse потерял ваши данные, полностью противоречит исходу вашей истории. Данные не волшебные, поэтому возвращаемые данные показывают, что они были там все время. Похоже, что произошел сбой, из-за которого столбец был скрыт, но не данные были потеряны. Это не спор о резервном копировании данных, просто вы на самом деле не сталкивались с потерей данных. - person mbm29414; 10.01.2015
comment
Здравствуйте, как я уже сказал, приложение отреагировало так, как будто данные были потеряны. Я был счастлив получить его обратно. Но этот сбой показывает, что возможны ошибки, и, если ошибка возможна, может потребоваться резервное копирование для восстановления после потери данных или просто для возможности переноса или синхронизации данных. - person vpx; 15.01.2015
comment
На самом деле, если это уже произошло или нет, резервное копирование должно быть возможно для любого приложения или сервера. Человеческая ошибка, стихийное бедствие или отказ оборудования всегда возможны. - person vpx; 15.01.2015

В декабре 2015 года parse.com выпустил новую панель инструментов с улучшенной функцией экспорта. Просто выберите свое приложение, нажмите «Настройки приложения» -> «Общие» -> «Экспорт данных приложения». Parse создает json-файл для каждого класса в вашем приложении и отправляет вам электронное письмо, если экспорт-прогресс выполнен.

анализ экспорта


ОБНОВИТЬ:

Грустно, но факт: parse.com закрывается: http://blog.parse.com/announcements/moving-on/

person Blank    schedule 08.01.2016
comment
Тем не менее, это ручной процесс. Поэтому, если вы не будете делать это каждый день, вы можете столкнуться с проблемами. Единственный другой вариант — использовать JSON API для самостоятельной реализации функций резервного копирования. - person hermanschutte; 13.01.2016

У меня была такая же проблема с резервным копированием данных сервера синтаксического анализа. Поскольку сервер синтаксического анализа использует mongodb, поэтому резервное копирование данных не является проблемой, я только что сделал простую вещь. загрузил резервную копию mongodb с сервера. А затем восстановил его с помощью

mongorestore /path-to-mongodump (извлеченные файлы)

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

person Debugger    schedule 19.01.2017

Для случайных удалений сработает написание облачной функции «beforedelete» для резервного копирования текущей строки в другой класс.

Для регулярного резервного копирования будет полезен ручной экспорт измененных записей (используйте фильтр). Для восстановления требуется, чтобы вы написали сценарии/использовали опцию импорта (не уверен) в браузере данных. Вы также можете написать облачную функцию для репликации данных на вашем резервном сервере (еще не пробовали).

Однако существуют некоторые ограничения облачного кода, которые вы должны учитывать, прежде чем рисковать: https://parse.com/docs/cloud_code_guide#functions-resource

person Brainhash    schedule 29.07.2015