Хранилище для миллинов
картинок на node.js
(а почему бы и да)
Wednesday, October 24, 12
Slide 2
Slide 2 text
Что есть
40+ миллионов пользователей
1.5 миллиона уников в сутки
15 пользовательских фоток на главной
60 пользовательских фоток в ленте
60 килобайт на фото в среднем
10 терабайт данных
Wednesday, October 24, 12
Slide 3
Slide 3 text
Роли
Frontend
Cache
Resizer
Backend
Wednesday, October 24, 12
Slide 4
Slide 4 text
Frontend
nginx
SSL termination
Upstream hash
Смотрят в интернет
Wednesday, October 24, 12
Slide 5
Slide 5 text
Cache
nginx
tmpfs
proxy_next_upstream
Больше ничего
Wednesday, October 24, 12
Slide 6
Slide 6 text
Resizer
nginx
image_filter
proxy_next_upstream
lua
Wednesday, October 24, 12
Slide 7
Slide 7 text
А дальше всё
становится плохо.
Wednesday, October 24, 12
Slide 8
Slide 8 text
Особенности
99% времени серверов с данными - IO
“Long tail” problem
Невозможно выровнять чтения
Попасть в кеш в 3Тб данных непросто
Wednesday, October 24, 12
Slide 9
Slide 9 text
Диски тормозят
Память в 100 000 раз быстрее диска,
но диски надёжнее и вместительнее.
Wednesday, October 24, 12
Slide 10
Slide 10 text
Решения
nginx хватит (btrfs, reiserfs, *fs)
Haystack (facebook)
Elliptics (yandex)
Wednesday, October 24, 12
Slide 11
Slide 11 text
Yeah, well, I'm gonna go build my own theme park,
with blackjack and hookers. In fact, forget the park!
Wednesday, October 24, 12
Slide 12
Slide 12 text
backpack
Задумка из Haystack
Proof of concept
+
Wednesday, October 24, 12
Slide 13
Slide 13 text
Backend
node.js
redis
Файлы по 4Gb
Wednesday, October 24, 12
Slide 14
Slide 14 text
Как это изнутри
node.js
redis
disk:
- data_XXX (4Gb)
- metadata_XXX
Метаданные всегда в памяти.
Для чтения всегда только 1 вызов pread
Wednesday, October 24, 12
Slide 15
Slide 15 text
Redis
Очень быстрый (даже слишком)
Информация в бинарном виде
Было: /u124/z1dg23.jpg
Будет:{file:1}{offset:4}{length:4}
Минимальная нагрузка на диск (AOF)
Wednesday, October 24, 12
Slide 16
Slide 16 text
node.js
javascript
Асинхронная работа
Постоянно открытые файлы
Постоянное соединение к redis
1 поток (на самом деле нет)
Wednesday, October 24, 12
Slide 17
Slide 17 text
Потоки (streams)
Http запросы и ответы: req, res
Data Writer: req.pipe(writer)
Data Reader: reader.pipe(res)
Wednesday, October 24, 12
Slide 18
Slide 18 text
Только ультахардкор
Выравнивание чтений (O_DIRECT)
Посчитать дешевле
+50% к пропускной способности
Более ровный график использования IO
Модуль для node.js (aligned-buffer)
Wednesday, October 24, 12
Slide 19
Slide 19 text
Грабли O_DIRECT
Записи должны быть выровнены
Линус не одобряет (fadvice/madvice)
Повторное чтение не идёт в кеш
Wednesday, October 24, 12
Slide 20
Slide 20 text
Тестирование
40Gb данных (малая часть)
500K файлов
Случайное чтение в 50 потоков
Без записи
Wednesday, October 24, 12
Графики: вместе
0
225
450
675
900 backpack-a-dc3
nginx-dс
nginx-dc3
-a: выровненные чтения
-dc: каждые 5 секунд echo 1 > /proc/sys/vm/drop-cache
-dc3: каждые 5 секунд echo 3 > /proc/sys/vm/drop-cache
Wednesday, October 24, 12
Slide 24
Slide 24 text
Где скачать?
Доведём до ума и сделаем Open Source!
Wednesday, October 24, 12
Slide 25
Slide 25 text
Шардинг
Фронтенды: dns round-robin
Кеши: upstream hash + хаки
Ресайзеры: выбирай любой
Данные: (D)HT - почти как в торрентах
Wednesday, October 24, 12
Slide 26
Slide 26 text
Hash map
Хеш: (md5(соль + user_id))[0:2]
Начальный хеш: [read], [write]
00: [1,2,3], [1,2,3] (от 00 до 39)
40: [5,6,7], [5,6,7] (от 40 до 80)
80: [8,9,10], [8,9,10] (от 80 до ff)
Wednesday, October 24, 12
Slide 27
Slide 27 text
Почему не уникальный
hash на картинку
Так вышло
К тому же, мы не хостинг скриншотов
Сложнее вычислить все урлы картинок
Неравномерное использование ресурсов
Wednesday, October 24, 12
Slide 28
Slide 28 text
Как всем рулить
Конфигурация
Обработка задач
Мониторинг
Wednesday, October 24, 12
Slide 29
Slide 29 text
Конфигурация:
Zookeeper
Отказоустойчивость до конца
Hash table для данных
Хранение данных серверов
Задачи
Wednesday, October 24, 12
Slide 30
Slide 30 text
Обработка задач:
crons
Кроны разбиения стораджа
Разбиение
Очистка
Репликация картинок
Кроны скачивания картинок
data
data
data
Wednesday, October 24, 12
Slide 31
Slide 31 text
Мониторинг:
zabbix
Мониторининг io (сервера данных)
Мониторинг cpu (ресайзеры)
Сокеты, сеть, всё что захотите
Wednesday, October 24, 12
Slide 32
Slide 32 text
Миграция
Перелопатить весь код
Скачать все картинки
Нагреть кеш
Докачивать новые
Wednesday, October 24, 12
Slide 33
Slide 33 text
Как переживать
падения
Падения будут всегда
Убрать точки отказа
Спокойно падать
Иметь возможность восстановиться
Wednesday, October 24, 12
Slide 34
Slide 34 text
Вопросы?
Иван Бобров
http://github.com/bobrik
@ibobrik
Wednesday, October 24, 12