4408 lines
51 KiB
Markdown
4408 lines
51 KiB
Markdown
# 丹阳公益婚恋服务平台
|
||||
|
|
# V1.0 部署架构、运维监控、备份恢复与升级方案
|
|||
|
|
|
|||
|
|
版本:V1.0
|
|||
|
|
适用范围:微信小程序后端、公益红娘工作台、运营管理后台、PostgreSQL、Redis、对象存储、WebSocket、日志与监控系统
|
|||
|
|
核心目标:低成本、易部署、易维护、可备份、可恢复、可升级、故障可定位、后期可平滑扩容
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一章 部署设计目标
|
|||
|
|
|
|||
|
|
V1.0部署方案不追求复杂云原生架构。
|
|||
|
|
|
|||
|
|
当前项目更需要:
|
|||
|
|
|
|||
|
|
> **少组件、低运维成本、可靠、容易备份、出现问题容易排查。**
|
|||
|
|
|
|||
|
|
因此V1优先:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Docker
|
|||
|
|
+
|
|||
|
|
Docker Compose
|
|||
|
|
+
|
|||
|
|
Nginx
|
|||
|
|
+
|
|||
|
|
后端应用
|
|||
|
|
+
|
|||
|
|
PostgreSQL
|
|||
|
|
+
|
|||
|
|
Redis
|
|||
|
|
+
|
|||
|
|
对象存储
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
暂不引入:
|
|||
|
|
|
|||
|
|
- Kubernetes
|
|||
|
|
- Service Mesh
|
|||
|
|
- Kafka
|
|||
|
|
- Elasticsearch
|
|||
|
|
- 分布式数据库
|
|||
|
|
- 多地域复杂集群
|
|||
|
|
- 大型日志平台
|
|||
|
|
- 大型微服务体系
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二章 V1总体部署架构
|
|||
|
|
|
|||
|
|
推荐:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
微信小程序
|
|||
|
|
│
|
|||
|
|
│ HTTPS / WSS
|
|||
|
|
↓
|
|||
|
|
┌───────────┐
|
|||
|
|
│ Nginx │
|
|||
|
|
└─────┬─────┘
|
|||
|
|
│
|
|||
|
|
┌───────────┴───────────┐
|
|||
|
|
│ │
|
|||
|
|
↓ ↓
|
|||
|
|
Backend API Admin Web
|
|||
|
|
+ WebSocket 静态资源
|
|||
|
|
│
|
|||
|
|
┌──────┼───────────────┐
|
|||
|
|
│ │ │
|
|||
|
|
↓ ↓ ↓
|
|||
|
|
PostgreSQL Redis Object Storage
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
Backup System
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三章 部署形态建议
|
|||
|
|
|
|||
|
|
V1优先采用:
|
|||
|
|
|
|||
|
|
> **单区域部署。**
|
|||
|
|
|
|||
|
|
如果选择云服务器:
|
|||
|
|
|
|||
|
|
建议中国大陆节点。
|
|||
|
|
|
|||
|
|
核心业务数据:
|
|||
|
|
|
|||
|
|
> 优先存储于中国大陆。
|
|||
|
|
|
|||
|
|
这样更适合:
|
|||
|
|
|
|||
|
|
- 微信小程序访问
|
|||
|
|
- 国内网络
|
|||
|
|
- 用户隐私
|
|||
|
|
- 后续合规管理
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四章 初期服务器数量
|
|||
|
|
|
|||
|
|
V1早期推荐:
|
|||
|
|
|
|||
|
|
> 1台应用服务器 + 独立数据库/托管数据库。
|
|||
|
|
|
|||
|
|
或者低预算情况下:
|
|||
|
|
|
|||
|
|
> 1台应用服务器 + 1台数据库服务器。
|
|||
|
|
|
|||
|
|
不建议:
|
|||
|
|
|
|||
|
|
> 所有应用、数据库、备份全放同一个Docker宿主机。
|
|||
|
|
|
|||
|
|
因为宿主机故障后:
|
|||
|
|
|
|||
|
|
> 全平台一起失效。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五章 推荐初期架构A
|
|||
|
|
|
|||
|
|
低维护优先:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
云服务器A
|
|||
|
|
├── Nginx
|
|||
|
|
├── Backend
|
|||
|
|
├── Admin Web
|
|||
|
|
└── Redis
|
|||
|
|
|
|||
|
|
云数据库
|
|||
|
|
└── PostgreSQL
|
|||
|
|
|
|||
|
|
对象存储
|
|||
|
|
└── 用户照片/聊天图片/活动图片
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
优点:
|
|||
|
|
|
|||
|
|
- PostgreSQL少维护
|
|||
|
|
- 云数据库自动备份较方便
|
|||
|
|
- 应用服务器故障不影响数据库持久数据
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六章 推荐初期架构B
|
|||
|
|
|
|||
|
|
成本优先:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
服务器A
|
|||
|
|
├── Nginx
|
|||
|
|
├── Backend
|
|||
|
|
├── Admin Web
|
|||
|
|
└── Redis
|
|||
|
|
|
|||
|
|
服务器B
|
|||
|
|
└── PostgreSQL
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
对象存储:
|
|||
|
|
|
|||
|
|
> 云对象存储。
|
|||
|
|
|
|||
|
|
适合:
|
|||
|
|
|
|||
|
|
> 希望降低托管数据库费用,但有一定服务器维护能力。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七章 不推荐架构
|
|||
|
|
|
|||
|
|
不建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
一台服务器
|
|||
|
|
├── Backend
|
|||
|
|
├── PostgreSQL
|
|||
|
|
├── Redis
|
|||
|
|
├── 用户图片目录
|
|||
|
|
├── Backup
|
|||
|
|
└── 所有日志
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
因为:
|
|||
|
|
|
|||
|
|
> 一块磁盘坏掉可能同时丢生产和备份。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八章 Docker部署原则
|
|||
|
|
|
|||
|
|
所有核心应用统一:
|
|||
|
|
|
|||
|
|
> Docker化。
|
|||
|
|
|
|||
|
|
包括:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
backend
|
|||
|
|
nginx
|
|||
|
|
redis(如果自建)
|
|||
|
|
admin-web
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
PostgreSQL是否Docker:
|
|||
|
|
|
|||
|
|
- 开发/Test可以
|
|||
|
|
- 生产更推荐托管数据库或独立服务器
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九章 Docker镜像原则
|
|||
|
|
|
|||
|
|
镜像必须:
|
|||
|
|
|
|||
|
|
- 可重复构建
|
|||
|
|
- 固定版本
|
|||
|
|
- 不使用latest生产部署
|
|||
|
|
- 保留版本历史
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
matchmaking-backend:1.0.0
|
|||
|
|
matchmaking-backend:1.0.1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
禁止:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
matchmaking-backend:latest
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
作为唯一可追溯版本。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十章 Docker Compose
|
|||
|
|
|
|||
|
|
V1生产仍可以使用:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
docker compose
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
无需Kubernetes。
|
|||
|
|
|
|||
|
|
示例逻辑:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
services:
|
|||
|
|
nginx:
|
|||
|
|
backend:
|
|||
|
|
redis:
|
|||
|
|
admin-web:
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
数据库如果外部托管:
|
|||
|
|
|
|||
|
|
> 不放Compose。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十一章 推荐项目部署目录
|
|||
|
|
|
|||
|
|
服务器建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/opt/matchmaking/
|
|||
|
|
├── compose/
|
|||
|
|
├── env/
|
|||
|
|
├── nginx/
|
|||
|
|
├── scripts/
|
|||
|
|
├── logs/
|
|||
|
|
├── backups/
|
|||
|
|
└── releases/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十二章 Releases目录
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
releases/
|
|||
|
|
├── 1.0.0/
|
|||
|
|
├── 1.0.1/
|
|||
|
|
└── 1.1.0/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
保留近期稳定版本。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十三章 环境划分
|
|||
|
|
|
|||
|
|
正式至少:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
dev
|
|||
|
|
test
|
|||
|
|
staging
|
|||
|
|
prod
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十四章 Dev环境
|
|||
|
|
|
|||
|
|
用途:
|
|||
|
|
|
|||
|
|
> 开发。
|
|||
|
|
|
|||
|
|
允许:
|
|||
|
|
|
|||
|
|
- Docker本地数据库
|
|||
|
|
- 模拟实名认证
|
|||
|
|
- 模拟短信
|
|||
|
|
- 测试对象存储
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十五章 Test环境
|
|||
|
|
|
|||
|
|
用于:
|
|||
|
|
|
|||
|
|
- CI
|
|||
|
|
- API测试
|
|||
|
|
- 并发测试
|
|||
|
|
- 自动化测试
|
|||
|
|
|
|||
|
|
数据:
|
|||
|
|
|
|||
|
|
> 可随时重置。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十六章 Staging
|
|||
|
|
|
|||
|
|
必须尽量接近Prod。
|
|||
|
|
|
|||
|
|
包括:
|
|||
|
|
|
|||
|
|
- HTTPS
|
|||
|
|
- Nginx
|
|||
|
|
- Redis
|
|||
|
|
- PostgreSQL同主版本
|
|||
|
|
- 对象存储权限策略
|
|||
|
|
- WebSocket
|
|||
|
|
- Migration流程
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十七章 Production
|
|||
|
|
|
|||
|
|
严格:
|
|||
|
|
|
|||
|
|
> 禁止使用测试Secret。
|
|||
|
|
|
|||
|
|
禁止:
|
|||
|
|
|
|||
|
|
> Debug模式。
|
|||
|
|
|
|||
|
|
禁止:
|
|||
|
|
|
|||
|
|
> 暴露数据库公网端口。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十八章 配置管理
|
|||
|
|
|
|||
|
|
配置分为:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
业务配置
|
|||
|
|
部署配置
|
|||
|
|
Secret
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第十九章 业务配置
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
dailyRecommendationLimit
|
|||
|
|
maxProfilePhotos
|
|||
|
|
activityEnabled
|
|||
|
|
matchmakerEnabled
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
由:
|
|||
|
|
|
|||
|
|
> system_configs
|
|||
|
|
|
|||
|
|
管理。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十章 部署配置
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
PORT
|
|||
|
|
DATABASE_HOST
|
|||
|
|
REDIS_HOST
|
|||
|
|
OBJECT_STORAGE_ENDPOINT
|
|||
|
|
LOG_LEVEL
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
通过环境变量。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十一章 Secret
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
DATABASE_PASSWORD
|
|||
|
|
JWT_SECRET
|
|||
|
|
WECHAT_SECRET
|
|||
|
|
REAL_NAME_PROVIDER_SECRET
|
|||
|
|
OBJECT_STORAGE_SECRET
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
禁止写入:
|
|||
|
|
|
|||
|
|
- Git
|
|||
|
|
- Dockerfile
|
|||
|
|
- 前端代码
|
|||
|
|
- README示例真实值
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十二章 .env管理
|
|||
|
|
|
|||
|
|
开发:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
.env.example
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
只提供键名。
|
|||
|
|
|
|||
|
|
生产:
|
|||
|
|
|
|||
|
|
> 实际.env不提交Git。
|
|||
|
|
|
|||
|
|
权限:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
chmod 600
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
或使用云Secret服务。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十三章 Nginx职责
|
|||
|
|
|
|||
|
|
Nginx负责:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
HTTPS
|
|||
|
|
反向代理
|
|||
|
|
静态后台资源
|
|||
|
|
WebSocket代理
|
|||
|
|
基础安全Header
|
|||
|
|
请求体大小限制
|
|||
|
|
访问日志
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十四章 域名结构建议
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
api.example.com
|
|||
|
|
admin.example.com
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
小程序:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
api.example.com
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
后台:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
admin.example.com
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十五章 API路径
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
https://api.example.com/api/v1/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
WebSocket:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
wss://api.example.com/ws
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十六章 HTTPS
|
|||
|
|
|
|||
|
|
生产必须:
|
|||
|
|
|
|||
|
|
> TLS。
|
|||
|
|
|
|||
|
|
HTTP:
|
|||
|
|
|
|||
|
|
> 自动301跳HTTPS。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十七章 TLS证书
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
- 自动续期
|
|||
|
|
- 到期监控
|
|||
|
|
|
|||
|
|
避免:
|
|||
|
|
|
|||
|
|
> 证书过期导致微信小程序整体不可访问。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十八章 Nginx上传大小
|
|||
|
|
|
|||
|
|
根据业务配置。
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
client_max_body_size 12M
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
与图片上传限制一致。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二十九章 WebSocket代理
|
|||
|
|
|
|||
|
|
必须配置:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Upgrade
|
|||
|
|
Connection
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
确保长期连接正常。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十章 API超时
|
|||
|
|
|
|||
|
|
普通API:
|
|||
|
|
|
|||
|
|
> 不宜设置过长。
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
proxy_read_timeout 30s
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
推荐服务也应在合理时间内返回。
|
|||
|
|
|
|||
|
|
不能靠:
|
|||
|
|
|
|||
|
|
> 5分钟HTTP超时
|
|||
|
|
|
|||
|
|
掩盖慢SQL。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十一章 WebSocket超时
|
|||
|
|
|
|||
|
|
WebSocket需要单独配置更长连接策略。
|
|||
|
|
|
|||
|
|
配合:
|
|||
|
|
|
|||
|
|
> 应用心跳。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十二章 后端实例
|
|||
|
|
|
|||
|
|
V1初期:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
backend x1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
足够。
|
|||
|
|
|
|||
|
|
架构必须保证后续:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
backend x2
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
容易扩展。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十三章 无状态设计
|
|||
|
|
|
|||
|
|
Backend尽量无状态。
|
|||
|
|
|
|||
|
|
Session:
|
|||
|
|
|
|||
|
|
> Redis/数据库。
|
|||
|
|
|
|||
|
|
用户图片:
|
|||
|
|
|
|||
|
|
> Object Storage。
|
|||
|
|
|
|||
|
|
不能存在:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/app/uploads/user1.jpg
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
作为正式生产唯一文件。
|
|||
|
|
|
|||
|
|
否则多实例后无法共享。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十四章 后端扩容
|
|||
|
|
|
|||
|
|
当单实例不足:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Nginx
|
|||
|
|
├── backend-1
|
|||
|
|
└── backend-2
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
即可。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十五章 多实例WebSocket
|
|||
|
|
|
|||
|
|
未来:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
backend-1
|
|||
|
|
backend-2
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
需要:
|
|||
|
|
|
|||
|
|
> Redis Pub/Sub或等效机制
|
|||
|
|
|
|||
|
|
进行跨实例实时推送。
|
|||
|
|
|
|||
|
|
V1单实例时可以简化。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十六章 PostgreSQL定位
|
|||
|
|
|
|||
|
|
PostgreSQL是:
|
|||
|
|
|
|||
|
|
> 核心业务事实数据源。
|
|||
|
|
|
|||
|
|
保存:
|
|||
|
|
|
|||
|
|
- 用户
|
|||
|
|
- 认证状态
|
|||
|
|
- 资料
|
|||
|
|
- Match
|
|||
|
|
- Conversation
|
|||
|
|
- Message
|
|||
|
|
- Activity
|
|||
|
|
- Matchmaker
|
|||
|
|
- Risk
|
|||
|
|
- Audit
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十七章 PostgreSQL生产原则
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
- 独立账号
|
|||
|
|
- 强密码
|
|||
|
|
- 禁止公网开放
|
|||
|
|
- 定期备份
|
|||
|
|
- 监控连接数
|
|||
|
|
- 监控磁盘
|
|||
|
|
- 执行Migration管理
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十八章 数据库账号建议
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
app_user
|
|||
|
|
migration_user
|
|||
|
|
backup_user
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第三十九章 app_user
|
|||
|
|
|
|||
|
|
仅拥有:
|
|||
|
|
|
|||
|
|
> 应用需要的CRUD。
|
|||
|
|
|
|||
|
|
不要:
|
|||
|
|
|
|||
|
|
> SUPERUSER。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十章 migration_user
|
|||
|
|
|
|||
|
|
用于:
|
|||
|
|
|
|||
|
|
> 数据库结构升级。
|
|||
|
|
|
|||
|
|
权限较高。
|
|||
|
|
|
|||
|
|
正常应用不使用。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十一章 backup_user
|
|||
|
|
|
|||
|
|
只拥有:
|
|||
|
|
|
|||
|
|
> 必要读取/备份权限。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十二章 数据库连接池
|
|||
|
|
|
|||
|
|
必须限制:
|
|||
|
|
|
|||
|
|
> 最大连接数。
|
|||
|
|
|
|||
|
|
不能每个API请求开新连接。
|
|||
|
|
|
|||
|
|
连接池大小根据服务器配置和数据库容量设置。
|
|||
|
|
|
|||
|
|
不要盲目设:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
500
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十三章 慢SQL监控
|
|||
|
|
|
|||
|
|
建议记录:
|
|||
|
|
|
|||
|
|
> 超过指定时间的SQL。
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
> 500ms
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
作为初始告警参考。
|
|||
|
|
|
|||
|
|
具体阈值可调整。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十四章 数据库关键监控
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
CPU
|
|||
|
|
Memory
|
|||
|
|
Disk
|
|||
|
|
Connections
|
|||
|
|
Slow Queries
|
|||
|
|
Locks
|
|||
|
|
Replication(若未来启用)
|
|||
|
|
Backup Status
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十五章 数据库磁盘告警
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
70% warning
|
|||
|
|
85% critical
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
数值可根据环境调整。
|
|||
|
|
|
|||
|
|
关键是:
|
|||
|
|
|
|||
|
|
> 提前告警。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十六章 Redis定位
|
|||
|
|
|
|||
|
|
Redis只做:
|
|||
|
|
|
|||
|
|
- Cache
|
|||
|
|
- Session
|
|||
|
|
- Rate Limit
|
|||
|
|
- WebSocket在线状态
|
|||
|
|
- 临时未读优化
|
|||
|
|
- 分布式锁/短锁(必要)
|
|||
|
|
|
|||
|
|
Redis不是核心事实数据源。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十七章 Redis丢失原则
|
|||
|
|
|
|||
|
|
即使Redis全部清空:
|
|||
|
|
|
|||
|
|
> 平台核心业务数据不能永久丢失。
|
|||
|
|
|
|||
|
|
最多:
|
|||
|
|
|
|||
|
|
- 缓存重建
|
|||
|
|
- 用户重新登录
|
|||
|
|
- 推荐重新计算
|
|||
|
|
- 未读重新统计
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十八章 Redis生产安全
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
- 非公网
|
|||
|
|
- 密码/ACL
|
|||
|
|
- 网络隔离
|
|||
|
|
- 最大内存
|
|||
|
|
- 淘汰策略
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第四十九章 Redis持久化
|
|||
|
|
|
|||
|
|
如果Redis用于:
|
|||
|
|
|
|||
|
|
> 重要Session
|
|||
|
|
|
|||
|
|
可以开启合理持久化。
|
|||
|
|
|
|||
|
|
但仍不能把:
|
|||
|
|
|
|||
|
|
> Match/Message
|
|||
|
|
|
|||
|
|
只放Redis。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十章 对象存储
|
|||
|
|
|
|||
|
|
存:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
用户头像
|
|||
|
|
生活照片
|
|||
|
|
聊天图片
|
|||
|
|
活动图片
|
|||
|
|
举报证据
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十一章 Bucket划分建议
|
|||
|
|
|
|||
|
|
可以:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
profile-private
|
|||
|
|
chat-private
|
|||
|
|
activity-assets
|
|||
|
|
risk-evidence-private
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
或者一个Private Bucket按Prefix隔离。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十二章 对象存储默认Private
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Public Access = Off
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十三章 用户访问图片
|
|||
|
|
|
|||
|
|
流程:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
客户端请求
|
|||
|
|
↓
|
|||
|
|
业务权限校验
|
|||
|
|
↓
|
|||
|
|
Backend生成短时Signed URL
|
|||
|
|
↓
|
|||
|
|
客户端访问对象存储
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十四章 Signed URL
|
|||
|
|
|
|||
|
|
有效时间:
|
|||
|
|
|
|||
|
|
> 短时。
|
|||
|
|
|
|||
|
|
例如数分钟。
|
|||
|
|
|
|||
|
|
具体按使用体验配置。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十五章 风控证据Bucket
|
|||
|
|
|
|||
|
|
建议更加严格:
|
|||
|
|
|
|||
|
|
- 更短Signed URL
|
|||
|
|
- 专门权限
|
|||
|
|
- 访问审计
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十六章 对象存储生命周期
|
|||
|
|
|
|||
|
|
临时上传:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
tmp/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
未绑定业务:
|
|||
|
|
|
|||
|
|
> 自动清理。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十七章 图片正式文件
|
|||
|
|
|
|||
|
|
按业务类型分类Prefix:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
profiles/{userId}/
|
|||
|
|
chat/{conversationId}/
|
|||
|
|
activities/{activityId}/
|
|||
|
|
reports/{reportId}/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十八章 日志体系
|
|||
|
|
|
|||
|
|
V1至少分:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
application.log
|
|||
|
|
access.log
|
|||
|
|
security.log
|
|||
|
|
audit(数据库)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第五十九章 Application Log
|
|||
|
|
|
|||
|
|
记录:
|
|||
|
|
|
|||
|
|
- Service异常
|
|||
|
|
- 第三方错误
|
|||
|
|
- 系统异常
|
|||
|
|
- 任务执行结果
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十章 Access Log
|
|||
|
|
|
|||
|
|
Nginx/API:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
requestId
|
|||
|
|
method
|
|||
|
|
path
|
|||
|
|
status
|
|||
|
|
latency
|
|||
|
|
clientIp
|
|||
|
|
userAgent
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十一章 Security Log
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
后台登录失败
|
|||
|
|
大量Rate Limit
|
|||
|
|
异常Token
|
|||
|
|
权限越权
|
|||
|
|
可疑上传
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十二章 Audit
|
|||
|
|
|
|||
|
|
正式业务审计:
|
|||
|
|
|
|||
|
|
> 存数据库。
|
|||
|
|
|
|||
|
|
不能只存在日志文件。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十三章 日志统一RequestId
|
|||
|
|
|
|||
|
|
从Nginx开始:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
RequestId
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
贯穿:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Nginx
|
|||
|
|
→ Backend
|
|||
|
|
→ Service
|
|||
|
|
→ Error Log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
方便故障排查。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十四章 日志格式
|
|||
|
|
|
|||
|
|
推荐结构化JSON。
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"level": "ERROR",
|
|||
|
|
"requestId": "req_xxx",
|
|||
|
|
"service": "match",
|
|||
|
|
"code": "MATCH_CREATE_FAILED"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十五章 禁止日志内容
|
|||
|
|
|
|||
|
|
严禁:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
身份证全文
|
|||
|
|
完整手机号
|
|||
|
|
AccessToken
|
|||
|
|
RefreshToken
|
|||
|
|
密码
|
|||
|
|
聊天正文
|
|||
|
|
举报完整证据
|
|||
|
|
对象存储Secret
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十六章 日志保留
|
|||
|
|
|
|||
|
|
具体期限:
|
|||
|
|
|
|||
|
|
> 根据数据安全政策确定。
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
- 普通应用日志短期
|
|||
|
|
- Security Log较长期
|
|||
|
|
- Audit按照审计要求长期管理
|
|||
|
|
|
|||
|
|
不要无差别永久保存所有日志。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十七章 日志轮转
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
> Log Rotation。
|
|||
|
|
|
|||
|
|
防止日志占满磁盘。
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
- 按天
|
|||
|
|
- 按大小
|
|||
|
|
- 保留指定天数
|
|||
|
|
- 自动压缩
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十八章 监控总体结构
|
|||
|
|
|
|||
|
|
V1建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
基础设施监控
|
|||
|
|
+
|
|||
|
|
应用监控
|
|||
|
|
+
|
|||
|
|
业务监控
|
|||
|
|
+
|
|||
|
|
安全监控
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第六十九章 基础设施监控
|
|||
|
|
|
|||
|
|
监控:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
CPU
|
|||
|
|
Memory
|
|||
|
|
Disk
|
|||
|
|
Network
|
|||
|
|
Container
|
|||
|
|
PostgreSQL
|
|||
|
|
Redis
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十章 应用监控
|
|||
|
|
|
|||
|
|
监控:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
QPS
|
|||
|
|
P95
|
|||
|
|
5xx
|
|||
|
|
4xx
|
|||
|
|
线程/事件循环状态
|
|||
|
|
DB连接池
|
|||
|
|
外部API
|
|||
|
|
WebSocket
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十一章 业务监控
|
|||
|
|
|
|||
|
|
重点:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
登录成功率
|
|||
|
|
实名认证失败率
|
|||
|
|
待审核数量
|
|||
|
|
推荐失败
|
|||
|
|
Match创建异常
|
|||
|
|
Message失败
|
|||
|
|
Activity报名失败
|
|||
|
|
Report积压
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十二章 安全监控
|
|||
|
|
|
|||
|
|
重点:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
后台连续登录失败
|
|||
|
|
大量401/403
|
|||
|
|
Rate Limit异常
|
|||
|
|
敏感数据访问
|
|||
|
|
高风险操作
|
|||
|
|
权限修改
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十三章 监控工具原则
|
|||
|
|
|
|||
|
|
V1不要求昂贵商业APM。
|
|||
|
|
|
|||
|
|
可采用:
|
|||
|
|
|
|||
|
|
> Prometheus + Grafana
|
|||
|
|
|
|||
|
|
或云厂商原生监控。
|
|||
|
|
|
|||
|
|
如果采用云平台:
|
|||
|
|
|
|||
|
|
优先选择:
|
|||
|
|
|
|||
|
|
> 少维护方案。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十四章 是否必须自建Prometheus
|
|||
|
|
|
|||
|
|
不是。
|
|||
|
|
|
|||
|
|
如果云厂商:
|
|||
|
|
|
|||
|
|
- 主机监控
|
|||
|
|
- 数据库监控
|
|||
|
|
- 日志告警
|
|||
|
|
|
|||
|
|
已经足够:
|
|||
|
|
|
|||
|
|
> V1可先使用云监控。
|
|||
|
|
|
|||
|
|
目标是:
|
|||
|
|
|
|||
|
|
> 能发现问题。
|
|||
|
|
|
|||
|
|
不是为了建设监控平台。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十五章 最低必须监控项
|
|||
|
|
|
|||
|
|
上线前必须有:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
服务器CPU
|
|||
|
|
服务器内存
|
|||
|
|
服务器磁盘
|
|||
|
|
Backend存活
|
|||
|
|
HTTP 5xx
|
|||
|
|
PostgreSQL
|
|||
|
|
Redis
|
|||
|
|
数据库备份结果
|
|||
|
|
HTTPS证书到期
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十六章 Health Check
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/health/live
|
|||
|
|
/health/ready
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十七章 Live
|
|||
|
|
|
|||
|
|
判断:
|
|||
|
|
|
|||
|
|
> 应用进程是否活着。
|
|||
|
|
|
|||
|
|
不能把所有第三方都放Live。
|
|||
|
|
|
|||
|
|
否则第三方短信挂了:
|
|||
|
|
|
|||
|
|
> 容器被不断重启。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十八章 Ready
|
|||
|
|
|
|||
|
|
判断:
|
|||
|
|
|
|||
|
|
> 是否能正常提供核心服务。
|
|||
|
|
|
|||
|
|
可以检查:
|
|||
|
|
|
|||
|
|
- PostgreSQL
|
|||
|
|
- 必要Redis连接
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第七十九章 第三方健康
|
|||
|
|
|
|||
|
|
实名认证、微信等:
|
|||
|
|
|
|||
|
|
> 单独监控。
|
|||
|
|
|
|||
|
|
不要作为应用存活唯一依据。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十章 告警渠道
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
- 手机
|
|||
|
|
- 企业微信/微信工作群
|
|||
|
|
- 邮件(可选)
|
|||
|
|
|
|||
|
|
关键事故:
|
|||
|
|
|
|||
|
|
> 不能只发到没人看的监控页面。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十一章 告警分级
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
P1 紧急
|
|||
|
|
P2 重要
|
|||
|
|
P3 提醒
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十二章 P1告警
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
生产API整体不可用
|
|||
|
|
PostgreSQL不可用
|
|||
|
|
磁盘接近满
|
|||
|
|
大量500
|
|||
|
|
权限绕过事件
|
|||
|
|
备份连续失败
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十三章 P2告警
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
推荐失败率异常
|
|||
|
|
WebSocket连接失败率高
|
|||
|
|
实名认证错误率高
|
|||
|
|
活动报名异常
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十四章 P3
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
- 某异步任务一次失败
|
|||
|
|
- 日志增量异常
|
|||
|
|
- 非核心第三方短暂失败
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十五章 告警防噪音
|
|||
|
|
|
|||
|
|
不要:
|
|||
|
|
|
|||
|
|
> CPU瞬间80%就每分钟报警。
|
|||
|
|
|
|||
|
|
使用:
|
|||
|
|
|
|||
|
|
- 持续时间
|
|||
|
|
- 连续次数
|
|||
|
|
- 恢复通知
|
|||
|
|
|
|||
|
|
避免告警疲劳。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十六章 生产Dashboard
|
|||
|
|
|
|||
|
|
运维Dashboard重点:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
API availability
|
|||
|
|
P95 latency
|
|||
|
|
Error Rate
|
|||
|
|
DB Health
|
|||
|
|
Redis Health
|
|||
|
|
Disk
|
|||
|
|
WebSocket connections
|
|||
|
|
External service status
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十七章 备份总体原则
|
|||
|
|
|
|||
|
|
必须保证:
|
|||
|
|
|
|||
|
|
> **生产数据损坏后可以恢复。**
|
|||
|
|
|
|||
|
|
不是:
|
|||
|
|
|
|||
|
|
> “我们每天有一个backup.zip”。
|
|||
|
|
|
|||
|
|
真正要求:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
有备份
|
|||
|
|
+
|
|||
|
|
备份可读取
|
|||
|
|
+
|
|||
|
|
备份异地
|
|||
|
|
+
|
|||
|
|
实际恢复验证
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十八章 数据库备份
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
每日全量备份
|
|||
|
|
+
|
|||
|
|
数据库服务自身时间点恢复能力(如果使用托管数据库)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第八十九章 自建PostgreSQL
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
> 每日逻辑/物理备份。
|
|||
|
|
|
|||
|
|
更可靠方案:
|
|||
|
|
|
|||
|
|
> WAL归档 + 全量备份。
|
|||
|
|
|
|||
|
|
V1具体方案根据部署预算决定。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十章 托管数据库
|
|||
|
|
|
|||
|
|
优先利用:
|
|||
|
|
|
|||
|
|
- 自动备份
|
|||
|
|
- 时间点恢复
|
|||
|
|
- 跨可用区备份(如适用)
|
|||
|
|
|
|||
|
|
但仍需:
|
|||
|
|
|
|||
|
|
> 验证恢复操作。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十一章 备份保留策略建议
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
每日备份:7~14份
|
|||
|
|
每周备份:4~8份
|
|||
|
|
每月备份:若干
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
具体期限结合:
|
|||
|
|
|
|||
|
|
- 成本
|
|||
|
|
- 合规
|
|||
|
|
- 风险
|
|||
|
|
|
|||
|
|
最终确定。
|
|||
|
|
|
|||
|
|
不是业务硬编码。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十二章 备份不要只在原机器
|
|||
|
|
|
|||
|
|
错误:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
PostgreSQL
|
|||
|
|
和
|
|||
|
|
backup.sql
|
|||
|
|
都在同一磁盘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
宿主机坏了:
|
|||
|
|
|
|||
|
|
> 两个一起没。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十三章 异地/异介质备份
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
> 备份复制到不同存储位置。
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
云数据库
|
|||
|
|
+
|
|||
|
|
对象存储Backup Bucket
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十四章 备份加密
|
|||
|
|
|
|||
|
|
备份中可能含:
|
|||
|
|
|
|||
|
|
> 高敏感数据。
|
|||
|
|
|
|||
|
|
因此:
|
|||
|
|
|
|||
|
|
- 存储加密
|
|||
|
|
- 访问控制
|
|||
|
|
- 密钥保护
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十五章 Backup Bucket
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
> Private。
|
|||
|
|
|
|||
|
|
只有备份角色可访问。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十六章 备份账号
|
|||
|
|
|
|||
|
|
不使用:
|
|||
|
|
|
|||
|
|
> super admin通用云账号。
|
|||
|
|
|
|||
|
|
使用:
|
|||
|
|
|
|||
|
|
> 独立Backup权限。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十七章 Redis备份
|
|||
|
|
|
|||
|
|
Redis数据可重建。
|
|||
|
|
|
|||
|
|
因此Redis备份优先级低于PostgreSQL。
|
|||
|
|
|
|||
|
|
若存Session等:
|
|||
|
|
|
|||
|
|
> 可保留合理快照。
|
|||
|
|
|
|||
|
|
但恢复生产最核心的是:
|
|||
|
|
|
|||
|
|
> PostgreSQL。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十八章 对象存储备份
|
|||
|
|
|
|||
|
|
用户图片本身也是重要数据。
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
- Bucket版本控制(如果成本允许)
|
|||
|
|
- 生命周期
|
|||
|
|
- 跨存储备份/冗余
|
|||
|
|
|
|||
|
|
至少确保:
|
|||
|
|
|
|||
|
|
> 数据库恢复后不会出现所有图片都找不到。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第九十九章 对象删除策略
|
|||
|
|
|
|||
|
|
业务删除:
|
|||
|
|
|
|||
|
|
> 先soft delete/状态标记。
|
|||
|
|
|
|||
|
|
对象存储真正物理删除:
|
|||
|
|
|
|||
|
|
> 经过延迟清理任务。
|
|||
|
|
|
|||
|
|
避免用户误操作后立刻不可恢复。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百章 删除延迟
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
> 7~30天后物理清理。
|
|||
|
|
|
|||
|
|
具体根据数据保留政策确定。
|
|||
|
|
|
|||
|
|
安全举报证据等:
|
|||
|
|
|
|||
|
|
> 按独立保留策略处理。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零一章 数据库恢复目标
|
|||
|
|
|
|||
|
|
建议定义:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
RPO
|
|||
|
|
RTO
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零二章 RPO
|
|||
|
|
|
|||
|
|
Recovery Point Objective:
|
|||
|
|
|
|||
|
|
> 最多能接受丢多久的数据。
|
|||
|
|
|
|||
|
|
V1建议目标:
|
|||
|
|
|
|||
|
|
> 尽量控制在小时级或更好。
|
|||
|
|
|
|||
|
|
若使用托管数据库PITR:
|
|||
|
|
|
|||
|
|
> 可显著降低RPO。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零三章 RTO
|
|||
|
|
|
|||
|
|
Recovery Time Objective:
|
|||
|
|
|
|||
|
|
> 故障后多久恢复服务。
|
|||
|
|
|
|||
|
|
V1建议:
|
|||
|
|
|
|||
|
|
> 数小时内恢复核心服务。
|
|||
|
|
|
|||
|
|
不追求金融级秒级容灾。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零四章 RPO/RTO属于建议目标
|
|||
|
|
|
|||
|
|
最终根据:
|
|||
|
|
|
|||
|
|
- 云服务
|
|||
|
|
- 预算
|
|||
|
|
- 活跃用户规模
|
|||
|
|
|
|||
|
|
正式确定。
|
|||
|
|
|
|||
|
|
不要写入代码。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零五章 恢复演练
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
> 每季度/半年实际恢复一次测试数据库。
|
|||
|
|
|
|||
|
|
早期可以:
|
|||
|
|
|
|||
|
|
> 每次大版本上线前至少一次。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零六章 恢复测试流程
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
下载备份
|
|||
|
|
↓
|
|||
|
|
新建隔离数据库
|
|||
|
|
↓
|
|||
|
|
Restore
|
|||
|
|
↓
|
|||
|
|
运行Migration校验
|
|||
|
|
↓
|
|||
|
|
执行数据一致性检查
|
|||
|
|
↓
|
|||
|
|
抽查用户/Match/Message/Activity
|
|||
|
|
↓
|
|||
|
|
记录结果
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零七章 恢复检查
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
users count
|
|||
|
|
matches count
|
|||
|
|
messages count
|
|||
|
|
activities count
|
|||
|
|
reports count
|
|||
|
|
audit logs
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
并检查外键关系。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零八章 恢复演练记录
|
|||
|
|
|
|||
|
|
记录:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
backupTime
|
|||
|
|
restoreTime
|
|||
|
|
duration
|
|||
|
|
result
|
|||
|
|
errors
|
|||
|
|
operator
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百零九章 配置备份
|
|||
|
|
|
|||
|
|
不仅数据库。
|
|||
|
|
|
|||
|
|
还需要备份:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Nginx配置
|
|||
|
|
Docker Compose
|
|||
|
|
Migration脚本
|
|||
|
|
系统公开配置
|
|||
|
|
监控规则
|
|||
|
|
部署脚本
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
这些本身应在:
|
|||
|
|
|
|||
|
|
> Git版本管理。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十章 Secret备份
|
|||
|
|
|
|||
|
|
Secret不能丢。
|
|||
|
|
|
|||
|
|
但不能放普通Git。
|
|||
|
|
|
|||
|
|
应使用:
|
|||
|
|
|
|||
|
|
- Secret Manager
|
|||
|
|
- 加密离线备份
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十一章 灾难恢复优先顺序
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1 PostgreSQL
|
|||
|
|
2 Backend
|
|||
|
|
3 Auth
|
|||
|
|
4 核心用户/Match
|
|||
|
|
5 Chat
|
|||
|
|
6 Object Storage
|
|||
|
|
7 Redis Cache
|
|||
|
|
8 Analytics
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
核心服务优先。
|
|||
|
|
|
|||
|
|
统计可以最后恢复。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十二章 Redis全部丢失恢复
|
|||
|
|
|
|||
|
|
流程:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
启动新Redis
|
|||
|
|
↓
|
|||
|
|
Session可能失效
|
|||
|
|
↓
|
|||
|
|
用户重新登录
|
|||
|
|
↓
|
|||
|
|
缓存自然重建
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
核心Match不会丢。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十三章 应用服务器损坏
|
|||
|
|
|
|||
|
|
如果镜像和配置都在版本库/镜像仓库:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
新服务器
|
|||
|
|
↓
|
|||
|
|
Docker
|
|||
|
|
↓
|
|||
|
|
部署Compose
|
|||
|
|
↓
|
|||
|
|
配置Secret
|
|||
|
|
↓
|
|||
|
|
启动
|
|||
|
|
↓
|
|||
|
|
Nginx/域名切换
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
即可。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十四章 应用服务器不能成为“手工艺术品”
|
|||
|
|
|
|||
|
|
禁止:
|
|||
|
|
|
|||
|
|
> 开发人员SSH进去改了一堆东西但没有记录。
|
|||
|
|
|
|||
|
|
所有正式变更:
|
|||
|
|
|
|||
|
|
> 进入部署脚本、Compose或配置仓库。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十五章 Infrastructure Documentation
|
|||
|
|
|
|||
|
|
至少记录:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
服务器
|
|||
|
|
域名
|
|||
|
|
证书
|
|||
|
|
数据库
|
|||
|
|
Redis
|
|||
|
|
对象存储
|
|||
|
|
备份位置
|
|||
|
|
监控入口
|
|||
|
|
关键联系人
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
但Secret单独管理。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十六章 Release流程
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
开发完成
|
|||
|
|
↓
|
|||
|
|
CI
|
|||
|
|
↓
|
|||
|
|
Test
|
|||
|
|
↓
|
|||
|
|
Build Image
|
|||
|
|
↓
|
|||
|
|
Staging
|
|||
|
|
↓
|
|||
|
|
Migration
|
|||
|
|
↓
|
|||
|
|
E2E
|
|||
|
|
↓
|
|||
|
|
RC
|
|||
|
|
↓
|
|||
|
|
Production
|
|||
|
|
↓
|
|||
|
|
Smoke
|
|||
|
|
↓
|
|||
|
|
监控
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十七章 Production发布不在服务器编译
|
|||
|
|
|
|||
|
|
禁止:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
git pull
|
|||
|
|
npm install
|
|||
|
|
mvn package
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
直接生产机器现场编译。
|
|||
|
|
|
|||
|
|
应该:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
CI构建
|
|||
|
|
↓
|
|||
|
|
生成镜像
|
|||
|
|
↓
|
|||
|
|
生产只拉镜像
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十八章 镜像仓库
|
|||
|
|
|
|||
|
|
使用:
|
|||
|
|
|
|||
|
|
> 国内访问稳定的Container Registry。
|
|||
|
|
|
|||
|
|
保存:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1.0.0
|
|||
|
|
1.0.1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百一十九章 CI输出
|
|||
|
|
|
|||
|
|
每次Release至少生成:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
backend image
|
|||
|
|
admin build
|
|||
|
|
migration package
|
|||
|
|
release notes
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十章 Version
|
|||
|
|
|
|||
|
|
后端提供:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/version
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
或健康接口返回:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"version": "1.0.0",
|
|||
|
|
"commit": "abc123"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
方便确认当前服务器版本。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十一章 数据库Migration
|
|||
|
|
|
|||
|
|
必须使用:
|
|||
|
|
|
|||
|
|
> 正式Migration工具。
|
|||
|
|
|
|||
|
|
例如具体框架对应:
|
|||
|
|
|
|||
|
|
- Flyway
|
|||
|
|
- Liquibase
|
|||
|
|
- Prisma Migration
|
|||
|
|
- TypeORM migration
|
|||
|
|
|
|||
|
|
根据最终技术栈选择。
|
|||
|
|
|
|||
|
|
禁止:
|
|||
|
|
|
|||
|
|
> 生产手工改表后不记录。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十二章 Migration版本
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
V001__initial_schema
|
|||
|
|
V002__activity_interest
|
|||
|
|
V003__add_match_rule_version
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十三章 Migration原则
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
- 可重复部署环境
|
|||
|
|
- 可审核
|
|||
|
|
- Staging先跑
|
|||
|
|
- 生产前备份
|
|||
|
|
- 记录执行结果
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十四章 大表Migration
|
|||
|
|
|
|||
|
|
未来数据量大时:
|
|||
|
|
|
|||
|
|
避免:
|
|||
|
|
|
|||
|
|
> 一次长时间锁表。
|
|||
|
|
|
|||
|
|
V1早期数据量小问题有限。
|
|||
|
|
|
|||
|
|
但仍建立正确习惯。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十五章 向后兼容Migration
|
|||
|
|
|
|||
|
|
推荐:
|
|||
|
|
|
|||
|
|
### 第一步
|
|||
|
|
|
|||
|
|
增加字段。
|
|||
|
|
|
|||
|
|
### 第二步
|
|||
|
|
|
|||
|
|
新旧代码兼容。
|
|||
|
|
|
|||
|
|
### 第三步
|
|||
|
|
|
|||
|
|
数据迁移。
|
|||
|
|
|
|||
|
|
### 第四步
|
|||
|
|
|
|||
|
|
后续版本再清旧字段。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十六章 不建议Release中直接DROP重要字段
|
|||
|
|
|
|||
|
|
因为回滚应用后:
|
|||
|
|
|
|||
|
|
> 旧版本可能无法运行。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十七章 发布策略V1
|
|||
|
|
|
|||
|
|
推荐:
|
|||
|
|
|
|||
|
|
> Rolling/短停机发布。
|
|||
|
|
|
|||
|
|
单实例情况下:
|
|||
|
|
|
|||
|
|
可以短暂:
|
|||
|
|
|
|||
|
|
> 维护模式。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十八章 单实例发布
|
|||
|
|
|
|||
|
|
流程:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
开启维护模式(需要时)
|
|||
|
|
↓
|
|||
|
|
备份
|
|||
|
|
↓
|
|||
|
|
Migration
|
|||
|
|
↓
|
|||
|
|
启动新版本
|
|||
|
|
↓
|
|||
|
|
健康检查
|
|||
|
|
↓
|
|||
|
|
Smoke Test
|
|||
|
|
↓
|
|||
|
|
关闭维护模式
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百二十九章 是否必须零停机
|
|||
|
|
|
|||
|
|
V1:
|
|||
|
|
|
|||
|
|
> 不必须。
|
|||
|
|
|
|||
|
|
宁愿:
|
|||
|
|
|
|||
|
|
> 几分钟明确维护窗口
|
|||
|
|
|
|||
|
|
也不要为了“零停机”引入复杂双活系统。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十章 维护页
|
|||
|
|
|
|||
|
|
用户看到:
|
|||
|
|
|
|||
|
|
> 系统正在进行短暂维护,请稍后再试。
|
|||
|
|
|
|||
|
|
不要:
|
|||
|
|
|
|||
|
|
> 502 Bad Gateway。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十一章 后台维护
|
|||
|
|
|
|||
|
|
管理员提前知道:
|
|||
|
|
|
|||
|
|
> 维护时间。
|
|||
|
|
|
|||
|
|
避免活动现场突然升级。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十二章 发布避开关键活动
|
|||
|
|
|
|||
|
|
正式部署不要安排在:
|
|||
|
|
|
|||
|
|
- 大型公益相亲活动签到前
|
|||
|
|
- 活动进行中
|
|||
|
|
- 大规模推广刚开始
|
|||
|
|
|
|||
|
|
优先低峰期。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十三章 灰度发布
|
|||
|
|
|
|||
|
|
如果未来多实例:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
backend-1 old
|
|||
|
|
backend-2 new
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
可先少量流量到new。
|
|||
|
|
|
|||
|
|
V1初期不强制。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十四章 Feature Flag灰度
|
|||
|
|
|
|||
|
|
当前更实用:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
activityEnabled
|
|||
|
|
imageChatEnabled
|
|||
|
|
matchmakerEnabled
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
可以单独开关。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十五章 新功能上线方式
|
|||
|
|
|
|||
|
|
例如图片聊天:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
代码已部署
|
|||
|
|
↓
|
|||
|
|
Flag=false
|
|||
|
|
↓
|
|||
|
|
内部测试
|
|||
|
|
↓
|
|||
|
|
Flag=true
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
降低风险。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十六章 数据结构和Feature Flag
|
|||
|
|
|
|||
|
|
注意:
|
|||
|
|
|
|||
|
|
> 数据库Migration必须先完成。
|
|||
|
|
|
|||
|
|
不能Flag一开:
|
|||
|
|
|
|||
|
|
> 表还不存在。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十七章 Rollback原则
|
|||
|
|
|
|||
|
|
如果上线后出现严重问题:
|
|||
|
|
|
|||
|
|
> 应能快速回到上一稳定应用版本。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十八章 Rollback前提
|
|||
|
|
|
|||
|
|
数据库Migration必须考虑:
|
|||
|
|
|
|||
|
|
> 旧版本是否仍兼容。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百三十九章 应用回滚
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1.0.1有Bug
|
|||
|
|
↓
|
|||
|
|
切回1.0.0 image
|
|||
|
|
↓
|
|||
|
|
Restart
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十章 数据库回滚
|
|||
|
|
|
|||
|
|
不建议:
|
|||
|
|
|
|||
|
|
> 自动Down Migration生产数据库。
|
|||
|
|
|
|||
|
|
更安全:
|
|||
|
|
|
|||
|
|
- 应用向后兼容
|
|||
|
|
- 必要时修复Forward Migration
|
|||
|
|
|
|||
|
|
除非明确验证。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十一章 为什么数据库回滚更危险
|
|||
|
|
|
|||
|
|
生产已产生新数据。
|
|||
|
|
|
|||
|
|
简单:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
DROP COLUMN
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
可能直接丢数据。
|
|||
|
|
|
|||
|
|
因此:
|
|||
|
|
|
|||
|
|
> 应用回滚简单,数据库回滚谨慎。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十二章 Hotfix流程
|
|||
|
|
|
|||
|
|
严重线上Bug:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
建立hotfix branch
|
|||
|
|
↓
|
|||
|
|
最小修复
|
|||
|
|
↓
|
|||
|
|
自动测试
|
|||
|
|
↓
|
|||
|
|
Staging验证
|
|||
|
|
↓
|
|||
|
|
生成1.0.1
|
|||
|
|
↓
|
|||
|
|
上线
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
不能:
|
|||
|
|
|
|||
|
|
> SSH服务器现场改代码。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十三章 Release Notes
|
|||
|
|
|
|||
|
|
每个版本:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
新增
|
|||
|
|
修复
|
|||
|
|
数据库变更
|
|||
|
|
配置变更
|
|||
|
|
已知问题
|
|||
|
|
回滚注意事项
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十四章 运维日常SOP
|
|||
|
|
|
|||
|
|
每天:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
检查P1告警
|
|||
|
|
检查备份
|
|||
|
|
检查磁盘
|
|||
|
|
查看严重错误
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十五章 每周
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
检查错误趋势
|
|||
|
|
检查慢SQL
|
|||
|
|
检查Redis
|
|||
|
|
检查高风险安全日志
|
|||
|
|
检查后台异常登录
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十六章 每月
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
检查资源容量
|
|||
|
|
检查证书
|
|||
|
|
检查数据库增长
|
|||
|
|
检查对象存储增长
|
|||
|
|
检查备份容量
|
|||
|
|
检查权限和离职账号
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十七章 每季度
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
恢复演练
|
|||
|
|
权限复核
|
|||
|
|
安全补丁
|
|||
|
|
依赖升级评估
|
|||
|
|
灾备检查
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十八章 容量监控
|
|||
|
|
|
|||
|
|
必须关注:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
用户数
|
|||
|
|
照片量
|
|||
|
|
消息量
|
|||
|
|
数据库大小
|
|||
|
|
对象存储大小
|
|||
|
|
Redis内存
|
|||
|
|
日志大小
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百四十九章 容量增长预警
|
|||
|
|
|
|||
|
|
例如数据库:
|
|||
|
|
|
|||
|
|
> 预计30天后超过磁盘80%。
|
|||
|
|
|
|||
|
|
应该:
|
|||
|
|
|
|||
|
|
> 提前扩容。
|
|||
|
|
|
|||
|
|
不是等磁盘100%再处理。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十章 对象存储成本
|
|||
|
|
|
|||
|
|
聊天图片和生活照片可能成为主要存储增长。
|
|||
|
|
|
|||
|
|
建议统计:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
daily upload volume
|
|||
|
|
total storage
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十一章 图片压缩
|
|||
|
|
|
|||
|
|
正式上传后:
|
|||
|
|
|
|||
|
|
> 后端/图片服务压缩。
|
|||
|
|
|
|||
|
|
减少:
|
|||
|
|
|
|||
|
|
- 网络
|
|||
|
|
- 存储
|
|||
|
|
- CDN成本
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十二章 是否需要CDN
|
|||
|
|
|
|||
|
|
V1用户集中丹阳/江苏。
|
|||
|
|
|
|||
|
|
如果对象存储已有加速能力:
|
|||
|
|
|
|||
|
|
> 可直接使用。
|
|||
|
|
|
|||
|
|
用户量上升后:
|
|||
|
|
|
|||
|
|
> 再评估CDN。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十三章 用户头像缓存
|
|||
|
|
|
|||
|
|
Signed URL虽然短时:
|
|||
|
|
|
|||
|
|
前端仍可:
|
|||
|
|
|
|||
|
|
> 本地短期缓存。
|
|||
|
|
|
|||
|
|
减少重复下载。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十四章 CDN不能破坏隐私
|
|||
|
|
|
|||
|
|
如果使用CDN:
|
|||
|
|
|
|||
|
|
> 私有内容仍需要鉴权/签名。
|
|||
|
|
|
|||
|
|
不能因为加CDN:
|
|||
|
|
|
|||
|
|
> 变成Public Bucket。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十五章 数据库扩容时机
|
|||
|
|
|
|||
|
|
出现:
|
|||
|
|
|
|||
|
|
- CPU长期高
|
|||
|
|
- Connection接近上限
|
|||
|
|
- 慢SQL明显
|
|||
|
|
- 磁盘压力
|
|||
|
|
|
|||
|
|
先优化:
|
|||
|
|
|
|||
|
|
> SQL和索引。
|
|||
|
|
|
|||
|
|
再升级:
|
|||
|
|
|
|||
|
|
> 数据库规格。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十六章 不要一有性能问题就分库
|
|||
|
|
|
|||
|
|
V1单PostgreSQL足够。
|
|||
|
|
|
|||
|
|
优先:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
索引
|
|||
|
|
查询优化
|
|||
|
|
缓存
|
|||
|
|
分页
|
|||
|
|
资源升级
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十七章 Redis扩容
|
|||
|
|
|
|||
|
|
主要根据:
|
|||
|
|
|
|||
|
|
> 内存。
|
|||
|
|
|
|||
|
|
缓存应设置TTL。
|
|||
|
|
|
|||
|
|
避免:
|
|||
|
|
|
|||
|
|
> 永不失效无限增长。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十八章 WebSocket容量
|
|||
|
|
|
|||
|
|
监控:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
在线连接
|
|||
|
|
连接创建率
|
|||
|
|
断线率
|
|||
|
|
消息推送失败
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
达到单实例瓶颈后:
|
|||
|
|
|
|||
|
|
> 横向扩Backend。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百五十九章 推荐任务容量
|
|||
|
|
|
|||
|
|
如果实时推荐开始变慢:
|
|||
|
|
|
|||
|
|
第一阶段:
|
|||
|
|
|
|||
|
|
> Redis缓存。
|
|||
|
|
|
|||
|
|
第二阶段:
|
|||
|
|
|
|||
|
|
> 预计算。
|
|||
|
|
|
|||
|
|
仍无需立即引入推荐大数据平台。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十章 Analytics容量
|
|||
|
|
|
|||
|
|
统计变慢:
|
|||
|
|
|
|||
|
|
先使用:
|
|||
|
|
|
|||
|
|
> Daily Summary。
|
|||
|
|
|
|||
|
|
不要让Dashboard每次扫描messages全表。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十一章 Maintenance Jobs
|
|||
|
|
|
|||
|
|
建议至少:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
通知重试
|
|||
|
|
临时文件清理
|
|||
|
|
活动状态更新
|
|||
|
|
推荐缓存清理
|
|||
|
|
审核超时提醒
|
|||
|
|
红娘超时提醒
|
|||
|
|
统计日汇总
|
|||
|
|
风险状态重算
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十二章 Job执行机制
|
|||
|
|
|
|||
|
|
V1可以:
|
|||
|
|
|
|||
|
|
> 后端内置Scheduler。
|
|||
|
|
|
|||
|
|
不需要单独任务平台。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十三章 Scheduler多实例问题
|
|||
|
|
|
|||
|
|
未来Backend多实例:
|
|||
|
|
|
|||
|
|
必须避免:
|
|||
|
|
|
|||
|
|
> 同一个任务两台都跑。
|
|||
|
|
|
|||
|
|
可采用:
|
|||
|
|
|
|||
|
|
- Redis Lock
|
|||
|
|
- DB Lock
|
|||
|
|
- Scheduler Leader
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十四章 Job必须幂等
|
|||
|
|
|
|||
|
|
例如Daily Analytics:
|
|||
|
|
|
|||
|
|
执行两次:
|
|||
|
|
|
|||
|
|
> 结果相同。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十五章 Job监控
|
|||
|
|
|
|||
|
|
记录:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
jobName
|
|||
|
|
startedAt
|
|||
|
|
finishedAt
|
|||
|
|
status
|
|||
|
|
error
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
重要任务失败:
|
|||
|
|
|
|||
|
|
> 告警。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十六章 临时文件清理Job
|
|||
|
|
|
|||
|
|
清理:
|
|||
|
|
|
|||
|
|
- 未绑定上传
|
|||
|
|
- 过期临时文件
|
|||
|
|
|
|||
|
|
不能误删:
|
|||
|
|
|
|||
|
|
> 正式Profile/Chat/Risk文件。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十七章 Notification Retry
|
|||
|
|
|
|||
|
|
失败:
|
|||
|
|
|
|||
|
|
> 重试有限次数。
|
|||
|
|
|
|||
|
|
不能:
|
|||
|
|
|
|||
|
|
> 无限重试造成任务堆积。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十八章 第三方服务监控
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
微信登录
|
|||
|
|
实名认证
|
|||
|
|
对象存储
|
|||
|
|
短信(如启用)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百六十九章 第三方错误隔离
|
|||
|
|
|
|||
|
|
实名认证失败:
|
|||
|
|
|
|||
|
|
> 不应影响用户查看帮助页。
|
|||
|
|
|
|||
|
|
对象存储失败:
|
|||
|
|
|
|||
|
|
> 不应导致整个API死亡。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十章 Circuit Breaker
|
|||
|
|
|
|||
|
|
V1不一定需要引入复杂框架。
|
|||
|
|
|
|||
|
|
但第三方调用应:
|
|||
|
|
|
|||
|
|
- 超时
|
|||
|
|
- 有限重试
|
|||
|
|
- 快速失败
|
|||
|
|
|
|||
|
|
不能一个实名认证API卡30秒拖死线程池。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十一章 Third-party Timeout
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
> 秒级合理超时。
|
|||
|
|
|
|||
|
|
具体根据供应商SLA。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十二章 Retry
|
|||
|
|
|
|||
|
|
只对:
|
|||
|
|
|
|||
|
|
> 明确可重试错误。
|
|||
|
|
|
|||
|
|
不要实名认证提交失败就无限重试。
|
|||
|
|
|
|||
|
|
避免重复请求和费用。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十三章 外部Provider适配层
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
WechatAdapter
|
|||
|
|
IdentityVerificationProvider
|
|||
|
|
SmsProvider
|
|||
|
|
ObjectStorageProvider
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
避免Service直接写供应商SDK。
|
|||
|
|
|
|||
|
|
后续更换服务商更容易。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十四章 Provider配置
|
|||
|
|
|
|||
|
|
后台不要直接暴露Secret。
|
|||
|
|
|
|||
|
|
使用部署配置。
|
|||
|
|
|
|||
|
|
运营后台最多看到:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
实名认证服务:正常
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十五章 微信小程序发布
|
|||
|
|
|
|||
|
|
小程序前端发布流程:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
开发版本
|
|||
|
|
↓
|
|||
|
|
体验版
|
|||
|
|
↓
|
|||
|
|
业务验收
|
|||
|
|
↓
|
|||
|
|
提交审核
|
|||
|
|
↓
|
|||
|
|
正式发布
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十六章 小程序API兼容
|
|||
|
|
|
|||
|
|
由于小程序审核和后端发布时间可能不同:
|
|||
|
|
|
|||
|
|
> API必须保持一定向后兼容。
|
|||
|
|
|
|||
|
|
不能后端一升级:
|
|||
|
|
|
|||
|
|
> 旧小程序立即全部坏。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十七章 API兼容策略
|
|||
|
|
|
|||
|
|
V1:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/api/v1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
增加字段:
|
|||
|
|
|
|||
|
|
> 兼容。
|
|||
|
|
|
|||
|
|
删除/重命名字段:
|
|||
|
|
|
|||
|
|
> 谨慎。
|
|||
|
|
|
|||
|
|
重大破坏:
|
|||
|
|
|
|||
|
|
> `/api/v2`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十八章 小程序最低版本控制
|
|||
|
|
|
|||
|
|
可以在:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/app/config
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
返回:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
minimumSupportedVersion
|
|||
|
|
latestVersion
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百七十九章 强制升级
|
|||
|
|
|
|||
|
|
微信小程序升级机制不同于APP。
|
|||
|
|
|
|||
|
|
可以提示:
|
|||
|
|
|
|||
|
|
> 当前版本过旧,请重新打开小程序获取最新版本。
|
|||
|
|
|
|||
|
|
但不要频繁使用。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十章 后台前端升级
|
|||
|
|
|
|||
|
|
Admin Web是静态资源。
|
|||
|
|
|
|||
|
|
发布后:
|
|||
|
|
|
|||
|
|
> 刷新获取新版本。
|
|||
|
|
|
|||
|
|
需要注意浏览器缓存。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十一章 Static Assets
|
|||
|
|
|
|||
|
|
文件名使用Hash:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
app.a87f91.js
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
避免老缓存。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十二章 后台版本不一致
|
|||
|
|
|
|||
|
|
前端可以在API发现:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
CLIENT_VERSION_TOO_OLD
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
提示刷新。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十三章 安全补丁升级
|
|||
|
|
|
|||
|
|
依赖包定期检查:
|
|||
|
|
|
|||
|
|
- 后端Framework
|
|||
|
|
- Node依赖
|
|||
|
|
- Nginx
|
|||
|
|
- PostgreSQL
|
|||
|
|
- Redis
|
|||
|
|
- Docker
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十四章 不自动升级生产主版本
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
> 数据库大版本。
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
评估
|
|||
|
|
↓
|
|||
|
|
测试
|
|||
|
|
↓
|
|||
|
|
备份
|
|||
|
|
↓
|
|||
|
|
Staging
|
|||
|
|
↓
|
|||
|
|
生产维护窗口
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十五章 小版本安全补丁
|
|||
|
|
|
|||
|
|
仍应:
|
|||
|
|
|
|||
|
|
> 先Test/Staging。
|
|||
|
|
|
|||
|
|
不要生产服务器自动apt upgrade所有软件。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十六章 Dependency Lock
|
|||
|
|
|
|||
|
|
必须有:
|
|||
|
|
|
|||
|
|
- package-lock
|
|||
|
|
- pnpm-lock
|
|||
|
|
- Maven/Gradle固定依赖
|
|||
|
|
|
|||
|
|
保证构建可重复。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十七章 镜像基础版本
|
|||
|
|
|
|||
|
|
不要长期:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
node:latest
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
固定:
|
|||
|
|
|
|||
|
|
> 主版本/明确镜像Tag。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十八章 容器运行安全
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
- 非root运行
|
|||
|
|
- 只读文件系统(可行处)
|
|||
|
|
- 最小权限
|
|||
|
|
- 不挂Docker Socket
|
|||
|
|
- 不把Secret写镜像
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百八十九章 防火墙
|
|||
|
|
|
|||
|
|
公网只开放:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
80
|
|||
|
|
443
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
SSH:
|
|||
|
|
|
|||
|
|
> 仅管理IP/VPN。
|
|||
|
|
|
|||
|
|
PostgreSQL:
|
|||
|
|
|
|||
|
|
> 不公网。
|
|||
|
|
|
|||
|
|
Redis:
|
|||
|
|
|
|||
|
|
> 不公网。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十章 SSH管理
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
- SSH Key
|
|||
|
|
- 禁止密码登录(条件允许)
|
|||
|
|
- 不允许root直接登录
|
|||
|
|
- 管理IP限制
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十一章 管理员系统和服务器权限分离
|
|||
|
|
|
|||
|
|
后台platform_admin:
|
|||
|
|
|
|||
|
|
> 不等于服务器root。
|
|||
|
|
|
|||
|
|
运营人员不需要SSH权限。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十二章 云账号权限
|
|||
|
|
|
|||
|
|
采用:
|
|||
|
|
|
|||
|
|
> 最小权限。
|
|||
|
|
|
|||
|
|
开发人员:
|
|||
|
|
|
|||
|
|
> 不自动拥有生产云账号Owner。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十三章 生产变更权限
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
- 技术负责人
|
|||
|
|
- 指定运维
|
|||
|
|
|
|||
|
|
执行。
|
|||
|
|
|
|||
|
|
重要变更:
|
|||
|
|
|
|||
|
|
> 留记录。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十四章 域名与证书管理
|
|||
|
|
|
|||
|
|
必须记录:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
域名注册商
|
|||
|
|
证书
|
|||
|
|
负责人
|
|||
|
|
到期时间
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
域名过期是非常常见但严重的事故。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十五章 证书到期告警
|
|||
|
|
|
|||
|
|
建议提前:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
30天
|
|||
|
|
15天
|
|||
|
|
7天
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
提醒。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十六章 数据库密码轮换
|
|||
|
|
|
|||
|
|
人员变化或怀疑泄露:
|
|||
|
|
|
|||
|
|
> 立即轮换。
|
|||
|
|
|
|||
|
|
定期轮换频率根据安全政策。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十七章 API Secret轮换
|
|||
|
|
|
|||
|
|
Provider Adapter应支持:
|
|||
|
|
|
|||
|
|
> 新旧Secret短期切换。
|
|||
|
|
|
|||
|
|
减少停机。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十八章 JWT/Token Key轮换
|
|||
|
|
|
|||
|
|
设计:
|
|||
|
|
|
|||
|
|
> key version/kid。
|
|||
|
|
|
|||
|
|
未来可以平滑轮换。
|
|||
|
|
|
|||
|
|
V1如果实现简单,也至少保留替换能力。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第一百九十九章 生产故障分级
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
SEV1
|
|||
|
|
SEV2
|
|||
|
|
SEV3
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百章 SEV1
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
全站不可用
|
|||
|
|
数据库损坏
|
|||
|
|
大规模数据泄露
|
|||
|
|
严重权限绕过
|
|||
|
|
Match大量错误生成
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零一章 SEV1处置流程
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
发现
|
|||
|
|
↓
|
|||
|
|
停止扩大影响
|
|||
|
|
↓
|
|||
|
|
必要时维护模式/Feature Flag
|
|||
|
|
↓
|
|||
|
|
保护数据
|
|||
|
|
↓
|
|||
|
|
定位
|
|||
|
|
↓
|
|||
|
|
修复/回滚
|
|||
|
|
↓
|
|||
|
|
恢复
|
|||
|
|
↓
|
|||
|
|
验证
|
|||
|
|
↓
|
|||
|
|
事故复盘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零二章 SEV2
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
- 聊天不可用
|
|||
|
|
- 推荐不可用
|
|||
|
|
- 活动报名异常
|
|||
|
|
- 实名第三方异常
|
|||
|
|
|
|||
|
|
核心平台部分可用。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零三章 SEV3
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
- 某统计延迟
|
|||
|
|
- 非核心通知失败
|
|||
|
|
- 局部后台页面Bug
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零四章 故障第一原则
|
|||
|
|
|
|||
|
|
> **先停止错误扩散,再追求恢复功能。**
|
|||
|
|
|
|||
|
|
例如Match逻辑错:
|
|||
|
|
|
|||
|
|
> 先关闭Like。
|
|||
|
|
|
|||
|
|
不要继续生成错误关系。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零五章 数据事故
|
|||
|
|
|
|||
|
|
如果发现数据写错:
|
|||
|
|
|
|||
|
|
> 禁止直接批量手改。
|
|||
|
|
|
|||
|
|
先:
|
|||
|
|
|
|||
|
|
- 备份
|
|||
|
|
- 确认影响范围
|
|||
|
|
- Dry Run修复脚本
|
|||
|
|
- 执行
|
|||
|
|
- 验证
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零六章 故障Runbook
|
|||
|
|
|
|||
|
|
建议至少建立:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
API全挂
|
|||
|
|
数据库不可连接
|
|||
|
|
Redis故障
|
|||
|
|
对象存储故障
|
|||
|
|
微信登录异常
|
|||
|
|
实名认证异常
|
|||
|
|
磁盘满
|
|||
|
|
证书过期
|
|||
|
|
Match异常
|
|||
|
|
消息异常
|
|||
|
|
权限事故
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零七章 Runbook格式
|
|||
|
|
|
|||
|
|
每个包含:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
症状
|
|||
|
|
检查步骤
|
|||
|
|
临时措施
|
|||
|
|
恢复方法
|
|||
|
|
升级联系人
|
|||
|
|
验证方式
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零八章 数据库故障Runbook
|
|||
|
|
|
|||
|
|
示例:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1 检查数据库状态
|
|||
|
|
2 检查连接数
|
|||
|
|
3 检查磁盘
|
|||
|
|
4 检查慢查询/锁
|
|||
|
|
5 必要时只读/维护
|
|||
|
|
6 恢复或切换
|
|||
|
|
7 核心数据校验
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百零九章 Redis故障Runbook
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1 判断是否核心业务受影响
|
|||
|
|
2 Restart/替换Redis
|
|||
|
|
3 Session影响评估
|
|||
|
|
4 清缓存
|
|||
|
|
5 用户重新登录
|
|||
|
|
6 检查推荐/未读恢复
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十章 Object Storage故障
|
|||
|
|
|
|||
|
|
降级:
|
|||
|
|
|
|||
|
|
- 文字功能保留
|
|||
|
|
- 暂停图片上传
|
|||
|
|
- 已有图片暂时显示失败占位
|
|||
|
|
|
|||
|
|
不需要:
|
|||
|
|
|
|||
|
|
> 全平台维护。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十一章 微信服务异常
|
|||
|
|
|
|||
|
|
提示:
|
|||
|
|
|
|||
|
|
> 微信服务暂时异常,请稍后重试。
|
|||
|
|
|
|||
|
|
记录Provider错误。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十二章 实名服务故障
|
|||
|
|
|
|||
|
|
可以:
|
|||
|
|
|
|||
|
|
> 暂停新实名认证。
|
|||
|
|
|
|||
|
|
已有已实名用户:
|
|||
|
|
|
|||
|
|
> 正常使用。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十三章 风控系统故障
|
|||
|
|
|
|||
|
|
核心权限:
|
|||
|
|
|
|||
|
|
- Block
|
|||
|
|
- AccountStatus
|
|||
|
|
|
|||
|
|
仍必须工作。
|
|||
|
|
|
|||
|
|
辅助关键词检测异常:
|
|||
|
|
|
|||
|
|
> 可降级。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十四章 统计系统故障
|
|||
|
|
|
|||
|
|
Analytics失败:
|
|||
|
|
|
|||
|
|
> 不影响用户Match/Chat。
|
|||
|
|
|
|||
|
|
Dashboard提示:
|
|||
|
|
|
|||
|
|
> 数据暂时无法更新。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十五章 事故复盘
|
|||
|
|
|
|||
|
|
SEV1/重要SEV2后必须形成:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
发生什么
|
|||
|
|
为什么
|
|||
|
|
影响谁
|
|||
|
|
为什么监控没提前发现
|
|||
|
|
怎么修
|
|||
|
|
怎么防止再次发生
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十六章 复盘不是追责会议
|
|||
|
|
|
|||
|
|
目标:
|
|||
|
|
|
|||
|
|
> 改系统和流程。
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
“开发操作失误”
|
|||
|
|
|
|||
|
|
不是根因。
|
|||
|
|
|
|||
|
|
应继续问:
|
|||
|
|
|
|||
|
|
> 为什么一个人的失误能够直接影响生产?
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十七章 版本升级节奏
|
|||
|
|
|
|||
|
|
V1稳定后:
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Patch
|
|||
|
|
按需
|
|||
|
|
|
|||
|
|
Minor
|
|||
|
|
按业务周期
|
|||
|
|
|
|||
|
|
Major
|
|||
|
|
谨慎
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
不要:
|
|||
|
|
|
|||
|
|
> 每天生产升级核心结构。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十八章 高频小版本
|
|||
|
|
|
|||
|
|
如果团队初期快速迭代:
|
|||
|
|
|
|||
|
|
可以:
|
|||
|
|
|
|||
|
|
> 每周固定窗口。
|
|||
|
|
|
|||
|
|
比随时上线更可控。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百一十九章 大型活动冻结期
|
|||
|
|
|
|||
|
|
活动前:
|
|||
|
|
|
|||
|
|
> 24~48小时建议冻结高风险大改动。
|
|||
|
|
|
|||
|
|
只允许:
|
|||
|
|
|
|||
|
|
> 紧急Hotfix。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十章 数据库维护窗口
|
|||
|
|
|
|||
|
|
如需:
|
|||
|
|
|
|||
|
|
- 大索引
|
|||
|
|
- 大版本升级
|
|||
|
|
|
|||
|
|
提前通知运营。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十一章 生产数据初始化
|
|||
|
|
|
|||
|
|
首次上线必须:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Migration
|
|||
|
|
↓
|
|||
|
|
基础字典
|
|||
|
|
↓
|
|||
|
|
系统角色
|
|||
|
|
↓
|
|||
|
|
系统权限
|
|||
|
|
↓
|
|||
|
|
平台组织
|
|||
|
|
↓
|
|||
|
|
首个管理员
|
|||
|
|
↓
|
|||
|
|
系统基础配置
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十二章 Seed原则
|
|||
|
|
|
|||
|
|
只Seed:
|
|||
|
|
|
|||
|
|
- 字典
|
|||
|
|
- Role
|
|||
|
|
- Permission
|
|||
|
|
- 基础配置
|
|||
|
|
|
|||
|
|
不要Seed:
|
|||
|
|
|
|||
|
|
> 测试用户到生产。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十三章 首个Super Admin
|
|||
|
|
|
|||
|
|
通过:
|
|||
|
|
|
|||
|
|
> 安全部署脚本/一次性初始化。
|
|||
|
|
|
|||
|
|
不能默认:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
账号和密码由部署环境安全提供,不写入文档
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十四章 默认密码
|
|||
|
|
|
|||
|
|
如果系统生成临时密码:
|
|||
|
|
|
|||
|
|
> 首次登录强制修改。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十五章 生产启动后检查
|
|||
|
|
|
|||
|
|
第一次:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
健康检查
|
|||
|
|
↓
|
|||
|
|
Admin登录
|
|||
|
|
↓
|
|||
|
|
微信登录
|
|||
|
|
↓
|
|||
|
|
测试实名环境检查
|
|||
|
|
↓
|
|||
|
|
文件上传
|
|||
|
|
↓
|
|||
|
|
推荐
|
|||
|
|
↓
|
|||
|
|
WebSocket
|
|||
|
|
↓
|
|||
|
|
数据库备份
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十六章 监控上线必须早于用户推广
|
|||
|
|
|
|||
|
|
不能:
|
|||
|
|
|
|||
|
|
> 用户都来了才开始装监控。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十七章 第一场活动前额外检查
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Activity API
|
|||
|
|
Registration
|
|||
|
|
Check-in
|
|||
|
|
Admin Login
|
|||
|
|
Volunteer Account
|
|||
|
|
Mobile Network
|
|||
|
|
Manual Check-in
|
|||
|
|
Backup Plan
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十八章 运维文档
|
|||
|
|
|
|||
|
|
建议目录:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
docs/ops/
|
|||
|
|
├── architecture.md
|
|||
|
|
├── deployment.md
|
|||
|
|
├── environment.md
|
|||
|
|
├── backup-restore.md
|
|||
|
|
├── monitoring.md
|
|||
|
|
├── incident-runbook.md
|
|||
|
|
├── release.md
|
|||
|
|
└── disaster-recovery.md
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百二十九章 部署脚本建议
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
scripts/
|
|||
|
|
├── deploy.sh
|
|||
|
|
├── rollback.sh
|
|||
|
|
├── backup-db.sh
|
|||
|
|
├── restore-db.sh
|
|||
|
|
├── health-check.sh
|
|||
|
|
└── rebuild-metrics.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
根据操作系统调整。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十章 Deploy Script原则
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
- `set -e`
|
|||
|
|
- 检查镜像
|
|||
|
|
- 检查环境
|
|||
|
|
- 记录版本
|
|||
|
|
- 健康检查
|
|||
|
|
- 失败退出
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十一章 Rollback Script
|
|||
|
|
|
|||
|
|
必须明确:
|
|||
|
|
|
|||
|
|
> 回哪个版本。
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
./rollback.sh 1.0.0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
不能:
|
|||
|
|
|
|||
|
|
> “回上一版”但系统不知道上一版是谁。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十二章 Backup Script
|
|||
|
|
|
|||
|
|
运行后:
|
|||
|
|
|
|||
|
|
- 生成备份
|
|||
|
|
- 校验
|
|||
|
|
- 上传异地
|
|||
|
|
- 记录成功
|
|||
|
|
- 失败告警
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十三章 Restore Script
|
|||
|
|
|
|||
|
|
默认:
|
|||
|
|
|
|||
|
|
> 不允许直接恢复覆盖生产。
|
|||
|
|
|
|||
|
|
应要求:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
target database
|
|||
|
|
backup file
|
|||
|
|
confirmation
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
防止误操作。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十四章 生产访问最小化
|
|||
|
|
|
|||
|
|
普通开发:
|
|||
|
|
|
|||
|
|
> 不需要每天SSH生产。
|
|||
|
|
|
|||
|
|
系统可通过:
|
|||
|
|
|
|||
|
|
- 监控
|
|||
|
|
- 日志
|
|||
|
|
- Admin
|
|||
|
|
|
|||
|
|
完成日常工作。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十五章 日志查询工具
|
|||
|
|
|
|||
|
|
初期:
|
|||
|
|
|
|||
|
|
> Docker logs + 集中日志/云日志
|
|||
|
|
|
|||
|
|
足够。
|
|||
|
|
|
|||
|
|
用户量增加后:
|
|||
|
|
|
|||
|
|
再考虑:
|
|||
|
|
|
|||
|
|
> Loki等轻量日志系统。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十六章 不建议V1自建ELK
|
|||
|
|
|
|||
|
|
因为:
|
|||
|
|
|
|||
|
|
- 内存高
|
|||
|
|
- 运维复杂
|
|||
|
|
- 当前数据规模不需要
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十七章 Metrics与Logs区分
|
|||
|
|
|
|||
|
|
Metrics:
|
|||
|
|
|
|||
|
|
> 看系统是不是出问题。
|
|||
|
|
|
|||
|
|
Logs:
|
|||
|
|
|
|||
|
|
> 查为什么出问题。
|
|||
|
|
|
|||
|
|
Audit:
|
|||
|
|
|
|||
|
|
> 查谁做了什么。
|
|||
|
|
|
|||
|
|
三者不能混为一体。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十八章 生产数据库直接查询
|
|||
|
|
|
|||
|
|
普通运营:
|
|||
|
|
|
|||
|
|
> 禁止。
|
|||
|
|
|
|||
|
|
技术人员如必须:
|
|||
|
|
|
|||
|
|
- 只读账号
|
|||
|
|
- 受控访问
|
|||
|
|
- 记录操作
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百三十九章 生产数据修复
|
|||
|
|
|
|||
|
|
使用:
|
|||
|
|
|
|||
|
|
> 专用脚本。
|
|||
|
|
|
|||
|
|
不要:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
UPDATE users SET ...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
直接靠手工SQL长期处理。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十章 Schema Ownership
|
|||
|
|
|
|||
|
|
数据库结构修改:
|
|||
|
|
|
|||
|
|
> 只能Migration。
|
|||
|
|
|
|||
|
|
Application User:
|
|||
|
|
|
|||
|
|
> 无ALTER TABLE权限。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十一章 成本控制原则
|
|||
|
|
|
|||
|
|
V1成本重点投入:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
稳定服务器
|
|||
|
|
数据库
|
|||
|
|
对象存储
|
|||
|
|
备份
|
|||
|
|
HTTPS
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
暂时不花重金:
|
|||
|
|
|
|||
|
|
- Kubernetes
|
|||
|
|
- 大型APM
|
|||
|
|
- 数据仓库
|
|||
|
|
- 搜索集群
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十二章 初期资源建议原则
|
|||
|
|
|
|||
|
|
不要预估成:
|
|||
|
|
|
|||
|
|
> 百万用户平台。
|
|||
|
|
|
|||
|
|
按照:
|
|||
|
|
|
|||
|
|
> 数千~数万用户可扩展
|
|||
|
|
|
|||
|
|
设计即可。
|
|||
|
|
|
|||
|
|
具体CPU/内存规格应根据最终技术栈和压测结果确定。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十三章 一个合理的扩容路径
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
阶段1
|
|||
|
|
单Backend
|
|||
|
|
+
|
|||
|
|
PostgreSQL
|
|||
|
|
+
|
|||
|
|
Redis
|
|||
|
|
|
|||
|
|
阶段2
|
|||
|
|
Backend x2
|
|||
|
|
+
|
|||
|
|
负载均衡
|
|||
|
|
|
|||
|
|
阶段3
|
|||
|
|
PostgreSQL升级规格
|
|||
|
|
+
|
|||
|
|
Redis独立
|
|||
|
|
|
|||
|
|
阶段4
|
|||
|
|
读写压力明显后
|
|||
|
|
再考虑进一步架构调整
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十四章 不提前分布式
|
|||
|
|
|
|||
|
|
因为V1真正风险不是:
|
|||
|
|
|
|||
|
|
> 扛不住百万QPS。
|
|||
|
|
|
|||
|
|
而是:
|
|||
|
|
|
|||
|
|
- 权限错
|
|||
|
|
- Match错
|
|||
|
|
- 数据丢
|
|||
|
|
- 活动现场不可用
|
|||
|
|
|
|||
|
|
技术投入应优先解决这些。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十五章 运维权限分层
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Cloud Admin
|
|||
|
|
Deployment Operator
|
|||
|
|
Database Admin
|
|||
|
|
Read-only Observer
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
小团队可兼任。
|
|||
|
|
|
|||
|
|
但权限思想保留。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十六章 云主账号
|
|||
|
|
|
|||
|
|
不要作为:
|
|||
|
|
|
|||
|
|
> 日常登录账号。
|
|||
|
|
|
|||
|
|
启用:
|
|||
|
|
|
|||
|
|
- MFA
|
|||
|
|
- 强保护
|
|||
|
|
|
|||
|
|
日常使用子账号。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十七章 Secret泄露事故
|
|||
|
|
|
|||
|
|
一旦发现:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Git中提交Secret
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
不能只:
|
|||
|
|
|
|||
|
|
> 删除Commit里的Secret。
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
> 立即Rotate。
|
|||
|
|
|
|||
|
|
因为历史可能已经泄露。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十八章 数据库备份恢复验收标准
|
|||
|
|
|
|||
|
|
必须证明:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
备份文件存在
|
|||
|
|
↓
|
|||
|
|
成功恢复新数据库
|
|||
|
|
↓
|
|||
|
|
Backend能连接
|
|||
|
|
↓
|
|||
|
|
核心E2E数据正常
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
才算:
|
|||
|
|
|
|||
|
|
> Backup可用。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百四十九章 发布验收标准
|
|||
|
|
|
|||
|
|
每次生产上线后:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/version正确
|
|||
|
|
/health正确
|
|||
|
|
Login正确
|
|||
|
|
推荐正确
|
|||
|
|
消息正确
|
|||
|
|
Admin正确
|
|||
|
|
监控无异常
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十章 生产变更记录
|
|||
|
|
|
|||
|
|
每次记录:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
版本
|
|||
|
|
时间
|
|||
|
|
执行人
|
|||
|
|
Migration
|
|||
|
|
配置变化
|
|||
|
|
结果
|
|||
|
|
是否回滚
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十一章 维护公告
|
|||
|
|
|
|||
|
|
如计划停机:
|
|||
|
|
|
|||
|
|
提前:
|
|||
|
|
|
|||
|
|
> 在小程序和后台提示。
|
|||
|
|
|
|||
|
|
不需要复杂公告系统。
|
|||
|
|
|
|||
|
|
可以通过:
|
|||
|
|
|
|||
|
|
> system notice/config。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十二章 用户端降级页面
|
|||
|
|
|
|||
|
|
至少:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
维护中
|
|||
|
|
网络异常
|
|||
|
|
服务暂不可用
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
不能只显示:
|
|||
|
|
|
|||
|
|
> 请求失败 -500。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十三章 后台故障页面
|
|||
|
|
|
|||
|
|
管理员看到:
|
|||
|
|
|
|||
|
|
> 当前服务暂时不可用,RequestId xxx。
|
|||
|
|
|
|||
|
|
方便反馈技术人员。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十四章 第三方依赖降级矩阵
|
|||
|
|
|
|||
|
|
| 服务 | 故障影响 | 降级 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| 微信登录 | 新登录受影响 | 已登录用户继续 |
|
|||
|
|
| 实名服务 | 新实名受影响 | 已实名用户正常 |
|
|||
|
|
| 对象存储 | 图片受影响 | 文字业务继续 |
|
|||
|
|
| Redis | Cache/Session部分影响 | DB核心业务保留 |
|
|||
|
|
| Analytics | 统计页面 | 核心婚恋不受影响 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十五章 核心依赖矩阵
|
|||
|
|
|
|||
|
|
PostgreSQL:
|
|||
|
|
|
|||
|
|
> 核心依赖。
|
|||
|
|
|
|||
|
|
如果不可用:
|
|||
|
|
|
|||
|
|
> 应进入维护模式/保护状态。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十六章 数据一致性优先
|
|||
|
|
|
|||
|
|
如果数据库出现异常:
|
|||
|
|
|
|||
|
|
不要为了:
|
|||
|
|
|
|||
|
|
> 页面继续“看起来能用”
|
|||
|
|
|
|||
|
|
而允许本地/Redis继续写业务。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十七章 上线后容量评估
|
|||
|
|
|
|||
|
|
每月记录:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
用户增长
|
|||
|
|
数据库增长
|
|||
|
|
消息增长
|
|||
|
|
对象存储增长
|
|||
|
|
峰值连接
|
|||
|
|
峰值QPS
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十八章 什么时候考虑架构升级
|
|||
|
|
|
|||
|
|
满足以下情况再考虑:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
单实例Backend成为明显瓶颈
|
|||
|
|
数据库规格已明显不足
|
|||
|
|
实时连接量增长
|
|||
|
|
统计查询影响主业务
|
|||
|
|
部署频率与团队规模显著增加
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百五十九章 不以“感觉用户以后会很多”作为升级依据
|
|||
|
|
|
|||
|
|
必须:
|
|||
|
|
|
|||
|
|
> 基于监控数据。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十章 V1明确不采用
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Kubernetes
|
|||
|
|
Kafka
|
|||
|
|
RabbitMQ(除非后期确有任务需求)
|
|||
|
|
Elasticsearch
|
|||
|
|
ClickHouse
|
|||
|
|
Neo4j
|
|||
|
|
Service Mesh
|
|||
|
|
微服务拆分
|
|||
|
|
多活数据库
|
|||
|
|
复杂DevOps平台
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十一章 V1推荐的最小可靠技术组合
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Nginx
|
|||
|
|
+
|
|||
|
|
Docker Compose
|
|||
|
|
+
|
|||
|
|
Backend Modular Monolith
|
|||
|
|
+
|
|||
|
|
PostgreSQL
|
|||
|
|
+
|
|||
|
|
Redis
|
|||
|
|
+
|
|||
|
|
Private Object Storage
|
|||
|
|
+
|
|||
|
|
云监控/Prometheus
|
|||
|
|
+
|
|||
|
|
数据库自动备份
|
|||
|
|
+
|
|||
|
|
Git CI/CD
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
足够支持V1长期稳定运行。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十二章 Codex实现要求:部署文件
|
|||
|
|
|
|||
|
|
代码仓库必须提供:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
docker-compose.yml
|
|||
|
|
docker-compose.staging.yml
|
|||
|
|
.env.example
|
|||
|
|
Dockerfile
|
|||
|
|
nginx/
|
|||
|
|
scripts/
|
|||
|
|
docs/ops/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十三章 Codex实现要求:健康检查
|
|||
|
|
|
|||
|
|
必须实现:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/health/live
|
|||
|
|
/health/ready
|
|||
|
|
/version
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十四章 Codex实现要求:Migration
|
|||
|
|
|
|||
|
|
必须在CI和部署流程中:
|
|||
|
|
|
|||
|
|
> 自动检测Migration。
|
|||
|
|
|
|||
|
|
禁止:
|
|||
|
|
|
|||
|
|
> 应用启动时偷偷自动修改生产结构且不可追踪。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十五章 Codex实现要求:日志
|
|||
|
|
|
|||
|
|
所有后端日志:
|
|||
|
|
|
|||
|
|
> 结构化。
|
|||
|
|
|
|||
|
|
包含:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
requestId
|
|||
|
|
level
|
|||
|
|
module
|
|||
|
|
message
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十六章 Codex实现要求:Graceful Shutdown
|
|||
|
|
|
|||
|
|
Backend收到:
|
|||
|
|
|
|||
|
|
> SIGTERM
|
|||
|
|
|
|||
|
|
应:
|
|||
|
|
|
|||
|
|
- 停止接新请求
|
|||
|
|
- 完成当前合理请求
|
|||
|
|
- 关闭DB连接
|
|||
|
|
- 关闭Redis
|
|||
|
|
- 关闭WebSocket
|
|||
|
|
|
|||
|
|
避免部署时大量异常。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十七章 Codex实现要求:Readiness
|
|||
|
|
|
|||
|
|
Migration未完成或数据库不可连接:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
ready = false
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十八章 Codex实现要求:Scheduler
|
|||
|
|
|
|||
|
|
所有定时任务:
|
|||
|
|
|
|||
|
|
- 有名称
|
|||
|
|
- 有日志
|
|||
|
|
- 幂等
|
|||
|
|
- 可手工补跑
|
|||
|
|
- 失败可告警
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百六十九章 Codex实现要求:对象存储抽象
|
|||
|
|
|
|||
|
|
不要硬编码供应商SDK到业务层。
|
|||
|
|
|
|||
|
|
接口:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
ObjectStorageService
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
以后可以切换国内云厂商。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十章 Codex实现要求:Provider抽象
|
|||
|
|
|
|||
|
|
同样:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
IdentityProvider
|
|||
|
|
WechatProvider
|
|||
|
|
SmsProvider
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十一章 Codex实现要求:配置检查
|
|||
|
|
|
|||
|
|
应用启动时检查必要配置。
|
|||
|
|
|
|||
|
|
缺:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
DATABASE_URL
|
|||
|
|
JWT_SECRET
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
应:
|
|||
|
|
|
|||
|
|
> Fail Fast。
|
|||
|
|
|
|||
|
|
不是启动后用户调用才发现。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十二章 Codex实现要求:生产模式
|
|||
|
|
|
|||
|
|
Production启动时:
|
|||
|
|
|
|||
|
|
- 禁Debug
|
|||
|
|
- 禁Swagger公开访问(或鉴权)
|
|||
|
|
- 禁测试接口
|
|||
|
|
- 禁Mock实名
|
|||
|
|
- 禁默认密码
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十三章 Swagger/OpenAPI
|
|||
|
|
|
|||
|
|
生产是否开放:
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
|
|||
|
|
> 后台鉴权或仅内网。
|
|||
|
|
|
|||
|
|
不能公开暴露完整管理API文档。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十四章 测试接口
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/test/create-user
|
|||
|
|
/test/mock-match
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
生产:
|
|||
|
|
|
|||
|
|
> 完全不存在或强制禁用。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十五章 运维最终验收清单
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
□ Docker镜像可重复构建
|
|||
|
|
□ Compose可启动
|
|||
|
|
□ Production Secret不进Git
|
|||
|
|
□ HTTPS正常
|
|||
|
|
□ WSS正常
|
|||
|
|
□ PostgreSQL非公网
|
|||
|
|
□ Redis非公网
|
|||
|
|
□ Object Storage Private
|
|||
|
|
□ Health Check正常
|
|||
|
|
□ RequestId正常
|
|||
|
|
□ 日志脱敏
|
|||
|
|
□ 监控正常
|
|||
|
|
□ 告警正常
|
|||
|
|
□ 数据库备份正常
|
|||
|
|
□ 恢复演练完成
|
|||
|
|
□ Migration流程完成
|
|||
|
|
□ Rollback可执行
|
|||
|
|
□ Feature Flag可用
|
|||
|
|
□ 运维文档齐全
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十六章 备份最终验收清单
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
□ 每日数据库备份
|
|||
|
|
□ 备份存储位置独立
|
|||
|
|
□ 备份访问受限
|
|||
|
|
□ 备份加密
|
|||
|
|
□ 备份失败告警
|
|||
|
|
□ 对象存储保护
|
|||
|
|
□ 配置在Git
|
|||
|
|
□ Secret有安全备份
|
|||
|
|
□ 实际Restore验证
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十七章 发布最终验收清单
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
□ CI通过
|
|||
|
|
□ Test通过
|
|||
|
|
□ Staging通过
|
|||
|
|
□ Migration验证
|
|||
|
|
□ 生产备份
|
|||
|
|
□ 发布版本明确
|
|||
|
|
□ Release Notes
|
|||
|
|
□ Smoke Test
|
|||
|
|
□ 监控无异常
|
|||
|
|
□ 回滚版本准备
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十八章 故障恢复最终验收
|
|||
|
|
|
|||
|
|
至少能够处理:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
应用服务器损坏
|
|||
|
|
Redis损坏
|
|||
|
|
数据库恢复
|
|||
|
|
对象存储异常
|
|||
|
|
证书异常
|
|||
|
|
微信登录异常
|
|||
|
|
实名服务异常
|
|||
|
|
错误版本上线
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百七十九章 V1部署与运维核心原则
|
|||
|
|
|
|||
|
|
必须坚持:
|
|||
|
|
|
|||
|
|
> **生产环境必须可以重新搭出来,而不是只有某个人知道怎么维护。**
|
|||
|
|
|
|||
|
|
> **数据库是核心事实源,Redis只是加速。**
|
|||
|
|
|
|||
|
|
> **用户文件必须进入私有对象存储,不放应用服务器本地。**
|
|||
|
|
|
|||
|
|
> **生产部署必须使用固定版本镜像。**
|
|||
|
|
|
|||
|
|
> **生产数据库禁止手工随意改表。**
|
|||
|
|
|
|||
|
|
> **所有结构变化必须Migration。**
|
|||
|
|
|
|||
|
|
> **备份必须真正做过恢复验证。**
|
|||
|
|
|
|||
|
|
> **应用升级必须能回滚。**
|
|||
|
|
|
|||
|
|
> **重要功能必须能够通过Feature Flag快速关闭。**
|
|||
|
|
|
|||
|
|
> **出现严重错误时优先保护数据,而不是强撑服务可用。**
|
|||
|
|
|
|||
|
|
> **运维系统应该简单到一个普通技术人员按照文档也能恢复,而不是高度依赖某一个开发者。**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百八十章 最终部署架构
|
|||
|
|
|
|||
|
|
V1推荐最终结构:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Internet / WeChat
|
|||
|
|
│
|
|||
|
|
HTTPS/WSS
|
|||
|
|
│
|
|||
|
|
┌───────┐
|
|||
|
|
│ Nginx │
|
|||
|
|
└───┬───┘
|
|||
|
|
│
|
|||
|
|
Backend Container
|
|||
|
|
Modular Monolith
|
|||
|
|
│
|
|||
|
|
┌──────────────────┼──────────────────┐
|
|||
|
|
│ │ │
|
|||
|
|
↓ ↓ ↓
|
|||
|
|
PostgreSQL Redis Object Storage
|
|||
|
|
Core Truth Cache Private Files
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
Automated Backup
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
Independent Storage
|
|||
|
|
|
|||
|
|
|
|||
|
|
Monitoring
|
|||
|
|
│
|
|||
|
|
├── Infrastructure
|
|||
|
|
├── Application
|
|||
|
|
├── Business
|
|||
|
|
└── Security
|
|||
|
|
|
|||
|
|
|
|||
|
|
CI/CD
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
Build Image
|
|||
|
|
↓
|
|||
|
|
Staging
|
|||
|
|
↓
|
|||
|
|
Production
|
|||
|
|
↓
|
|||
|
|
Monitor
|
|||
|
|
↓
|
|||
|
|
Rollback if needed
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 第二百八十一章 最终结论
|
|||
|
|
|
|||
|
|
丹阳公益婚恋服务平台V1.0不需要一套“看起来很高级”的大型技术基础设施。
|
|||
|
|
|
|||
|
|
真正需要的是:
|
|||
|
|
|
|||
|
|
> **任何一个服务器坏了,系统能重新部署。**
|
|||
|
|
|
|||
|
|
> **任何一个版本出问题,能够回退。**
|
|||
|
|
|
|||
|
|
> **数据库损坏,有备份可以恢复。**
|
|||
|
|
|
|||
|
|
> **Redis丢失,不会丢核心业务。**
|
|||
|
|
|
|||
|
|
> **对象存储出现问题,不会让数据库关系失真。**
|
|||
|
|
|
|||
|
|
> **上线后出现异常,监控能够及时发现。**
|
|||
|
|
|
|||
|
|
> **开发人员离开后,其他人仍然可以按文档维护。**
|
|||
|
|
|
|||
|
|
因此V1部署策略可以概括为:
|
|||
|
|
|
|||
|
|
> **架构尽量简单,数据保护必须认真;部署可以轻量,备份不能轻量;升级可以快速,回滚必须可靠。**
|