Настоящий документ описывает архитектуру пиринговой сети Montana Protocol. Сеть обеспечивает распространение подписей присутствия, выбор активного мастера и защиту от изоляции узлов.
---
## 1. Архитектура сети
### 1.1 Топология
Montana Protocol использует фиксированную топологию из 5 узлов:
```
┌─────────────┐
│ amsterdam │ ← PRIMARY (позиция 0)
│ 72.56.102.240│
└──────┬──────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌─────▼────┐
│ moscow │ │ almaty │ │ spb │
│176.124..│ │91.200...│ │188.225...│
└────┬────┘ └────┬────┘ └────┬─────┘
│ │ │
└────────────────┼────────────────┘
│
┌──────▼──────┐
│ novosibirsk │
│147.45.147...│
└─────────────┘
```
### 1.2 Типы узлов
| Тип | Описание | Реализация |
|-----|----------|------------|
| **Full Node** | Полный узел сети с Telegram polling | junomontanaagibot.py |
| **Health Server** | HTTP endpoint для проверки здоровья | leader_election.py:8889 |
### 1.3 Порты
| Порт | Протокол | Назначение |
|------|----------|------------|
| 22 | SSH | Администрирование |
| 8889 | HTTP | Health check endpoint |
| 443 | HTTPS | Fallback проверка |
---
## 2. Leader Election Protocol
### 2.1 Алгоритм выбора мастера
Детерминированный выбор мастера на основе позиции в цепочке:
```python
# leader_election.py:326-349
BOT_CHAIN = [
("amsterdam", "72.56.102.240"), # позиция 0
("moscow", "176.124.208.93"), # позиция 1
("almaty", "91.200.148.93"), # позиция 2
("spb", "188.225.58.98"), # позиция 3
("novosibirsk", "147.45.147.247"), # позиция 4
]
def am_i_the_master():
for name, ip in BOT_CHAIN:
if name == my_node_name:
return True # Я первый живой — я мастер
if check_node_health(ip):
return False # Узел выше меня жив
return False
```
### 2.2 Health Check Protocol
HTTP запрос к `/health` endpoint:
```python
# leader_election.py:102-134
def check_node_health(ip: str) -> bool:
try:
url = f"http://{ip}:8889/health"
response = requests.get(url, timeout=5)
return response.status_code == 200
except:
return False
```
**Response format:**
```json
{
"status": "healthy",
"node": "moscow",
"uptime": 3600,
"is_master": false
}
```
### 2.3 Failover Timing
| Событие | Время |
|---------|-------|
| Health check interval | 5 секунд |
| Request timeout | 5 секунд |
| Max failover time | <10секунд|
| Startup delay | 7-15 секунд (рандом) |
---
## 3. Message Types
### 3.1 Telegram Polling
Только мастер-узел выполняет polling Telegram API: