Skalowalna Pamięć Obrazów

Obecnie projektuję architekturę dla aplikacji internetowej, która powinna również zapewniać pewien rodzaj przechowywania obrazów. Użytkownicy będą mogli przesyłać zdjęcia jako jedną z kluczowych funkcji serwisu. Również przeglądanie tych obrazów będzie jednym z głównych zastosowań(za pośrednictwem sieci).

Nie jestem jednak pewien, jak zrealizować tak skalowalny komponent do przechowywania obrazów w mojej aplikacji. Myślałem już o różnych rozwiązaniach, ale ze względu na brakujące doświadczenia, czekam na twoje sugestie. Oprócz obrazów należy również zachować metadane. Oto moje pierwsze przemyślenia:

  1. Użyj (rozproszonego) systemu plików, takiego jak HDFS i przygotuj dedykowane serwery WWW jako "klientów systemu plików" w celu zapisania przesłanych obrazów i żądań usług. Metadane obrazu są zapisywane w dodatkowej bazie danych zawierającej informacje o ścieżce pliku dla każdego obrazu.

  2. Używaj systemu zorientowanego na BigTable, takiego jak HBase na HDFS i zapisuj obrazy i metadane razem. Again, webservers Bridge przesyłanie obrazów i żądania.

  3. Użyj całkowicie schematycznej bazy danych, takiej jak CouchDB do przechowywania zarówno obrazów, jak i metadanych. Dodatkowo, użyj samej bazy danych do przesyłania i usuwania za pomocą RESTful API opartego na HTTP. (Dodatkowe pytanie: CouchDB zapisuje obiekty BLOB poprzez Base64. Czy jednak może zwrócić dane w postaci obrazu / jpeg itp.)?

Author: Flimzy, 2009-12-25

11 answers

Używamy do tego CouchDB, zapisując obrazy jako"załącznik". Ale po roku kilkadziesiąt GB plików bazy CouchDB okazało się bólem głowy. Na przykład replikacja CouchDB nadal ma problemy, jeśli jest używana z bardzo dużymi rozmiarami dokumentów.

Więc po prostu przepisaliśmy nasze oprogramowanie, aby używać CouchDB do informacji o obrazie i Amazon S3 do rzeczywistego przechowywania obrazu. Kod jest dostępny pod adresem http://github.com/hudora/huImages

Możesz założyć Amazon Usługa pamięci masowej zgodna z S3 na miejscu dla Twojego projektu. Zapewnia to elastyczność i pozostawia opcję amazon bez konieczności korzystania z zewnętrznych usług na razie. Walruss wydaje się być najpopularniejszym i najbardziej skalowalnym klonem S3.

Zachęcam również do przyjrzenia się projektowi Livejournal z ich doskonałymi ofertami Open Source MogileFS i Perlbal. ta kombinacja {[4] } jest prawdopodobnie najbardziej znaną konfiguracją serwującą obraz.

Również flickr Architektura może być inspiracją, chociaż nie oferuje publicznego oprogramowania Open Source, jak robi to Livejournal.

 42
Author: max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-21 20:20:21

" dodatkowe pytanie: CouchDB zapisuje bloby za pomocą Base64."

CouchDB nie zapisuje obiektów blob jako Base64, są one przechowywane jako proste binarne. Podczas pobierania dokumentu JSON za pomocą ?attachments=true konwertujemy plik binarny na dysk do Base64, aby dodać go bezpiecznie do JSON, ale to tylko kwestia poziomu prezentacji.

Zobacz Samodzielne Załączniki .

CouchDB serwuje załączniki z typem treści, z którym są przechowywane, jest możliwe, w rzeczywistości powszechne, do serwera Załączniki HTML, CSS i GIF/PNG/JPEG bezpośrednio do przeglądarek.

Załączniki mogą być przesyłane strumieniowo, a w CouchDB 1.1 obsługuje nawet nagłówek Range (do przesyłania strumieniowego multimediów i/lub wznawiania przerwanego pobierania).

 12
Author: Robert Newson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-13 14:53:20

Use Seaweed-FS (dawniej nazywany Weed-FS), implementacja papieru stóg siana Facebook.

Seaweed-FS jest bardzo elastyczny i dostosowany do podstaw. Został stworzony, aby przechowywać miliardy obrazów i szybko je obsługiwać.

 8
Author: chrislusf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-04 07:43:43

Rozważałeś Amazon Web Services? S3 to internetowy magazyn plików, a SimpleDB to klucz->atrybut store. Oba są wydajne i wysoce skalowalne. Jest to droższe niż utrzymywanie własnych serwerów i konfiguracji (zakładając, że zrobisz to sam, a nie zatrudniasz ludzi), ale szybciej zaczynasz działać.

Edit: cofam to - jest droższy na dłuższą metę przy dużych wolumenach, ale za niski wolumen bije początkowy koszt zakupu sprzęt.

S3: http://aws.amazon.com/s3/ (możesz przechowywać pliki obrazów tutaj, a dla wydajności może mieć pamięć podręczną obrazów na serwerze, a może nie)

SimpleDB: http://aws.amazon.com/simpledb/ (metadane mogą znaleźć się tutaj: mapowanie ID obrazu do dowolnych danych, które chcesz przechowywać)

Edit 2: nawet o tym nie wiedziałem, ale jest nowy serwis internetowy o nazwie Amazon CloudFront ( http://aws.amazon.com/cloudfront / ). służy do szybkiego internetu dostarczanie treści i dobrze integruje się z S3. Jak Akamai dla Twoich zdjęć. Możesz użyć tego zamiast pamięci podręcznej obrazu.

 3
Author: danben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-25 14:03:44

Używamy MogileFS. Jesteśmy małymi użytkownikami z mniej niż 8TB i około 50 milionami plików. Kilka lat temu przełączyliśmy się z przechowywania w Amazon S3, aby uzyskać lepszą kontrolę nad nazwami plików i wydajnością.

Nie jest to najładniejsze oprogramowanie, ale jest bardzo "testowane w terenie" i w zasadzie wszyscy użytkownicy używają go tak samo, jak ty.

 3
Author: Ask Bjørn Hansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-29 06:29:53

Może zajrzyj do opisu Facebook stóg siana

Igła w stogu siana: efektywne przechowywanie miliardów zdjęć

 3
Author: Leen Toelen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-16 08:55:11

Jako część Cloudant, nie chcę naciskać produktu.... ale BigCouch rozwiązuje ten problem w moim stosie aplikacji naukowych (fizyka-nie ma nic wspólnego z Cloudant, a na pewno nie ma nic wspólnego z zyskiem!). Łączy prostotę konstrukcji CocuhDB z automatycznym shardingiem i skalowalnością, której brakuje w CouchDB z pojedynczym serwerem. Zazwyczaj używam go do przechowywania mniejszej liczby dużych plików (multi-GB) i dużej liczby małych plików (100MB lub mniej). Ja używałem S3 ale koszt get faktycznie zacząć dodawać do małych plików, które są wielokrotnie dostępne.

 2
Author: Mike Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-07 18:49:03

Ok, jeśli te wszystkie rzeczy z AWS nie zadziałają, oto kilka przemyśleń.

Jeśli chodzi o (3), Jeśli umieścisz dane binarne w bazie danych, te same dane wyjdą na jaw. To, co sprawia, że jest to jpeg, to format danych, a nie to, co baza danych myśli, że jest. Co sprawia, że klient (przeglądarka internetowa) myśli, że jest to jpeg, gdy ustawisz nagłówek Content-type na image/jpeg. Można też ustawić na coś innego (niezalecane) jak tekst i tak przeglądarka będzie próbowała zinterpretować to.

W przypadku pamięci masowej na dysku Lubię CouchDB za jego prostotę, ale HDFS na pewno by zadziałał. Oto link do posta o serwowaniu treści graficznych z CouchDB: http://japhr.blogspot.com/2009/04/render-couchdb-images-via-sinatra.html

Edit: oto link do użytecznej dyskusji na temat buforowania obrazów w memcached vs serwowania ich z dysku pod Linuksem / apache.

 1
Author: danben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-25 14:20:00

Eksperymentowałem z niektórymi funkcjami _update dostępnymi dla serwerów widoku CouchDB w moim serwerze widoku Pythona.

Jedną naprawdę fajną rzeczą, jaką zrobiłem, była funkcja aktualizacji do przesyłania obrazów, dzięki czemu mogłem użyć PIL do tworzenia miniatur i innych powiązanych obrazów i dołączania ich do dokumentu, gdy zostaną wypchnięte do CouchDB.

Może to być przydatne, jeśli potrzebujesz manipulacji obrazami i chcesz ograniczyć ilość kodu i infrastruktury, której potrzebujesz, aby nadążyć.

 1
Author: mikeal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-27 20:07:37

Napisałam sklep z obrazkami na Kasandrze . Mamy dużo i pisze i losowe odczyty odczyt / zapis jest niski. Dla wysokiego współczynnika odczytu / zapisu proponuję MongoDB (GridFs).

 1
Author: baklarz2048,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-29 06:18:51

Oto przykład do przechowywania obrazu blob w CouchDB przy użyciu PHP Laravel. W tym przykładzie przechowuję trzy obrazy w oparciu o wymagania użytkownika.

Nawiązywanie połączenia w 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);

...

Tak samo jak można przechowywać pojedynczy obraz.

 -1
Author: javed shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 05:46:37