网络运维浅析
信息安全公益宣传,信息安全知识启蒙。
加微信群回复公众号:微信群;QQ群:16004488
加微信群或QQ群可免费索取:学习教程
教程列表见微信公众号底部菜单
运维,这里指互联网运维,通常属于技术部门,与研发、测试、系统管理同为互联网产品技术支撑的4大部门,这个划分在国内和国外以及大小公司间都会多少有一些不同。
一个互联网产品的生成一般经历的过程是:产品经理、需求分析、研发部门开发、测试部门测试、运维部门部署发布以及长期的运行维护。
一、运维的职责
对于初创公司,运维部和系统部一般是合二为一的,相关工作由同一批人负责,界限可能不是很明显。大型公司对运维工作的要求更高,需要有更精细的分工,因此机房/网络/操作系统相关的底层工作分离出来由专人负责,成为系统管理部,而上层和应用产品相关的工作则由运维负责,成为运维部。以下从互联网产品生命周期和运维涉及的技术分别来看分工较细的大型互联网公司中运维工作的职责。
二、产品生命周期维度
运维的职责覆盖了产品从设计到发布、运行维护、变更升级及至下线的生命周期,各个阶段的职责包括:
产品发布前
这个阶段运维工程师的职责是参与设计并把有关运维准入,主要包括:
(1) 产品的业务熟悉;
(2) 产品架构设计的合理性评估,包括是否存在单点,是否可容错,是否有强耦合等,同时需要提供产品设计的合理性建议以使产品能够满足上线发布并稳定运行的基本要求;
(3) 资源评估,包括所需的服务器资源、网络资源以及资源的分布等,同时把相关产品对资源预算申请的合理性,控制服务成本;
(4) 资源就位,将申请的服务器及基础环境/域名准备就位。
产品发布
这个阶段运维工程师负责发布的具体工作,将具体的软件和系统/硬件资源整合形成产品并对外提供服务。
对于已在线服务的更新也属于发布范畴,这个时候的产品发布一般要保障在线发布,在不中断对外服务的情况下完成产品的升级。对于大型复杂的变更也存在中止服务部署完成后再重新提供服务的情况,但这种情况需要运维工程师通过尽可能的技术手段来避免。
产品运行维护
这个阶段的主要工作包括:
(1) 监控:对服务运行的状态进行实时的监控,随时发现服务的运行异常和资源消耗情况;输出重要的日常服务运行报表以评估服务/业务整体运行状况,发现服务隐患;
(2) 故障处理:对服务出现的任何异常进行及时处理,尽可能避免问题的扩大化甚至中止服务。这之前运维工程师需要针对各类服务异常,如机房/网络故障、程序bug等问题制定处理的预案,问题出现时可以自动或手动执行预案达到止损的目的。除了日常小故障外,运维工程师还需要考虑产品不同程度受损情况下的灾难恢复,包括诸如地震等不可抗力导致大规模机房故障、在线产品被删除等对产品造成致命伤害的情况。
容量管理:包括服务规模扩张后的资源评估、扩容、机房迁移、流量调度等规划和具体实施。
产品性能/成本优化
产品对外提供服务最重要的一点是用户体验,用户体验中非常重要的是产品的可用性和响应速度。而如何用最合理的资源(如机器、带宽等)支持产品提供高可用和高速度的用户体验,这也是运维工程师的重要职责。
产品下线
发展良好的互联网产品将始终在线对外提供服务,但互联网产品快速迭代,也存在相当多孵化的产品最后被淘汰的情况,这些产品都需要做下线处理,这个过程运维工程师主要做好资源回收的工作,将机器/网络等资源回收后纳入资源池中供其它服务使用。
三、运维技术方向
产品的整个生命周期里运维的职责重要而广泛,但运维工程师们的职责不仅限于这部分工作,还需要总结工作中遇到的问题,抽取出相关的技术方向、研发相关的工具和平台以支持/优化业务的发展并提高运维的效率,相关技术工作主要包括:
服务监控技术:包括监控平台的研发、应用,服务监控准确性、实时性、全面性的保障
服务故障管理:包括服务的故障预案设计,预案的自动化执行,故障的总结并反馈到产品/系统的设计层面进行优化以提高产品的稳定性
服务容量管理:测量服务的容量,规划服务的机房建设,扩容、迁移等工作
服务性能优化:从各个方向,包括网络优化、操作系统优化、应用优化、客户端优化等,提高服务的性能和响应速度,改善用户体验
服务全局流量调度:接入服务的流量,根据容量和服务状态在各个机房间分配流量
服务任务调度:服务的各种定时/非定时任务的调度触发及状态监控
服务安全保障:包括服务的访问安全、防攻击、权限控制等
数据传输技术:包括p2p等各类传输技术的研发应用,也远距离大数据传输等问题的解决
服务自动发布部署:部署平台/工具的研发,及平台/工具的使用,做到安全、高效的发布服务
服务集群管理:包括服务的服务器管理、大规模集群管理等
服务成本优化:尽可能降低服务运行使用的资源,降低服务运行成本
数据库管理(DBA):通过设计、开发和管理高性能数据库集群,使数据库服务更稳定、更高效、更易于管理。
平台化的开发:类docker和google borg平台的开发管理,及服务接入技术
分布式存储平台的开发优化:类google gfs等分布式存储平台的研发及服务接入等等,凡是关系到服务质量、效率、成本、安全等方面的工作,及涉及到的技术、组件、工具、平台都在运维的技术范畴里。做好每一个技术方向、完成相应的组件、工具、平台研发都能对履行运维职责起到积极的作用,对业务的发展发挥关键影响。
四、运维需要的技能和素质
运维以技术为基础,通过技术保障产品提供更高质量的服务。运维工作的职责及在业务中的位置决定了运维工程师需要具备更加广博的知识和深入的技术能力:
扎实的计算机基础知识,包括计算机系统架构,操作系统,网络技术等;
通用应用方面需要了解操作系统、网络、安全,存储,CDN,DB等,知道其相关原理;
编程能力,小到运维工具的开发大到大型运维系统/平台的开发都需要有良好的编程能力;
数据分析能力:能够整理、分析系统运行的各项数据,从中发现问题及找到解决方向;
丰富的系统知识,包括系统工具、典型系统架构、常见的平台选型等;
综合利用工具和平台的能力。
运维工作的复杂性对这个岗位的运维工程师们的软素质也提出了要求:
时间管理能力,特别是碎片化时间的处理能力;
沉稳的心态,面对紧急情况时需要处变不惊;
沟通能力、团队协作,运维工作跨部门、跨工种工作很多,需善于沟通、并且团队协作能力要强;
工作中需胆大心细:胆大才能创新、不走寻常路,特别对于运维这种新的工种,更需创新才能促进发展;心细,运维工程师是最高线上权限者,需要谨慎心细;
主动性、执行力,能够主动学习国际国内的运维技术,并引入到工作中,提高运维的质量和效率。
五、运维工作开展方式
业务运维工程师的日常工作包括:
监控线上的服务质量
响应异常/处理突发故障
在线发布/升级产品
和相应产品线的研发和测试协调处理产品问题
基于工作中的问题和数据分析进行抽取,将运维经验理念落地沉淀为方法论/工具/系统/平台,并制定相关的改进计划,在各个技术方向上落地实现,最终反馈回运维工作中,提高运维本身的效率和产品的价值。
六、运维工程师使用的平台、工具
运维工程师使用的运维平台和工具包括:
Web服务器:apache、tomcat、nginx、lighttpd
监控:nagios、ganglia、cacti、zabbix
自动部署:ansible、sshpt、salt
配置管理:puppet、cfengine
负载均衡:lvs、haproxy、nginx
传输工具:scribe、flume
备份工具:rsync、wget
数据库:mysql、oracle、sqlserver
分布式平台:hdfs、mapreduce、spark、storm、hive
分布式数据库:hbase、cassandra、redis、MongoDB
容器:lxc、docker
虚拟化:openstack、xen、kvm
安全:kerberos、selinux、acl、iptables
问题追查:netstat、top、tcpdump、last
广义上所有开源的软件都是运维工程师会使用到的平台和工具,同时也包括运维各个技术方向上自行研发的各类平台。
七、运维工程师的职业发展
运维工程师从工作方式上分为几大类:
运维工程师/运维开发工程师
负责具体的产品线运维工作,同时也需要掌握开发的能力,深入业务,最了解业务的痛点和问题,同时研发/优化针对产品业务需求的平台、工具和手段,能够接触到各类优秀的系统架构并有能力做出优劣对比,同时对业务的掌控决定了相应运维工程师在业务发展中的作用。长远发展是成为大型系统的架构师。
运维平台研发工程师
专门研发运维相关通用平台和技术,需要有一定的产品线运维经验或从产品线中拿到运维需求。对研发能力有较高的要求,对系统的设计有较严格的标准,并且能够理解用户需求,做出适合服务运维和满足运维工程师使用体验的运维产品,长远的发展是成为各个技术纵向领域的技术专家。
数据库研发工程师/数据库工程师
数据库方向是运维技术中较为特殊的一个方向,由于业务的重要性通常需要专设岗位,业界在该方向也有深厚的研究和积累。主要方向有数据库内核、云数据库等,长远发展是数据库领域的技术专家,数据库架构师。
运维经理
运维同学做事情的过程中通常需要协调多个RD和QA同学,对协调和推进能力要求比较高,对一些技术深度还不错,协调和推进能力比较高的同学非常适合转型管理职位,长远的发展和技术部门的管理职位一样目标是CTO、CEO。
各个方向上的工程师发展到一定阶段后,没有明确的界限,需要同时具备较强的运维、架构、编程、算法等能力,是一个要求很高要求的职业。
八、运维行业前景
从行业角度来看,随着中国互联网的高速发展、网站规模越来越来大、架构越来越复杂,对专职网站运维工程师、网站架构师的要求会越来越急迫,特别是对有经验的优秀运维人才需求量大,而且是越老越值钱。
从个人角度,运维工程师技术含量及要求会越来越高,同时也是对公司应用、架构最了解最熟悉的人、越来越得到重视。
互联网运维是一个融合多学科(网络、系统、开发、安全、应用架构、存储等)的综合性技术岗位,给运维工程师提供了一个很好的个人能力与技术的发展空间。
运维工作的相关经验将会变得非常重要,而且也将成为个人的核心竞争力,优秀的运维工程师具备很好的各层面问题的解决能力及方案提供、全局思考的能力等。
由于运维岗位所接触的知识面非常广阔,更容易培养或发挥出个人某些方面的特长或爱好,如内核、网络、开发、数据库等方面,可以做得非常深入精通、成为这方面的专家。
当前国内外对运维人才的需求非常迫切,运维工程师的薪资也水涨船高,与研发、测试等技术部门持平,甚至超出。
九、资深运维工程师眼中的运维
以下是中国互联网业界部分资深运维工程师对运维的看法(涉及隐私,相关人名采用首字母缩写):
CXY:
运维是一个非常广泛的定义,在不同的公司不同的阶段有着不同的职责与定位,如果以operation字面的含义去理解,认为就是敲几行操作命令的工作,那就错了。 对于初创公司,运维工程师的工作可能需要从申请域名开始,购买/租用服务器,上架,调整网络设备的设置,部署操作系统和运行环境,部署代码,设计和部署监控,防止漏洞和攻击等等。对于大型的公司,对于运维工作的要求越来越高,也催生了更细化的运维分工:从大的方向,可以分为网站运维,系统运维,网络运维,数据库运维,IT运维,运维开发,运维安全等方向。
很多非从业人员对运维的看法一般属于IT运维的一个非常小的职责:装系统^^。 一些研发工程师对运维的看法也只局限运维工作的几个点:部署, 变更, 监控,响应。
无论做什么运维,最基本的职责都是保证业务能够稳定运行。所以必须成为业务稳定性的owner。有些人通常认为运维工程师像消防员,7*24小时响应异常,救火。但是稳定性的运维工程师和医生的职业更接近。医生也分各种科室,也有急症室,需要先判断病人的问题,对症下药。
业务有着各种各样的需求,如果运维工程师能够满足业务需求,或者主动挖掘业务的痛点和改进方法,就能为业务实现更多的价值。
在满足业务需求时,应该分清主次,优先面对业务快速发展非常重要的需求,例如稳定性,部署和变更效率,容量管理。稳定性不用多说,如果用户没法稳定使用你的业务,什么产品特性都没有价值。对于百度这样极速发展的互联网公司,每天都有大量的升级更新需要提供给用户,如何在异地的大集群上最快的满足产品的升级需求,同时让用户对升级过程无感知,这是我们的追求。当用户会用百度来测量网络是否可以上网时,就是对运维质量的褒奖。
其次,可以横向看看不同业务的需求。如果能够把多个业务的需求抽象出来,把一些有通用价值的工作平台化(例如数据库,cdn,监控,流量接入和调度,大数据的存储和计算),也能在这个方向进行深入的发展。在百度这样的巨大的流量和服务器规模下,你不仅有巨大的空间和挑战,也有着充足的资源和支持,可以开发和应用业界最前沿的技术。
有一定的积累后,可以进入到宏观和微观的两个层面,从整个公司层面考虑业务的智能部署和调度(涉及网络,硬件,系统,应用开发方式等各个要点),进一步提升效率和节省成本。
如果能够懂业务,理解业务的模式,紧密结合业务进行优化和创新,也是运维工程师体现价值的另外一种方式。有很多产品上的创新,专利的申请,论文的发表,业务指标的提升,直接或者以合作的方式由运维工程师贡献。
YBX:
运维工程师相对研发人员来讲,可以全局观察所维护的计算机系统,特别是高阶运维工程师,不存在模块界限,这种独特的位置带来很多价值:
知道准确的系统瓶颈点,进而知道系统准确的容量;在系统出现瓶颈前,知道如何快速提供容量。
知道系统的风险点,可以协调风险点上下相关关联模块,做出冗余策略;相比集中解决单点模块稳定性,更合理。
长期从事相关工作,积累较多的架构设计经验,可以指导新架构设计和审核。
从公司不同业务角度看,运维可以从中抽象相同的模块,统一管理,形成有效的平台和自动化管理方法。
同样从公司不同业务角度看,可以统一调配资源,进而节省资源。
KZ:
设计并实现可以提高公司服务可用性,可扩展性,延迟和效率的软件。
处理日常紧急事故,修正,替换问题组件。并设计规避问题方法。
设计和实现新的超大规模分布式系统架构和标准。
参与服务扩容计划和预测服务增长趋势,对软件和系统性能进行调优。
提供在线咨询服务和现场解决问题服务。
构建自动运维平台,解决日常问题。
构建知识库,预测可能的问题。
XX:
运维即生产环境以及和生产环境相关的资源、服务的维护的整个过程,包括了相关的技术、流程手段,确保生产环境稳定、高效、低成本的运行。
运维一方面为对业务功能最终负责,其价值的体现为最大化助力产品价值的发挥。这通常是通过将产品功能的运行表现提升到极致来达成的。例如搜索引擎的运维重点要保障用户在搜索时候的极致体验:稳、快、准、新、全。而一个在线聊天系统的运维应该是确保用户聊天过程的实时与顺畅。另一方面为对在线业务的成本最终负责。其价值的体现为降低服务运行成本。
运维工作的开展方式一般取决于所维护的业务特点需求,形成所需的多个主题方向进行开展。通常的解决方案中包括如下的一些主题方向:事件管理、配置管理、变更管理、容量管理等。
运维工程师的要求特别严苛,因为运维工程师针对不同的问题,需要不断的补充扩大自己的知识和研究范畴。
在初级阶段,优秀运维工程师会体现出格外出众的主动性和责任心,面对陌生的业务会主动学习和拓展自己对业务对认识和相应的知识范畴,以能够足够的胜任业务的独立维护。
在逐步的发展阶段中,注重总结反省的工程师会逐渐成长为高阶运维工程师,通常他们会有比较体系化的服务运维理解。也有一部分工程师由于出色的项目管理规划能力,逐渐成为项目经理。
再进一步的发展,高阶的运维工程师对于产品的理解将非常的透彻,因而在这种情况下,高阶运维工程师甚至可以成为产品的产品经理、产品研发的咨询顾问,在产品功能的设计与开发中起到至关重要的角色。
SJY:
一个运维工程师所需的技术体系以其专业方向而异。但基本的计算机系统架构,操作系统,网络技术的掌握是基本要求。例如你可能需要熟练掌握linux操作系统的使用,熟练使用各种脚本工具来处理日常工作任务,精通TCP/IP协议栈以排查一个大规模网络系统中的流量异常问题等。更进一步的你需要形成一套软件可运维性方面的经验积累,以此作为后续工作的指导。
一个运维工程师在初期阶段目的是掌握维护一套系统所需的所有软硬件知识和经验。进阶阶段是需要能够设计开发一套基础的体系软件,以支撑业务系统的稳定可靠运行,即开发服务于软件的软件,以支持更大规模的业务系统,提高运维生产力。最高阶段是反作用于软件系统的构建和运行阶段,使得系统从诞生阶段起即具有天然的可运维性,以最大化系统的生产力,同时最小化对外部支撑资源的依赖。
ZM:
运维工程师首先应该是软件工程师(Software Engineer),只是责任和侧重有所不同。
运维工程师不是系统管理员。和系统管理员最大的差别是,运维工程师的工作不仅仅是配置和管理系统,而且可以运用软件开发的方法来增强系统的功能、或者对数据进行分析。
运维工程师应该是软件工程师、系统工程师等角色的综合体,和一般软件工程师相比、应该具有更加广博的知识背景。
运维的职责在于:
保证服务的稳定运行;
考虑服务的可扩展性;
从系统的稳定性和可运维性的角度,提出开发需求;
定位系统的问题,甚至可以直接修正bug;
对突然出现的问题做到快速响应和处理;
运维的日常工作:
需要对系统的需求和设计方案进行分析,思考在保证稳定性方面有哪些可以加强的地方,并和系统的研发人员进行有效沟通;
使用工具、或者写程序,对运营数据进行分析;
写程序以建立工具或平台,去加强系统的稳定性;
运维工程师最重要的是会运用编程和软件的方法来解决问题。发展的道路应该和软件工程师没有很大的区别,差异只是关注点和领域方向的不同。