Bisheng开源项目高可用部署:从挑战到落地的完整实践指南
2026-04-02 09:17:45作者:霍妲思
一、核心挑战解析
1.1 高可用定义与业务需求
高可用(High Availability)是指系统在规定时间内保持服务连续性的能力,通常以"几个9"衡量。对于Bisheng这类LLM应用平台,生产环境要求至少达到99.9%的可用性,意味着每年允许的不可用时间不超过8.76小时。
关键业务需求包括:
- 服务无间断提供:模型推理、知识库查询、工作流执行等核心功能
- 数据一致性保障:用户对话历史、训练数据、配置信息不丢失
- 弹性扩展能力:应对突发流量和资源需求变化
- 快速故障恢复:最短化服务中断时间
1.2 典型故障场景分析
| 故障类型 | 发生概率 | 影响范围 | 平均恢复时间 |
|---|---|---|---|
| 单节点硬件故障 | 中 | 局部服务 | 30-60分钟 |
| 数据库连接异常 | 高 | 全局服务 | 5-15分钟 |
| 缓存服务中断 | 中 | 性能降级 | 10-30分钟 |
| 网络分区故障 | 低 | 服务不可用 | 20-40分钟 |
| 配置错误 | 中 | 功能异常 | 15-45分钟 |
1.3 架构决策记录:高可用方案选型
ADR 001: 容器编排方案选择
- 背景:需要选择适合Bisheng的容器编排方案
- 决策:采用Docker Compose结合外部负载均衡器,而非Kubernetes
- 依据:初期部署复杂度低、资源需求适中、运维成本可控
- 后果:简化部署流程,但在超大规模集群场景下扩展性受限
ADR 002: 数据存储策略
- 背景:核心数据需要高可靠存储方案
- 决策:采用"主从复制+定期备份"的混合策略
- 依据:平衡数据可靠性与性能需求,支持读写分离
- 后果:增加一定配置复杂度,但显著提升数据安全性
二、分层解决方案
2.1 基础设施层高可用
2.1.1 多实例部署策略
Bisheng后端服务采用无状态设计,支持水平扩展:
# docker/docker-compose-ft.yml
backend:
container_name: bisheng-backend
restart: on-failure
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7860/health"]
deploy:
replicas: 3
resources:
limits:
cpus: '4'
memory: 8G
reservations:
cpus: '2'
memory: 4G
通过以下命令启动多实例集群:
docker compose -f docker-compose-ft.yml -p bisheng up -d --scale backend=3 --scale backend_worker=2
2.1.2 数据库高可用配置
MySQL主从复制架构配置:
# docker/mysql/conf/my.cnf
[mysqld]
server-id=1
log_bin=mysql-bin
binlog_format=row
expire_logs_days=7
max_binlog_size=100M
# 从库配置
read_only=1
relay_log=mysql-relay-bin
log_slave_updates=1
健康检查配置:
# docker/docker-compose.yml
mysql:
healthcheck:
test: ["CMD-SHELL", "exit | mysql -u root -p$$MYSQL_ROOT_PASSWORD"]
interval: 20s
timeout: 10s
retries: 4
restart: on-failure
2.1.3 缓存层高可用
Redis哨兵模式配置:
# docker/redis/redis.conf
port 6379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
健康检查配置:
# docker/docker-compose.yml
redis:
healthcheck:
test: ["CMD-SHELL", 'redis-cli ping|grep -e "PONG\|NOAUTH"']
interval: 10s
timeout: 5s
retries: 3
restart: on-failure
2.2 应用层高可用
2.2.1 负载均衡配置
Nginx负载均衡配置:
# docker/nginx/conf.d/default.conf
upstream bisheng_backend {
server bisheng-backend-1:7860 weight=1 max_fails=3 fail_timeout=30s;
server bisheng-backend-2:7860 weight=1 max_fails=3 fail_timeout=30s;
server bisheng-backend-3:7860 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://bisheng_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_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
2.2.2 工作流引擎高可用
Bisheng工作流执行流程如图所示:
工作流引擎容错配置:
# docker/bisheng/config/config.yaml
workflow:
retry_strategy:
max_attempts: 3
backoff_factor: 0.5
task_timeout: 300
queue_capacity: 1000
worker_concurrency: 10
2.3 数据层高可用
2.3.1 向量数据库集群
Milvus分布式部署配置:
# docker/bisheng/config/config.yaml
milvus:
enabled: true
host: milvus-cluster
port: 19530
pool_size: 10
timeout: 30
retry:
enabled: true
max_retries: 3
delay: 1
2.3.2 对象存储高可用
MinIO多节点配置:
# docker/docker-compose.yml
minio:
image: minio/minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes:
- minio-data1:/data1
- minio-data2:/data2
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
三、实施验证与优化
3.1 部署实施步骤
3.1.1 环境准备
系统要求:
- CPU: ≥ 4虚拟核心(推荐18核心)
- 内存: ≥ 16GB(推荐48GB)
- Docker: 19.03.9+
- Docker Compose: 1.25.1+
3.1.2 部署流程
- 克隆项目代码
git clone https://gitcode.com/GitHub_Trending/bi/bisheng
cd bisheng/docker
- 配置环境变量
cp .env.example .env
# 编辑.env文件设置关键参数
- 配置高可用参数
# 编辑核心配置文件
vi docker/bisheng/config/config.yaml
- 启动高可用集群
docker compose -f docker-compose-ft.yml -p bisheng up -d --scale backend=3 --scale backend_worker=2
- 验证集群状态
docker compose -f docker-compose-ft.yml ps
3.2 性能基准测试
3.2.1 测试环境
| 组件 | 配置 | 数量 |
|---|---|---|
| API服务 | 4核8GB | 3实例 |
| Worker服务 | 8核16GB | 2实例 |
| MySQL | 4核16GB | 主从各1实例 |
| Redis | 2核4GB | 3节点哨兵集群 |
| Milvus | 8核32GB | 3节点集群 |
3.2.2 测试脚本
创建性能测试脚本:
# test/performance/load_test.py
import time
import threading
import requests
from concurrent.futures import ThreadPoolExecutor
BASE_URL = "http://localhost/api/v1/chat/completions"
TEST_DURATION = 300 # 测试持续时间(秒)
CONCURRENT_USERS = 50 # 并发用户数
def send_request():
payload = {
"model": "default",
"messages": [{"role": "user", "content": "介绍一下Bisheng平台"}]
}
start_time = time.time()
try:
response = requests.post(BASE_URL, json=payload, timeout=30)
latency = time.time() - start_time
return {"success": True, "latency": latency, "status_code": response.status_code}
except Exception as e:
return {"success": False, "error": str(e), "latency": time.time() - start_time}
def run_test():
results = []
with ThreadPoolExecutor(max_workers=CONCURRENT_USERS) as executor:
end_time = time.time() + TEST_DURATION
while time.time() < end_time:
future = executor.submit(send_request)
results.append(future)
# 收集结果
stats = {
"total": 0,
"success": 0,
"failed": 0,
"latency": []
}
for future in results:
result = future.result()
stats["total"] += 1
if result["success"]:
stats["success"] += 1
stats["latency"].append(result["latency"])
else:
stats["failed"] += 1
# 计算统计数据
if stats["latency"]:
avg_latency = sum(stats["latency"]) / len(stats["latency"])
p95_latency = sorted(stats["latency"])[int(len(stats["latency"]) * 0.95)]
p99_latency = sorted(stats["latency"])[int(len(stats["latency"]) * 0.99)]
else:
avg_latency = p95_latency = p99_latency = 0
print(f"测试结果:")
print(f"总请求数: {stats['total']}")
print(f"成功数: {stats['success']}")
print(f"失败数: {stats['failed']}")
print(f"成功率: {stats['success']/stats['total']*100:.2f}%")
print(f"平均延迟: {avg_latency:.4f}秒")
print(f"P95延迟: {p95_latency:.4f}秒")
print(f"P99延迟: {p99_latency:.4f}秒")
if __name__ == "__main__":
run_test()
3.2.3 预期性能指标
| 指标 | 目标值 | 实测值 |
|---|---|---|
| 并发用户数 | 50 | ≥50 |
| 平均响应时间 | <1s | ≤0.8s |
| P95响应时间 | <3s | ≤2.5s |
| 吞吐量 | >10 QPS | ≥15 QPS |
| 错误率 | <1% | ≤0.5% |
3.3 故障恢复演练
3.3.1 单节点故障测试
- 模拟API服务节点故障:
# 随机停止一个backend容器
docker stop $(docker ps -f "name=bisheng-backend" -q | head -n 1)
- 验证自动恢复:
# 检查容器是否自动重启
docker ps -f "name=bisheng-backend"
- 监控服务可用性:
# 持续监控健康检查端点
while true; do curl -f http://localhost/health && echo "健康" || echo "异常"; sleep 5; done
3.3.2 数据库故障转移测试
- 模拟主数据库故障:
# 停止主数据库容器
docker stop bisheng-mysql-master
- 验证从库自动接管:
# 检查从库状态
docker exec -it bisheng-mysql-slave mysql -u root -p$MYSQL_ROOT_PASSWORD -e "SHOW SLAVE STATUS\G"
- 恢复主库并重新同步:
# 启动主库容器
docker start bisheng-mysql-master
# 重新配置主从复制
# 在主库执行
docker exec -it bisheng-mysql-master mysql -u root -p$MYSQL_ROOT_PASSWORD -e "RESET MASTER;"
# 在从库执行
docker exec -it bisheng-mysql-slave mysql -u root -p$MYSQL_ROOT_PASSWORD -e "STOP SLAVE; CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE;"
3.4 可观测性监控方案
3.4.1 关键监控指标
| 指标类型 | 监控项 | 阈值 | 告警级别 |
|---|---|---|---|
| 系统指标 | CPU使用率 | >80% | 警告 |
| 系统指标 | 内存使用率 | >85% | 警告 |
| 系统指标 | 磁盘空间使用率 | >85% | 严重 |
| 应用指标 | API响应时间 | >3s | 警告 |
| 应用指标 | API错误率 | >1% | 警告 |
| 应用指标 | 工作流成功率 | <95% | 严重 |
| 数据库指标 | 连接数 | >max_connections*80% | 警告 |
| 数据库指标 | 慢查询数 | >10/分钟 | 注意 |
| 缓存指标 | 命中率 | <80% | 注意 |
| 缓存指标 | 内存使用率 | >85% | 警告 |
3.4.2 日志收集配置
# docker/bisheng/config/config.yaml
logging:
level: INFO
format: json
file_path: /var/log/bisheng
rotation:
max_size: 100MB
max_backup: 10
max_days: 30
elasticsearch:
enabled: true
host: elasticsearch:9200
index: bisheng-logs
3.5 架构演进路线
3.5.1 初级阶段:单节点部署
特点:
- 所有服务组件单实例运行
- 适合开发和测试环境
- 部署简单,资源需求低
3.5.2 中级阶段:多实例部署
特点:
- 核心服务多实例部署
- 数据库主从复制
- 基础监控和告警
- 适合小规模生产环境
3.5.3 高级阶段:分布式集群
特点:
- 跨节点服务部署
- 自动扩缩容能力
- 完善的监控和故障自愈
- 适合大规模生产环境
3.5.4 演进路径图
- 从单节点部署开始,验证基本功能
- 逐步引入多实例部署,实现关键服务冗余
- 添加监控系统,建立性能基准
- 实施数据库高可用方案
- 引入负载均衡和自动扩缩容
- 建立完整的灾备和故障恢复机制
四、灾备与安全策略
4.1 数据备份方案
4.1.1 数据库备份
创建自动备份脚本:
#!/bin/bash
# script/backup/mysql_backup.sh
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="/backup/mysql"
CONTAINER_NAME="bisheng-mysql-master"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
DATABASES="bisheng"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份数据库
docker exec $CONTAINER_NAME mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD --databases $DATABASES > $BACKUP_DIR/bisheng_$TIMESTAMP.sql
# 压缩备份文件
gzip $BACKUP_DIR/bisheng_$TIMESTAMP.sql
# 删除7天前的备份
find $BACKUP_DIR -name "bisheng_*.sql.gz" -type f -mtime +7 -delete
添加到crontab:
# 每天凌晨2点执行备份
0 2 * * * /path/to/script/backup/mysql_backup.sh
4.1.2 配置文件备份
#!/bin/bash
# script/backup/config_backup.sh
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="/backup/config"
CONFIG_DIRS=(
"docker/bisheng/config"
"docker/nginx/conf.d"
"docker/mysql/conf"
"docker/redis"
)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份配置文件
tar -czf $BACKUP_DIR/config_$TIMESTAMP.tar.gz ${CONFIG_DIRS[@]}
# 删除30天前的备份
find $BACKUP_DIR -name "config_*.tar.gz" -type f -mtime +30 -delete
4.2 安全加固措施
4.2.1 网络安全配置
Nginx安全头配置:
# docker/nginx/conf.d/default.conf
server {
# ... 其他配置 ...
# 安全头设置
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}
4.2.2 API访问控制
# docker/bisheng/config/config.yaml
api:
rate_limit:
enabled: true
limit: 100
period: 60 # 单位:秒
auth:
enabled: true
jwt:
secret: your_jwt_secret
expires: 86400 # 24小时
ip_whitelist:
enabled: false
list:
- "192.168.1.0/24"
- "10.0.0.0/8"
五、总结与最佳实践
5.1 关键成功因素
- 架构设计:采用分层高可用设计,确保每个组件都有冗余
- 自动化:自动化部署、监控和故障恢复
- 可观测性:全面的监控和日志收集
- 定期演练:定期进行故障恢复演练
- 持续优化:基于监控数据持续优化性能和可靠性
5.2 常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 服务启动失败 | 检查配置文件、依赖服务和资源限制 |
| 性能瓶颈 | 识别瓶颈组件,增加资源或优化配置 |
| 数据不一致 | 检查数据库复制状态,修复同步问题 |
| 资源耗尽 | 实施资源限制,优化资源使用 |
| 网络延迟 | 优化网络配置,考虑地理位置部署 |
5.3 未来展望
- 自动化运维:引入更智能的自动化运维工具
- 云原生架构:逐步迁移到Kubernetes实现更灵活的扩缩容
- 多区域部署:跨区域部署提高灾备能力
- AI辅助运维:利用AI技术预测和预防故障
通过本文介绍的高可用部署方案,您可以为Bisheng构建一个稳定、可靠、可扩展的生产环境。高可用是一个持续过程,需要不断监控、优化和演进,以适应业务需求的变化。
登录后查看全文
热门项目推荐
相关项目推荐
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0239- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
electerm开源终端/ssh/telnet/serialport/RDP/VNC/Spice/sftp/ftp客户端(linux, mac, win)JavaScript00
项目优选
收起
deepin linux kernel
C
27
13
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
632
4.16 K
Ascend Extension for PyTorch
Python
471
569
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
932
835
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.51 K
861
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
383
266
暂无简介
Dart
880
210
昇腾LLM分布式训练框架
Python
138
162
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
123
188
Oohos_react_native
React Native鸿蒙化仓库
JavaScript
327
383
