System Design социальной сети для курса по System Design
- Лента новостей (посты других пользователей), сортируем по времени (первыми - более свежие)
- Аутентификация, авторизация пользователей
- Можно оценивать и комментировать посты других пользователей
- Можно подписываться на других пользователей
- Поиск популярных мест, просмотр постов с этих мест
- DAU = 10 000 000
- В среднем запросов в день - на чтение 20. На запись - создание постов - не более 3 постов в день в среднем.
- Каждый пользователь ищет в среднем 5 мест для путешествия в день.
- Каждый пользователь в среднем оставляет 5 комментариев в день. Читаем 30 самых свежих комментариев.
- Аудитория - страны СНГ.
- Используем мобильное приложение и браузер.
- Сезонности: может возрастать нагрузка на праздники/выходные.
- Условия хранения данных: всегда.
- Лимиты:
- максимальное количество подписчиков - 1 000 000 подписчиков.
- не более 1000 комментариев к одному посту
- не более 5 фото к каждому посту
- размер комментария не более 100 символов
- размер текста в посте - не более 150 символов
- Лента: подгружаем последние 20 постов единовременно.
- Реакции: пользователь ставит не более 20 реакций (лайки/дизлайки) в день.
- Временные ограничения: лента может обновляться не сразу. Допустима задержка не более 2 секунд.
- Доступность приложения: за год не более 4 часов простоя. (99.95%)
- Поиск постов: по строке.
posts (400b):
post_id uuid 8b
description string < 2b * 150 = 300b
owner_id uuid 8b
photo_id string 100b
place_id uuid 8b
created_at date 8b
...
comments(250b):
comment_id uuid 8b
text string 2b * 100 = 200b
owner_id uuid 8b
reactions(20b):
user_id uuid 8b
post_id uuid 8b
type 1b
places(150b):
id integer 8b
name string 100b
location point 8b
post_count int 4b
read: 10 000 000 * 20 / 86400 ~ 2000 write: 10 000 000 * 3 / 86400 ~ 300
read: 10 000 000 * 30 / 86400 ~ 3000 write: 10 000 000 * 5 / 86400 ~ 500
10 000 000 * 20 / 86400 ~ 2000
read: 2000 * 400b = 800000b/s ~ 800 Kb/s
write: 300 * 400b = 1200 b/s = 1.2Kb/s
read: 3000 * 250b = 750000 b/s ~ 750 Kb/s
write: 500 * 250b = 125000 b/s ~ 125 Kb/s
2000 * 20b = 40000 b/s ~ 40 Kb/s
Расчеты на 1 год:
800Kb/s * 86400 * 365 ~ 800 * 100 000 * 400 Kb = 32Tb
750Kb/s * 86400 * 365 ~ 750 * 100 000 * 400 Kb = 30 000 000 000 Kb = 30Tb
40Kb/s * 86400 * 365 ~ 40 * 100 000 * 400 = 1 600 000 000 Kb = 1.6Tb
Пропускная способность: 100 Mb/s capacity: 32 Tb IOPS: 100
disks for capacity = capacity / disk_capacity = 32Tb / 32Tb = 1 disk + метаданные = 2 disks disks for throughput = traffic_per_second / disk_throughput = 802Kb/s / 100 000Kb/s = 1 disk disks for iops = iops / disk_iops = RPS(write+read) / disk_iops = 2300 RPS / 100 = 23 disks
disks for capacity = capacity / disk_capacity = 30 Tb / 32 Tb = 1 disk + метаданные = 2 disks disks for throughput = traffic_per_second / disk_throughput = 900 Kb/s / 100 000 Kb/s = 1 disk disks for iops = iops / disk_iops = RPS(write+read) / disk_iops = 3500 RPS / 100 = 35 disks
disks for capacity = capacity / disk_capacity = 1.6Tb / 32Tb = 1 disk disks for throughput = traffic_per_second / disk_throughput = 40Kb/s / 100 000Kb/s = 1 disk disks for iops = iops / disk_iops = RPS(write+read) / disk_iops = 2000 / 100 = 20 disks
Суммарно ~ 80 дисков.
Пропускная способность: 500 Mb/s capacity: 100Tb IOPS: 1000
disks for capacity = capacity / disk_capacity = 32Tb / 100Tb = 1 disk disks for throughput = traffic_per_second / disk_throughput = 802Kb/s / 500 000Kb/s = 1 disk disks for iops = iops / disk_iops = RPS(write+read) / disk_iops = 2300 RPS / 1000 = 3 disks
disks for capacity = capacity / disk_capacity = 30 Tb / 100 Tb = 1 disk disks for throughput = traffic_per_second / disk_throughput = 900 Kb/s / 500 000 Kb/s = 1 disk disks for iops = iops / disk_iops = RPS(write+read) / disk_iops = 3500 RPS / 1000 = 4 disks
disks for capacity = capacity / disk_capacity = 1.6Tb / 100Tb = 1 disk disks for throughput = traffic_per_second / disk_throughput = 40Kb/s / 500 000Kb/s = 1 disk disks for iops = iops / disk_iops = RPS(write+read) / disk_iops = 2000 / 1000 = 2 disks
Суммарно ~ 7 дисков.
Вывод: по расчетам количество более дешевых дисков (HDD) примерно в 10 раз больше, чем SSD дисков.
Учитывая этот факт и планируемый рост нагрузки на чтение/запись, рост количества пользователей, предлагаю использовать SSD диски.
PostgreSQL RF = 2 async replication, master-slave 3 all_disks / 2 disks_per_host (типичная конфигурация) = 2 shards 2 shards * 2 (RF) = 4 hosts by 2 disks
Шардирование по key-based подход - by user_id
PostgreSQL RF = 2 async replication, master-slave 4 all_disks / 2 disks_per_host = 2 shards 2 shards * 2 (RF) = 4 hosts by 2 disks
Шардирование по key-based подход - by posts_id
PostgreSQL RF = 2 async replication, master-slave 2 all_disks / 2 disks_per_host = 1 shards 1 shards * 2 (RF) = 2 hosts by 2 disks