Tinkoff Python

Episode 11 (Final) - path 2

HighLoad, масштабирование, отказоустойчивость

У нас есть приложение

В которое ходят клиенты

Данные читаем из базы

С увеличением нагрузки увеличиваем кол-во процессов/потоков для обработки запросов

Но рано или поздно нам придется поставить второй сервер/виртуалку и добавить новые инстансы приложения

Балансировка

На стороне клиента

Клиенты знают адреса всех серверов, и сами выбирают на какой ходить

DNS балансировка

Revers-proxy (nginx, haproxy)

Алгоритмы балансировки

  • Round robin
  • По кол-ву запросов
  • По весам

HTTPS, throttling часто настраивается на стороне reverse-proxy

Балансер тоже является точкой отказа и может быть продублирован

Слишком много запросов на чтение в бд?

Репликация

+ Увеличиваем возможность обрабатывать запросы на чтение

+ Отказоустойчивость (можно переключить запись на реплику, если мастер упал)

- Eventual consistency - изменения доходят до реплик с задержкой (для критично важных запросов читаем из мастера)

Запросы становятся тяжелыми и медленными?

Добавляем кэширование, денормализацию

Объемы хранимых данных слишком велики?

Шардирование

Данные можно делить по условию или типу

Например данные разных клиентов в разных базах, логи за разные периоды времени и тд - это разделение по условию. Под шардированием подразумевают такой способ.

Хранить сообщения чата в одной базе, аватарки пользователей в другой - это разделение по типу

Консистентность не гарантируется, например уникальный индекс по данным на разных шардах придется строить в отдельной базе данных.

Индексы для поиска по всем данным также можно выносить в отдельные базы (например elastic для поиска по тексту)

Решардшинг

Hashring

Шардирование + Репликация

Слишком много запросов на запись в базу?

Пишем асинхронно через очередь (celery, rq, etc.)

Очереди также могут быть отказоустойчивы и продублированы

Файловый сервер с обработкой картинок

Приложения на хостах с хорошим cpu для обработки изображений

Диск для записи

Сервера раздающие файлы с реплик диска

При этом мы имеем N resizer`ов, которые пишут данные на M дисков, которые реплицируются на M*X копий, с которых раздают файлы Y файловых серверов

Чат

Авторизация

API gateway

Апи, с которым взаимодействуют клиенты. Гейт скрывает внутреннюю структуру системы и упрощает ее изменения. Часто в роли такого апи может выступать не отдельное приложение, а revers-proxy

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

Спасибо, что были с нами!)

Вопросы?

Tinkoff Python 11

By Afonasev Evgeniy

Tinkoff Python 11

  • 436