Архітектура високих навантажень

Архітектурні рішення - фундамент будь-яких додатків. У тому числі і додатків з високими навантаженнями. Важливо розуміти, що архітектура Web додатки визначає 95% успішності його роботи. У тому числі здатність справлятися з навантаженнями.

принципи розробки

Розробляючи успішне, а значить велика, Web додаток, необхідно розібратися в принципах побудови великих систем.

Ви ніколи не знаєте, що станеться з додатком завтра. Можливо, кількість ваших користувачів збільшитися в 5 разів. Можливо, різко почне набирати популярність другорядна функція. І вона створить нові проблеми. Чим більше буде ставати система, тим більш складним (= менш ефективним) буде ставати довгострокове планування.

Успішність роботи над великим додатком має на увазі зовсім не детальне планування всіх аспектів. Основне зусилля повинне бути спрямоване на забезпечення гнучкості системи. Гнучкість дозволить швидко вносити зміни. Це найбільш важлива властивість будь-швидкозростаючою системи.

поступове зростання

Не намагайтеся спрогнозувати обсяг аудиторії на рік вперед. Те ж саме стосується і архітектури додатку. Основа успішної розробки - поступові рішення. Це можна застосувати і до програмної і до апаратної частини.

Якщо Ви запускаєте новий додаток, немає сенсу відразу забезпечувати інфраструктуру, яка здатна витримати мільйони відвідувачів. Використовуйте хмари для хостингу нових проектів. Це дозволить знизити витрати на сервера і спростити їх управління.

Багато хмарні хостинги надають послуги приватної мережі. Це дозволить безпечно використовувати кілька серверів прямо в хмарі. Таким чином, ви зможете виконувати перші кроки в масштабуванні без переїзду на фізику.

прості рішення

Прості рішення розробляти вкрай складно. Проте, краще витратити час і зусилля на спрощення рішень (як для розробки так і для користувачів). Гнучка система не буває складною.

прогресивні зміни

Робота над великим проектом дуже нагадує завантаження картинки формату Progressive JPEG. Ви рухаєтеся не поступово, а хаотично. Вам доведеться постійно допрацьовувати і переробляти різні рішення, перемикатися з одних на інші.

95% процентиль

Архітектура високих навантажень

Застосовуйте правило 95% процентилю: Інвестуйте час тільки в забезпечення 95% функціоналу. Решта 5% відкидайте - це окремі випадки, які ведуть до ускладнення системи.

Акцентуйте увагу на важливому. Запам'ятайте, у вас завжди буде більше завдань, ніж часу на їх рішення. Ставте пріоритети правильно - вирішуйте ті проблеми, які виникають у більшості користувачів.

архітектурні рішення

Масштабування будь-якого Web додатки - це поступовий процес, який включає:
  1. Аналіз навантаження.
  2. Визначення найбільш схильних до навантаженні ділянок.
  3. Винесення таких ділянок на окремі вузли і їх оптимізація.
  4. Повтор пункту 1.

1. Проста архітектура Web додатки

Новий додаток зазвичай запускається на одному сервері, на якому працюють і Web сервер і база даних і сам додаток:

Архітектура високих навантажень

Це розумно, тому що це економить час і гроші на запуск. Використовуйте саме такий підхід для старту. Якщо боїтеся не витримати стартову навантаження - візьміть потужний сервер в оренду. Тільки у виняткових ситуаціях, коли ви абсолютно точно впевнені в великий стартовою навантаженні, переходите відразу до того, що описано нижче.

2. Відділення бази даних

Найчастіше, першим вузлом, який опиняється під навантаженням, є база даних. Це зрозуміло. Кожен запит від користувача до додатка - це зазвичай від 10 до 100 запитів до бази даних:

Архітектура високих навантажень

Пауза в роботі при перенесенні

Після виділення MySQL на окремий сервер, переконайтеся в його оптимальному налаштуванні.

3. Відділення Web сервера

Далі на черзі Web сервер. Його виділення на окремий вузол дозволить залишити більше ресурсів для програми (у прикладі - PHP):

# Все файли статики Nginx буде віддавати без звернення на бекенд

Якщо Ви використовуєте завантаження файлів, вам потрібно буде виділити файлове сховище на окремий вузол (про це - нижче).

4. Кілька PHP бекендов

Коли навантаження зростає, Web додаток поступово починає працювати все повільніше. У якийсь момент причина буде лежати вже в самій реалізації. Тоді варто встановити кілька PHP бекендов:

Архітектура високих навантажень

Все бекенди важливо мати однакової конфігурації. Nginx вміє балансувати навантаження між ними. Для цього Вам необхідно виділити список бекендов в upstream і використовувати його в конфігурації:

# Nginx буде рівномірно розподіляти навантаження між зазначеними бекендамі

Ви можете використовувати ваги бекендов, якщо одні з них могутніше, ніж інші:

# З кожних 16 запитів, перший бекенд обробить 10, другий - 2, а третій - 4

Як тільки ви почнете використовувати кілька бекендов, запити від одного користувача будуть потрапляти на різні сервера. Це зажадає використання єдиного сховища для сесій, наприклад Memcache.

5. Кешування

Підключення серверів кешування - одна з найпростіших завдань:

Архітектура високих навантажень

Memcache забезпечує використання декількох серверів в стандартному постачанні:

# Підключаємо Memcache до декількох серверів відразу

Memcache самостійно розподілить навантаження між використовуваними серверами. Для цього він використовує алгоритм постійного хеширования. Вам знадобиться стежити за витіснення і вчасно додати апаратне забезпечення.

6. Черги завдань

Черги завдань дозволяють виконувати важкі операції асинхронно. не забарився основного додатка. Архітектурно це виглядає так:

Архітектура високих навантажень

Сервер черги приймає завдання від додатка. Worker-сервера обробляють завдання. Їх кількість слід збільшувати, коли середня кількість завдань в черзі буде поступово зростати.

7. Балансування DNS

Для використання цього механізму, необхідно встановити кілька однакових фронтенда. Тоді в DNS слід вказувати такі А записи:

8. Файлові сховища

Правильним рішенням буде використання окремих серверів для завантаження, зберігання і обробки файлів:

Архітектура високих навантажень

На практиці це реалізується так:
  1. Виділяється окремий субдомен для сервера файлів.
  2. На сервері розгортається Nginx і невеликий додаток, яке вміє зберігати (і обробляти, якщо потрібно) файли.
  3. Масштабування відбувається шляхом додавання нових серверів і субдоменів (images1, images2, images3 і т.п.).

Завантаження файлів

Завантаження зручно перекладати на клієнтську сторону. Тоді форма буде відправляти запит на конкретний сервер:

Домени можна генерувати випадковим чином з вже існуючих:

AJAX завантаження

Не забуваємо про CORS:

# Це дозволить відправляти AJAX запити з домену ruhighload.com на домени завантаження

Архітектура високих навантажень

матеріали по темі

Схожі статті