Question

Je suis en train de concevoir une architecture pour une application basée sur le Web qui devrait également fournir une sorte de stockage d'image. Les utilisateurs pourront télécharger des photos comme l'une des principales caractéristiques du service. Ègalement ces images sera l'un des usages principaux (via le web).

Cependant, je ne suis pas sûr de savoir comment réaliser un tel composant de stockage d'image évolutive dans mon application. Je l'ai déjà pensé à des solutions différentes, mais en raison des expériences manquantes, je me réjouis d'entendre vos suggestions. Mis à part les images, aussi les métadonnées doivent besaved. Voici mes réflexions initiales:

  1. Utilisez un (distribué) système de fichiers comme HDFS et préparer les serveurs Web dédiés comme des « clients » du système de fichiers afin d'enregistrer des images mises en ligne et les demandes de service. Les données d'image méta sont enregistrées dans une base de données supplémentaires, y compris les informations filepath pour chaque image.

  2. Utilisez un système BigTable orienté comme HBase sur le dessus de HDFS et enregistrer des images et des données méta ensemble. Encore une fois, les serveurs Web ajouts et des demandes d'image pont.

  3. Utiliser une base de données complètement sans schéma comme CouchDB pour stocker à la fois des images et des métadonnées. De plus, utiliser la base de données elle-même pour le téléchargement et delievery en utilisant l'API RESTful HTTP. (Question supplémentaire: CouchDB n'enregistre blobs via base64 peut-il revenir cependant des données sous forme d'image / jpeg etc.)?

Était-ce utile?

La solution

Nous utilisons CouchDB pour cela, l'enregistrement d'images comme une « pièce jointe ». Mais après une année, les fichiers de base de données multi-douzaine de GB CouchDB se sont avérés être un mal de tête. Par exemple la réplication CouchDB a encore des problèmes si vous l'utilisez avec de très grandes tailles de documents.

Nous avons donc simplement réécrit notre logiciel à utiliser CouchDB pour des informations d'image et Amazon S3 pour le stockage de l'image réelle. Le code est disponible à http://github.com/hudora/huImages

Vous pouvez mettre en place un service de stockage compatible Amazon S3 sur place pour votre projet. Cela vous évite flexible et laisse l'option amazone sans avoir besoin de services externes pour l'instant. Walruss semble devenir le clone S3 le plus populaire et évolutive.

Je vous invite aussi à se pencher sur la conception de Livejournal avec leur excellente Open Source MogileFS et < a href = "http://www.danga.com/perlbal/" rel = "noreferrer"> les offres de Perlbal. Cette combinaison est probablement au service de la configuration d'image les plus célèbres.

De plus, le flickr architecture peut être une source d'inspiration, bien qu'ils ne proposent pas de logiciels Open Source au public, comme le fait Livejournal.

Autres conseils

"Question supplémentaire:. CouchDB sauve des blobs via base64"

CouchDB ne pas enregistrer blobs en base64, ils sont stockés sous forme binaire droite. Lors de la récupération d'un document JSON avec ?attachments=true nous ne convertir le binaire base64 sur disque afin d'ajouter en toute sécurité à JSON mais c'est juste une chose au niveau de la présentation.

Voir les pièces jointes autonomes .

CouchDB sert des pièces jointes avec le type de contenu qu'ils sont stockés avec, il est possible, en fait commun, au serveur HTML, CSS et GIF / PNG / JPEG pièces jointes directement aux navigateurs.

Les pièces jointes peuvent être diffusés en continu et, CouchDB 1.1, support même l'en-tête de gamme (pour le streaming de médias et / ou la reprise d'un téléchargement interrompu).

Utilisez FS-Algue (autrefois appelé Weed-FS), une mise en œuvre du document de botte de foin Facebook .

Seaweed-FS est très flexible et épuré aux bases. Il a été créé pour stocker des milliards d'images et de les servir rapidement.

Avez-vous pensé Amazon Web Services? S3 est le stockage de fichiers en ligne, et SimpleDB est un magasin key-> attribut. Les deux sont très évolutives et performantes. Il est plus cher que l'entretien de vos propres serveurs et configurations (en supposant que vous allez faire vous-même et non embaucher des gens), mais vous lever et courir beaucoup plus rapidement.

Edit:. Je retire ce que - son plus cher à long terme à des volumes élevés, mais pour un faible volume, il bat le coût initial de l'achat de matériel

S3: http://aws.amazon.com/s3/ (vous pouvez stocker image fichiers ici, et la performance ont peut-être une cache d'image sur votre serveur, ou peut-être pas)

SimpleDB: http://aws.amazon.com/simpledb/ (métadonnées peuvent aller ici: cartographie identifiant d'image à toutes les données que vous souhaitez stocker)

Edit 2: Je ne savais même pas à ce sujet, mais il y a un nouveau service Web appelé Amazon CloudFront ( http://aws.amazon.com/cloudfront/ ). Il est pour la livraison de contenu Web rapide, et il intègre bien avec S3. Un peu comme Akamai pour vos images. Vous pouvez utiliser cette place du cache d'image.

Nous utilisons MogileFS. Nous sommes petits utilisateurs à grande échelle avec moins de 8 To et des fichiers de 50 millions. Nous sommes passés de stockage dans Amazon S3 il y a quelques années pour obtenir un meilleur contrôle des noms de fichiers et de la performance.

Il est pas le logiciel la plus jolie, mais il est très « testé sur le terrain » et essentiellement tous les utilisateurs utilisent la même manière que vous serez.

Peut-être un coup d'oeil à la description de Facebook Haystack

dans une botte de foin aiguille: stockage efficace des milliards de photographies

Dans le cadre de Cloudant, je ne veux pas pousser le produit .... mais BigCouch permet de résoudre ce problème dans ma pile d'applications de la science (physique - rien à voir avec Cloudant, et certainement rien à voir avec le profit). Il allie la simplicité de la conception CocuhDB avec l'auto-sharding et l'évolutivité qui manque dans un seul serveur CouchDB. Je l'utilise généralement pour stocker un plus petit nombre de gros fichier (multi-Go) et un grand nombre de petits fichiers (100 Mo ou moins). J'utilisais S3 mais les coûts get réellement commencer à ajouter pour les petits fichiers qui sont accessibles à plusieurs reprises.

Ok, si ce genre de choses AWS ne va pas travailler, voici quelques pensées.

En ce qui concerne (3), si vous mettez des données binaires dans une base de données, les mêmes données va sortir. Ce qui en fait un jpeg est le format des données, et non pas ce que la base de données pense qu'il est. Ce qui rend le client (navigateur Web) pense son jpeg est lorsque vous définissez l'en-tête de Content-type à image/jpeg. Vous pouvez également mettre à quelque chose d'autre (non recommandé) comme du texte et comment le navigateur essaierait de l'interpréter.

Pour le stockage sur disque, j'aime CouchDB pour sa simplicité, mais HDFS serait certainement travailler. Voici un lien vers un poste de servir le contenu de l'image de CouchDB: http://japhr.blogspot.com/2009/04/render-couchdb-images-via-sinatra.html

Edit:. Voici un lien vers une discussion utile sur la mise en cache des images dans memcached vs leur service à partir du disque sous linux / apache

Je l'ai expérimenté avec certaines des fonctionnalités de _update disponibles aux serveurs de vue CouchDB dans mon serveur vue Python.

Une chose vraiment cool, je l'ai fait était une fonction de mise à jour pour les téléchargements d'image afin que je puisse utiliser PIL pour créer des vignettes et autres images connexes et les attacher au document quand ils sont poussés à CouchDB.

Cela peut être utile si vous avez besoin de manipulation d'image et que vous voulez réduire la quantité de code et de l'infrastructure que vous devez suivre.

J'ai écrit mémoire d'image au-dessus de Cassandre. Nous avons beaucoup et écrit et de lectures aléatoires de lecture / écriture est faible. Pour le rapport de lecture / écriture élevé, je vous suggère de MongoDB (GridFS).

Voici un exemple pour stocker l'image blob dans CouchDB en utilisant PHP Laravel. Dans cet exemple, je stocke trois images en fonction des besoins de l'utilisateur.

L'établissement de la connexion à CouchDB.

$connection = DB::connection('your database name');

/*region Fetching the Uers Uploaded Images*/

$FirstImage = base64_encode(file_get_contents(Input::file('FirstImageInput')));
$SecondImage =base64_encode(file_get_contents(Input::file('SecondImageInput')));
$ThirdImage = base64_encode(file_get_contents(Input::file('ThirdImageInput')));

list($id, $rev) = $connection->putDocument(array(
    'name' => $name,
    'location' => $location,
    'phone' => $phone,
    'website' => $website,
    "_attachments" =>[
        'FirstImage.png' => [
            'content_type' => "image/png",
            'data' => $FirstImage
        ],
        'SecondImage.png' => [
            'content_type' => "image/png",
            'data' => $SecondImage
        ],
        'ThirdImage.png' => [
            'content_type' => "image/png",
            'data' => $ThirdImage
        ]
    ],
), $id, $rev);

...

même que vous pouvez stocker seule image.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top