`

一个开发眼中的运维

阅读更多

 

个人看到分享,不完全是这样嘿嘿  酷

 

在云计算大数据时代,开发和运维的结合变得越来越重要。谈如何把在开发上的运用抽象思维方式运用到运维领域。

1. 运维不是什么?

运维不是打杂的,运维不是客服,运维也不是服务开发的,但要做好合作。

2. 运维是什么?

运维服务于整个产品,保证架构合理,系统稳定。运维只对业务稳定负责,所有的工作都是奔着这个去的。

3. 你如何写程序,写程序的目的是什么?

程序是为了完成特定的功能。为了完成特定的功能,程序需要申请资源、使用资源、管理资源,功能完成后,还要释放资源。说到底,就是跟资源打交道,和资源打交道的工具是“编程语言”。
资源包括什么?内存、CPU、磁盘、网络、文件描述符、外部API、缓存、数据库等,编程语言是如何管理资源的、合理的算法/架构保证了资源的合理使用,malloc/free分配内存、connec、close使用网络等等。

4. 什么样的程序算好程序?

正确的程序算好程序。
1)逻辑正确,使用资源尽可能的少;
2)没有bug,没有把机器资源耗尽;
3)稳定性好,不会异常退出;
4)可用性高,有HA方案,不会因为一台机器(或一个进程)无法提供服务,而影响整个系统的服务;
5)没有单点是基本要求;
6)容易扩展,只需要简单的增加资源(CPU、内存、磁盘、机器等)就行,不需要太多人工迁数据、修改配置等;
7)容易维护,包括容易配置、容易部署、容易监控等。

5. 如何写出好程序?

1)什么样的程序不出错?代码少的程序错误少,逻辑简单的程序错误少,需要管理的资源少的程序错误少。要复用代码,减少代码的数量。
2)要抽象,分层,内聚,解藕,简化逻辑,隔离资源,才能简化逻辑,隔离资源,限制错误。
3)没有持久状态的程序好扩展,没有持久状态意味着上下线机器不需要迁移数据。没有状态的程序也很容易做HA方案。
4)配置简单,日志丰富,能提供程序状态查询的程序好运维。
5)但程序不可能没有数据,通过集中管理数据库,让数据尽量只读,预加载数据等手段隔离逻辑和数据,也能让扩展变的容易。

6. 系统是什么?

1)系统是我们运维的目标,不了解系统是什么,就不知道如何运维。
2)系统是网络,是机器,是程序。是把网络,机器,程序组织起来的架构。
3)机器角色应该是尽量单一的,架构应该是数据流简单的,基础业务服务化的。
4)系统是动态的,运维系统首先考虑的不是当下成本,而是系统变更(扩容,上下线机器)的成本。
5)运维必需是简单的,要考虑的一个新手,如何能尽快上手工作,而不是冗长的文档和复杂的培训。

7. 写程序和做运维是类似的,甚至一样的!程序提供单一功能,而运维搭建,维护的系统提供全部的功能,开发人员开发的程序只是整个系统的一个部分。

1)从某个角度说,开发人员做的事情越少,系统越容易稳定,因为开源的总是更靠谱。这是减少代码,也是复用。
2)但运维却理应比开发更不容易犯错,因为运维只需要管理资源,而不需要应对复杂的业务逻辑。
3)这是个矛盾,因为开发负责的复杂业务逻辑,是运维负责的系统的一部分,前者不稳定,后者也别想消停。

所以运维不懂开发,至少要懂如何控制复杂度,如何隔离故障,如何服务降级。出色的运维人员,只要精通一门语言,必然也是出色的开发(反之亦然)。但什么是出色的运维呢?大部分运维人员,只是一个熟练的操作工人。出色的运维必然更了解系统(原理),这要读很多书,做很多思考,有很多实践。
只看这个cat bigfile.txt | parallel --pipe wc -l | awk "{s+=$1} END {print s}"你能不能想出parallel加速的原理是什么?

8. 你是否了解你运维的资源?

1)CPU高意味着什么?你是不是应该先问问是sys,user,iowait这三个的哪个高?是单个CPU高,还是整体都搞?
2)你是否了解有的程序CPU使用率90%就有问题了,而有的350%了还没问题?
3)load高意味着cpu高吗?内存耗尽导致load高的原理是什么?内存耗尽回导致io高吗?

9. 是否正确的监控了资源?

监控了磁盘使用率,是不是也监控了磁盘的io能力,raid卡呢?磁盘损坏呢?监控了网卡使用率,是不是也监控了丢包率?

10. 资源是否一定对应硬件?

1)CPU,内存,磁盘,带宽都有对应的硬件,那些没有硬件对应的资源呢?文件描述符,端口数,进程数是不是资源?
2)路由表,iptables,cron是不是资源?
3)MySQL主从,第三方REST接口是不是资源?

11. 为什么要尽量把一切抽象为资源?

还记得刚才说程序要讲抽象么,为什么linux一切皆文件?一切运维对象都抽象为资源后,就可以用尽量统一的方法来管理(配置,监控)。
如果新上线一台机器无比容易,为什么还要费尽修复删除的/usr目录呢,把它当成新机器重做上线就行了。

12. 运维原则:

1)线上变更必需走配置管理。线上系统对任何人应该是只读的,只有配置管理程序有权写。这样保证了,变更是可重复的,可复制的。手工加路由,手工修改文件权限,手工配置ip,手工配置nfs,手工起虚拟机等等。一切在线上手工做的操作,于团队都是无益的,因为团队失去了一次改进配置管理的机会。任何操作不是想我就这一台机器,而是想我有1000台机器怎么办。
2)上线业务必需先问,如何保证HA,如何扩展,如何运维/监控。这三个问题不解决,谨慎上线,当然上线必需使用配置管理上线。
3)隔离复杂度,要简化,抽象。抽象指角色抽象。运维眼中没有计数用的mc,和缓存用的mc,运维眼中只有mc,于是所有的mc都来自mc池,mc池通过puppet配置,创建mc的过程编程了简单的puppet配置。一旦把自己管理的所有业务抽象/分拆为几种有限的“业务”,缓存、mysql、httpd等,一切就简单了。例如我们有缓存池、数据库池、redis池、httpd池。(参考:4、5)
4)先解决问题,然后是以后如何避免此类问题,后者更重要。
5)不犯第三次错误(重复的问题不出现第三次)。第一次算不知道,第二次算不小心,第三次特么是故意的吧。如果每个问题都能彻底有效解决(最终落实到配置变更和监控),问题就会越来越少。
6)时刻思考如何“偷懒”,运维越清闲,系统越稳定。

13. 配置管理是如何管理资源的?

1)包,所有线上的软件/脚本都是通过(rpm)包管理的。
2)文件,所有的变更“持久化”都是通过文件。程序的配置文件,sysctl,iptables,route,cron等凡是能用配置文件控制的一切。
3)进程,所有的进程都是用配置管理启动的,或者通过配置管理写文件到系统启动目录,例如rc3.d。

你能相到的一切,无论是配置keepalived,还是添加用户,都抽象为这三个。如果不能抽象为这三个,请再思考两个小时。
如果系统可以由这三者全部控制,而这三者又全部写入了配置管理,这意味着按照配置管理配置出来的系统就一定是对的。扩容,升级,机器的上线,下线从此该有多容易。而运维人员,可以通过配置管理,一览整个系统,通过持续改进的模板,配置更容易学习,不容易出错。

14. 监控

1)监控的正确性、业务响应时间也要同等关注的。
2)基础监控要全面,但不一定实时报警。如果业务不受影响,又何必半夜起来处理宕机呢?如果业务有问题,全面的监控会帮你发现问题的蛛丝马迹。

如果memcache偶尔响应慢,你怎么能想到是swap导致的呢?全面的监控可以帮你发现这一点。把业务逻辑抽象为资源,可以统一业务监控和基础监控。(监控如何算全面,参考8、9)

15. 运维技巧

1)重装操作系统,使用puppet重新配置,是系统恢复到正确状态的最佳途径。理论上,新装的机器使用puppet配置后一定是能用的,否则,就是puppet写的有问题。
2)区分无状态的机器和有状态的机器,尽量把状态集中,然后集中精力运维这些有状态的机器。
宁可通过网络把状态集中也要尽量让机器避免有状态,无状态的机器非常好运维。

分享到:
评论

相关推荐

    开发和运维的关系,实施和运维的区别.docx

    开发和运维的关系,实施和运维的区别.docx开发和运维的关系,实施和运维的区别.docx开发和运维的关系,实施和运维的区别.docx开发和运维的关系,实施和运维的区别.docx开发和运维的关系,实施和运维的区别.docx开发和运维...

    redis开发和运维

    redis开发与运维 比较好的redis入门书 讲的很详细 !!!!!

    redis开发运维指南.pdf

    redis 开发运维指南 全套宝典 包含开发标准开发设计规范,上线部署规划 常见问题处理 高可用及集群 开发运维人员的必备宝典

    软件开发+运维方案投标资料四篇

    软件开发+运维方案投标资料四篇

    redis开发运维实践指南

    redis开发运维工具手册,适用于redis开发和运维人员。

    Redis开发与运维教程下载.rar

    Redis开发与运维视频教程,本套教程基本上涵盖了redis的开发和运维工作中大部分的知识点,从redis的原理到redis的使用,再到redis的常见使用场景,再到redis的集群与故障处理。期望通过本套教程,可以帮助正在redis...

    DevOps(开发-运维)会用到的所有软件.zip

    DevOps(开发-运维)会用到的所有软件.zip 编排:Kubernetes、Core、Apache Mesos、DCOS 持续集成(CI):Bamboo、Hudson、Jenkins 代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion 服务注册与发现:...

    小程序开发及运维服务合同.pdf

    小程序开发及运维服务合同.pdf小程序开发及运维服务合同.pdf小程序开发及运维服务合同.pdf小程序开发及运维服务合同.pdf小程序开发及运维服务合同.pdf小程序开发及运维服务合同.pdf小程序开发及运维服务合同.pdf小...

    Hadoop开发、运维和调优实战考试资料.pdf

    Hadoop开发、运维和调优实战考试资料.pdf

    App后台开发运维和架构实践.haozip01

    App后台开发运维和架构实践.haozip01.zip App后台开发运维和架构实践.haozip02.zip App后台开发运维和架构实践.haozip03.zip App后台开发运维和架构实践.haozip04.zip 为了更方便的合并分卷文件,本说明文件请勿删除...

    App后台开发运维和架构实践.haozip04.

    App后台开发运维和架构实践.haozip01.zip App后台开发运维和架构实践.haozip02.zip App后台开发运维和架构实践.haozip03.zip App后台开发运维和架构实践.haozip04.zip 为了更方便的合并分卷文件,本说明文件请勿删除...

    App后台开发运维和架构实践

    《App后台开发运维和架构实践》通过阐述移动互联网中 App 后台开发的特点,梳理了 App 后台开发中会遇到的各个技术点,给出了生产环境常用软件的实战运维经验总结,剖析了常见 App 后台技术架构设计,为读者呈现一幅...

    基于 python3+django 开发的一套 web 可视化的运维自动化项目源码.zip

    基于 python3+django 开发的一套 web 可视化的运维自动化项目源码 基于 python3+django 开发的一套 web 可视化的运维自动化项目源码 基于 python3+django 开发的一套 web 可视化的运维自动化项目源码 基于 ...

    python开发运维程序员求职面试通用简历.docx

    python开发运维程序员求职面试通用简历.docxpython开发运维程序员求职面试通用简历.docxpython开发运维程序员求职面试通用简历.docxpython开发运维程序员求职面试通用简历.docxpython开发运维程序员求职面试通用简历...

    运维开发系统介绍.xmind

    一个互联网产品的生成一般经历的过程是:产品经理、需求分析、研发部门开发、测试部门测试、运维部门部署发布以及长期的运行维护。 运维,本质上是对网络、服务器、服务的生命周期各个阶段的运营与维护,在成本、...

    开发-运维-开发,收获与感悟

    对系统线上运行状况了如指掌 线上操作无小事 遵守流程 风险意识,一切操作均可能失败 注意日常操作的整理与收集 老大是用来背黑锅的 ...注重总结:你会在同一个水沟前跌倒两次吗? 及时反馈、指导开发

    DevOps开发运维一体化平台建设解决方案共36页.ppt

    DevOps开发运维一体化平台建设解决方案共36页.ppt

    Redis开发运维实践指南

    Redis开发运维实践指南电子书 支持PDF/mobi/epub多种格式

    开发运维:潜在风险以及如何实现目标

    本电子书面向所有的开发经理、运营经理及开发运维经理。无论您是开发运维的新手,还是仍在考虑开发运维转型对您的组织有何帮助,这本电子书将为您剖析为何开发运维如此重要、领军者有哪些制胜之道,并提供了关于如何...

Global site tag (gtag.js) - Google Analytics