《SRE Google运维解密》读书笔记

SRE团队职责:

确保服务可以正常运转,主要方向包括:

  • 可用性改进
  • 延迟优化
  • 性能优化
  • 效率优化
  • 变更管理 (渐进式发布)
  • 监控
  • 紧急事务处理
  • 容量规则与管理 (N+2 模式,google--> 15倍)

SRE核心处理思想:

  • 灾难预演与演习
    • 确保系统按照预想方式应对故障
    • 寻找系统中未预料的弱点
    • 寻找其他提高鲁棒性的方式避免事故发生
      • 从组织架构层面关注
      • 关注细节
      • 冗余容量
      • 模拟线上灾难演习
      • 培训考核
      • 纵深防御
  • 书写时候总结
    • 究竟发生了什么?
    • 相应的有效速度
    • 下次可以采用其他方案解决问题
    • 如果避免
  • 自动化与降低日常运维负载
  • 结构化、理智决策
    • 决策是事先决定的
    • 决策的信息源是清楚的
    • 任何假设都要明确说明
    • 数据驱动优于情感驱动

服务可靠性层级模型:

错误预算:

1- 可靠性目标

在一个明确的、客观的指标来决定服务在一个单独的季度中能接受多少不可靠性。用来控制调节发布速度

琐事:手动性、重复性、可以被自动化的、战术性没有持久价值的工作


SLI:服务质量指标(请求延迟、错误率、系统吞吐量、可用性、持久性)

  • 不要以目前的状态为基础选择目标
  • 保持简单,避免绝对值
  • SLO越少越好

SLO:服务质量目标(服务某个SLI的目标值或目标范围)

  • 留出一定安全区
  • 实际SLO也不要过高

SLA:服务质量协议(描述没有达到SLO之后的后果)

 

服务可用性度量:

基于时间的可用性:=系统正常运行时间 / (系统正常运行时间 + 停机时间)

合计可用性:= 成功请求数 / 总的请求数

可靠性管理:

MTTF ---- 平均失败时间

MTTR ---- 平均恢复时间

 

监控系统的4个黄金指标:

  1. 延迟
  2. 流量
  3. 错误
  4. 饱和度

监控系统的三类输出:紧急警报、工单、日志

 

传统测试:

  • 单元测试:检验某一个独立的软件单元
  • 集成测试:检验组件的功能
  • 系统测试
  • 冒烟测试
  • 性能测试
  • 回归测试
  • 生产测试
  • 配置测试
  • 压力测试

金丝雀测试:在典型工作负载的服务子集中进行测试。最终用户的验收测试

 

识别异常任务的方法:跛脚鸭状态

后端任务正在监听端口,并且可以服务请求,但是已经明确要求客户端停止发送请求

  1. 任务编排系统发送一个SIGTERM信号给该任务
  2. 后端任务进入跛脚鸭状态,同时请求它的所有客户端发送请求给其他后端任务
  3. 任何在后端进入跛脚鸭状态时正在进行的请求仍会继续进行
  4. 随着请求恢复被发送回客户端,该后端任务的活跃请求逐渐降低为0
  5. 在配置的时间过后,后端程序要么自己干净退出,要么任务编排系统主动干掉它

流量相关:

QPS:每秒处理的请求数单位 (用来规划服务容量)

过载处理思路:

  • 客户端:某个用户超过资源配额时,后端任务应该迅速拒绝该请求。客户端主动限制请求速度
  • 自适应节流:

          请求数量、请求接数量

          新的请求以 max(0,requests-K*accepts / (requests + 1))

          增加K会使算法不再激进,减少会使算法激进

后端的请求都会标记为以下四种:

  1. 最重要
  2. 重要
  3. 可丢弃的 SHEDDABLE_PLUS
  4. 可丢弃的 SHEDDABLE
  • 客户端配额不够时,后端按优先级分级拒绝请求
  • 某个任务进入过载时,低优先级请求会先被拒绝
  • 自适应节流系统会根据每个优先级分别计数

情况1:如果大部分后端任务处于过载状态,请求应该不再重试,而是一直向上传递给请求者

情况2:小部分任务过载应该立即重试该请求,重试注意点:

  • 增加每次请求重试次数的限制
  • 每个客户端的重试次数限制
  • 客户端在请求元数据中加入一个重试次数

情况3:对于超大数量的连接可能造成后端的过载,建议采取以下策略:

  1. 将负载传递给数据中心负载均衡算法
  2. 强制要求批处理任务使用某些特定的批处理代理后端任务(代理转发请求,并回复转发给客户端)

 

防止服务器过载:

  • 压力测试,过载情况的失败模式
  • 提供降级结果
  • 在过载情况下主动拒绝请求
  • 上层系统应该主动拒绝请求
  • 容量规划(只能减少可能性)

 

限流的解决方案:

子集化:限制某个客户端任务需要连接的后端任务数量

子集选择算法:

  • 随机选择
  • 确定性算法
def Subset(backends,client_id,subset_size):
    subset_count = len(backends) / subset_size
    
    # 将客户端划分为多轮,每一轮计算使用同样的随机配列的列表
    round = client_id / subset_count
    random.seed(round)
    random.shuffle(backends)
    
    # subset_id 代表了目前的客户端
    subset_id = client_id % sebset_count
    
    start = subset_id * subset_size
    return backends[start:start + subset_size]

每轮计算使用不同的重排列表时

不同轮中的客户端会使用不同的列表,同一轮中的客户端也会使用不同的列表子集。从而达到了负载均匀分布

 

加权轮询策略:

每个客户端为子集中的每个后端任务保持一个“能力”值,仍然以轮询方式分发,但是客户端会按照能力值权重比例调节。收到每个回复之后,后端会在回复中提供当前观察到的请求速率、每秒错误值,以及目前资源利用率。客户端根据目前成功请求的数量,以及对应的资源利用率进行周期性调节。


连锁故障

  1. 服务器过载(服务器故障,导致其他服务过载)
  2. 资源耗尽

CPU:

  • 请求的数量上升
  • 队列过长
  • 线程卡住
  • CPU死锁或卡住
  • RPC超时
  • CPU缓存效率下降

 

内存:

  • 任务崩溃
  • Java垃圾回收速率加快,导致CPU使用率上升
  • 缓存命中率下降

 

线程

文件描述符

资源之间的相互依赖

服务不可用

连锁故障触发条件:

  • 进程崩溃
  • 进程更新
  • 新的发布
  • 自然增长
  • 计划中或计划外的不可用

解决连锁故障:

  • 增加资源
  • 停止健康检查导致的任务死亡
  • 重启
  • 丢弃流量
  • 进入降级模式
  • 消除批处理负载
  • 消除有害流量

 

队列长度比线程池大小更小会更好,当服务处理速度无法跟上请求到达速率时,尽早拒绝会更好

 

流量抛弃:根据CPU使用量、内存使用量以及队列长度进行节流

慢启动与冷缓存

保持调用栈永远向下

如果在层内交互会导致:

  1. 分布式死锁
  2. 交互延迟上升
  3. 系统会更加复杂

分布式共识:

分布式协调失败可能原因:

  • 网络慢
  • 某些消息可以通过,某些消息被丢弃
  • 单方面节流措施

脑裂问题:如果主无法确定副实例健康度,会将自己标记为不可用,升级人工处理

分布式协调和锁服务:

  1. 屏障

可靠分布式队列和消息传递:

  1. 队列
  2. 原子性广播

 

法定租约:分布式共识性能优化手段,降低延迟和提高读操作吞吐量

给系统中的法定人数进程发放一个租约,这个租约是带有具体事件范围的。这个法定租约有限期内,任何对该部分数据的操作都要被法定租约中的所有进程相应。如果租约中的任何一个副本不可用,那么该部分数据在租约过期前将无法被修改

 

分布式共识的主要物理限制:网络往返时间RTT、数据写入持久化存储时间

故障域:系统中可能由于一个故障而同时不可用的一组组件


周期性任务

cron:仅仅是单台物理机器

幂等性---> 在最差情况下跳过好于执行两次

 

crond:系统守护进程,负责加载cron任务的定义列表,任务会在对应时间启动

 

anacron:在恢复运行时,会试图运行那些在宕机时间本来应该运行的程序。通过将所有已注册的cron任务上次运行的时间记录在一个文件中来实现

 

大型分布式cron系统注意点:

  1. 跟踪cron任务的状态
  2. cron任务部署多个副本的同时,会采用Paxos分布式共识算法保证状态一致
  3. Leader & Flower

(Leader进程是唯一一个主动启动的Cron任务进程,内部有一个内置调度器。该调度器按照预定启动时间排序维护一个Cron列表)

Cron要通过Paxos协议通知其他副本

追随者需要保持跟踪Leader状态,修阿婆更新副本内部该系统的下次预计启动时间


WorkFolow模型:MVC模式

流水线可能产生的问题:

  1. 惊群
  2. 摩尔负载模式:某些执行过程重叠,导致共同消耗某些资源

正确性保障:配置文件、租约、唯一文件名

  1. 配置文件本身作为屏障,保障工作进程的输出永远与配置一致
  2. 所有工作结果都必须由当前拥有租约的进程提交
  3. 工作进程的输出文件都是全局唯一命名的
  4. 客户端和服务端会在每次操作的时候校验主任务令牌token

没有人真的想备份数据,他们只想要恢复数据


数据备份

  • 软删除(懒删除:某段时间以后真删除)
  • 备份和相关的恢复方法

考虑点:

  • 备份和还原的方法
  • 全量或增量建立恢复点频率
  • 备份的存储位置
  • 备份的保留时间

 

  • 一级备份:频率高,可以快速恢复的备份
  • 二级备份:用来为服务所使用的数据提供额外保护的
  • 三级备份:冷存储,异地备份
  • 复制机制(备份的备份)
  • 早期预警

LCE:发布协调工程师。负责测试发布可能出现的问题,以及不同开发小组之间协调工作。例如:生产评审

良好的发布流程:

轻量级、鲁棒性、完整性、可扩展性、适应性

达到的目的:

简化、高度定制、快速完成

 

灰度发布:逐渐发布产品和服务可以降低风险

功能开关:可以将新功能逐渐发布给0%~100%的用户

服务端控制客户端

过载行为和压力测试:负载均衡、物理机故障、同步客户端行为、外界攻击

on-call工程师的特点:

  1. 事后总结
  2. 故障处理分角色演习
  3. 破坏真的东西,并修复
  4. 维护文档
  5. 尽早实战

生产会议议程:

  1. 即将到来的生产环境变化
  2. 性能指标
  3. 故障
  4. 紧急警报
  5. 非紧急警报事件
  6. 之前的代办事项

PRR 生产就绪程度评审

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值