правильно xранить картинки не в базе, а в файловой системе

Alexander08

мямямя... не храни картинки в базе... мямямя

Alena_08_11

чем плохо хранить картинки в базе ?

Alexander08

начиная с некоторых объемов - медленно.

klyv

начиная с некоторых объемов - медленно.
а потом - крайне медленно...

Alena_08_11

хмм
а это примерно с каких обьёмов ?
быдлопрога предназначена тупо для каталогизирования и систематизирования входящих факсов. штук по 10 в день максимум. Я думаю уж пару лет то не будет медленно ?
ps. Я начинающий велосипедостроитель :)

6yrop

не храни картинки в базе
не учи плохому :). Про медленно это пиздешь. Рано или поздно файловое хранилище и идентификаторы картинок в базе разойдутся. К тому же, файловая система не предназначена для многопользовательского режима.

klyv

файловая система не предназначена для многопользовательского режима
а) как это, не предназначена? те же блокировки на уровне файлов.
б) а зачем многопользовательский режим, когда файлы один раз заливаются, после чего только читаются?
в) файловый сервер быстрее сервера БД, т.к. имеет только необходимую функциональность.

Andbar

в) файловый сервер быстрее сервера БД, т.к. имеет только необходимую функциональность.
на очень большом количестве мелких картинок, файловые системы начнут загибаться.
В том-же ютубе, если не ошибаюсь, превьюшки в базе хранятся.

anatolii

на очень большом количестве мелких картинок, файловые системы начнут загибаться.В том-же ютубе, если не ошибаюсь, превьюшки в базе хранятся.
Если верить highscalability, то раньше они использовали для превьюшек ext3, а после покупки гуглом перешли на bigtable :p

Alexander08

не учи плохому . Про медленно это пиздешь. Рано или поздно файловое хранилище и идентификаторы картинок в базе разойдутся. К тому же, файловая система не предназначена для многопользовательского режима.
гыгыгы. глянь на поддерживаемый мной ресурс shop.wildorchid.ru . картинок там до жопы, храню их именно в файловой системе. если бы на серваке - все бы здохло давно. да, глянь на посещаемость. по поводу многопользовательского режима нареканий не было.
а про расходимость идентификаторов - гыгы, главное чтоб руки прямые были

laki

http://shop.wildorchid.ru/catalog/StyleCard.aspx?category=7&...
хочу посмотреть как черные будут выглядеть тыкаю на цвет и нихрена, че за нах?

katrin2201

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

Alexander08

хочу посмотреть как черные будут выглядеть тыкаю на цвет и нихрена, че за нах?
ето не ко мне, а к фотографам. не все засняли зачем-то...

Dasar

а потом - крайне медленно...
и за счет чего будет крайне медленно?
за счет доп. передачи через shared memory?

6yrop

гыгыгы. глянь на поддерживаемый мной ресурс shop.wildorchid.ru
по поводу многопользовательского режима нареканий не было
ты показываешь read-only приложение (корзина не в счет упомянутые мной проблемы в read-only режиме естественно не проявляются. В первоначальном посте как раз был код на апдейт.
 

поддерживаемый мной ресурс
а про расходимость идентификаторов - гыгы, главное чтоб руки прямые были

часто ситуация обратная — приложение поддерживает не разработчиком

Alexander08

плюс тебе за оба замечания. просто мы нашли такое решение и оно нас не подвело

NAIL

А какой суммарный размер картинок и пиковая нагрузка (в количестве отдаваемых картинок)?
А картинки кстати маза хранить в мемкешах (ну естественно сдублированием в базе или на диске).

6yrop

тоже поставил плюс :), за правильную оценку ситуации
Кстати,
 
В SQL Server 2008 Microsoft делает ответный ход, объявляя о поддержке типа данных FILESTREAM [15]. В решении Microsoft пользователи получают возможность доступа средствами SQL Server к файлам, хранящимся в файловой системе NTFS (при этом сохраняется ограниченная возможность доступа к тем же файлам на основе интерфейса Win32). Доступ к объектам типа FILESTREAM из SQL Server производится в транзакционном режиме с поддержкой журнализации и восстановления.
http://citforum.ru/database/data_management_overview/2.shtml
  

Alexander08

как думаешь - зачем они это сделали? :smirk: :grin:

Dasar

как думаешь - зачем они это сделали?
для хранения больших файлов (например, видео) в базе.
картинки такими большими файлами не являются.

Alexander08

ответь честно - умножение в первом классе учил?

dgaf

умножение - это второй класс

AlexV769

картинки такими большими файлами не являются.
полноцветный, 300dpi, A4 скан в формате BMP - это большой файл?

klyv

полноцветный, 300dpi, A4 скан в формате BMP - это большой файл?
тут речь скорее про thumbnails, а не про тупо-фотки или сканы.

AlexV769

быдлопрога предназначена тупо для каталогизирования и систематизирования входящих факсов. штук по 10 в день максимум. Я думаю уж пару лет то не будет медленно ?
в среднем 50кб/факс, если хранить оригинал (2х цветный TIFF). Вот и считай - 10 факсов в день, 3.5 мб в неделю, 15мб в месяц. это копеечные объемы особенно с учетом того, что факсы как правило очень быстро устаревают или теряют актуальность (например, счета).

Gaishnik

а) как это, не предназначена? те же блокировки на уровне файлов.

Только блокировками на запись высокий уровень изоляции транзакций не обеспечить

Papazyan

на очень большом количестве мелких картинок, файловые системы начнут загибаться.
Совершенно безосновательное заявление.

klyv

в общем-то, когда картинка занимает немногим больше, чем путь к ней, имеет смысл хранить саму картинку, а не путь, по которому потом искать картинку.

AlexV769

Как мне нравятся такие обтекаемые характеристики типа "немногим", "чуть-чуть" и прочее.
Ребята, цифры рулят. 160 байт - это в лучшем случае какая-то иконка в глубинах веб-интерфейса, которую никто в здравом уме хранить в базе не будет по определению.
Нормальные изображения по размеру всегда много длиннее пути, где могла бы лежать эта картинка.

SCIF32

если у меня 10 серверов, то на каждом картинки должны дублироваться?
(если говорить про шардинг, то он опять же заведомо тормознее,
чем отдача картинок через nginx, который на своем уровне может определить к
какому серверу картинок посылать запрос)
зачем нагружать транзакции в базе, если они по своей сути являются самой тормозной вещью в СУБД.
 

SCIF32

например, flickr, по данным за зиму
470 млн изображений, 5 петабайт дискового пространства (всего, занятое включено)
вопрос в зал:
Как вы думаете, что будет с БД, если в нее это все положить?
особенно обратите внимание на то, что СУБД любят держать свои индексы в оперативной памяти.

Bibi

http://www.insight-it.ru/net/scalability/arkhitektura-flickr...
> Все, за исключением фотографий, хранится в базе данных

SCIF32

ну да, я к тому и написал про фликр )

SCIF32

хотя 450 млн записей - не так много и индекс в памяти легко помещается, но все равно остальных проблем не отменяет.

katrin2201

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

Bibi

А жж на пехепе был написан
ты уверен в этом?

katrin2201

Разумеется. Именно для жж был написан memcached между прочим.

AlexV769

Я, к сожалению, на практике столкнулся с тем, что хранение картинок (почтовых вложений, содержащих как правило картинки) - большой геморой для обслуживания. Не говорю, что это невозможно обслуживать, но процесс существенно более трудоемкий, нежели картинки на fs + метки об этом в БД.

Helga87

Разумеется. Именно для жж был написан memcached между прочим.
жж был написан на перле.
Brad Firzpatrick - создатель Livejournal и один из главных фанатов Perl-а в Google. http://brad.livejournal.com/2388824.html
http://www.usenix.org/events/usenix07/tech/slides/fitzpatric... - слайды про архитектуру LiveJournal.
http://video.google.com/videoplay?docid=-8953828243232338732 - почти те же слайды из уст Брэда Фитцпатрика.

katrin2201

прошу прощения
переформулирую свой исходный пост: все нагруженные приложения надо писать на перле?

SCIF32

нет, не стоит.
вывод один - стоит думать, прежде чем выдавать категоричные высказывания.

klyv

Когда картинка занимает 2 КБ, а путь к ней 0.5 КБ, имо не стоит вытаскивать картинку из БД - получится только лишний доступ к ФС. (не говоря уже о занятии на 25% большего места :))

vall

более того, БД если картинка лежит где надо загрузит её разом с нужными данными, возможно за одну дискововую операцию.
в случае ФС может случится всякая фигня — пути try-кэша неисповедимы =)

AlexV769

Твоя картинка в 2Кб будет занимать в ежедневном бекапе БД эти самые 2кб, в то время как в дифференциальном бекапе ФС - ни байта.

ava3443

плохой аргумент: для БД возможны ровно те же стратегии резервного копирования, что и для ФС, включая дифференциальные и инкрементальные бэкапы.

AlexV769

Уточни, для каких БД возможны диф бекапы? Oracle? :)

Marinavo_0507

Когда картинка занимает 2 КБ, а путь к ней 0.5 КБ, имо не стоит вытаскивать картинку из БД - получится только лишний доступ к ФС. (не говоря уже о занятии на 25% большего места :))
А в БД все блобы вплотную упакованы что ли? :D

ava3443

ну уж бэкапить файлы журнала транзакций, а при восстановлении "накатывать" их на полный бэкап можно практически везде, и это эквивалентно поддержке инкрементального бэкапа:
 - в PostgreSQL (write ahead log или WAL
 - в MySQL (Binary Log, MySQL backups
 - в Berkeley DB,
 - очевидно, это можно делать в Oracle, DB2 и SQL Server

Marinavo_0507

ну уж бэкапить файлы журнала транзакций
ну это жесть, пригодно только если записи почти совсем не меняются

AlexV769

гыгы. бинлоги будешь за месяц накатывать?

ava3443

ну это жесть, пригодно только если записи почти совсем не меняются
а какие варианты-то? рано или поздно логи за день будут занимать сильно меньше чем полный бэкап
из моего опыта:
1) нормальный (= опытный и ответственный ) Oracle DBA будет бэкапить:
- и файлы данных (полные, и, если считает возможным, дифференциальные/инкрементальные резервные копии
- и файлы журнала транзакций (archived redo logs)
2) разработчики несколько известных "коробочных" продуктов, использующих встроенную Berkeley DB, инкрементальный бэкап предлагают делать именно как бэкап логов транзакций.

ava3443

гыгы. бинлоги будешь за месяц накатывать?
за неделю - да
а чего ты будешь делать если полный бэкап занимает по времени больше чем допустимое время остановки системы ("daily maintenance window")? а нормальное "окно", достаточное для полного бэкапа, есть только в выходной, скажем?

Marinavo_0507

а какие варианты-то?
инкрементальный бекап по образцу того, как это делается для ФС
а чего ты будешь делать если полный бэкап занимает по времени больше чем допустимое время остановки системы
а чё, бекап без остановки всякие ораклы не умеют? :shocked:

dgaf

>а чего ты будешь делать если полный бэкап занимает по времени больше чем допустимое время остановки системы
ну как бы стандартное решение - поставить репликацию и бэкапить на слейве

ava3443

а чё, бекап без остановки всякие ораклы не умеют?
MySQL я так понял не умеет
а в PostgreSQL, равно как и в Oracle, online-backup состоит из копии файлов данных + копии логов транзакций (после восстановления файлов данных они накатываются, чтобы восстановить consistency)

Marinavo_0507

а в PostgreSQL, равно как и в Oracle, online-backup состоит из копии файлов данных + копии логов транзакций
ну не за неделю же логи!
я понимаю, если моментальный снапшот

psm-home

Я может торможу, но как быть с лагом? Под нагрузкой слейв же будет отставать от мастера, нет? И что мы тогда набекапим?

ava3443

ну как бы стандартное решение - поставить репликацию и бэкапить на слейве
ну и чего дешевле:
- место на магнитных лентах под логи,
или же
- отдельный сервер под слейв + дисковое пространство под слейв, равное размеру основной базы?
ответ, как всегда, - "зависит от".
если база - MySQL, лежит на внутренних дисках сервера, а сервер дешевый - наверное держать слейв будет дешевле
если база лежит на внешнем дисковом массиве, и серверы не дешёвые - дешевле бэкапить логи

dgaf

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

dgaf

ну да, я про MySQL :-/

ava3443

ну не за неделю же логи!
логи за время бэкапа, с запасом (т.е. обычно за несколько часов)

Dasar

в то время как в дифференциальном бекапе ФС - ни байта.
как будет обеспечиваться транзакционность backup-а?
остановкой сервера?

AlexV769

MySQL я так понял не умеет
Неправильно понял. Если БД на innodb, то блокировка на запись нужна только до момента запуска mysqldump.

dgaf

Пётр советуетовал LVM
http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for...

Marinavo_0507

А, я перепутал. С бекапом форума нет проблем.
mysqldump просто открывает транзакцию и запускает селекты, как я понимаю, работа не останавливается
А способ со снапшотом тоже хорош по-своему, но нужно копировать все файлы данных, а в случае innodb там много лишнего, ведь место резервируется заранее.

dgaf

>в случае innodb там много лишнего, ведь место резервируется заранее.
да, в 3 раза по объёму overhead,
а tablespace можно и не резервировать сразу всё
зато быстро!

Marinavo_0507

> а tablespace можно и не резервировать сразу всё
вакуум всё равно остаётся

ava3443

Если БД на innodb, то блокировка на запись нужна только до момента запуска mysqldump.
так мы про резервное копирование и восстановление говорим, или про экспорт-импорт?
использовать экспорт-импорт вместо бэкапа-восстановления приемлемо только на небольших базах: импорт базы гигов в 50 из дампа созданного mysqldump будет длиться много часов, а то и суток, или я не прав?

Marinavo_0507

импорт базы гигов в 50 из дампа созданного mysqldump будет длиться много часов, а то и суток, или я не прав?
с форматом -T должно быть быстрее, но я не пробовал

dgaf

а надо иметь две схемы бэкапа: для восстановления удалённых данных и для восстановления полностью базы после аварии (ну тут и слейв спасёт)
Оставить комментарий
Имя или ник:
Комментарий: