今天,我们来简单聊聊关于SRE工程师的那些事
在正式开始之前,我先跟大家讲一下我的个人经历:今年春招找实习的时候,依稀记得那是一个日暖风和的中午,我坐在电脑前,而网线的另一端是和蔼可亲的面试官——是的,我正在进行一场某企业的技术面试,岗位则是SRE工程师
面试的前半段,我跟面试官相谈甚欢,不亦乐乎。直到面试官突然问了我这么一个问题:“你觉得运维工程师和SRE工程师有什么区别?或者说他们的工作性质有什么不一样的地方吗?”
这个问题直接把我问住了,运维工程师跟SRE工程师有什么区别?SRE工程师全名叫啥来着?顿时一个个问题涌上我的脑海,我只能尴尬的笑着并跟面试官说:“不好意思面试官,这个问题我没有过多的去了解”
面试结束后,果不其然的“挂掉了”
回到宿舍后,我对今天的面试过程做了一个总结复盘,我决心要弄清楚SRE工程师到底是什么,以及他跟运维工程师有什么区别,不然这都不懂的话我还应聘什么SRE工程师。
好,正文开始。
SRE这个词诞生于谷歌公司,其全名叫网站可靠性工程师(Site Reliability Engineer ),它是软件工程师和系统管理员的结合。
在SRE诞生之前,谷歌认为“既然软件工程师职业主要专注于设计和构建软件系统,那么应该有另外一种职业来专注于整个软件系统的生命管理周期”。
SRE工程师在最初的时候,主要的工作是负责维护谷歌网站的正常运转,所以我们看到SRE中的"S"最开始指代的就是谷歌的网站业务。
任何一个软件或者系统,我们认为其可靠性(Reliability)是相当重要的。因为绝大多数的大型软件或者系统,它们的生命周期绝大部分都处于“使用”阶段,而非“设计”或者“实现”阶段。一旦你这个软件或系统投入到生产环境并正式使用后,你就得想尽办法让它的用户体验更好,这样才能留住用户,给公司带来利润对吧。
所以说,SRE工程师的主要任务之一就是:负责软件和系统的架构设计,运维流程的不断优化,让这些大型软件以及系统运行得更加可靠,更加稳定,扩展性更好,更能有效地利用计算机资源。
在《SRE Google运维解密》一书中,作者跟我们谈到了SRE的起源——Margaret Hamilton,MIT教授。
他参与了阿波罗登月计划的软件开发工作,在阿波罗七号飞船研发的某天,MIT教授带着他的小女儿Lauren一起来到公司。小孩子嘛,对于新鲜事物都特别好奇,所以就在MIT教授忙着和组员们在计算机上进行飞行模拟测试的时候,他的女儿Lauren不小心按下了控制台上的DSKY键,这一按可不得了——整个模拟程序直接崩溃,导致火箭发射程序意外终止。
之后MIT教授发现,是因为当时Lauren意外触发了P01程序的执行,所以才导致了程序的崩溃(这个子程序是起飞前调试程序,执行时会删除现存的导航信息,如果在火箭飞行过程中执行这个程序,计算机将无法继续维持火箭航线,后果可是灾难性的)
MIT教授凭着自己的直觉,为项目组提交了一个软件改动,申请在飞行程序中增加一项特殊状态检查,以免飞行员在飞行过程中意外触发P01子程序的执行
但不幸的是,NASA管理层认为,这项错误发生的可能性太小,如果要修改的话成本太大,根本不值得。
无奈MIT教授只能在火箭飞行手册中写道:“请勿触发P01程序”
当时增加这段文字的时候,很多同事都觉得MIT教授在小题大做,因为他们都认为宇航员在经过如此长时间的专业训练,几乎不可能会发生这种错误
几天后,阿波罗8号飞船在执行一项任务时。宇航员Jim Lovell、William Anders和Frank Borman三人执行一个长达四天的飞行计划途中,Jim Lovell意外触发了P01程序,好巧不巧,当时正好是美国的圣诞节,大部分工程师都休假去了。
可想而知,当时NASA处于一片混乱状态,如此人命关天的时刻如果不能及时解决,三名宇航员恐怕就回不来了。
所幸当时MIT教授的飞行手册更新中恰恰提到了这种情形,并且提供了重新上传数据以及恢复执行的有效办法,在有效的时间内解决了问题,并拯救了宇航员的生命。
最后,我想说的是:没有人能够毫不出错地去做一件事,即使他是这个领域内最顶尖的人才。无论对一个软件系统运行原理掌握得多么彻底,也不能阻止人犯意外错误!
上文我们对SRE工程师有了一个基本的了解,别忘了还有一个问题:SRE工程师跟运维工程师有什么区别?
我们先看看某招聘网上企业分别对SRE工程师和运维工程师的技能要求,当然这只是一个大概的需求而且我只放了一张图片,具体还得看不同企业。大家可以自行去某招聘网站上了解。
运维工程师
我们可以看到,两个职业在技能需求上其实没有太大的差别,都需要了解Linux操作系统,熟悉编程语言或者脚本语言。那么为什么还会有SRE工程师和运维工程师呢?以及他们直接有没有特别明显的区别呢?
传统的IT行业中,许多企业大多都是雇佣系统管理员来运维复杂的软件或者系统。
这些系统管理员的日常工作和研发工程师(软件工程师)相差甚远,通常属于两个部门:开发部(Dev)和运维部(Ops),这个团队模型也就是Dev/Ops分离模型。
于是,系统管理员也被称作运维工程师,他们主要负责将线程的软件组件部署在生产环境当中,并对外提供某种业务服务。
与运维工程师不同的是。SRE工程师不但负责传统运维工程师的工作,他们也负责软件工程师的一些工作——参与某些软件或系统的开发。
SRE团队相信通过开发软件系统来维护系统的正常运行,以此来代替传统运维工程师的人工操作,这样做大大节省了人力开销。
SRE团队中实现的是DevOps结合模型,他们主张用系统来维护系统,让SRE工程师有更多时间来负责软件系统的开发,而不是每天进行重复枯燥的运维工作。
最后,做个小总结: