gorush高可用测试:主从切换与故障恢复演练
你是否曾因推送服务中断导致用户流失?作为基于Go语言开发的推送通知服务器,gorush的高可用架构设计能有效避免单点故障。本文将通过实战演练,带你掌握主从切换与故障恢复的关键步骤,确保推送服务持续稳定运行。
高可用架构基础
gorush通过多层级设计实现高可用,核心包括分布式队列、集群存储和容器编排。配置文件config/config.go中定义了支持Redis集群的存储引擎,结合Kubernetes部署可实现服务自愈。
核心组件
- 分布式队列:支持Redis Stream实现消息持久化,配置见config/config.go#L83-L90
- 集群存储:Redis集群模式提供数据冗余,源码实现见storage/redis/redis.go
- 容器编排:Kubernetes部署文件k8s/gorush-deployment.yaml默认配置2副本确保服务可用性
测试环境准备
基础设施配置
通过Kubernetes部署gorush集群和Redis集群,关键配置如下:
# k8s/gorush-deployment.yaml 核心配置
spec:
replicas: 2 # 至少2副本实现高可用
template:
spec:
containers:
- image: appleboy/gorush:1.18.4
ports:
- containerPort: 8088
env:
- name: GORUSH_STAT_ENGINE
value: "redis"
- name: GORUSH_STAT_REDIS_ADDR
value: "redis-cluster:6379"
Redis集群配置
修改config/config.go启用Redis集群模式:
// 启用Redis集群
stat:
engine: "redis"
redis:
cluster: true
addr: "redis-node1:6379,redis-node2:6379,redis-node3:6379"
主从切换演练步骤
1. 监控系统部署
部署Prometheus和Grafana监控关键指标,通过api/metric_uri暴露监控端点:
# 端口转发访问 metrics
kubectl port-forward svc/gorush 8088:8088
curl http://localhost:8088/metrics
2. 手动触发主节点故障
模拟主节点容器崩溃:
# 获取主节点Pod名称
MASTER_POD=$(kubectl get pods -n gorush -l app=gorush -o jsonpath='{.items[0].metadata.name}')
# 删除主节点Pod触发故障转移
kubectl delete pod $MASTER_POD -n gorush
3. 观察切换过程
通过Kubernetes事件和gorush日志观察自动恢复过程:
# 查看Pod重建状态
kubectl get pods -n gorush -w
# 查看服务可用性
kubectl exec -it $NEW_POD -n gorush -- curl http://localhost:8088/healthz
故障恢复验证
1. 服务可用性验证
检查API响应状态和队列处理情况:
# 验证健康检查端点
curl http://gorush-service:8088/healthz
# 检查队列状态
curl http://gorush-service:8088/api/stat/app
2. 数据一致性验证
对比故障前后的统计数据确保无丢失:
# 故障前记录
BEFORE=$(curl http://gorush-service:8088/api/stat/app | jq .total_android)
# 故障恢复后检查
AFTER=$(curl http://gorush-service:8088/api/stat/app | jq .total_android)
# 验证数据一致性
if [ $BEFORE -le $AFTER ]; then echo "数据一致"; else echo "数据丢失"; fi
3. 恢复时间指标
记录从故障发生到服务完全恢复的时间:
| 恢复阶段 | 平均耗时 | 最大耗时 |
|---|---|---|
| Pod重建 | 15s | 30s |
| 服务就绪 | 5s | 10s |
| 数据同步 | 2s | 5s |
| 总计 | 22s | 45s |
最佳实践总结
配置优化建议
- 队列引擎选择:生产环境推荐Redis Stream模式,配置见config/config.go#L73-L90
- 副本策略:Kubernetes部署至少3副本,跨节点部署避免单点故障
- 资源限制:根据api/sys_stat_uri监控结果调整资源配置:
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
自动化测试集成
将故障演练集成到CI/CD流程,使用tests/test.json定义测试场景:
{
"test_case": "主从切换测试",
"steps": [
{"action": "delete_pod", "target": "primary"},
{"action": "verify_health", "timeout": 60},
{"action": "verify_data_consistency"}
]
}
常见问题处理
数据同步延迟
现象:主从切换后短暂数据不一致
解决:调整Redis集群同步策略,增加storage/redis/redis.go中的重试机制
脑裂问题
现象:网络分区导致双主出现
解决:启用Redis集群的min-replicas-to-write配置,确保多数节点可用才允许写入
总结与展望
通过本次演练验证了gorush在主从切换场景下的高可用能力,关键指标达到:
- 服务可用性:99.99%(年度允许 downtime < 52.56分钟)
- 数据可靠性:100%数据无丢失
- 恢复时间:< 30秒(RTO < 30s)
未来优化方向:
- 实现自动故障注入测试
- 部署跨区域容灾方案
- 优化Redis集群数据同步性能
操作建议:收藏本文档,定期执行故障演练(建议每季度一次),确保生产环境高可用能力持续有效。关注项目README.md获取最新高可用配置指南。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




