zed писал(а):(почему-то про СУБД не упомянул?)
Ну во-первых, потому что хранилище и DLL для взрослых СУБД уже есть, и если GC в какой-то далёкой версии после перехода на SQLite научится ходить в сасовы хранилища, работа с СУБД получится почти автоматической.
А во-вторых, потому что аудитория GC в том числе просто распаковывает кэш мастером, обойдя один снимок, зачем ей со взрослыми СУБД связываться.
zed писал(а):Вообще, есть дикая мысль заняться велосипедостроением и изобрести своё гибридное хранилище
Однозначно самый простой способ - плагин для MySQL (см. в вики - сейчас это третий параграф в первой части). Там даже есть тип таблиц EXAMPLE.
В вообщем и целом opensource и всё такое, и даже книжки про такие плагины есть (и даже на торрентах есть))). Например так написан XtraDB против InnoDB.
zed писал(а):Цель - уйти от журналирования и лишней нагрузки на HDD (в том числе, уменьшить излишнюю дефрагментацию файлов БД) и при этом не потерять в надёжности хранения тайлов
Ну и получишь свою реализацию NoSQL, зачем? Собственно СУБД и решает задачу индексирования, кэширования, отката, восстановления после сбоев, параллельного доступа,...
Если очень хочешь такое, и не хочешь возиться с реляционными СУБД (почти полностью окученными в моей DLL, исключая Teradata и совсем уж редких зверюшек типа Linter, Ingres,...) - используй нереляционные (вики про них знает куда больше меня, так что перечислять их не буду, но в статье NoSQL исчерпывающая информация для понимания, и ссылки есть). Там будет просто "ключ-значение", ровно как сейчас в файловой системе или в BDB. Вставил в ключ версию последним полем - получил версионность и халявное перечисление версий для тайла. Не вставил - нет версионности. Если по версиям организовал список значений для ключа - боюсь что всё значение для ключа будет блокироваться целиком, не знаю насколько это допустимо, а может это как раз самое то что нужно.
В общем велосипед не нужен совсем, всё уже
украдено придумано до нас. Главное чтобы была транзакционность и было востановление после сбоев.
ps. Здесь под NoSQL я понимаю сам подход к построению БД не на основе SQL, а не обязательно именно NoSQL в отдельных проектах типа MySQL.
pps. Лично мне подход NoSQL чужд, я классический реляционщик, так что может чего и напутал про NoSQL.
zed писал(а):Тайловый кэш лидирует по быстродействию, надёжности и простоте
По быстродействию чтения - сравнимо, пока что объёмы относительно небольшие и один пользователь, и только локально, иначе у файлового шансов нет (в том числе проверка полномочий пользователя при каждом открытии каждого файла тоже не совсем бесплатная). По записи - простой тест с копированием кэша в файловый и в СУБД даёт разницу во времени заливки более чем на порядок (а при запуске "ФС в ФС" после "СУБД в СУБД" - так просто начинает нервировать). По построению карты заполнения и прочим возможным операциям, там где работают индексы - файловый кэш просто бьётся в паркинсоне после продолжительного курения в сторонке. Причины понятны: продуманный кэш в памяти, индексы, отсутствие фрагментации, отложенная запись или прямой доступ к диску,...
По надёжности - взрослые СУБД существенно надёжнее, если конечно востановление после сбоев есть (а оно есть не везде, например на некоторых подсистемах MySQL его нет, в BDB судя по всему нет,..). В принципе если кэш в такой СУБД, где есть поддержка транзакций и восстановление после сбоев, делать бэкап кэша необходимо разве что на случай смерти HDD (поскольку кэш сас не mission critical). В остальных ситуациях типа пропадания питания, вылета саса или сервера БД, голубого экрана и т.п. - ничё не похерится.
То есть это я не к тому, что бэкапы не нужны, а к тому, что даже кэш без бэкапов надёжнее файлового кэша. А уж скорость создания бэкапа для СУБД катастрофически выше (bulk), чем обойти все файлики в кэше.
zed писал(а):Бэкапы не сделаешь, и выходит что все яйца лежат в одной корзине
Во-первых, приличные СУБД случайно ещё надо умудриться сломать, тогда как файловый кэш ломается просто по достижению 50 млн тайлов ))) а это число, скажем, меньше чем число тайлов только на bing и dg по квадрату P-40 (и при этом скорость работы PostgreSQL совершенно не изменилась, что в начале, что после наполнения данными).
Во-вторых, все приличные СУБД умеют делать бэкапы (некоторые правда быстрее скопировать руками, остановив инстанс, но это другой разговор), настраивать это по расписанию, бэкапировать не всё, инкременально,..особенно в этом преуспел PostgreSQL - так что как раз с файловой системой не сравнится.
В-третьих, бэкапом может быть просто экспорт из саса в архив или другой кэш, откуда в случае факапа данные можно быстро и просто вытащить. Но повторяю, это нужно только для клинически важных данных, без которых сразу жизнь будет не мила. Если раньше не делались бэкапы с файлового кэша и это устраивало, сам по себе перенос кэша в СУБД не может привести к необходимости бэкапирования.
В-четвёртых, даже в случае поломки, формат файлов данных известен (если это конечно открытая БД, или саса БД как oracle допускает хождение по логам, так как чаще всего реальная "поломка" возникает потому что логи не пролазят в БД), так что для ценных данных можно пробовать восстановить данные (если автоматическое восстановление после сбоев не устраивает, и данные ни откуда больше не взять, и бэкапа нет).
В-пятых, точно также на своём велосипеде будешь терять по полснимка, если в случае ошибки будешь весь файл выкидывать, и не будет атоматического восстановления после сбоев.
Файловая система рулит только если HDD совсем уж какой-то ненадёжный, сыпицца и теряе байты или находить новыйе, тогда можно адресно похерить файлик и ещё пождать и поработать с другими, пока те не помрут. Или пока тайлов мало, из-за чего накладные расходы на сервер дОроги. Даже для обмена кэшем, есть возможность сразу экспортировать его в архив.
zed писал(а):если будешь делать кэш в виде какой-то БД, то по возможности предусмотри (опционально) чтобы можно было отказаться от версионности
Ну это как раз просто: новый номерок (типа 91 вместо 9), и непролёт v в хранилище ниже ITileStorage. В этом случае даже указание v в свойствах карты не поможет ))
Тем более если версии картосервиса лежат отдельным справочником - резервирование 0 для "без версии" даст возможность переключать режим хоть даже на лету.
Shoorick писал(а):На последовательную запись рассчитан формат tar
Мы не умеем дописывать файлы в tar, только в zip.