毕业后,一直从事着J2EE开发,每天面对的就是代码、业务、测试。除了找运维上线,基本运维和我没搭边。当然心中有信念,如果线上出了问题就求助运维。久而久之,感觉运维有点像7*24小时的客服,因为混迹在各个公司技术群里,所以经常听到各种事故在联系运维。
比如:
XXX页面不能正常访问了
XXX页面访问的时候特别慢
XXX数据库连接不上了
XXX页面数据显示错误
XXX表单提交不了,按钮点击没反应
…….
一个偶然的机会让自己也踏上了运维的路。。。以下就大概谈谈运维涉及的一些方面,笔者对运维的理解不深,很多地方也只是抛出运维面临的问题,想到哪就写到哪,讲的内容也比较片面,希望大家不要太介意,纯属让大家对运维有一个简单的了解
下面我就来,抛砖引玉。。。
1、设施服务
首先谈下机房,他有一个比较高上大的名字,互联网数据中心(Internet Data Center)。
机房里有机柜、服务器、交换机、存储、网线、光纤\防火墙、邮件服务系统、DNS服务器,路由,光纤配线架、数据配线架、语音配线架等等。以及一系列繁琐的事情,机器上架、设备调通、参数配置、故障处理等等其他各种。有一个特别有意思的东西:利用一些网卡都支持的功能,进行远程开关机Wake onLAN(WOL),俗称远程唤醒。
复杂的特性就不多说了,直接上图
Ps:好的运维,可以将机房打理的整整有条。
再讲讲网络,中国网络的核心层由北京、上海、广州、沈阳、南京、武汉、成都、西安8个城市的核心节点组成。理所当然这些核心节点的网络,肯定会比较好。。。关于网络的运营商,就比较多了。我们平时所了解的国内六大运营商指的是中国移动,中国联通,中国电信,中国网通,中国铁通和中国卫通。在IDC领域,中国电信无疑是业务规模最大网络资源最多的,华东沿海、华南沿海以及西南地区都是电信的主要覆盖范围;中国网通名列第二,网通的机房网络与电信“隔长江而治”,主要分布于华北以及周边地区;中国铁通位则列第三,主要资源集中在华北、东北;移动、联通这些也有少部分机房资源,不过一般是合作方式,机房规模也不大,拿电信少量的带宽。 各个运营商网络之间互通,会存在问题,可想而知多个IDC之间同样也会存在网络问题。我也终于体验了,你的项目被部署在不同的网络节点,带来的 “访问不了”“访问慢”问题排查点就多了。
当然现在云(如Aws、Azure、阿里云等)的兴起,屏蔽了idc很多底层的这些问题。
2、资源管理
首先服务器(虚拟机)管理, 关于操作系统: 系统补丁漏洞升级、内核微调、维护不同的操作系统、搭建不同的产品依赖环境等等,针对大规模的服务器,批量操作想想是不是特别过瘾?当然批量操作的工具也特别多,比如说puppet、saltstack、ansible等等,这样方便的工具,如果执行了删除这样危险的操作,后果也是很难预料的。再者就是计算资源,用虚拟化的方式去管理你机器上的硬件资源。简单点说,就是能把cpu、内存这些东西进行虚拟化管理。有一些商业软件,如vmware,互联网公司会用一些开源的软件,如cloudstack、openstack等云计算平台。这样做有什么好处了?当你某天找到运维说,你需要一台X核X G内存Centos服务器用来做测试,而运维利用这些工具可以很快的做出一台这样的虚拟机。
再讲讲存储资源,从存储解决方案(如RAID 5 是一种存储性能、数据安全和存储成本兼顾的解决方案),到一些 常用的一些分布式存储(这种机制可以很方便的进行磁盘挂载、扩容、回收、备份等等)。也会有一些开源的软件,如ceph、swift存储等等。存储的几种类型,如对象存储:存储一个视频文件或者图片文件,返回给用户的是一个访问的链接地址。块存储:简单的理解为一块可以移动、方便扩容的磁盘。分布式文件存储,可理解为一个超大型的文件系统,可以存储任意类型的文件,可以把一个超大的文件,切割成多份放在不同的服务器上,然后进行分布式计算,比如说hdfs)
最后讲讲业务管理,不同的业务对应到不同的服务器,当一服务器上部署多个业务,或者还有复杂的业务依赖关系,想想看挂掉后带来的后果。如何去维护,并且快速恢复,这对运维人员的troubleshoot,都要求很高。尽管有时候一个很简单的问题,解决它只需要1分钟,但是定位它就没那么easy了。举个简单场景的例子,假设有A、B、C、D四个系统,A依赖B,B依赖C,C依赖D,如果C挂了,该怎么办?用户在使用A时,发现用不了C的服务,如果这是一个秒杀活动或者是限时活动,就有可能会导致雪崩效应,因为用户往往是发现用不了服务,就会不停的刷新页面,导致C的整个应用集群挂掉。可以脑补一下那位正在排查问题的运维同学额头上的汗珠。。。
最后借用一个别人的管理资源的图
4、数据库
维护数据库,也并不是简单的增删改查。就拿oracle与mysql来说。
oracle的行级锁,比较好,并发性能自然就要好很多,对事务支持的比较好,事务的隔离级别也支持的比较好,回滚、备份与恢复机制也做的相当不错。并且还有比较好用的查询优化器,主要有rbo(如hint)与cbo(如分区表和分区索引)的方式,目前比较推荐的是cbo优化器。商业化的数据库,比较重量级,要去了解的东西也特别多,当然好用的工具也特别多
再谈谈mysql,首先上个主从,主库负责写入数据,从库负责数据库读的操作。
原理图很简单,如下:
但是要做的事情却不少,我们先要确保数据库的数据同步,并定时备份,全量备份会锁表,不能写入数据。这个锁的问题,也是运维经常要处理的事情。如果仅仅只是全量备份数据,那就会丢失数据,因此要思考如何热备份,主从的架构,如果是主库挂了又怎么办?面试的时候还经常被问到,如果XX多少的并发同时访问数据库,该怎么优化?你能找到这个瓶颈在哪里吗?每秒的TPS(每秒处理的事务数)、QPS(每秒处理的查询数)有多少?
最后谈谈其他类型的Nosql数据库,它们常用来缓存或处理一些大数据等,这里面的组件也特别多,对于不同的业务场景选取的组件也不一样,你能举出它们各自的适用场景吗?比如Cassandra、Mongodb、 Redis、Memcached、 Riak、Membase、Neo4j 、HBase、CouchDB…..为了系统有大幅度的响应速度提升,总得来几个吧,这又得多大的维护成本,首先得高可用搞个分布式吧?然后热备、灾备、迁移。。。这些工作也得做全套吧!当然还时不时会有点诡异的故障要排查!!!
5、安全
这个问题在任何一家企业,想做,可以做得很大很大,当然也可简单做,但是如果做不好,甚至会让公司倒闭。数据的安全对一个公司来说,真的很重要。做安全不仅需要了解整个公司的大局形式,而且还得深入到代码实现细节漏洞。不仅要确保公司的安全,还得抵得住入侵。比如说自己弄个弱密码库,不停的去撞库,确保公司内部没有弱密码。记得有次服务器ssh使用了弱密码,被人登录后弄了个病毒软件在不停的向外发起访问请求,流量直接达到了GB每秒。对于购买了云主机的服务器,这些流量的产生是会直接生成很高费用的。或者再搞个Sqlmap,弄弄有没有什么sql注入,这是个一直被强调,一直会发生的问题。再来个端口扫描的工具,做做渗透测试。突发性的安全问题,被人DDOS、域名劫持、xss攻击、GetShell。偶尔还搞出个openssl心脏出血,然后再来个Struts2漏洞。互联网的安全不容小觑,新闻中经常看到各种公司被干(如最近京东数千万用户12G数据疑泄露),总感觉自己的隐私数据每一天都在裸奔当中?
以是一张OSSIM的图(open source security information management:开源安全信息管理系统)
6、部署
现在终于体会到了,互联网快速迭代的开发模式,需要不停的持续交付,开发出某个新功能立马上线能看到效果,每一次生产环境部署的都心惊胆战。生产环境故障频出,整个人都不好了!如果一个开放人员写出不好的代码,上线之后问题频出,需要查看生产环境日志。每天leader各种群里催促紧急bug修复,研发不停催促,需要赶快上线,这压力已经够大。。。而且时不时各种突发状况,被各种问题打断后仍然冷静的连接之前思绪troubleshoot,到底是经历了什么才可以练就如此好的心态。所以我们也只能躲在了夜深人静的夜里,一个人偷偷的上线,发现问题,立马回滚。
7、日志
对于各类日志,一套完美的分布式日志收集与查看的解决方案,显得尤为重要。主要包括有安全日志的收集、访问日志的收集、应用程序的日志收集等等。要把各个服务器的上的日志收集起来进行分析,对于问题的排查与定位速度,可以说是几何倍的增长。就简单谈谈,目前了解到ELK这样一套比较好的方式,
Logstash负责收集日志,然后写入到ElasticSearch,最后通过Kibana展示出来。虽然运用开源软件的特性,配合上文档可以很快搭建一套环境,但是其中要了解的细节确实太多太多。
比如Logstash日志切割问题?数据量比较大时,有性能问题,怎么办?怎么样配合其他的日志收集方式(如syslog、flume等等)?怎么结合其他的消息中间件(如kafka)?后面如何接入Storm这种流式计算框架?又如何配合hadoop做离线的计算?是否有网络问题?
再谈谈Elasticsearch,一个基于Lucene(lucene原理与代码分析)全文检索的分布式框架。全文检索主要是针对非结构化的数据,那非结构化的数据又是如何存储,并被快速检索的?倒排索引又是什么?首先得去了解一些底层的实现细节,因为当你使用Elasticsearch时,要维护集群的稳定性,你就会发现数据量变的大时,需要不停的去调优,同时增加了运维的难度。。。
Kibana负责展示,自已可以定制很多个性化的dashboard面板。如下图
8、报警
这个也挺有意思的,对于开发或者是运维来说,如果线上发现问题,能第一时间通过短信或者邮件、语音的方式告诉大家,是不是一件很爽的事情?当然这里也有很多开源的解决方案,如zabbix、nagios等。报警的延迟性、精准性、稳定性也给运维人员带来了很大的挑战。监控的范围很广,当然基础的运维监控也必不可少,比如机器Down了、网络不通、访问延迟高、磁盘满了、服务器负载过高、tomat挂了、页面5XX过多等等,每一个警告都需要运维去处理好。目前,应用性能检测(Application Performance Monitor (APM))也在逐步的兴起,监控的粒度也特别细,就拿一点简单的来说,可以检测到某个项目中某一行代码的响应时间。有一些工具,比如说大众点评开源的Java实时应用监控平台:CAT。有兴趣的同学,也可去试试听云或者是OneAPM的产品。
附上一张zabbix监控图表截图
9、自动化
最近这些年,比较提倡运维自动化。有一个称呼叫DevOps(英文Development和Operations的组合),当然跟Google的SRESite Reliability Engineer (网站可靠性工程师)相比,相差还甚远。说的通俗点,就是开发一些方便的工具,提供给运维使用。那怎么样才算做到自动化了?首先得解放运维人员,其次就是方便开发人员。自动化运维体系比较大,比方说流程规范、部署规范、配置规范等等。
这边就简单的讲一讲,比如说
资产管理系统:用系统把物理资源与逻辑资源进行统一管理
自动化部署:可以很方便的一键部署你的应用到服务器上
故障自动恢复:检测报警,自动恢复故障
数据库与缓存管理:支持快速申请数据库资源、恢复、回滚等操作
配置管理平台:通过界面推送全网配置或者安装环境
等等其他。当然你也可以鉴于自己对于运维的理解,快速开发出一些方便实用的工具。
运维问题特别多,经常需要去利用搜索引擎。附上一些查询的简单语法
精确查找—— 使用双引号。表示查询词不能被拆分
如“点融科技”
不包括某个词——使用减号。使用+ 进行限制性检索,相当于And
如搜索包含“点融科技”,不包含“风险”的内容 eg:点融科技 -风险
如 查询同事包含“水果”与“苹果”的内容 eg:水果+苹果
并行搜索——两个词用“|”隔开。同时搜索多个关键字
如 网易新闻 | 点融网
“site:”+“网站名”。
如在点融网的网站下搜索如何理财。
eg:site:dianrong.com 如何理财
eg:site:http://pan.baidu.com/ java视频
指定格式搜——在关键词前面加“Filetype:+格式”
如搜索包含点融的pdf文档eg:Filetype:pdf 点融
只在标题中出现关键词——前面加intitle:
如在网站标题中出现“知乎”与 “点融网”的title eg:intitle:知乎 点融网
Intext–正文检索.和标题搜索相比,正文检索的搜索目标更明确,而且适合于一次性搜索同一主题的不同分支内容
eg:intext:点融网招聘
Inurl–直攻URL链接
如 搜索包含” 点融科技” 且url中包含photo的内容eg:点融 inurl:photo