1. Введение: Setup.ru — система быстрого создания сайта по шаблону.
1.1. Быстрое создание означает взрывной рост.
1.2. Так и есть — 300К зарегистрированных пользователей за год.
1.3. Взрывной рост означает необходимость создания горизонтально масштабируемой системы отдачи пользовательского контента.
1.4. Горизонтальная масштабируемость проще всего достигается публикацией в виде статического контента.
1.5. Горизонтальное масштабирование означает ориентацию на дешевое (относительно) железо.
2. Основная часть: неочевидные грабли.
2.1. Байка про неочевидные проблемы из собственного опыта.
2.1.1. 300К пользователей создали 300К сайтов по шаблонам. Шаблоны эти не слишком простые — иначе кого они порадуют?!
2.1.2. Не слишком простой шаблон означает примерно 20 файлов типа картинка/js/css на каждый сайт.
2.1.3. Разбивка по директориям нескольких уровней для ускорения поиска файла на файловой системе.
2.1.4. Результат: 6М файлов, распределенных по 6М директорий. Поиск файла на файловой системе происходит быстро, отдача происходит быстро, все довольны.
2.2. Однако: чемодан без ручки.
2.2.1. Дешевый SATA жесткий диск — 80 iops.
2.2.2. 12М files / 80 iops = 6 часов на обход дерева директорий, 20 часов на клонирование.
2.2.3. Файловый кэш малоэффективен из-за большого объема данных: каждая директория занимает 4К, 6М * 4К = 24Г.
2.2.4. Результат: хранить и отдавать можем, управлять — нет.
2.3. Поиск решения.
2.3.1. Источник проблемы — иерархическая файловая система.
2.3.2. Решение проблемы — индексированная файловая система.
2.4. СУБД как индексированная файловая система.
2.4.1. Опробованы.
2.4.2. Hypertable: быстр, но падуч.
2.4.3. PostgeSQL: стабилен и предоставляет stream-интерфейс к blob.
2.4.4. Выбран PostgeSQL.
2.4.4.1. База с метаинформацией — 800М.
2.4.4.2. База с контентом — 500Г.
2.4.4.3. Результаты нагрузочного тестирования.
3. Выводы: планирование управления данными — это очень важно.