feat(D3): 负载均衡 + 高可用

- Nginx upstream 双实例 (7821, 7822)
- least_conn 负载策略
- 服务注册/发现(心跳续约 TTL 30s)
- 故障切换验证通过
This commit is contained in:
小唯 A06
2026-05-25 16:26:09 +08:00
parent cee53da87f
commit c2e21d448d
5 changed files with 47 additions and 6 deletions
+5
View File
@@ -28,3 +28,8 @@
{"id": "462fc577-5a6f-4feb-838b-965d24612eea", "text": "Redis集成测试,多实例同步验证 Redis集成 多实例同步", "facts": ["Redis集成", "多实例同步"], "category": "episodes", "timestamp": "2026-05-25T15:27:29.602233"}
{"id": "a055f73f-21fb-41e4-a8b0-1d534a4e4a0b", "text": "Redis集成测试,多实例同步验证 Redis集成测试,多实例同步验证", "facts": ["Redis集成测试,多实例同步验证"], "category": "fact", "timestamp": "2026-05-25T15:27:29.604812"}
{"id": "462fc577-5a6f-4feb-838b-965d24612eea", "text": "Redis集成测试,多实例同步验证 Redis集成 多实例同步", "facts": ["Redis集成", "多实例同步"], "category": "episode", "timestamp": "2026-05-25T15:27:29.602233"}
{"id": "6e21af7f-0d61-4f05-be0c-e2d544b07487", "text": "Nginx负载均衡测试 负载均衡 双实例", "facts": ["负载均衡", "双实例"], "category": "episode", "timestamp": "2026-05-25T16:22:13.753469"}
{"id": "7a6c1b4d-edac-4895-ae88-770340acdea7", "text": "Nginx负载均衡测试 Nginx负载均衡测试", "facts": ["Nginx负载均衡测试"], "category": "distilled", "timestamp": "2026-05-25T16:22:13.755401"}
{"id": "6e21af7f-0d61-4f05-be0c-e2d544b07487", "text": "Nginx负载均衡测试 负载均衡 双实例", "facts": ["负载均衡", "双实例"], "category": "episodes", "timestamp": "2026-05-25T16:22:13.753469"}
{"id": "fe06fbff-e206-400f-9a4d-a413ff488202", "text": "故障切换后继续服务测试 故障切换后继续服务测试", "facts": ["故障切换后继续服务测试"], "category": "distilled", "timestamp": "2026-05-25T16:22:59.327332"}
{"id": "1af83f92-e13b-4343-b246-4fac772089be", "text": "故障切换后继续服务测试 高可用 故障切换", "facts": ["高可用", "故障切换"], "category": "episodes", "timestamp": "2026-05-25T16:22:59.326841"}
+1 -1
View File
@@ -1 +1 @@
{"model_name": "moka-ai/m3e-base", "doc_count": 30, "updated_at": "2026-05-25T15:40:12.362234"}
{"model_name": "moka-ai/m3e-base", "doc_count": 34, "updated_at": "2026-05-25T16:22:59.384265"}
File diff suppressed because one or more lines are too long
+29
View File
@@ -0,0 +1,29 @@
upstream zhiyi_backend {
least_conn; # 最少连接优先(适合高并发)
server 127.0.0.1:7821;
server 127.0.0.1:7822;
}
server {
listen 8080;
server_name _;
# 健康检查
location /health {
proxy_pass http://zhiyi_backend;
proxy_connect_timeout 1s;
proxy_read_timeout 2s;
}
# API 代理
location / {
proxy_pass http://zhiyi_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超时设置
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
}
}
+7 -5
View File
@@ -18,20 +18,20 @@ def get_shared_embedder() -> SentenceTransformersRecall:
# D2: 事件消费者(后台线程,监听其他实例的 commit 事件)
_consumer = None
def _start_event_consumer():
def _start_event_consumer(port: int = 7821):
"""启动事件消费者(在 FastAPI startup 事件中调用)"""
global _consumer
try:
from src.storage.event_consumer import start_event_consumer
from src.storage.redis_store import get_commit_store, get_instance_id
# 注册当前实例
# 注册当前实例(使用实际监听端口)
redis_store = get_commit_store()
redis_store.register_instance("127.0.0.1", 7821)
redis_store.register_instance("127.0.0.1", port)
# 启动事件消费者(传入 embedder 用于增量 merge)
_consumer = start_event_consumer(embedder=_shared_embedder)
print("[Server] 事件消费者已启动(多实例同步就绪)")
print(f"[Server] 事件消费者已启动(实例端口 {port},多实例同步就绪)")
except Exception as e:
print(f"[Server] 事件消费者启动失败: {e}")
@@ -49,7 +49,9 @@ app.add_middleware(
@app.on_event("startup")
async def startup_event():
"""FastAPI 启动时初始化事件消费者"""
_start_event_consumer()
import os
port = int(os.environ.get("ZHIYI_PORT", 7821))
_start_event_consumer(port=port)
from src.api.routes import commit, recall, conflicts, feedback, admin, templates, sync