经过一年多在一家私企混乱的运维工作后,我选择跳槽。跳槽总是一件很让人纠结的事情,既舍不得当前的状态,又自感不能继续在原来的地方虚度光阴,一年多感觉自己成长太慢,所学太少。最主要的原因还是因为我不喜欢当前所做的工作,想要换个环境多学东西,况且这边的待遇也不行。想要跳槽的那段时间,心情总是很浮躁,毕竟是自己刚毕业正式工作的第一家公司,为了进入公司,自己也是花了很多时间复习知识,准备面试。但是来工作以后却发现好多东西都没有接触的机会,顿感失落。期间我抽空出去面试过几家公司,但都因为我的工作中很少接触,或者我自己私下研究过,因为没有经常用而不能说出个所以然来。Linux的基础知识,性能监控的命令,F5,LVS,HAproxy,Nginx,Squid,Varnish,MySQ,HeartBeat,DRBD,iptables这些都没有怎么接触过,基础命令由于工作中也没有经常使用,所以面试都很失败。原来,我在这个公司呆了一年多,出去以后一点竞争优势也没有,想跳槽的欲望更强了。这里也想和大家分享一下经验,好好制定自己的职业规划,不能无谓地浪费光阴。后来联系了一家外企,笔试题简单得让我很不敢相信,全是基础命令,虽然有些命令我不记得怎么用了,但是总体来讲,确实很简单。面试的过程中,我们经理一再强调遵守流程的问题,工作中主要就是监控服务器和服务,以及做一些SA相关的工作。面试的过程很顺利,后面就到了这家公司工作。刚开始特别不习惯,因为平时所作的工作都比较繁琐和简单,没有那种我想要的技术氛围,还有就是要严格遵照工作流程去办事,期间也有一些浮躁,感觉到这边也学不到什么。但是后面随着对产品环境的了解,我改变了原来的想法,这边还是有很多值得学习的,虽然我们日常主要以监控服务为主,但是所有的产品环境机器我们都有访问权限,虽然不需要我们配置,但是许多配置文件都可以查看,再加上我们平时的空闲时间比较多,也够自己学习了。像PXE,DNS,NFS,memcached,squid,FTP,DRBD,HeartBeat,MySQL,hadoop,负载均衡F5在产品环境中都在使用。空闲时间也够自己研究了。从私企到外企,运维工作方面,明显感到有很大的不同,抛开企业文化以及其他人事方面来说,单从技术管理思想方面就不一样。外企很注重规范化和流程化以及权限分级制度,如从服务器命名,到服务器访问权限的控制,以及服务器账号的UID,GID,Username,Groupname,服务器硬件资源,软件资源的管理都有严格的标准。下面我就一一列举我在工作中的心得。

一。关于运维流程。

公司有三种环境,产品环境(Production),测试环境(Stage),开发环境(Development)。所有的服务器资源差不多都是由开发申请(需要提供文档说明是是运行什么服务,需要多大配置等信息),然后IT(SA和Network的总称)提供相应的服务器资源,包括配置网络信息和磁盘分区等初步设定,最后由我们所在的部门NOC(国外很多叫NOC,就是监控和管理服务的部门,Network Operation Center)参照开发提供的文档做最后的配置。在正式部署到产品环境之前,开发需要在开发环境上测试通过,然后再由QA在测试环境上通过,最后才能到产品环境。NOC部署完服务后,再由开发确认没问题就正式上线。后面的工作就是NOC监控相应组建的服务器磁盘,内存,和服务状态,有问题的就处理一下,处理不了的交由开发查原因。开发任何关于产品环境的需求都需要经过NOC部门同意由NOC部门操作完成。所有的工作都通过IT流程化管理软件记录和审批。NOC在产品环境上作的任何操作都需要在内部IRC系统上进行标注,IRC系统有相应的日志,可以随时查看相应的记录。这一点,我觉得是比上一个公司做得好的地方,以前运维人员登陆产品环境作什么操作直接就在公司内部聊天系统RTX上吼几句,加上群里又聊一些工作以外的东西,搞得很混乱,非常不便于查找,也不利于提高工作效率。

二。关于产品环境和运行软件。

     公司主要是做手机平台软件,所以,开发语言主要是Java。无论是Web和Application都是以Java开发为主。操作系统主要是CentOS5.6以上版本和RHEL5,少数是RHEL4,差不多每台服务器上都运行有JDK1.5或JDK1.6 和Tomcat5或Tomcat6.由于公司主要不是做网站业务的,所以架构和网站架构有很大的不同。用户使用手机客户端软件后,点击相应的按钮,就会通过网络连接到相应的server上。刚开始看到产品环境的架构图,感觉就像迷宫一样,密密麻麻的全是各种Java Application组建。所以说,我们日常工作中除了linux系统本身之外,最多的就是和jdk和tomcat打交道。有相关服务的heartbeat(心跳)出现错误,就做做java 的threaddump或者heapdump。平时也会监控一些服务器的JVM。除了必须软件之外,多余的软件都没有安装,确保服务运行环境的安全。

由于产品环境运行的组件特别多,每个组件对服务器的硬件要求以及软件版本都不太一样,况且每个组建的服务器数量也不是太多,所有很难像一些网站那样去用puppet进行统一配置和管理。由于大部分服务的主要文件就是日志文件,所以大部分服务器只配置了一块硬盘,三个分区/ , /swap , /boot。没有其他高级的分区设定。

三。关于资源管理。

公司内部有资源管理系统,上面显示相应的主机名,IP地址,所属VLAN,网卡信息,是物理机还是虚拟机,以及重启服务器需要登录哪台特定的机器和特定的端口。

这里说明一下,平常中我们重启服务器和可以通过reboot,shutdown等命令来重启服务器,但是如果这些命令运行后,机器重启后起动不来怎么办。在一般情况下,服务器有远程控制卡,通过远程控制卡来重启服务器。我们公司是使用的一种类似于交换机的设备,有很多端口。将这种设备放置到机柜上面,然后不同机器连接到不同端口上。国内好像没哪个公司用这种东西,由于在美国机房,我也没见过具体长啥样。平时我们要需要重启服务器就通过它重启。通过它还可以更改服务器前面的LED显示信息。应该大多数人都见过,好多服务器前面有有一个LED的小屏幕,滚动一些信息,这主要是为了机房维护人员方便查找对应的机器。所有的服务器增加和减少都需要记录到相应的文档中。公司内部有wiki系统,我们NOC部门的所有操作步骤都记录在wiki上,其他部门的有些信息也会记录到wiki上。在上个公司呆的时候,由于公司服务器没有设定内部DNS,全是用的IP地址,特别容易搞混。为了能够方便管理,最好是不要直接使用IP地址管理服务器,应为人们对名称的认识远远高于对数字的认识,在域名命名上最好是一眼就能分清楚这台服务器位于哪个机房,作什么用途的,以及编号是多少。如beijing-web-01.abc.com 。一看到这个域名就知道这台服务器位于北京机房,是做web服务的,编号是01。还有就是相应组建用户名,组名,以及UID,GID都统一化,如提供地图下载的服务,将用户名统一设置成mapuser,UID统一为506,归属于appuser这个组,提供语音服务,将用户名统一设置成voiceuser,UID统一为507,也归属于appuser这个组。并且相应的服务只用由相应的用户名启动或停止。

四。关于产品环境登陆权限的控制

网上有些文章在讨论到底要不要给开发人员的产品环境登陆权限。在很多外企,答案非常明确,只能给相应开发人员只读权限。比如说,开发能够看到他们开发的程序在产品环境的运行状态,以及运行日志。因为开发人员开发的程序经过开发环境和测试环境通过后,交由NOC部门后,除了程序本身以外的所有操作职能都是由NOC负责。所以一定要对开发人员进行权限控制。对于NOC内部的人员也是有权限级别的,这一点上,IT部门把sudo这个我以前自己玩linux的时候从没重视的功能发挥到了极致,不同权限在产品环境上能运行的命令都是由sudo来控制,通过sudo -l可以查看能运行哪些命令。最开始运维人员都是直接采用相应的程序用户名直接登录产品环境,但是这样做具有一定的风险,经常使用程序用户名登录容易暴露密码。由于需要登录产品环境的人员比较多,也不可能在每台服务上创建所有需要登录人员的账号。所以后来发展到采用LDAP账号登录+sudo的方式来管理相应的服务。前提是相应的LDAP账号具有登录产品环境的权限。如我想登录到beijing-web-01.abc.com这台服务器上去重启web服务,这个服务是需要用webuser来重启的,那我就想用我的LDAP账号登录这台机器,在通过sudo切换到webuser进行操作。这样就加强了系统管理的安全性。我们这边是用Windows AD+OpenLDAP+NFS来实现的。Windows域账号是所有登录环境的统一密码,然后OpenLDAP会去同步Windows AD账号信息,NFS主要用来存储登录用户的主目录。通过LDAP设定登录到一台服务器后就可以自动挂在NFS服务器到这台服务器。这样每台服务器就不用为每个用户建立相应的目录,节省空间。推出这台服务器后,NFS服务器自动卸载。以后我为写篇文章详细讲解如何通过Windows 域账号去进行linux服务器的统一验证。

 

     -