Архитектура хранения и отдачи фотографий в Badoo

Preview:

Citation preview

Архитектура хранения и отдачи фотографий в 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- Чтение -> кэш- Запись -> шардинг

Итоги

- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг- Immutable фотки

Итоги

- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг- Immutable фотки- Resize на лету

Итоги

- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг- Immutable фотки- Resize на лету- Инкрементальные асинхронные бэкапы - это хорошо

Итоги

- А надо ли улучшать? Сначала измерь http://pinba.org- Чтение -> кэш- Запись -> шардинг- Immutable фотки- Resize на лету- Инкрементальные асинхронные бэкапы - это хорошо- Если что-то может сломаться - оно сломается

Recommended