運維之下 - 第一章 互聯網運維工作

第一章 | 互联网运维工作
互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够7×24小时为用户提供高质量的服务。
运维人员对公司互联网业务所依赖的基础设施、基础服务、线上业务进行稳定性加强,进行日常巡检发现服务可能存在的隐患,对整体架构进行优化以屏蔽常见的运行故障,多数据中心接入提高业务的容灾能力,通过监控、日志分析等技术手段,及时发现和响应服务故障,减少服务中断的时间,使公司的互联网业务符合预期的可用性要求,持续稳定地为用户提供服务。
在安全方面,运维人员需要关注业务运行所涉及的各个层面,确保用户能够安全、完整地访问在线业务。从网络边界划分、ACL管理、流量分析、DDoS防御,到操作系统、开源软件的漏洞扫描和修补,再到应用服务的XSS、SQL注入防护;从安全流程梳理、代码白盒黑盒扫描、权限审计,到入侵行为检测、业务风险控制等。运维人员需要保障公司提供的互联网业务运行在安全、可控的状态下,确保公司业务数据和用户隐私数据的安全,同时还需要具备抵御各种恶意攻击的能力。
在确保业务稳定、安全的前提下,还需保障业务高效的运转,公司内快速的产出。运维工作需要对业务进行各方面优化,比如,IO优化提升数据库性能,图片压缩降低带宽使用量等,使公司提供的互联网业务以较小的资源投入带来最大的用户价值和体验。同时,还需要通过各种工具平台提升内部产品发布交付的效率,提升公司内运维相关的工作效率。
运维工作分类运维的工作方向比较多,随着业务规模的不断发展,越成熟的互联网公司,运维岗位会划分得越细。当前很多大型的互联网公司,在初创时期只有系统运维,随着业务规模、服务质量的要求,也逐渐进行了工作细分。一般情况下运维团队的工作分类(见图1-1)和职责如下。
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1图1-1  运维团队的工作分类
系统运维系统运维负责IDC、网络、CDN和基础服务的建设(LVS、NTP、DNS);负责资产管理,服务器选型、交付和维修。详细的工作职责如下:
(1)IDC数据中心建设收集业务需求,预估未来数据中心的发展规模,从骨干网的分布,数据中心建筑,以及Internet接入、网络攻击防御能力、扩容能力、空间预留、外接专线能力、现场服务支撑能力等多个方面评估选型数据中心。负责数据中心的建设、现场维护工作。
(2)网络建设设计及规划生产网络架构,这里面包括:数据中心网络架构、传输网架构、CDN网络架构等,以及网络调优等日常运维工作。
(3)LVS负载均衡和SNAT建设LVS是整个站点架构中的流量入口,根据网络规模和业务需求,构建负载均衡集群;完成网络与业务服务器的衔接,提供高性能、高可用的负载调度能力,以及统一的网络层防攻击能力;SNAT集中提供数据中心的公网访问服务,通过集群化部署,保证出网服务的高性能与高可用。
(4)CDN规划和建设CDN工作划分为第三方和自建两部分。建立第三方CDN的选型和调度控制;根据业务发展趋势,规划CDN新节点建设布局;完善CDN业务及监控,保障CDN系统稳定、高效运行;分析业务加速频道的文件特性和数量,制定最优的加速策略和资源匹配;负责用户劫持等CDN日常故障排查工作。
(5)服务器选型、交付和维护负责服务器的测试选型,包含服务器整机、部件的基础性测试和业务测试,降低整机功率,提升机架部署密度等。结合对公司业务的了解,推广新硬件、新方案减少业务的服务器投入规模。负责服务器硬件故障的诊断定位,服务器硬件监控、健康检查工具的开发和维护。
(6)OS、内核选型和OS相关维护工作负责整体平台的OS选型、定制和内核优化,以及Patch的更新和内部版本发布;建立基础的YUM包管理和分发中心,提供常用包版本库;跟进日常各类OS相关故障;针对不同的业务类型,提供定向的优化支持。
(7)资产管理记录和管理运维相关的基础物理信息,包括数据中心、网络、机柜、服务器、ACL、IP等各种资源信息,制定有效的流程,确保信息的准确性;开放API接口,为自动化运维提供数据支持。
(8)基础服务建设业务对DNS、NTP、SYSLOG等基础服务的依赖非常高,需要设计高可用架构避免单点,提供稳定的基础服务。
应用运维应用运维负责线上服务的变更、服务状态监控、服务容灾和数据备份等工作,对服务进行例行排查、故障应急处理等工作。详细的工作职责如下所述。
(1)设计评审在产品研发阶段,参与产品设计评审,从运维的角度提出评审意见,使服务满足运维准入的高可用要求。
(2)服务管理负责制定线上业务升级变更及回滚方案,并进行变更实施。掌握所负责的服务及服务间关联关系、服务依赖的各种资源。能够发现服务上的缺陷,及时通报并推进解决。制定服务稳定性指标及准入标准,同时不断完善和优化程序和系统的功能、效率,提高运行质量。完善监控内容,提高报警准确度。在线上服务出现故障时,第一时间响应,对已知线上故障能按流程进行通报并按预案执行,未知故障组织相关人员联合排障。
(3)资源管理对各服务的服务器资产进行管理,梳理服务器资源状况、数据中心分布情况、网络专线及带宽情况,能够合理使用服务器资源,根据不同服务的需求,分配不同配置的服务器,确保服务器资源的充分利用。
(4)例行检查制定服务例行排查点,并不断完善。根据制定的服务排查点,对服务进行定期检查。对排查过程中发现的问题,及时进行追查,排除可能存在的隐患。
(5)预案管理确定服务所需的各项监控、系统指标的阈值或临界点,以及出现该情况后的处理预案。建立和更新服务预案文档,并根据日常故障情况不断补充完善,提高预案完备性。能够制定和评审各类预案,周期性进行预案演练,确保预案的可执行性。
(6)数据备份制定数据备份策略,按规范进行数据备份工作。保证数据备份的可用性和完整性,定期开展数据恢复性测试。
数据库运维数据库运维负责数据存储方案设计、数据库表设计、索引设计和SQL优化,对数据库进行变更、监控、备份、高可用设计等工作。详细的工作职责如下所述。
(1)设计评审在产品研发初始阶段,参与设计方案评审,从DBA的角度提出数据存储方案、库表设计方案、SQL开发标准、索引设计方案等,使服务满足数据库使用的高可用、高性能要求。
(2)容量规划掌握所负责服务的数据库的容量上限,清楚地了解当前瓶颈点,当服务还未到达容量上限时,及时进行优化、分拆或者扩容。
(3)数据备份与灾备制定数据备份与灾备策略,定期完成数据恢复性测试,保证数据备份的可用性和完整性。
(4)数据库监控完善数据库存活和性能监控,及时了解数据库运行状态及故障。
(5)数据库安全建设数据库账号体系,严格控制账号权限与开放范围,降低误操作和数据泄露的风险;加强离线备份数据的管理,降低数据泄露的风险。
(6)数据库高可用和性能优化对数据库单点风险和故障设计相应的切换方案,降低故障对数据库服务的影响;不断对数据库整体性能进行优化,包括新存储方案引进、硬件优化、文件系统优化、数据库优化、SQL优化等,在保障成本不增加或者少量增加的情况下,数据库可以支撑更多的业务请求。
(7)自动化系统建设设计开发数据库自动化运维系统,包括数据库部署、自动扩容、分库分表、权限管理、备份恢复、SQL审核和上线、故障切换等功能。
运维研发运维研发负责通用的运维平台设计和研发工作,如:资产管理、监控系统、运维平台、数据权限管理系统等。提供各种API供运维或研发人员使用,封装更高层的自动化运维系统。详细的工作职责如下所述。
(1)运维平台记录和管理服务及其关联关系,协助运维人员自动化、流程化地完成日常运维操作,包括机器管理、重启、改名、初始化、域名管理、流量切换和故障预案实施等。
(2)监控系统负责监控系统的设计、开发工作,完成公司服务器和各种网络设备的资源指标、线上业务运行指标的收集、告警、存储、分析、展示和数据挖掘等工作,持续提高告警的及时性、准确性和智能性,促进公司服务器资源的合理化调配。
(3)自动化部署系统参与部署自动化系统的开发,负责自动化部署系统所需要的基础数据和信息,负责权限管理、API开发、Web端开发。结合云计算,研发和提供PaaS相关高可用平台,进一步提高服务的部署速度和用户体验,提升资源利用率。
运维安全运维安全负责网络、系统和业务等方面的安全加固工作,进行常规的安全扫描、渗透测试,进行安全工具和系统研发以及安全事件应急处理。详细的工作职责如下所述。
(1)安全制度建立根据公司内部的具体流程,制定切实可行,且行之有效的安全制度。
(2)安全培训定期向员工提供具有针对性的安全培训和考核,在全公司内建立安全负责人制度。
(3)风险评估通过黑白盒测试和检查机制,定期产生对物理网络、服务器、业务应用、用户数据等方面的总体风险评估结果。
(4)安全建设根据风险评估结果,加固最薄弱的环节,包括设计安全防线、部署安全设备、及时更新补丁、防御病毒、源代码自动扫描和业务产品安全咨询等。为了降低可能泄露数据的价值,通过加密、匿名化、混淆数据,乃至定期删除等技术手段和流程来达到目的。
(5)安全合规为了满足例如支付牌照等合规性要求,安全团队承担着安全合规的对外接口人工作。
(6)应急响应建立安全报警系统,通过安全中心收集第三方发现的安全问题,组织各部门对已经发现的安全问题进行修复、影响面评估、事后安全原因追查。
运维工作发展过程早期的运维团队在人员较少的情况下,主要是进行数据中心建设、基础网络建设、服务器采购和服务器安装交付工作。几乎很少涉及线上服务的变更、监控、管理等工作。这个时候的运维团队更多的属于基础建设的角色,提供一个简单、可用的网络环境和系统环境即可。
随着业务产品的逐渐成熟,对于服务质量方面就有了更高的要求。这个时候的运维团队还会承担一些服务器监控的工作,同时会负责LVS、Nginx等与业务逻辑无关的4/7层运维工作。这个时候服务变更更多的是逐台的手工操作,或者有一些简单批量脚本的出现。监控的焦点更多的在服务器状态和资源使用情况上,对服务应用状态的监控几乎很少,监控更多的使用各种开源系统如Nagios、Cacti等。
由于业务规模和复杂度的持续增加,运维团队会逐渐划分为应用运维和系统运维两大块。应用运维开始接手线上业务,逐步开展服务监控梳理、数据备份以及服务变更的工作。随着对服务的深入,应用运维工程师有能力开始对服务进行一些简单的优化。同时,为了应对每天大量的服务变更,我们也开始编写各类运维工具,针对某些特定的服务能够很方便的批量变更。随着业务规模的增大,基础设施由于容量规划不足或抵御风险能力较弱导致的故障也越来越多,迫使运维人员开始将更多的精力投入到多数据中心容灾、预案管理的方向上。
业务规模达到一定程度后,开源的监控系统在性能和功能方面,已经无法满足业务需求;大量的服务变更、复杂的服务关系,以前靠人工记录、工具变更的方式不管在效率还是准确性方面也都无法满足业务需求;在安全方面也出现了各种大大小小的事件,迫使我们投入更多的精力在安全防御上。逐渐的,运维团队形成之前提到的5个大的工作分类,每个分类都需要有专精的人才。这个时候系统运维更专注于基础设施的建设和运维,提供稳定、高效的网络环境,交付服务器等资源给应用运维工程师。应用运维更专注于服务运行状态和效率。数据库运维属于应用运维工作的细化,更专注于数据库领域的自动化、性能优化和安全防御。运维研发和运维安全提供各类平台、工具,进一步提升运维工程师的工作效率,使业务服务运行得更加稳定、高效和安全。
我们将运维发展过程划分为4个阶段,如图1-2所示。
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1图1-2  运维发展过程
手工管理阶段:业务流量不大,服务器数量相对较少,系统复杂度不高。对于日常的业务管理操作,大家更多的是逐台登录服务器进行手工操作,属于各自为战,每个人都有自己的操作方式,缺少必要的操作标准、流程机制,比如业务目录环境都是各式各样的。
工具批量操作阶段:随着服务器规模、系统复杂度的增加,全人工的操作方式已经不能满足业务的快速发展需要。因此,运维人员逐渐开始使用批量化的操作工具,针对不同操作类型出现了不同的脚本程序。但各团队都有自己的工具,每次操作需求发生变化时都需要调整工具。这主要是因为对于环境、操作的规范不够,导致可程序化处理能力较弱。
此时,虽然效率提升了一部分,但很快又遇到了瓶颈。操作的质量并没有太多的提升,甚至可能因为批量执行而导致更大规模的问题出现。我们开始建立大量的流程规范,比如复查机制,先上线一台服务器观察10分钟后再继续后面的操作,一次升级完成后至少要观察20分钟等。这些主要还是靠人来监督和执行,但在实际过程中执行往往不到位,反而降低了工作效率。
平台管理阶段:在这个阶段,对于运维效率和误操作率有了更高的要求,我们决定开始建设运维平台,通过平台承载标准、流程,进而解放人力和提高质量。这个时候对服务的变更动作进行了抽象,形成了操作方法、服务目录环境、服务运行方式等统一的标准,如程序的启停接口必须包括启动、停止、重载等。通过平台来约束操作流程,如上面提到的上线一台服务器观察10分钟。在平台中强制设定暂停检查点,在第一台服务器操作完成后,需要运维人员填写相应的检查项,然后才可以继续执行后续的部署动作。
系统自调度阶段:更大规模的服务数量、更复杂的服务关联关系、各个运维平台的林立,原有的将批量操作转化成平台操作的方式已经不再适合,需要对服务变更进行更高一层的抽象。将每一台服务器抽象成一个容器,由调度系统根据资源使用情况,将服务调度、部署到合适的服务器上,自动化完成与周边各个运维系统的联动,比如监控系统、日志系统、备份系统等。通过自调度系统,根据服务运行情况动态伸缩容量,能够自动化处理常见的服务故障。运维人员的工作也会前置到产品设计阶段,协助研发人员改造服务使其可以接入到自调度系统中。
在整个运维的发展过程中,希望所有的工作都自动化起来,减少人的重复工作,降低知识传递的成本,使我们的运维交付更高效、更安全,使产品运行更稳定。对于故障的处理,也希望由事后处理变成提前发现,由人工处理变成系统自动容灾。
第二章 | 运维的烦恼
如前一章所描述那样,随着业务和用户规模越来越大,公司对业务的稳定和质量开始重视起来,这时候公司才意识到需要专职的运维人员介入,而此时的业务系统已经变得非常庞大和复杂。此外,由于互联网产品快速试错的特点,服务架构也在不断地快速变化。
产品研发早期缺少相应的规范和标准,服务的部署方式、启停方式、配置和日志格式等都不统一,服务与服务之间的关联关系错综复杂,服务的各个环节都缺少监控;服务之间的耦合度很高,经常会由于一个小模块的崩溃,导致整个业务系统拒绝服务。
这个时候运维人员更像是保姆、消防员和拆弹专家。运维人员需要细心地呵护服务,让其健康地成长,就像照顾婴儿一样;成长中的服务,经常由于各种不规范带来的历史原因,出现很多意想不到的突发事情,这时候运维人员需要第一时间响应,进行业务的紧急恢复,类似消防员的角色;在日常的服务管理过程中,一个操作顺序或命令的错误,有可能直接让服务中断,这时候运维人员就像拆弹专家,既要细心大胆,又要有耐心,在危机时刻能够快速处理,做出正确决策。
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1
运维人员需要处理各种突发的服务故障,在早期缺少统一规范、缺少业务监控、基础设施不成熟以及业务不断快速变化的时候,运维人员几乎每天都在忙于应付各种大大小小的服务故障。如图2-1所示是一个真实案例中,某个月统计到的服务故障分类和占比。
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1图2-1  服务故障分类和占比
根据监控项的重要程度对告警进行分级是一个很好的实践,Disaster级别优先级最高,需要立即处理。Warning级别需要24小时内完成处理,如图2-2所示。Warning级别大多数是CPU、内存、硬盘资源超限预警。详细的报警级别定义和划分,请参见后面监控章节的报警分级部分。
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1图2-2  各报警级别占比
注:根据监控项的重要程度对告警进行分级是一个很好的实践,P0级别优先级最高,需要立即处理。P3级别需要24小时内完成处理,P3级别大多数是CPU、内存、硬盘类资源超限预警。详细的报警级别定义和划分,请参见后面监控章节的报警分级部分。
业务快速变化、缺少统一规范、缺少文档和培训,运维人员基本上是摸黑接手服务。线上服务经常会埋着各种奇奇怪怪的坑,每一次服务变更都如履薄冰。
案例1服务上下游处理超时时间不匹配,上游服务的超时时间设置为5毫秒,而下游服务的超时时间却设置成了10毫秒,下游服务还在正常处理请求中,可上游服务却因达到超时设置而将本次请求丢弃了,最终客户端不断重试,导致服务器端压力增大。
一个真实案例中,遇到过上下游服务超时时间单位不一致的情况,因为系统中的各个服务是不同的研发人员负责的,在联调过程中忽略了一些问题,导致上游服务使用秒作为超时时间单位,下游服务却使用了毫秒。某次下游单机故障时,运维人员发现上游容错机制完全无效,依然导致其堆积了大量请求,最终影响服务整体性能。经过了较长时间的追查,才发现是由于超时时间单位问题引起的。
由于缺少规范化,给运维带来了无形的风险,而且故障定位也比较困难。
案例2集群服务是多台服务器共同完成一个任务,它们之间的调用关系是通过在程序配置文件中配置IP地址或服务器主机名来宣告的。由于IP地址的易读性较差,我们一般会使用内网DNS提供的主机域名。但有些研发人员却通过修改本机/etc/hosts文件的形式自定义域名解析。
这样的修改,使得对目标域名的解析是维护在每台服务器上的,这将极大增加运维管理的风险。试想100台相互存在调用关系的服务器,每台服务器上都需要维护与其他多台服务器的域名关系。当出现服务变更、故障处理、服务迁移时,需要所有上下游服务配合变更,带来很高的操作风险和复杂度。
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1
运维属于技术线的末端(见图2-3),产品研发、测试、上线后将持续不断地在线上运行着。互联网产品很少有产品下线的情况,经常会出现某个产品的产品经理、研发工程师、测试工程师都没有了,而这个产品依然还有运维人员在维护,持续提供服务。上游引入的任何缺陷,最终都由运维去承担,上游往往无法感受到运维的压力。随着业务的增长、服务与主机数量的增加,产品各个阶段的缺陷会被进一步放大,运维压力也越来越大。
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1图2-3  运维属于技术线的末端
手工操作是初期运维团队的主要方式,渐渐的会形成一些工具或者系统,但都比较零散,适用场景较小,无法产生规模化。运维批量化和自动化所需要的信息非常少,这些信息基本上都靠人工录入,有哪些IDC,放置了什么服务器,服务器部署了什么服务,这些信息都没有自动采集和联动,无法给自动化系统提供必需的基础信息。运维的重复性工作非常多,又较多属于手工操作,不仅效率低,而且手工操作带来的失误率也比较多,几乎无法消除。
运维承受来自于外部不断增长的业务压力,以及快速发展中引入的各种缺陷。同时又面对内部生产力低下,导致工作效率低下和误操作较多的现状。运维是一个比较尴尬的工作,属于技术线的末端,人力、技术和资源的投入也属于末端。运维不出故障是正常,任何由于资源不足、基础设施不稳定、人员误操作导致的问题,都会被业务部门投诉。不过近年来,运维工作的价值越来越被大家认可,运维支持能力成为公司的核心技术竞争力之一。
运维工作需要从两个方向去解决上述提到的问题:提高内部运维效率和降低外部运维压力。
经过统计,运维工作中占比最多的是服务变更、监控管理、容量管理和故障处理。我们需要开发运维工具和平台,在运维数据准确的前提下让所有的工作尽量自动化起来。制定相关的标准和流程,运维人员在项目设计阶段就参与进来,进行设计评审,让研发人员交付的项目符合运维准入的要求。同时,让研发人员使用运维相关的工具,使研发、测试、上线阶段的部署行为一致,监控策略一致,且被测试验证过。
运维标准不是凭空制定出来的,需要满足运维自动化相关工具的最低要求。符合运维标准的产品,能够更加方便地进行一键部署,与监控联动等,这样才使研发人员有动力往运维标准靠拢,更积极地使用运维工具,我们的标准和工具才能进一步得到。

转载于:https://my.oschina.net/hmc0316/blog/756648

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值