Попов М.А. АПО-31
Облачное хранилище (VK Облако).
В связи с отсутсвием открытой информации о статистике VK Облака, будем опираться на статистику сервиса Dropbox.
MVP включает:
- Загрузка файлов любого формата в хранилище
- Скачивание файлов из хранилища
- Просмотр загруженных файлов через веб-интерфейс
- Предоставление доступа на просмотр файлов третьим лицам
Целевая аудитория ([1]):
- США - 56 миллионов в месяц
- Великобритания - 9 миллиона в месяц
- Япония - 8 миллиона в месяц
- Германия - 6.5 миллиона в месяц
- Канада - 6 миллиона в месяц
- Другие страны - 73.5 миллионов в месяц
Согласно статистике [1], Dropbox в месяц посещают около 160 миллионов пользователей.
В среднем ежедневно около 5.3 миллиона посещений.
Размер хранилища, доступный при бесплатном использовании, равен 2 Гб.
Пусть около 10% посещений происходит с запросом авторизации, тогда ежедневно выполняется 530 тысяч запросов на авторизацию.
На первой странице сервиса отображается список всех файлов, поэтому будем считать, что каждый десятый хотя бы раз попадает на эту страницу. Пусть таких запросов 60 млн в день.
Согласно статистике [2] за 2016 год в Dropbox ежедневно просматривают порядка 1 200 миллиона файлов. Так как с 2016 года аудитория зарегистрированных пользователей выросла на 200 миллионов [3], возьмём количество загрузок файлов равное 1 700 миллионам.
Загрузка файлов происходит реже - около 500 млн раз в день (с учетом автоматической синхронизации).
Согласно статистике [2] за 2015 год каждый час создается 100 тысяч новых публичных папок и файлов. С 2015 года аудитория Dropbox увеличилась на 300 миллионов зарегистрированных пользователей [3], поэтому будем считать, что каждый час создается 180 тысяч шареных файлов. Тогда в день таких файлов создается порядка 4.4 миллиона.
Среднее количество действий пользователей
Тип запроса | Среднее количество (млн/день) |
---|---|
Авторизация | 0.53 |
Просмотр списка файлов | 60 |
Просмотр файлов | 1 700 |
Загрузка файлов | 500 |
Шаринг файла | 4.4 |
Среднее количество действий одного пользователя
Тип запроса | Среднее количество (в день) |
---|---|
Авторизация | 0.1 |
Просмотр списка файлов | 11 |
Просмотр файлов | 320 |
Загрузка файлов | 94 |
Шаринг файла | 1 |
Согласно статистике [3], на текущий момент в Dropbox зарегистрировано 700 млн пользователей, из которых 15.5 млн (~2%) - платные пользователи.
Размер бесплатного хранилища пользователя равен 2 Гб. Примем, что пользователи в среднем занимают 1 Гб в облаке, тогда размер хранилища для бесплатных пользователей равен 684.5 * 10^6 * 1 = 668 457 Тб.
Dropbox предлагает неограниченнный объем хранилища на самой дорогой подписке. Так как нет открытой информации о среднем объеме хранения платных пользователей, возьмем его равным 128 Гб. Тогда размер хранилища для платных пользователей равен 15.5 * 10^6 * 128 = 1 937 500 Тб.
Таким образом, суммарный объем хранилища составляет около 2 600 000 Тб.
Обычно пользователи хранят в облаке фотографии или текстовые документы. Будем считать, что их средний размер 4 Мб.
Считаем, что в пике средняя нагрузка увеличина в 2 раза.
Входящий трафик
Тип запроса | Объём 1 запроса (Кб) | Суточный объём (Гб/сутки) | Пиковое потребление в течении суток (Гбит/с) |
---|---|---|---|
Авторизация | 1 | 0.5 | 0.00009 |
Загрузка файлов | 4096 | 1 953 125 | 362 |
Шаринг файла | 1 | 4.2 | 0.0008 |
Входящий трафик в расчете на одного пользователя
Тип запроса | Объём 1 запроса (Кб) | Суточный объём (Кб/сутки) | Пиковое потребление в течении суток (Кбит/с) |
---|---|---|---|
Авторизация | 1 | 0.1 | 0.00002 |
Загрузка файлов | 4096 | 385 024 | 71 |
Шаринг файла | 1 | 1 | 0.0002 |
Исходящий трафик
Тип запроса | Объём 1 запроса (Кб) | Суточный объём (Гб/сутки) | Пиковое потребление в течении суток (Гбит/с) |
---|---|---|---|
Просмотр списка файлов | 512 | 29 296 | 5 |
Просмотр файлов | 4096 | 6 640 625 | 1 230 |
Исходящий трафик в расчете на одного пользователя
Тип запроса | Объём 1 запроса (Кб) | Суточный объём (Кб/сутки) | Пиковое потребление в течении суток (Кбит/с) |
---|---|---|---|
Просмотр списка файлов | 512 | 5 632 | 1 |
Просмотр файлов | 4096 | 1 310 720 | 243 |
Количество RPS по типам запросов
Тип запроса | RPS |
---|---|
Авторизация | 12 |
Просмотр списка файлов | 1 400 |
Просмотр файлов | 40 000 |
Загрузка файлов | 11 600 |
Шаринг файла | 51 |
Для хранения всех данных будем использовать БД Tarantool, так как она предоставляет быстрый доступ к данным, эффективное сохранение постоянных данных на диск. Кроме того, Tarantool предоставляет возможность вынесения какой-то части логики в application рядом с БД. Также есть поддержка репликация (будем использовать master-slave репликацию).
Users
5 * 64 + 4 + 32 = 356 байт - 1 запись
Зарегистрированных пользователей 700 млн, тогда 356 * 700 * 10^6 / 1024^3 ~ 232 Гб
Индексы по id и email
Subscriptions
4 * 4 + 2 + 2 * 8 + 1 = 35 байт - 1 запись
Платных пользователей 15.5 млн, предположим, что на каждого платного пользоавтеля приходится хотя бы 10 записей о подписке, тогда 35 * 155 * 10^6 / 1024^3 ~ 5 Гб
Индексы по id, user_id, transaction_id и (user_id, transaction_id)
Transactions
2 * 4 + 8 + 2 = 18 байт - 1 запись
Если записей о подписках порядка 155 млн, то предположим, что на каждую подписку приходится хотя бы 2 записи о транзакции, тогда 18 * 310 * 10^6 / 1024^3 ~ 5 Гб
Индекс по id
Binds
2 * 4 + 2 * 32 + 8 = 80 байт - 1 запись
Предположим, что запоминают карту 60% платных пользователей, тогда 80 * 9.3 * 10^6 / 1024^3 ~ 0.7 Гб
Индексы по id и user_id
Documents
2 * 4 + 2 * 64 + 8 = 144 байта - 1 запись
Согласно статистике [2] всего загруженных файлов порядка 400 млрд, тогда 144 * 400 * 10^9 / 1024^4 ~ 52 Тб
Индексы по id, name и path
Versions
5 * 4 + 8 = 28 байт - 1 запись
Предположим, что на каждый документ в среднем приходится по 3 версии, тогда 28 * 1 200 * 10^9 / 1024^4 ~ 30.5 Тб
Индексы по id, user_id, doc_id и (user_id, doc_id)
Weblinks
4 * 4 + 2 * 8 + 2 = 34 байт - 1 запись
Предположим, что каждый пользователь в среднем делится 50 документами, тогда 34 * 775 * 10^6 / 1024^3 ~ 25 Гб
Индексы по id, user_id, doc_id, for_user и (user_id, doc_id)
Access
3 * 4 + 2 = 14 байт - 1 запись
Предположим, что каждый пользователь в среднем делится 50 документами, тогда 14 * 775 * 10^6 / 1024^3 ~ 10 Гб
Индексы по id, user_id, doc_id и (user_id, doc_id)
Для оптимизации работы с БД будем использовать шардирование по регионам. Проверка региона может осуществлятся на основе выставленного языка, либо IP-адреса.
Технология | Применение | Причина выбора |
---|---|---|
TypeScript | Язык Frontend | Типизация |
React | Фреймворк Frontend | Скорость написания, хорошая поддержка |
Nginx | Web-server, Reverse proxy | Скорость, простая настройка |
Golang | Язык Backend | Скорость, скорость написания, простота поддержки |
Tarantool | База данных | Скорость доступа к данным |
Для балансировки применяется DNS-балансировка и далее L7-балансировка на nginx.
auth - сервис авторизации пользователя.
documents - сервис для работы с документами.
payments - сервис для работы с оплатами и подписками.
Между собой сервисы будут общаться по gRPC, т.к. это позволит добиться высокой скорости связи между внутренними API.
Все файлы пользователей будут храниться на машинах, раздавать файлы будет nginx.
Для распределения нагрузки предлагается создать 3 датацентра:
- в Северной Америке (Нью-Йорк)
- в Европе (Франкфурт)
- в Юго-Восточной Азии (Токио)
Это позволит покрыть основные регионы проживания потенциальных пользователей.
Доступность данных является критически важной для проекта, поэтому для хранения будет использоваться RAID 10 массив [5,6] из жёстких дисков. Это повысит надёжность благодаря полному дубированию данных, а также скорость обработки из-за распараллеливания операций по дискам.
Количество серверов в датацентре
Тип | Количество основных | Количество резервных |
---|---|---|
Nginx | 10 | 4 |
Backend | 6 | 2 |
Database | 3 + 6 | 3 |
Files | 81 250 | 2 000 |
Конфигурация сервера для Nginx
CPU | RAM (Гб) | Тип диска | Объем диска (Гб) | Пропускная способность (Гб/с) |
---|---|---|---|---|
16 | 32 | 20 |
Конфигурация сервера для Backend
CPU | RAM (Гб) | Тип диска | Объем диска (Гб) | Пропускная способность (Гб/с) |
---|---|---|---|---|
32 | 128 | SSD | 512 Гб | 20 |
Конфигурация сервера для Database
CPU | RAM (Гб) | Тип диска | Объем диска (Тб) | Пропускная способность (Гб/с) |
---|---|---|---|---|
32 | 256 | HDD | 8 * 4 | 20 |
Конфигурация сервера для Files
CPU | RAM (Гб) | Тип диска | Объем диска (Тб) | Пропускная способность (Гб/с) |
---|---|---|---|---|
16 | 32 | HDD | 8 * 4 | 10 |
- https://www.similarweb.com/ru/website/dropbox.com/#overview
- https://expandedramblings.com/index.php/dropbox-statistics/
- https://www.wallstreetzen.com/stocks/us/nasdaq/dbx/statistics
- https://backlinko.com/dropbox-users
- https://saasscout.com/statistics/dropbox-statistics/
- https://www.wallstreetzen.com/stocks/us/nasdaq/dbx/statistics
- https://altastor.ru/tech/raid/
- https://highload.today/index-php-2009-10-31-nginx-dlya-otdaci-failov/