Software_Architect.png
多年的运维感悟,什么阶段干什么事。这也是我在内部的运维规范里明确标明,“不提前优化”

我来谈谈几个阶段,

初创阶段

部分参考 原文链接:https://mp.weixin.qq.com/s/vVhLZDL6bRJL9u5GJg63tw

  • 初创阶段,更多关注业务最小模型能否跑通

    • 快速实现
    • 熟悉什么技术栈,就用什么
    • allinone
    • 引入ORM、DAO屏蔽sql复杂性
    • 早期不自研
    • 规模扩大的时候,要浅浅的封装一层,防止日后技术栈更新,控制数量。我称之为“有中台作用,但无中台负重”
    • 只有在开源社区无法满足时,再造轮子
  • 需要容量评估的场景

    • 新系统上线
    • 临时活动、大促、秒杀类
    • 系统容量有质变性增长
  • 创业初期最贵的是时间成本,这个阶段用钱堆资源的方式可以快速解决问题,不贸然重构
  • 有些明显的规则要遵守,比如

    • 不能硬编码IP,使用域名
    • 域名见名知意,区分内外,比如baidu.com / baidu-inc.com
    • 区分生产环境
    • 避免账号公用

步入正轨阶段

  • 这时候就要拆分了,上面提到的allinone可能已经有了性能、容量等压力。此时就要垂直拆分了

    • 核心是基于业务的拆分

      • 代码
      • 数据库、中间件
      • 团队垂直拆分
  • 这时候我们要引入反向代理,最常见的如nginx,我的建议是用更加贴近业务的api网关,比如kong、apisix、openrestry等等,有更多原生功能。如果nginx比作汽车引擎,后者可以比作宝马、奔驰汽车,多了很多配置外,还能开车即用,开箱即用

    • 对应反向代理层也需要高可用,好消息是都是必备能力
  • 服务也要拆分,其中关键的是,尽可能无状态,“状态”尽可能让中间件,redis、mysql、共享存储等手段解决,确保服务动态、快速伸缩
  • 这时候,我们引入了新的问题,这部分中间件的性能谁来保证,我的答案是,

    • 要有专业的研发、架构师、DBA
    • 要使用云上服务,复用云的稳定性,和庞大的技术支持体系(比如备份、同步、安全、审计、扩缩容、无锁变更等等),降低维护难度,回归商业本质
  • 这个时候,随着用户的增加,为了提高访问速度、降低成本。外部就要引入CDN了,针对特定行业,还要引入安全CDN的概念,要有安全属性,把攻击影响降到最低
  • 前后端分离、数据库引入读写分离中间件、微服务架构都可以在这个阶段引入
  • 异步引入,比如计算历史订单,复杂计算,MQ可以对“不关心任务执行结果”,调用链超长,外部三方API。实现削峰填谷,保护下游等等
  • 有些明显的话题

    • 引入kubernetes
    • 数据库用户拆分,按服务名
    • DBA持续优化慢查询过程,添加索引,性能优化
    • 以应用为核心的CMDB建设
    • CICD流程完善,代码扫描,制品管理,研发效率统计

稳定阶段

  • 服务治理话题
  • 混沌工程
  • 可观测性
  • 熔断、限流
  • 跨地域双活
  • 拆账、降本
  • 此阶段话题

    • 资源标签、统计ROI,从提供服务,到“物尽其用”
    • 完善告警

      • 基础设施:比如低利用率告警、跌零告警
      • 业务:比如异常交易、频繁提现、低价购物等
    • 点状架构优化

      • 反爬、风控引入
      • 三方接口冗余,比如支付通道,代码逻辑判断失效后自动切换
    • 引入审计,定位到人
    • 安全认证,等保、ISO27000等符合业界标准。引入内外部安全人员周期性渗透测试、修复,满足自身及客户的安全需求
    • 灾难备份实施,对核心库数据,跨云、跨地域、跨账号实时备份。冷备,恢复时间小时级

      • 防止高权限人员恶意或者误操作
      • 防止云上可用区级故障时,比如我们遇到的阿里云新加坡可用区C的大火,持续一周业务中断
      • 被黑客拖库,勒索
    • 同城灾备挑战,从整个业务链条重构。故障切换思路更符合实际,平时数据同步,由人做切换决策调整DNS或者负载均衡,事后数据补齐。有一定浪费,技术实现相对复杂性低

      • 我们有案例是加密机,属于无状态,通过DNS+健康检查自动切换。阿里云的产品叫“全局流量管理”
    • 同城双活难题,数据一致性,by业务承载流量,同样由人决策切换。复杂度极高

心得感悟补充

  • 故障秉持先恢复,再排查

    • 通知业务方
    • 查看变更,

      • 我们有变更看板,包括

        • 服务发布历史,当前状态
        • 云操作变更-调整安全组、解绑ip、释放资源等
    • 配置留痕,比如cp nginx.conf nginx.conf.bak
    • 保留证据,截图,日志留存
    • 不担心担责,重心是找到根因,避免同类故障再次发生
  • 抽象一层可以解决问题,但更重要的是“如无必要,勿增实体”,血的教训,回头看服务网格技术时,承载了极其有限的需求,但kubernetes集群升级、调整,都需要考虑istio,比如升级前需要先升级istio,性能损失等。
  • 升级策略

    • 有维护者时

      • 需要遵循EOL时间
      • 有重大安全隐患
      • 仅新版本提供新功能
    • 无维护者时

      • 不做调整
      • 接入waf,依赖waf能力屏蔽问题
      • 人为沟通,产品层面EOL,让产品自然下线
  • 权责对等

    • 敏捷团队更加开放,尊重技术选择,更宽松的权限申请,提供必备运维支持(站点监控),敏捷团队要有担责能力
    • 统一团队、技术栈,需符合既定规范,仅能申请阶段性有限权限,会自动回收。运维负责第一道响应、扩容、处理
    • 非生产环境相对宽松,比如可以在dev环境自行验证服务
    • 敏捷统一必选题,不能既要求安全、又要求便利
  • 最大公约数,不使用某家云独占产品
  • 技术服务于业务!

标签: 感悟, devops

已有 2 条评论

  1. 季总YYDS!
    PASSION!

    1. 这个点还在加班,666

添加新评论