作业帮业务大体可分为几种类型,有工具场景、电商场景、在线直播场景和智能硬件场景等。这些业务背后,服务数量已达数千级别,NS 数量达上百级别,域名数量达数千级别,节点数量已经上万级别。此外,技术栈也遍地开花,语言多达近十种类,主流开发语言是 Go 和 PHP。在如此规模化的业务背后,有两大技术底座支撑:一个是以容器技术和服务治理为代表的云原生架构,另一个是以专线组网构建公有云多云多活的运维架构。
怎样高效运维这样量级的业务?我们可以先看下作业帮基础技术的团队分工。
自底向上,团队按 IaaS、PaaS、SaaS 类型进行划分。最底层的 IaaS 主要负责向上提供计算、网络、存储等资源。中间的 PaaS 切为三块:有以数据存储、消息队列等为主的中间件服务,有以容器技术和服务治理为主的云原生架构服务,还有以真合规为目标的安全服务。再往上就是业务应用,有流量、营销、直播、中台支撑等。
这些不同分工背后,自然就衍生了不同的配套运维岗位,比如最底层的 IaaS 衍生了 CloudOps、NetOps 和 FinOps,中间件服务衍生了 MiddleOps,云原生架构衍生了 InfOps,安全服务衍生了 SecOps,业务应用衍生了 SRE。
谷歌把服务生命周期划分为五个阶段。它认为,从 Idea 确定那一刻,服务就诞生了,然后进行架构设计,接着进行开发,再灰度/全量放量,最后到该服务弃用,终结生命。转化到运维视角来看,在架构设计阶段就开始进行标准化建设,在开发阶段就开始进行服务准入,在放量阶段就开始进行持续交付和持续运营,最后就是服务下线。那么,再服务生命周期的这几个阶段中,我们是怎么介入运维的?
关键思路表现为:
关键实践表现为:
虚机时代,为了提升资源利用率,大量服务混部在一起,这给运维带来灾难性的麻烦,比如混部态下,ODP 服务间上线互相干扰,没法按服务维度精准封线和权限管控,也没法进行精准容量评估等。域名拆分则就是从 www 公共域名拆分出来,让每个业务拥有独立域名,方便南北向流量调度和容器化迁移。
部署归一,主要定义部署环境规范,把发布环节分为 Tips(预发)、Small(灰度)、Online(全流量)三个烟冲式生产环境,并要求它们代码同构、配置同构、路由同构和环境同构。若用 CD 平台部署,代码同构很容易搞定,配置同构则稍有复杂,我们借助服务发现特点,把配置异构细节隐藏到服务发现背后实现,让它对业务透明。
网络归一,主要把专线接入点归一到 IDC POP 点,物理专线归一到传输专线,网络探测协议归一化到 BFD 协议,QoS 控制归一化到 CPE 等。
机型归一,主要收敛到主流通用机型,并借助容器部署磨平机型差异,同时不让 SaaS 业务触摸到机器,避免研发黑屏登机后不讲武德造成运维失控。
服务发现归一,主要把东西向服务发现归一化到 SVC,南北向服务发现归一化到 DNS。早期服务发现使用 BNS,后来演化到 ZNS 支持多云能力,它俩都属于大中心式架构,再后来演化到当前 SVC 模式,一改往日风格,从中心式架构模式转变到集群内自治的服务发现模式,避免云间互为影响。
框架归一,主要收敛 PHP 框架到 ODP,Go 框架归一化到 ZGIN 框架。
组件归一,就是自建关键组件服务,并让它们类型归一,比如去 MemCache、去 NMQ 等。大数据组件采买云 PaaS 服务。通信归一,主要使用统一的标准通信协议,比如 HTTP,TCP 等,去业务自定义的协议。
服务准入阶段,主要思路是让业务做选择题,不要让他们做填空题,同时给业务灌输标准化理念:“只有按我们的套路来,才能享用开箱即用的配套运维服务。”
持续交付概念略做泛化,它覆盖到所有变更交付场景,包括业务变更和运维变更。主要思路:
关键实践主要体现在业务更变和运维变更上。
稳定性建设大体可分为业务质量、架构归一和运维管控三部曲,每个维度背后都有各自对应的若干服务。
通常,业务若想更快迭代起来,需要对架构进行很好的服务治理。同时,业务若想更稳迭代起来,则需要运维进行优雅的管控,运维也要通过技术手段多盯架构,防止架构裂变造成稳定性问题。架构也需要多加考虑,怎样设计以及演进才不会导致运维失控。除此之外,不管是业务、运维,还是架构,若想要稳定性能力得到极致提升的话,背后都需要进行标准化建设。
当然,这些还不够。从底层逻辑出发,让业务聚焦价值,我们还要变革全新合作方式。从运维角度看,把带有业务逻辑的事情下移到业务,比如配置发布、任务发布、接入层掺杂的业务逻辑下移等。从业务角度看,把非业务逻辑的事情左移到架构,比如服务发现、统一鉴权、流量调度等。从架构角度看,把 ToC 控制面上移到运维,比如容量管理、流量调度等,总不能让业务直接穿透运维管控直撸我们的容器吧。最后,这三者之外,还有一个威力巨大的组织建设,才能够确保刚才讲的事情良性运转起来。
这就是作业帮三位一体的稳定性体系,如下图所示:
磨合出以上体系之后,我们自然就产生这样的运营思路:
多活架构建设,属于业界老话题,任意一个中大厂都会或深或浅地卷入其中。从业界来看,多活已有成熟方法论,但缺乏成熟的标准指导。很多人善于把多活架构从 0 到 1 建好,但往往运营不善,最终功亏一篑。这里主要从运营面,讲讲我们不一样的打法。
前面提到,标准化建设、服务准入、持续交付和多活架构,主要从故障预防层面,狠下功夫,多管齐下,力求延长 MTBF 时间来达到高稳定性诉求。若预防环节拦不住,接下来就要想尽办法缩短 MTTR 时间。
有多活架构之后,怎样放大它的价值,预案就是最好的切入点。我见证过不少中大厂对预案的定义模糊不清,掺杂太多业务属性,最终运维都不敢操作,所以有必要对预案进行全新定义和重构。
运维聚焦在南北向全局的流量调度,架构聚焦在东西向长尾流量调度,业务聚焦在特征流量调度,比如按 lesson 进行分流。调度对象是域名,从公网入口开始调度,流量一旦进入本云之后,单云闭环,除底层数据存储之外,不允许有跨云流量请求。调度方式有两,一种是 DOH 按权重进行精准调度,另一种是 DNS 按解析线路进行非精准分流调度。
监控告警偏向上层运维,问题定位偏向服务可观测,怎么合二为一为我所用?
产品形态如下图所示,第一个就是宏观定位大盘。从大盘飘红的地方,可以下钻到异常服务详情;从服务详情站位,可以快速下钻到 Mesh 入向调用详情、出向调用详情、以及失败链路调用详情,也可以横向钻到服务容量和变更事件等。
容量监控和业务监控思路类似。它覆盖到 CPU&GPU 算力,容器宿主容量,云主机容量,子网 IP 容量,专线带宽容量,VPN 容量等。
报警层面,构建全局通用服务报警大盘,力求扮演好故障第一跳角色,同时把未恢复和近期报警做一个快捷查询,方便支撑全局决策。权限运营主要感知关键权限点的异动,防止因运维失控,造成越界授权和越界操作。变更管控主要围绕五条军规落地。
为何能在短时间建成这样体系和能力?主要有四大环境变化,它们互相关联,互相驱动。
也正因为这四个变化,同时也给 SRE 带来前所未有的冲击,倒逼我们深度思考,转型探索。
从团队分工可看出,每个运维角色背后都有自己的主营服务,唯独业务运维,它不是业务服务的提供方,而是依附业务,无限延伸和放大业务的价值。长期下去,容易演变为一个横向支持团队,大大弱化 SRE 方向的专业性。因此,运维服务化呼之欲出。
再回归初心,看看 SRE 的内在定义,它是 Site Reliability Engineering 首字母缩写,最后一个单词强调工程化而非工程师,关键点在于用工程化的思路和方法来定义和重构运维,让运维更加自动化,更加服务化,而不是狠砸工程师原地重复挖坑。
传统运维偏向被动执行,不出问题就好,作风求稳,重流程规范和 SOP。云原生时代的运维,更强调构建业务数据度量业务风险,给出标准化解决方案建议,并主动作为,善于把流程规范和 SOP 固化到架构或者平台中去。
最后要认清 SRE 的岗位职责,让业务高效迭代,让业务稳定运行。
对岗位有全新的认知之后,再看看云原生时代,SRE 需要具备什么样的能力模型。我觉得主要有四点:
能力模型具备之后,如何在云原生时代中找到自己的方向呢,我认为有四个方向还可以大展拳脚。
对于未来,我们主要有两点展望:第一是能力升级,第二是运维服务化。
为了更加适应云原生时代,始终坚持和深化技术信仰,升级团队技术能力,通过技术手段成就业务。其次要深化运维服务化理念,运维的价值最终会体现到业务身上,但体现该价值最好的方式就是运维服务化,最大限度地给业务赋能。能力升级,就是为了更好地进行运维服务化。而运维服务化则打开了一扇窗,给 SRE 更多的成长空间,让他们能够升级迭代,就像太极理念一样,让这个团队生生不息。
作者介绍:
邓瑞龙,作业帮 SRE 负责人
聂安安,作业帮运维负责人
领取专属 10元无门槛券
私享最新 技术干货