Архитектура хранения и отдачи фотографий в badoo
TRANSCRIPT
Архитектура хранения и отдачи фотографий в Badoo
Артем Денисов, Badoo
330 млн. пользователей3 Pb фотографий3,5 млн. новых фотографий в день80 тыс. запросов в секунду за фото
Тривиальный пример
Тривиальный пример
photos1
photos2
photosN
Тривиальный пример
place_id
place_id: 1..5
place_id: 6..11
place_id: m..n
photos1
photos2
photosN
Тривиальный пример: проблемы
Тривиальный пример: проблемы
! Ограниченная вместимость
Тривиальный пример: проблемы
! Ограниченная вместимость! Нетипичная конфигурация машин
Тривиальный пример: проблемы
! Ограниченная вместимость! Нетипичная конфигурация машин! Цена
Тривиальный пример: проблемы
Используем систему хранения данных
bphotos1
bphotos2
bphotosN Storage Area Network (SAN)
! Меньше $/Gb
bphotos1
bphotos2
bphotosN Storage Area Network (SAN)
Используем систему хранения данных
! Меньше $/Gb! Больше плотность размещения
bphotos2
bphotosN Storage Area Network (SAN)
bphotos1
Используем систему хранения данных
! Меньше $/Gb! Больше плотность размещения! Быстрая деградация чтения (>500 rps per host)
bphotos2
bphotosN Storage Area Network (SAN)
bphotos1
Используем систему хранения данных
Характер нагрузки
Чтение преобладает над записью:
7*109 reads / 3.5*106 writes per day
Характер нагрузки
Горячий dataset небольшой
Чтение преобладает над записью:
7*109 reads / 3.5*106 writes per day
Характер нагрузки
Горячий dataset небольшойКажется, нам нужен кэш с LRU
Чтение преобладает над записью:
7*109 reads / 3.5*106 writes per day
Кэшированиеbphotos1
bphotos2
bphotosN Storage Area Network (SAN)
photoscache1
photoscacheN
Структура фотокэша
bphotos
Структура фотокэша
bphotosLocal cache
Структура фотокэша
Local cache
proxy_pass
proxy_store bphotos
Структура фотокэша
Local cache
BufferHot cacheCold cache
proxy_pass
proxy_store bphotos
Структура фотокэша
Local cache
BufferHot cacheCold cache
Access log
<photo_path> <served_by>
proxy_pass
proxy_store bphotos
Структура фотокэша
Local cache
BufferHot cacheCold cache
Access log
<photo_path> <served_by>
proxy_pass
proxy_store bphotos
Cache manager daemon
Структура фотокэша
Local cache
BufferHot cacheCold cache
Access log
<photo_path> <served_by>
proxy_pass
proxy_store bphotos
Cache manager daemonХранит статистику запросов по файлам
Структура фотокэша
Local cache
BufferHot cacheCold cache
Access log
<photo_path> <served_by>
proxy_pass
proxy_store bphotos
Cache manager daemonХранит статистику запросов по файламЧасто запрашиваемые -> Hot cache
Структура фотокэша
Local cache
BufferHot cacheCold cache
Access log
<photo_path> <served_by>
proxy_pass
proxy_store bphotos
Cache manager daemonХранит статистику запросов по файламЧасто запрашиваемые -> Hot cacheРедко запрашиваемые -> Cold cache
Структура фотокэша
Local cache
BufferHot cacheCold cache
Access log
<photo_path> <served_by>
proxy_pass
proxy_store bphotos
Cache manager daemonХранит статистику запросов по файламЧасто запрашиваемые -> Hot cacheРедко запрашиваемые -> Cold cacheПостепенно удаляет из Cold cache
Как распределять запросы?
photoscache2
photoscache1
photoscache3
Как распределять запросы?
Round-robin?
photoscache2
photoscache1
photoscache3
Как распределять запросы?
Round-robin?Hash % count?
photoscache2
photoscache1
photoscache3
Как распределять запросы?
Round-robin?Hash % count?hash(“example_url”) = 5server_idx0 = 5 % 3 = 2photoscache2
photoscache1
photoscache3
Как распределять запросы?
Round-robin?Hash % count?hash(“example_url”) = 5server_idx0 = 5 % 3 = 2server_idx1 = 5 % 4 = 1
Как распределять запросы?
photoscache2
photoscache1
photoscache3
Round-robin?Hash % count?
Как распределять запросы?
Round-robin?Hash % count?Consistent hashing?photoscache2
photoscache1
photoscache3
Consistent hashing0
hash(sharding_key)
Consistent hashing0
hash(sharding_key)
Consistent hashing0
hash(sharding_key)
A
Consistent hashing0
hash(sharding_key)
BA
Consistent hashing0
hash(sharding_key)
BA
C
Consistent hashing0
hash(sharding_key)
BA
C
Consistent hashing0
hash(sharding_key)
BA
C
BA
C
Резервный фотокэшphotoscache1
bphotos
photoscache2
photoscache3
photoscache4(reserve)
Load balancer
Резервный фотокэшphotoscache1
Load balancer
photoscache2
photoscache3
photoscache4(reserve)
bphotos
Кэширование. Результаты- Hitrate (количество попаданий в кэш) 98%- Из 80k только 1600 rps доходят до bphotos
Кэширование. Результаты- Hitrate (количество попаданий в кэш) 98%- Из 80k только 1600 rps доходят до bphotos- 3 точки присутствия (Прага, Майами, Гонконг)
Кэширование. Результаты- Hitrate (количество попаданий в кэш) 98%- Из 80k только 1600 rps доходят до bphotos- 3 точки присутствия (Прага, Майами, Гонконг)
+
- Поддержка webp, progressive jpeg- Динамический resize/crop- Динамические вотермарки, фильтры (blur, pixelize)
Почему не CDN?- Хочется больше контроля и предсказуемости
Почему не CDN?- Хочется больше контроля и предсказуемости- Система развивалась постепенно
Почему не CDN?- Хочется больше контроля и предсказуемости- Система развивалась постепенно- Много специфической логики на фотокэшах
Почему не CDN?- Хочется больше контроля и предсказуемости- Система развивалась постепенно- Много специфической логики на фотокэшах- Невысокая сложность поддержки итогового решения
Почему не CDN?- Хочется больше контроля и предсказуемости- Система развивалась постепенно- Много специфической логики на фотокэшах- Невысокая сложность поддержки итогового решения
Современный CDN — хорошая альтернатива в условиях дефицита ресурсов и времени
Хранение. 2013 годbphotos1
bphotos2
bphotosN Storage Area Network (SAN)
photoscache1
photoscacheN
Хранение. 2013 годbphotos1
bphotos2
bphotosN Storage Area Network (SAN)
photoscache1
photoscacheN
80 x bphotos = ~560Tb данных40 x photoscache
X 2 ДЦ
Хранение. 2013 годbphotos1
bphotos2
bphotosN Storage Area Network (SAN)
photoscache1
photoscacheN
1 x POINT OF FAILURE
Хранение. 2013 годbphotos1
bphotos2
bphotosN Storage Area Network (SAN)
photoscache1
photoscacheN
2 x POINT OF FAILURE
Хранение. 2013 годbphotos1
bphotos2
bphotosN Storage Area Network (SAN)
photoscache1
photoscacheN
3 x POINT OF FAILURE
Хранение. 2013 годbphotos1
bphotos2
bphotosN Storage Area Network (SAN)
photoscache1
photoscacheN
3 x POINT OF FAILURE! MAINTENANCE
Хранение. 2013 годbphotos1
bphotos2
bphotosN Storage Area Network (SAN)
photoscache1
photoscacheN
3 x POINT OF FAILURE ! DATA LOSS! MAINTENANCE
Резервирование v.1
bphotos
Main partitionLocal FS Fiber
Storage Area Network
bphotos
Local FS
Main partition
Backup partitionFiber
Storage Area Network
Fiber
Storage Area Network
Резервирование v.1
Async queue
bphotos
Local FS
Main partition
Backup partitionFiber
Storage Area Network
Fiber
Storage Area Network
Резервирование v.1
Async queue
bphotos
Local FS
Main partition
Backup partitionFiber
Storage Area Network
Fiber
Storage Area NetworkBuffer partition
Резервирование v.1
Async queue
bphotos
Local FS
Main partition
Backup partitionFiber
Storage Area Network
Fiber
Storage Area NetworkBuffer partition
! NO DATA LOSS
Резервирование v.1
Async queue
bphotos
Local FS
Main partition
Backup partitionFiber
Storage Area Network
Fiber
Storage Area NetworkBuffer partition
! NO DATA LOSS! POINT OF FAILURE
Резервирование v.1
Async queue
bphotos
Local FS
Main partition
Backup partitionFiber
Storage Area Network
Fiber
Storage Area NetworkBuffer partition
! NO DATA LOSS! POINT OF FAILURE! MAINTENANCE
Резервирование v.1
Dphotos
Async queue
bphotos
Local FS
Main partition
Backup partitionFiber
Storage Area Network
Fiber
Storage Area NetworkBuffer partition
Dphotos
Async queue
bphotos
Local FS
Main partition
Backup partition
Buffer partition
Dphotos
Async queue
bphotos
Local FS
Main partition
Backup partition
Buffer partition
Dphotos
dphotosN
Buffer partition
Main partition
dphotosN+1
Buffer partition
Main partition
Dphotos
dphotosN
Async queue
Buffer partition
Main partition
dphotosN+1
Buffer partition
Main partition
Dphotos. Upload
Async queue
dphotosN
dphotosN+1Round robin + health checks
Load balancer
Dphotos. Отдача
photoscache
Async queue
dphotosN
dphotosN+1Round robin + health checks
Dphotos. Отдача
photoscache
Async queue
dphotosN
dphotosN+1
HIT
Round robin + health checks
Dphotos. Отдача
Async queue
dphotosN
dphotosN+1
MISS
Round robin + health checks
photoscache
Dphotos. Отдача
Async queue
dphotosN
dphotosN+1
MISS
Round robin + health checks
photoscache
Dphotos. Отказоустойчивость
dphotosN
Async queue
Buffer partition
Main partition
dphotosN+1
Buffer partition
Main partition
Dphotos. Отказоустойчивость
dphotosN
Async queue
Buffer partition
Main partition
dphotosN+1
Buffer partition
Main partition
Dphotos. Отказоустойчивость
dphotosN
Async queue
Buffer partition
Main partition
dphotosN+1
Buffer partition
Main partition
Dphotos. Отказоустойчивость
dphotosN
Async queue
Buffer partition
Main partition
dphotosN+1
Buffer partition
Main partition
Dphotos. Результаты- Отказоустойчивость
Dphotos. Результаты- Отказоустойчивость- Простая эксплуатация
Dphotos. Результаты- Отказоустойчивость- Простая эксплуатация- Двойной запас по чтению
Dphotos. Результаты- Отказоустойчивость- Простая эксплуатация- Двойной запас по чтению- Сложность разработки
Dphotos. Результаты- Отказоустойчивость- Простая эксплуатация- Двойной запас по чтению- Сложность разработки
Так хранить локально — это хорошо или плохо?- Проще в эксплуатации
Dphotos. Результаты- Отказоустойчивость- Простая эксплуатация- Двойной запас по чтению- Сложность разработки
Так хранить локально — это хорошо или плохо?- Проще в эксплуатации- Производительнее
Dphotos. Результаты- Отказоустойчивость- Простая эксплуатация- Двойной запас по чтению- Сложность разработки
Так хранить локально — это хорошо или плохо?- Проще в эксплуатации- Производительнее- В 1.5 раза дороже, чем SAN
Итоги
Итоги
Итоги
photoscache
Итоги
photoscache
CDN
Итоги
photoscache dphotos
CDN Storage layer
Итоги
photoscache dphotos
CDN Storage layer
Local drives
Итоги
photoscache dphotos
Storage Area Network
CDN Storage layer
Local drives
Итоги
- А надо ли улучшать? Сначала измерь
Итоги
- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг
Итоги
- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг- Immutable фотки
Итоги
- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг- Immutable фотки- Resize на лету
Итоги
- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг- Immutable фотки- Resize на лету- Инкрементальные асинхронные бэкапы - это хорошо
Итоги
- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг- Immutable фотки- Resize на лету- Инкрементальные асинхронные бэкапы - это хорошо- Если что-то может сломаться - оно сломается