Update README.md
This commit is contained in:
135
README.md
135
README.md
@@ -46,6 +46,7 @@
|
|||||||
<li><a href="#индексы">Индексы</a></li>
|
<li><a href="#индексы">Индексы</a></li>
|
||||||
<li><a href="#транзакции">Транзакции</a></li>
|
<li><a href="#транзакции">Транзакции</a></li>
|
||||||
<li><a href="#кластеризация-и-шардинг">Кластеризация и шардинг</a></li>
|
<li><a href="#кластеризация-и-шардинг">Кластеризация и шардинг</a></li>
|
||||||
|
<li><a href="#backpressure">Backpressure</a></li>
|
||||||
<li><a href="#ограничения">Ограничения</a></li>
|
<li><a href="#ограничения">Ограничения</a></li>
|
||||||
<li><a href="#импорт-экспорт">Импорт-Экспорт</a></li>
|
<li><a href="#импорт-экспорт">Импорт-Экспорт</a></li>
|
||||||
<li><a href="#http-api">HTTP API</a></li>
|
<li><a href="#http-api">HTTP API</a></li>
|
||||||
@@ -1203,6 +1204,140 @@ futriix:~> cluster health
|
|||||||
```
|
```
|
||||||
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
|
||||||
|
## Backpressure
|
||||||
|
|
||||||
|
Для равномерной загрузки каждого узла кластера, в субд futriix применяется механизм **"backpressure (в пер. с англ. "обратный клапан@)"**.
|
||||||
|
|
||||||
|
**Математическая формула вероятностного отклонения в Backpressure**
|
||||||
|
|
||||||
|
В системе Backpressure используется адаптивная вероятностная модель для отклонения запросов при перегрузке, которое рассчитывается по следующей формуле:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
P_reject = f(level) × g(load) × h(time)
|
||||||
|
|
||||||
|
Где:
|
||||||
|
|
||||||
|
* P_reject — итоговая вероятность отклонения запроса (0.0 - 1.0)
|
||||||
|
* f(level) — коэффициент на основе уровня перегрузки
|
||||||
|
* g(load) — коэффициент на основе текущей нагрузки
|
||||||
|
* h(time) — коэффициент на основе времени (для защиты от "thundering herd")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Компоненты формулы** </br>
|
||||||
|
|
||||||
|
**Коэффициент уровня перегрузки f(level)**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
f(level) = {
|
||||||
|
0.00, если level = None
|
||||||
|
0.00, если level = Low (только задержка)
|
||||||
|
0.30, если level = Medium
|
||||||
|
0.70, если level = High
|
||||||
|
0.90, если level = Critical
|
||||||
|
}
|
||||||
|
```
|
||||||
|
</br>
|
||||||
|
**Коэффициент нагрузки g(load)**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
g(load) = (cpu_usage + memory_usage + queue_factor + connection_factor) / 4
|
||||||
|
|
||||||
|
где:
|
||||||
|
cpu_usage = current_cpu / cpu_threshold
|
||||||
|
memory_usage = current_memory / memory_threshold
|
||||||
|
queue_factor = min(queue_size / queue_threshold, 1.0)
|
||||||
|
connection_factor = min(connections / connection_threshold, 1.0)
|
||||||
|
```
|
||||||
|
</br>
|
||||||
|
|
||||||
|
**Коэффициент времени h(time) (экспоненциальное сглаживание)**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
h(time) = 1 - e^(-λ × Δt)
|
||||||
|
|
||||||
|
где:
|
||||||
|
λ = 0.1 (константа скорости затухания)
|
||||||
|
Δt = время с последнего отклонения в секундах
|
||||||
|
```
|
||||||
|
</br>
|
||||||
|
|
||||||
|
**Итоговая формула вероятности отклонения**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
P_reject = f(level) × g(load) × (1 - e^(-0.1 × Δt))
|
||||||
|
```
|
||||||
|
|
||||||
|
**Формула задержки (для уровня Low)**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
D = D_base × (1 + α × load_factor)
|
||||||
|
|
||||||
|
где:
|
||||||
|
D_base = 100ms (базовая задержка)
|
||||||
|
α = 2.0 (коэффициент усиления)
|
||||||
|
load_factor = (cpu_usage + memory_usage) / 2
|
||||||
|
```
|
||||||
|
</br>
|
||||||
|
|
||||||
|
**Графическое представление**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
Вероятность отклонения P_reject
|
||||||
|
|
|
||||||
|
1.0 | * * * Critical (90%)
|
||||||
|
| *
|
||||||
|
0.9 | * High (70%)
|
||||||
|
| *
|
||||||
|
0.7 | * Medium (30%)
|
||||||
|
| *
|
||||||
|
0.5 | *
|
||||||
|
| *
|
||||||
|
0.3 | * Low (0% - только задержка)
|
||||||
|
| *
|
||||||
|
0.1 |*
|
||||||
|
|_____________________________ Нагрузка
|
||||||
|
0 0.2 0.4 0.6 0.8 1.0
|
||||||
|
```
|
||||||
|
</br>
|
||||||
|
|
||||||
|
#### Пример рассчёта
|
||||||
|
|
||||||
|
**Исходные данные:**
|
||||||
|
|
||||||
|
* Уровень: High → f(level) = 0.70
|
||||||
|
|
||||||
|
* CPU: 85% → cpu_usage = 0.85/0.80 = 1.0625
|
||||||
|
|
||||||
|
* Memory: 75% → memory_usage = 0.75/0.85 = 0.882
|
||||||
|
|
||||||
|
* Queue: 8000/10000 = 0.8
|
||||||
|
|
||||||
|
* Connections: 4000/5000 = 0.8
|
||||||
|
|
||||||
|
* Время с последнего отклонения: 2 секунды
|
||||||
|
</br>
|
||||||
|
**Рассчёт**
|
||||||
|
```sh
|
||||||
|
load_factor = (1.0625 + 0.882 + 0.8 + 0.8) / 4 = 0.886
|
||||||
|
|
||||||
|
time_factor = 1 - e^(-0.1 × 2) = 1 - e^(-0.2) = 1 - 0.819 = 0.181
|
||||||
|
|
||||||
|
P_reject = 0.70 × 0.886 × 0.181 = 0.112 = 11.2%
|
||||||
|
```
|
||||||
|
**Результат: ~11% запросов будут отклонены.**
|
||||||
|
</br>
|
||||||
|
|
||||||
|
**Преимущества формулы**
|
||||||
|
|
||||||
|
1. **Адаптивность** — реагирует на изменение нагрузки в реальном времени
|
||||||
|
2. **Сглаживание** — предотвращает резкие скачки отклонений
|
||||||
|
3. **Самовосстановление** — при снижении нагрузки вероятность автоматически уменьшается
|
||||||
|
4. **Предсказуемость** — поведение системы становится детерминированным и предсказуемым
|
||||||
|
|
||||||
|
<p align="right">(<a href="#readme-top">К началу</a>)</p>
|
||||||
|
|
||||||
|
|
||||||
## Ограничения
|
## Ограничения
|
||||||
|
|
||||||
В субд `futriix` также как и в традиционных субд, есть механизм **Ограничений (Constraints)**.
|
В субд `futriix` также как и в традиционных субд, есть механизм **Ограничений (Constraints)**.
|
||||||
|
|||||||
Reference in New Issue
Block a user