Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
node.js for millions of images
Search
Ivan Babrou
October 25, 2012
Programming
7
1.4k
node.js for millions of images
Ivan Babrou
October 25, 2012
Tweet
Share
More Decks by Ivan Babrou
See All by Ivan Babrou
LXJS 2013: backpack — scalable photo storage
bobrik
2
150
Other Decks in Programming
See All in Programming
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
820
20250704_教育事業におけるアジャイルなデータ基盤構築
hanon52_
5
790
Quand Symfony, ApiPlatform, OpenAI et LangChain s'allient pour exploiter vos PDF : de la théorie à la production…
ahmedbhs123
0
190
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
770
Team operations that are not burdened by SRE
kazatohiei
1
310
ruby.wasmで多人数リアルタイム通信ゲームを作ろう
lnit
3
490
テストから始めるAgentic Coding 〜Claude Codeと共に行うTDD〜 / Agentic Coding starts with testing
rkaga
12
4.5k
「テストは愚直&&網羅的に書くほどよい」という誤解 / Test Smarter, Not Harder
munetoshi
0
170
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
650
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
900
チームのテスト力を総合的に鍛えて品質、スピード、レジリエンスを共立させる/Testing approach that improves quality, speed, and resilience
goyoki
5
880
Code as Context 〜 1にコードで 2にリンタ 34がなくて 5にルール? 〜
yodakeisuke
0
130
Featured
See All Featured
For a Future-Friendly Web
brad_frost
179
9.8k
Building an army of robots
kneath
306
45k
Speed Design
sergeychernyshev
32
1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Producing Creativity
orderedlist
PRO
346
40k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
970
4 Signs Your Business is Dying
shpigford
184
22k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Designing Experiences People Love
moore
142
24k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
Transcript
Хранилище для миллинов картинок на node.js (а почему бы и
да) Wednesday, October 24, 12
Что есть 40+ миллионов пользователей 1.5 миллиона уников в сутки
15 пользовательских фоток на главной 60 пользовательских фоток в ленте 60 килобайт на фото в среднем 10 терабайт данных Wednesday, October 24, 12
Роли Frontend Cache Resizer Backend Wednesday, October 24, 12
Frontend nginx SSL termination Upstream hash Смотрят в интернет Wednesday,
October 24, 12
Cache nginx tmpfs proxy_next_upstream Больше ничего Wednesday, October 24, 12
Resizer nginx image_filter proxy_next_upstream lua Wednesday, October 24, 12
А дальше всё становится плохо. Wednesday, October 24, 12
Особенности 99% времени серверов с данными - IO “Long tail”
problem Невозможно выровнять чтения Попасть в кеш в 3Тб данных непросто Wednesday, October 24, 12
Диски тормозят Память в 100 000 раз быстрее диска, но
диски надёжнее и вместительнее. Wednesday, October 24, 12
Решения nginx хватит (btrfs, reiserfs, *fs) Haystack (facebook) Elliptics (yandex)
Wednesday, October 24, 12
Yeah, well, I'm gonna go build my own theme park,
with blackjack and hookers. In fact, forget the park! Wednesday, October 24, 12
backpack Задумка из Haystack Proof of concept + Wednesday, October
24, 12
Backend node.js redis Файлы по 4Gb Wednesday, October 24, 12
Как это изнутри node.js redis disk: - data_XXX (4Gb) -
metadata_XXX Метаданные всегда в памяти. Для чтения всегда только 1 вызов pread Wednesday, October 24, 12
Redis Очень быстрый (даже слишком) Информация в бинарном виде Было:
/u124/z1dg23.jpg Будет:{file:1}{offset:4}{length:4} Минимальная нагрузка на диск (AOF) Wednesday, October 24, 12
node.js javascript Асинхронная работа Постоянно открытые файлы Постоянное соединение к
redis 1 поток (на самом деле нет) Wednesday, October 24, 12
Потоки (streams) Http запросы и ответы: req, res Data Writer:
req.pipe(writer) Data Reader: reader.pipe(res) Wednesday, October 24, 12
Только ультахардкор Выравнивание чтений (O_DIRECT) Посчитать дешевле +50% к пропускной
способности Более ровный график использования IO Модуль для node.js (aligned-buffer) Wednesday, October 24, 12
Грабли O_DIRECT Записи должны быть выровнены Линус не одобряет (fadvice/madvice)
Повторное чтение не идёт в кеш Wednesday, October 24, 12
Тестирование 40Gb данных (малая часть) 500K файлов Случайное чтение в
50 потоков Без записи Wednesday, October 24, 12
Графики: 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
Графики: 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
Графики: вместе 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
Где скачать? Доведём до ума и сделаем Open Source! Wednesday,
October 24, 12
Шардинг Фронтенды: dns round-robin Кеши: upstream hash + хаки Ресайзеры:
выбирай любой Данные: (D)HT - почти как в торрентах Wednesday, October 24, 12
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
Почему не уникальный hash на картинку Так вышло К тому
же, мы не хостинг скриншотов Сложнее вычислить все урлы картинок Неравномерное использование ресурсов Wednesday, October 24, 12
Как всем рулить Конфигурация Обработка задач Мониторинг Wednesday, October 24,
12
Конфигурация: Zookeeper Отказоустойчивость до конца Hash table для данных Хранение
данных серверов Задачи Wednesday, October 24, 12
Обработка задач: crons Кроны разбиения стораджа Разбиение Очистка Репликация картинок
Кроны скачивания картинок data data data Wednesday, October 24, 12
Мониторинг: zabbix Мониторининг io (сервера данных) Мониторинг cpu (ресайзеры) Сокеты,
сеть, всё что захотите Wednesday, October 24, 12
Миграция Перелопатить весь код Скачать все картинки Нагреть кеш Докачивать
новые Wednesday, October 24, 12
Как переживать падения Падения будут всегда Убрать точки отказа Спокойно
падать Иметь возможность восстановиться Wednesday, October 24, 12
Вопросы? Иван Бобров http://github.com/bobrik @ibobrik Wednesday, October 24, 12
Wednesday, October 24, 12