2013-05-02 3 views
3

J'ai deux bases de données sur Cloudant, staging et production, qui sont consommées par une application web basée sur Node.JS et fonctionnant sur Heroku, également avec des instances de production et de transfert. L'application Web comprend une zone d'administration dans laquelle les administrateurs peuvent vérifier le contenu de la base de données et modifier les valeurs, etc.Déplacement de données entre les bases de production et de transfert sur Cloudant

Quelle est la meilleure approche pour déplacer des données entre les deux environnements? Parfois, nous allons vouloir déplacer de nouvelles valeurs de la mise en scène à la production, et peut-être déplacer d'autres fois les données de production vers la mise en scène pour faciliter les tests, etc., donc cela doit être bidirectionnel.

La réplication complète de la base de données n'est pas une option car, en général, nous ne voulons copier que certains objets de la base de données, pas tout.

Quel genre de choses dois-je regarder pour faire ceci dans Node.JS? Des approches générales? Pensons-nous mal à la configuration?

Répondre

4

Il y a deux façons de le faire avec la base de données elle-même (par rapport à l'écriture de code client pour déplacer des données, ce qui ne serait pas optimal).

Pour une référence à jour sur la réplication, voir http://wiki.apache.org/couchdb/Replication (le wiki d'Apache est en panne au moment de l'écriture de cette réponse).

nommé document de réplication

Si vous savez exactement quels documents vous souhaitez répliquer et leurs _id l », vous pouvez les spécifier dans un tableau lors de l'appel de la réplication. Par exemple, cela répliquerait les deux documents avec _iddoc-a et doc-b.

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

Filtrée réplication

Si vous pouvez dire quels programatically enregistrements que vous souhaitez déplacer, vous pouvez utiliser la réplication filtrée. Vous écrivez une fonction qui renvoie true si vous souhaitez que le document soit répliqué ou false si vous ne le faites pas. Par exemple ...

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

    return false; 
} 

... reproduirait tous les enregistrements dont type attribut est égal à "user".

Vous pouvez également supprimer le bloc complet if et faire simplement return (doc.type === "user"); si vous êtes à l'aise avec elle.

Ce code est stocké dans votre document de conception. Voici un exemple DDOC qui stocke la fonction ci-dessus:

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

Vous Invoquez ensuite le filtre lors de la réplication comme ceci:

{ 
    "source": "https://USER:[email protected]/dbname-qa", 
    "target": "https://USER:[email protected]/dbname-production", 
    "filter": "app/myfilter" 
} 
+0

Wow, c'est super, me mettre définitivement sur la bonne voie. Merci beaucoup. Donc, si je comprends bien la réplication est réellement appelée par POSTing à la base de données source, avec ces sortes d'objets JSON en tant que corps. Je voudrais avoir un bouton dans ma zone d'administration, quelque chose comme "Copier en production", ou similaire. Ce bouton devrait-il simplement invoquer une réplication 'curl' sur le serveur, ou y a-t-il une approche plus élégante? – WildService

+1

Essayez d'utiliser la base de données _replicator (http://wiki.apache.org/couchdb/Replication#Replicator_database).Je ne suis pas sûr de la langue dans laquelle votre zone d'administration est écrite, mais j'imagine que vous pouvez soumettre le document directement à la base de données _replicator en utilisant les bibliothèques HTTP de votre langage d'implémentation plutôt que d'appeler cURL. –

Questions connexes