Перемещение данных между рабочей и промежуточной базами данных в Cloudant

У меня есть две базы данных в Cloudant, промежуточная и производственная, которые используются веб-приложением на основе Node.JS, работающим на Heroku, а также промежуточными и производственными экземплярами. Веб-приложение включает в себя область администрирования, где администраторы могут проверять содержимое базы данных, настраивать значения и т. д.

Как лучше всего перемещать данные между двумя средами? Иногда нам нужно переместить новые значения из промежуточной стадии в производственную, а иногда, возможно, переместить производственные данные в промежуточную, чтобы помочь с тестированием и т. д., поэтому это должно быть двусторонним.

Репликация всей базы данных не является вариантом, поскольку, как правило, мы хотим копировать только определенные объекты базы данных, а не все целиком.

На что мне следует обратить внимание, чтобы сделать это в Node.JS? Какие-то общие подходы? Мы неправильно думаем о настройке?


person Jed Richards    schedule 02.05.2013    source источник


Ответы (1)


Есть два способа сделать это с самой базой данных (по сравнению с написанием клиентского кода для перемещения данных, что было бы неоптимальным).

Актуальную информацию о репликации см. на странице http://wiki.apache.org/couchdb/Replication (Вики Apache не работает на момент написания этого ответа).

Репликация именованного документа

Если вы точно знаете, какие документы вы хотите реплицировать, и их _id, то вы можете указать их в массиве при вызове репликации. Например, это будет дублировать два документа с doc-a и doc-b от _id.

{
  "source": "https://USER:[email protected]/dbname-qa",
  "target": "https://USER:[email protected]/dbname-production",
  "doc_ids": [ "doc-a", "doc-b" ]
}

Отфильтрованная репликация

Если вы можете программно указать, какие записи вы хотите переместить, вы можете использовать фильтрованную репликацию. Вы пишете функцию, которая возвращает true, если вы хотите, чтобы документ был реплицирован, или false, если вы этого не хотите. Например...

function(doc) {
  /*
   * This will not replicate doc deletions. Add `&& doc._deleted` to replicate
   * those as well.
   */
  if(doc.type === "user") {
    return true;
  }

  return false;
}

...будет реплицировать все записи, чей атрибут type равен "user".

Вы также можете удалить весь блок if и просто сделать return (doc.type === "user");, если вам это удобно.

Этот код хранится в вашем дизайн-документе. Вот пример ddoc, в котором хранится указанная выше функция:

{
  "_id": "_design/app",
  "filters": {
    "myfilter": "function(doc) { return (doc.type === \"user\"); }"
  }
}

Затем вы вызываете фильтр во время репликации следующим образом:

{
  "source": "https://USER:[email protected]/dbname-qa",
  "target": "https://USER:[email protected]/dbname-production",
  "filter": "app/myfilter"
}
person Sam Bisbee    schedule 02.05.2013
comment
Вау, это здорово, определенно ставит меня на правильный путь. Спасибо большое. Насколько я понимаю, репликация фактически вызывается путем отправки POST в исходную базу данных с такими объектами JSON в качестве тела. Я хотел бы иметь кнопку в своей области администратора, что-то вроде «Копировать в производство» или что-то подобное. Должна ли эта кнопка просто вызывать репликацию curl на сервере или есть более элегантный подход? - person Jed Richards; 09.05.2013
comment
Попробуйте использовать базу данных _replicator (wiki.apache.org/couchdb/Replication#Replicator_database) . Я не уверен, на каком языке написана ваша административная область, но я полагаю, что вы можете отправить документ в базу данных _replicator напрямую, используя библиотеки HTTP вашего языка реализации, а не обращаться к cURL. - person Mike Rhodes; 09.05.2013