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:
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.
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.
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.)?
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.
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).
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ć.
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.
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.
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ęć
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.
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.
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ć.
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).
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.
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