Slide 1

Slide 1 text

Хранилище для миллинов картинок на 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

Slide 21

Slide 21 text

Графики: backpack 0 225 450 675 900 backpack-a backpack-a-dc3 backpack -a: выровненные чтения -dc3: каждые 5 секунд echo 3 > /proc/sys/vm/drop-cache Wednesday, October 24, 12

Slide 22

Slide 22 text

Графики: nginx 0 225 450 675 900 nginx 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 23

Slide 23 text

Графики: вместе 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

Slide 35

Slide 35 text

Wednesday, October 24, 12