广告:Codex Token 低价中转站稳定接口 · 快速接入 · 开发者备用通道
Engineering article

开源方案 | SRE可靠性工程实践

我见过太多用开源方案做SRE可靠性工程的团队,结果全栽在细节上。最典型的坑就是直接拿某个工具照搬,没做本地化适配,导致生产环境炸了。实际落地时,要结合日志、监控、告警、自动化流水线等模块,不能只依赖一个工具。比如用Prometheus监控,但没在报警规则里设置合理的阈值,结果误报泛滥,反而让运维团队疲于奔命。还有人把Kubernetes探

开源方案 | SRE可靠性工程实践
配图来源于网络和AI生成,仅供参考。
▌ 技术引导 我见过太多用开源方案做SRE可靠性工程的团队,结果全栽在细节上。最典型的坑就是直接拿某个工具照搬,没做本地化适配,导致生产环境炸了。实际落地时,要结合日志、监控、告警、自动化流水线等模块,不能只依赖一个工具。比如用Prometheus监控,但没在报警规则里设置合理的阈值,结果误报泛滥,反而让运维团队疲于奔命。还有人把Kubernetes探针配置得一塌糊涂,导致Pod反复重启,服务不可用。关键在于要理解每个工具的落地方式,再结合业务场景做调整,不能直接抄作业。我用过的方案中,最稳定的是把日志系统和监控系统分开部署,并且用脚本自动化日志归档和监控指标聚合。这种分层架构能有效隔离风险,也便于后期扩展。 如果你在用Prometheus+Alertmanager,那一定要配置多个报警渠道,比如钉钉、Slack、邮件,不能只依赖一个。我曾经有一次报警渠道没配置,导致一个严重的故障没人知道,直到用户电话打进来。报警渠道必须有冗余,不能只用一个。另外,Prometheus的存储策略要设置好,比如block存储和remote_write配合使用,否则数据会堆积、查询变慢。监控指标也要做分层,基础指标放Prometheus,高级分析放Grafana,这样效率更高。 日志系统不能只依赖ELK,得结合具体的业务需求。我见过某团队用Fluentd+Logstash+Kibana,结果日志没做切分,导致磁盘爆掉。必须在采集阶段配置日志切分,比如按时间或大小分割,并且用压缩方式保存。另外,日志本身不能做核心监控,只能作为补充。核心指标要靠Metrics系统,比如CPU、内存、网络、磁盘IO这些,不能全靠日志。日志的作用是事后分析、故障回溯,不能替代监控。 SRE可靠性工程要强调自动化,但自动化不是万能的。我见过有人用Ansible做运维自动化,结果配置文件没做版本控制,导致某次发布彻底失败。必须使用Git管理配置,保证每次变更都有记录。自动化脚本要写得健壮,比如在执行时加入健康检查,确保操作成功。还有人用CI/CD做部署自动化,但没配好回滚机制,导致故障无法恢复。回滚策略要明确,比如在部署失败后自动触发回滚,不能只靠人手动处理。 最后,SRE要重视文档和流程,不能只盯着工具。我见过某团队用很多开源工具,但没人知道怎么用,最后全成了摆设。必须为每个工具写操作手册,甚至写成脚本,让新成员能快速上手。另外,故障演练也要定期做,不能只依赖监控。我曾在某项目中用 chaos engineering 模拟网络分区和数据库宕机,发现很多自动化流程根本没考虑到这些极端情况。真正的可靠性工程,必须在真实场景中打磨。 ▌ 技术参考 一 开源方案做SRE可靠性工程,第一步是确定监控体系。Prometheus+Alertmanager 组合是主流,但配置要精细。默认的scrape配置可能不够,需要手动设置job和scrape_interval。比如在 prometheus.yml 中配置 scrape_interval: "10s" ,这样能更快发现异常。同时,要避免监控指标过多导致性能下降,建议使用 Metric Filter 和 PromQL 进行指标过滤。常用的指标包括 node_cpu_seconds_total 、node_memory_MemTotal_bytes 、node_filesystem_avail_bytes 等。也可以用 node_cpu_seconds_total{mode="idle"} 滤出空闲CPU,判断负载是否正常。 二 日志系统必须做切分和归档。Fluentd 作为日志采集工具,要配合 logrotate 进行日志切割。比如在 /etc/logrotate.d/app 中设置 daily 策略,同时设置 maxsize=100M,这样日志不会无限增长。但要注意,切分后的日志要写入ES,不能直接丢掉。比如用 rsyslog 把日志转发到 Fluentd,再由 Fluentd 发送到 Kafka,最后由 Logstash 写入 ES。这样能保证数据不丢失,也能实现高并发下的日志处理。 三 自动化部署不能只依赖CI/CD工具。比如用 GitLab CI 的 deploy 阶段,但要加 check 阶段。在 deploy 前,先执行 healthcheck 脚本,确保当前服务状态正常。如果失败,直接跳过部署。另外,回滚机制必须写入 pipeline,比如在部署失败后,用 rollback 阶段触发旧版本的回滚。回滚脚本要写得健壮,比如用 curl 执行回滚 API,并加上重试逻辑。 四 Kubernetes探针配置必须合理。livenessProbe 和 readinessProbe 要分开设置,不能用同一个端点。比如 livenessProbe 检查健康端点 /healthz,而 readinessProbe 检查 /ready。配置方式如下: livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 10 这样能确保容器状态判断准确,不会因为探针配置不当导致服务不可用。 五 Prometheus 的存储策略要设置 block 存储。block 存储能高效处理时间序列数据,比默认的 wal 更适合长期存储。配置方式是修改 prometheus.yml 中的 storage.tsdb.path 参数,并在启动时指定 --storage.tsdb.type block。另外,要使用 remote_write 把数据发到长期存储,比如 Prometheus Remote Write 到 MinIO 或 Loki。这样能避免磁盘空间不足的问题,也能实现数据的多副本存储。 六 报警渠道不能只用一个,要设置冗余。Alertmanager 支持多种通知方式,比如 webhook、email、slack、钉钉等。配置示例: - name: 'email' webhook_configs: - url: 'https://api.example.com/webhook/email' send_resolved: true - name: 'slack' webhook_configs: - url: 'https://hooks.slack.com/services/xxx' send_resolved: true 这样确保当一个渠道失败时,另一个还能通知到。另外,报警规则要精细化,比如设置 alert.threshold 为 90% 以上才触发,避免误报。 七 日志归档要结合备份方案。比如用 Logstash 把日志写入 S3,同时用 AWS Backup 做定时备份。配置示例: input { stdin { } } output { s3 { bucket => "my-bucket" region => "us-west-1" access_key_id => "your-key" secret_access_key => "your-secret" } } 这样日志既能保留,又能快速恢复。同时,要使用压缩格式减少存储成本,比如配置 compress: true。 八 监控指标要分层。基础指标放 Prometheus,高级分析放 Grafana。比如用 Prometheus 检测 CPU 使用率、内存使用、网络流量,而用 Grafana 汇总这些指标,做趋势分析和异常检测。Grafana 的 dashboard 要设置好 refresh interval,比如 10s,确保数据实时更新。同时,Grafana 的报警功能要绑定到 Alertmanager,这样能实现统一的报警流程。 九 自动化脚本要加入健康检查。比如用 shell 脚本执行 curl 检查服务状态,并返回 exit code。如果 exit code 不为0,脚本直接退出,避免影响后续流程。具体命令: curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/healthz | grep -q '^200$' || exit 1 这样确保脚本执行前服务是健康的,减少误操作。同时,脚本要加入重试逻辑,比如用 retry 命令最多尝试3次。 十 Kubernetes 部署要结合服务网格。比如用 Istio 做服务发现和流量管理,这样能实现更细粒度的监控和自动恢复。配置示例: apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-service spec: trafficPolicy: loadBalancer: consistentHash: httpUseSourceIp: true hosts: - "my-service.default.svc.cluster.local" 这样能避免流量分配不均,也能做熔断和降级。同时,Istio 可以监控每个请求的延迟和错误率,帮助判断服务性能。 十一 SRE 要重视故障演练。比如用 Chaos Monkey 模拟网络分区、数据库宕机、服务崩溃等场景。命令示例: chaos monkey run --target "my-service" --action "network-partition" --duration 60s 这样能发现运维流程中的漏洞,比如备份是否及时、自动化是否有效。演练后要记录结果,并据此优化 SRE 流程。 十二 日志系统必须做索引和搜索。比如用 Elasticsearch 的 index templates 和 mappings 来管理日志结构。配置示例: PUT /log-index-2026 { "settings": { "number_of_shards": 3 "number_of_replicas": 1 }, "mappings": { "properties": { "timestamp": { "type": "date" }, "level": { "type": "keyword" }, "message": { "type": "text" } } } } 这样能提升日志查询效率,也能防止索引错误导致数据丢失。同时,使用 Kibana 做日志分析和可视化,能更快发现异常模式。 十三 监控指标要结合业务逻辑。比如在微服务中加入自定义指标,用 Prometheus 的 client library 实现。代码示例: prometheus.MustRegister( prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "request_count", Help: "Number of requests handled", }, []string{"method", "status_code"}, ), ) 这样能监控每个接口的调用情况,帮助发现性能瓶颈或异常行为。同时,指标要设置合适的单位,比如 bytes_per_second 而不是 raw bytes,提升可读性。 十四 SRE 可以结合运维知识图谱。比如用 Graphite 或 Prometheus 的 metrics 存储结构,加上 alert 规则,形成一个完整的运维图谱。这样能快速定位故障根源,比如某个服务的 CPU 使用率突然上升,自动关联到相关依赖服务的指标变化。这种方法能显著提升故障排查效率。 十五 数据库监控不能只靠 MySQL 自带的工具,要用 Prometheus 的 mysql_exporter。配置示例: - job_name: 'mysql' static_configs: - targets: ['localhost:9104'] 同时,要监控慢查询和锁等待,这些指标对数据库可靠性影响极大。如果发现慢查询超过阈值,要立即触发报警,并记录日志。 十六 日志采集要避免性能瓶颈。比如用 Fluentd 做数据采集,配置 buffer 机制,避免日志堆积。比如在 fluentd.conf 中设置: @type file path /var/log/fluentd/buffer flush_interval 10s chunk_limit_size 1M 这样能保证日志采集的稳定性,避免 Kafka 或ES超载。同时,要合理设置 chunk_limit_size,避免单个日志过大导致处理变慢。 十七 自动化流程要配置环境变量。比如在 CI/CD 中设置 ENV=production,这样部署脚本能判断是否是生产环境。配置示例: export ENV=production if [ "$ENV" = "production" ]; then echo "Deploying to production" # 部署命令 fi 这样能防止误操作,比如在测试环境执行生产部署。同时,环境变量要写入 Git,确保每次部署都有记录。 十八 服务发现要结合健康检查。比如用 Consul 或 etcd 做服务注册,同时设置健康检查端点。配置示例: "check": { "name": "health check", "http": "http://localhost:8080/healthz", "interval": "10s", "timeout": "5s" } 这样能确保服务只有在健康时才会被发现,避免流量打到故障节点。同时,健康检查要设置重试策略,比如 max_consecutive_failures 设置为3。 十九 SRE 需要结合灰度发布。比如用 Istio 的 canary 发布策略,让部分流量进入新版本,同时监控其指标。配置示例: apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: canary-rule spec: trafficPolicy: loadBalancer: canary: weight: 10 这样能降低发布风险,同时确保监控指标能覆盖新旧版本。灰度发布要结合自动化监控,一旦发现异常,立即回滚。 二十 日志分析要加入机器学习模型。比如用 Elasticsearch 的 anomaly detection 功能,自动发现日志中的异常模式。配置示例: PUT /log-index-2026_anomalies { "settings": { "index.lifecycle.name": "anomaly_detection", "index.lifecycle.rollover_alias": "log-index" } } 这样能提升日志分析的智能化水平,减少人工干预。同时,机器学习模型要定期更新,否则会误判正常行为。