做一年运维后


从去年的3月份进入现在的公司,我已经干了一年多了,在这一年多里,我学习到了许多的东西,不过最珍贵还是宝贵的线上运维的经验,我现在也是一名有着实操经验的运维了。

不过慢慢也遇到一些瓶颈,想着换一个工作环境。而且也有一个原因,就是过了一年了,涨薪的事情好像被他们遗忘了一样,都没有提及。这个就更加促使我换工作了。

今年过来,一直都有筹划找工作,断断续续在苏州面试了几家,都不太好,不是我看不上他,就是他无法达到我要求的薪资,总是一对矛盾。

后来,我找铭哥聊了聊,铭哥的建议是直接去上海吧,苏州毕竟是二线城市,上海不同,机会多,待遇也高。考虑再三,决定去上海。

经过一轮又一轮的投简历,等面试。终于有两次面试的邀请,准备了下,去上海面试去。

第一家是蚁城,是一家提供商城解决方案的公司。环境还不错。一面是技术组长,总体来说我表现还不错。

其中一个问题是,有三台web机器,开发只部署了其中一台机器,如何把将代码同步到剩余的web机器上。我的回答是使用rsync 的后台方式,或者ssh 密钥建立三台web机器的信任关系。

接着问我说,还有其他的方式么,我想了下,又给出一个方案,将开发部署的web机器的代码目录通过NFS共享出来,其他的两台机器来挂载。但是,技术组长对这两种方案,好像都不是太满意。

ps:其实,咱们课程里面的有很多解决方案,比如你可以讲铭哥讲过的shell项目《分发系统》,也可以说通过自动化运维工具(salt或者ansible),当然还可以说第三阶段的课程jenkins。

快要结束一面的时候,我问了他一个问题,如果有三台tomcat机器,用户的session如何共享?

他给我的答案是使用阿里云的load balance的session 会话粘连,我又接着问,如果是自己搭建呢,他回答说,可以使用nginx的IP-hash功能,固定的IP会链接到固定的tomcat机器上。

我说这个方案有一个缺点,会导致其中一台tomcat机器负载比较高,因为现有网络的公网IP大都是公用的。

最后,我提了一个方案是,可以使用memcached搭建一个session共享存储层,将三台tomcat机器的session都存储在这个共享层中,而且memcached是nosql,容易横向扩展。

接着就是二面了,是cto来面试的,cto比较nice,先问了对LNMP的架构熟悉么,我心里就在偷笑了,在铭哥的课程里,讲的非常细,我自己在面试前也复习过,所以根本不是问题。这家公司的offer我拿到了,但是因为有更好的选择,我没有选择这家公司。

第二家公司主要是做云计算以及大数据的解决方案的。我面试的部门主要是做大数据,负责给咪咕视频提供大数据的解决方案。但是这家公司会比较特别,三面都是电话面试。

一面是一位来自总部的资深工程师给我面试的,电话聊了1个小时左右,就是聊一些技术,mysql的高可用,redis的高可用,nginx, openresty, django 聊了许多,因为时间比较久了,我也不记得问了我什么问题。但是聊完之后,让我做了一个线下题,以下是线下题:

1. 编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。

2. 给定一个正整数数组,前半段非递减、后半段非递增,要求从小到大不重复打印数字。给定时间复杂度O(n),空间复杂度O(1)

input: Array={1,2,2,3,5,4,2} output: 1 2 3 4 5
input: Array={1,2,2,2} output: 1 2
input: Array={5,3,2,2,2,1} output: 1 2 3 5
input: Array={1,1,1,1,1} output: 1
input: Array={1,2,1} output: 1 2

第一题,我很快就解决了,不过,这第二题,可是把我难坏了。在网上找了许多资料,终于是搞定了。

之后是第二面,第二面也是一位总部的一位资深的工程师。我们主要聊了发布方面的事情,了解什么是灰度发布么?

我的答案是灰度发布就是正式发布生产前,新建一个生产环境,把新的代码部署到新的生产环境,然后通过前面的负载均衡把现有生产环境的一部分流量倒入到新的生产环境,防止新版本的代码出现大的bug导致用户都无法正常使用。

最后是第三面,第三面的面试官是上海的技术总监。他和我说,因为前面已经有两位工程师和你聊过了,那我们就聊聊一些技术上面的细节。

1 生产服务器的磁盘快要满了,你上线查看磁盘使用量,发现了有一个大的log文件,你将这个文件删除了,之后发现文件系统并没有释放这部分空间,是什么原因?

我的答案是,使用这个文件的进程并没有结束,基于Linux系统的特性,被进程占用的文件是不会被释放的,可以使用lsof | grep deleted 来查看有那些文件已经被删除,但是没有被释放的。

解决这个问题的方法有 (1) 结束掉该进程,(2) 如果这个进程不能被结束的话,可以给这个进程发送一个日志轮转的信号。

2 现在有一复杂的分布式系统,他们之间通过api调用去相互联系,A -> B , B->C and D , 这样的系统,让你来选型监控系统,你会选择什么?

我的答案是可以选择prometheus来监控这样的复杂分布式系统。

3 现在研发说线上的服务器卡,你会通过什么方式去排查这种问题?

(1). 我会使用w, top , free,vmstat 查看Linux系统的负载,CPU, 内存,是否存在瓶颈。

(2). 我会使用iostat , iotop 查看磁盘的IO 是否存在瓶颈。

(3). 我会使用sar -n DEV 来分析网络带宽方面是不是存在瓶颈,带宽是不是不够了等原因。

三面结束了,我也顺利拿到offer , 我最终选择去后面这家,不仅仅是因为他们给我13k的薪资,同时也是因为如果我去这里,在技术领域会有更好的发展。

好了,说了这么多,这次的求职分享到这里就该结束了。谢谢!