我:我的简历,您先看一下。

我:我先做个自我介绍吧。我叫加加林,上家公司是在北京XXX,上家公司是给山东体彩的机房做机房维护。那里有2套省级系统,一个山东,一个海南。我们给它做维护。我去的时候,已经有山东。在去年56月份,又上线了海南。然后,他们上线的时候,我是跟着一起上线的。大体就是这么一个情况。因为海南和山东的架构都差不多,我就以海南为例吧:

  海南系统分成三大块:一块是体育总局,属于线下×××站的投注之类用的,分成骏彩和科技中心两部分。然后,另外一块是我们手机app,分成一些模块:前端模块、后端服务的,还有子帐户。每个模块有多台服务器构成高可用,前端是2dell r420组成高可用,nginx+keepalived;后端的,还有子帐户模块,一共6台服务器,又是一组集群;还有后台的web服务器,2r420组成高可用。还有一块是支付的,分成建行和支付宝,这两个金融机构分别提供接口给我们的子帐户连接,用于投注和资金兑付。

  大体基本就是这样。

  山东和海南大体一样,共用一个机房,共用相同的网络,共用一套硬件防火墙。

  就是这样。

面试官:你觉得你的运维水平,属于那个范围阶段?

我:怎么说呢,我做运维有4年,前2年是监控,后2年算是正儿八经的运维。我感觉,肯定是有经验的。

面试官:我看你写的这个脚本,你感觉有问题吗?tomcat这个脚本

【简历最后我附上的脚本】

脚本:一键重启tomcat服务脚本

cat /server/scripts/tomcat_restart.sh
#!/bin/sh
. /etc/init.d/functions
/application/tomcat/bin/shutdown.sh
sleep 5
 
ps=$(ps -ef|grep java|grep -v grep|wc -l)
if [ $ps -eq 0 ]
then
 /application/tomcat/bin/startup.sh
else
  echo"please closing tomcat"
  break
fi
 
sleep 2
 
if [ $ps > 0 ]
then
  action"starting tomcat" /bin/true
else
  action"starting tomcat" /bin/false
fi

【我还是看了看】

我:没有问题啊

面试官:没问题……如果它单独在上面……你是通过java程序判定的。如果它跑的是对应的一些jar包应用,这不就全部杀掉了?这样,不就判定错误了?比如,【这里,面试官提到其它的工具启动的应用,生成的进程也会包含“java”关键字存在那里】

我:我们那里没有使用那么复杂

面试官:tomcat判断,一定不是这种判断方法。

  如果有的tomcat出现假死,你这个脚本还解决不了。tomcat有时候启动时,会卡住,有个状态码……code码,就卡那儿了

我:这个没有遇到过

面试官:就是类似的

  这个地方如果这样使用脚本,可能会影响业务。因为可能java跑的很多,有可能有1个,有可能没有。这样,tomcat停掉了,但是,还有可能有java程序在跑……

我:也就是说,不是java程序还可能有

面试官:只要是“java -jar”启动的,或者和java相关的,都会有java这样的进程存在。所以,这时候这样判断就不完善了。

  当机器里全部是tomcat的时候,这样干没有问题。

我:那您的意思是,服务器里还有别的东西?

[5:30]

面试官:服务器一般那有光跑这些……比如,有些自定义监控,还有好多东西。比如说,举个例子,tomcat里有很多日志,日志正常情况下会产生日志文件,这些日志文件需要手工去维护。比如说,要把创建时间大于第7天的全部压缩到另外1个目录里,只要不是今天的,全部压缩。

  我再重新说一下:今天之外的日志全部压缩,压缩过程中,不再重复压缩,压缩日期超过7天的,移动到另外的备份目录。这常用的。这种需求,用shell解决很麻烦。

  如果这个文件,超过7天。正常情况下,这种文件每天都会生成,但是,没有访问的话,是不会生成新的日志文件,也就是始终都是那1个文件。这样,就不能再对它进行压缩。这种问题,用shell如何解决?

我:像tomcat这种,每天都会自动生成1个日志文件

面试官:那是有用户访问,没有用户访问,就不会自动生成。

我:它会一直那样,没必要压缩了?

面试官:对啊,这个事,你是压缩,还是不压缩呢?这个地方,用shell处理就处理不了了,对不对?

我:我的意思是说,既然没有,就不用压缩了。

面试官:没有的话,不用压缩,这个是对的。但是,如果写的脚本,正常情况下,要面向通用型。而不是……你怎么知道这个日志文件什么时候产生,什么时候不产生啊?你是不知道的,对不对?业务复杂程度你是无法预测的,对不对?

我:那得看您开发搞得怎么样了?

面试官:这就是用shell去写这个,写这个脚本这是正常一名运维需要做的。

我:是是

面试官:这时候,运维就有可能写不出来,就可能要找别人。因为这里面有大量的逻辑判断。

我:这里有特殊性?

面试官:这个地方,用shell搞,是搞不定的。

我:也就是说,您说的这种情况,是不是能从开发上排除这种事情。

面试官:这和业务没有相关性,和开发没有任何关系。这纯粹是1个技术和维护工作。

我:您的意思是,这种情况,只能用python写吗?

面试官:用shell写也可以,但是,就是不全。用python写是最简单的,用java写也可以啊。你知道吗?

我:好吧

面试官:我再举1个例子,nginx会产生请求日志,对不对?请求日志就需要安全拆分,这个拆分怎么拆?你拆分的话,是通过什么拆的?

【我想了一会儿】

我:我好像是0点定时,reload一下。用shell脚本,到了点,因为默认它是没有日期后缀的

面试官:对

我:然后使用脚本mv一下,成为带后缀,然后好像就reload一下,之后会自动再创建1个新的日志文件,这样就是1天的。就是这样。

面试官:你想一下,这个过程中,是不是有问题?对业务是不是会产生影响啊?

我:有些事情,怎么说呢……任何人的web服务器都不可能是单台的

面试官:web服务器的access.log文件不是有接口的地方吗?这个地方如果因为备份,产生临时文件,按照日期产生的临时文件,影响业务,是不是?

我:产生的临时文件?

面试官:就是按天的访问日志文件,在我们这里算是临时文件。就是mv过程中……

我:如果文件很大的话?

面试官:我们的日志文件很大,我们的用户量很大,这时候就存在丢的可能,这个问题怎么解决?

【被问住了】

我:没遇到过这种情况

面试官:正常情况下,都是用mv搞的。但是,海外一般不这样高。他们是怎么做的呢?nginx配置里面有1个文件名称,就是日志地址,对不对?日志地址的文件名称,用日期指定。

我:用日期指定?

面试官:比如说,……,对不对?直接指定1个目录,然后1个日期名称,对不对?名称搞成时间的名称。

我:一天换一个?

面试官:它自动会创建,它那时候会touch一个,那没有时间间隔的,这样不会丢。

我:也就是在配置文件里,直接就是1天创建1个?

面试官:不是配置文件,直接就是用……符【没听清】,就是那个自定义变量取出当前日期,因为它是变的,因此,到时候运行过程中会自动产生。

  是这样搞的。

我:就是配置文件里加?

面试官:对

  就不用拆和写脚本……

我:对,很多工作最好是能不动就不动,集群最好也是这样。况且,业务量大的……

面试官:我们的业务量在我们这种情况下,是不能……【听不清】

我:是是


整理的思路:

这个问题,回去后我又和一些运维方面的朋友和老师交流过。mv命令重命名文件,实质只是inode节点号的改变,不会影响磁盘上的block信息块。因此,日志文件无论是1M,还是1G,重命名所带来的文件变化影响,微乎其微。


[12:10]

面试官:就是ddos***这一块,就是你……【笔试题写的很粗】

我:因为我们那儿没有……【尴尬的掩饰】

面试官:你们那儿业务量不大啊?!

我:我们都是以手机app业务为主,因此……

面试官:我们也是面向手机app

我:那您这儿手机app也会遇到ddos***吗?

面试官:有时候,之前遇到过。

我:哦

 

整理的思路:

怎样做好防护DDOS***:

1.了解DDDOS技术

2.对网站做好DDOS压力测试

3.选择服务好、安全防护专业的IDC机房

4.架构里尽可能没有单点,做高可用部署时,前后端多放cache

5.系统和业务上的应用,性能和安全配置不要顶配。需要适度,否则,大流量之下会压垮整个架构。

6.预留平时可能增长30%流量的资源

7.网站架构优化,多用缓存

8.把尽可能多的内容放到CDN

9.如果公司有钱,可以通过DNS做跨机房策略,顶不住就切走。

10.软硬件的防护:web应用有自身的防***模块,iptables也可以做IP并发限制

11.保留***证据

 

[12:40]

面试官:就是你找出最多连接IP地址,怎么找?

我:您是说nignx的访问日志,是吗?就是awk吧。取出第1行,去重,排序,逆序那种,不就出来了吗?那个IP地址最多,就这样。

总结的命令:

方法一:

[root@web01 ~]# awk -F " " '{print $1}' /app/logs/blog_access.log |sort |uniq -c
    155 10.0.0.1
    156 172.16.1.5
     12 172.16.1.8

方法二:

[root@web01 ~]# cut -d " " -f1 /app/logs/blog_access.log |sort |uniq -c
     13 10.0.0.1
      1 172.16.1.8


[13:15]

面试官:监控那块,你接触的多吗?

我:监控,我们海南使用的是zabbix

面试官:监控指标有那些?

我:硬件,比如CPU,不能高于80%;内存不能高于80%;磁盘/目录,也不能高于80%。然后就是tomcat那种端口,80808087……有很多工程,肯定要有。然后就是数据库,数据库的线程、进程要有,再有就是数据库的表空间大小。这些是属于系统的。然后就是网络,不过,不是很多。网络就是通过写那种自定义的东西,去ping它,好像就是ping运营商,3分钟ping一次。如果通,就没事;如果不通,就报警之类。网络大流量,一般是用cacti看,实时看。

  监控,基本就是这样。nagios不是说,可以有新加的服务器,可以自动发现嘛。但是,我们那儿,上线之后很少再加新的服务器,因此,这个功能用的不是很多。

【这里本来应该说zabbix,但是顺嘴说成nagios,之前公司用的事实上就是nagios。】

面试官:你们之前公司,有多少台服务器?

我:两个省,100台。每个省,各50

面试官:50台的量,还算可以了。也算比较大的了。

我:怎么说呢,有些刚才给您说的体系架构,没有那么多。那样的话,算起来没有几台。因为有些服务器不是干这个的。但是,我们上线完后的说明就是这样的,事实上山东好像是50多台,海南是40

 

[15:30]

面试官:MySQL,你熟吗?

我:MySQL,就是做主从同步。别的,因为我在那儿主要是nginx优化之类,别的不是很多。

面试官:tomcat优化,你知道吗?

我:tomcat优化,主要是有1servers.xml文件,里面可以改,可以起到优化的作用;再有1个,就是加大内存。别的,就不是很清楚了。

 

[16:10]

面试官:文件同步,你搞过没有?就是那种分发。

我:哦,是说ssh-key吗?

面试官:差不多

  比如说,我有1个文件,50台服务器,我要把这1个文件发布到50台服务器上去。这50台服务器如何保证全部能搞完,还不出问题。

我:分发密钥,1个服务端,1个客户端,互相分发密钥。这样,分发服务器就可以把需要分发的,类似/etc/hosts文件,分发到指定的位置上去。可以普通用户分发,也可以root用户分发。那个,也做过。

面试官:比如,那种几十兆的.apk

我:abk

面试官: apk,就是手机应用软件。有四五十个,要分发到那些服务器上

我:如果是命令的话,就是ssh-key -P 端口……

面试官:这很慢啊,还得输入密码

我:如果弄好了,可以直接往脚本里写就好了。把命令放到脚本里,带上IP地址……部署好了,不就不用……

面试官:你想一下这里面的问题。你感觉这里面有问题吗?

  你想一下,50台服务器同时接收这些文件,这样流量不是很高吗?

我:您的.apk文件应该不大吧?50个也没多少啊。

面试官:我们有时候搞,一上线不是几个,也不是1个;一上线,可能有好几个,十几个。

我:您的意思是,我的方案容易丢数据?

面试官:不是丢数据。你的方案,第一,出口流量会非常大。你想,如果1apk文件往50台服务器同时上传;如果是50apk文件呢?那不就很大了吗?你想,需要多长时间才能把它搞完啊?全部瓶颈都卡在这台分发服务器上了。对不对?

我:那我可以晚上搞啊!夜深人静的时候,弄啊。

面试官:业务,不会等的。

我:有的业务,会很着急?

面试官:比如,1个产品过来了,让你去做。说这个分发不了,到半夜才能做……

我:对对,也是,那是不行。

【我想了想】

  您说,我这个方案不行,还是说它占流量啊……

面试官:就是你这个方案能干,但是,太耗时了。然后,比如说,如果按ssh-key这样搞,能最后保证分发到服务器上是成功的吗?怎么校验它是成功的?怎么校验它是不是传了一半,有可能吗?怎么校验它啊?确实是成功了?

我:这个,用脚本也可以实现。我记得是……

【思考一会儿】

ssh-key那种东西,如果执行不成功,肯定会报错的。用脚本,输出报错,能让它弹出提示来。这个成功了,就OK;如果不成功,就失败。可以让它弹出东西来。

  您的问题就是,如果量太大的话,网络会受不了,是吗?

面试官:第一,是量太大;第二,50个包,光用眼看这50个,要数啊,很麻烦。我们这种整天这样上,人受不了,你知道吗?

我:每天都有50个,这样上吗?

面试官:就是个别时候,有时候上的就很多,有时候也不一定就是apk,可能是其它的东西。

我:对对,这样就有可能比apk大了。

面试官:对对,有可能,比如要上jar包,这是很正常的事情。如果是一个项目,整天部署,也是很多的。对吧?

  其它的……

  我给你讲一下我们这儿……

【我打断他】

我:等一会儿,您这儿是用什么方案?

面试官:其实最好的方法,先用一台机器给3台机器分发,再用那3台机器再向下分发。

我:哦,就和数据库主从级联同步类似

面试官:别什么事都让那一个人干,会累死的。对不对?多找几个人,找小弟嘛,就是。

我:这就是思路啊。我明白了,明白了。

面试官:这就是我手下,这个任务就交给你了,你去负责干吧。

我:明白了

面试官:这就是我说的那种问题,就可以解决掉了。大流量那种情况,用ssh-key不能很好的解决问题,一般就是用inotify+rsync,用它去搞。它把那个特定目录约定好,传这个文件……

【我打断他】

我:那不是实时同步的吗?我记得inotify是做实时同步的啊

面试官:实时同步,就是符合要求嘛。这个业务上,就是用实时同步去搞。如果发现某个文件上传失败,或者有问题,可以自动接着搞啊。

我:就是说,我放到那个目录,它会自动传上去,我也不用执行其它的命令了。

面试官:什么都不用管了,直接往上扔就完事了。比如,ftp目录,往那个目录上一扔。它自己就去搞了。

我:是是

[22:35]

面试官:我讲一下我们公司。我们公司是基于海外流量变现的,我们做海外业务,不做国内业务,国内业务做得很少。我们有一个类似电子市场的东西,就是下载的软件中心,如“应用宝”、“小米中心”。

  我们的东西,和那些差不多。然后,用户就去下载,用户安装什么应用,我们推荐什么应用,用户安装过什么应用。不能用的时候,再下载再打开。类似这种,我们要去分析,去做这样的一套系统。

  我们的系统是分布式的,然后里面有mongodbredis,然后有mysql,都是集群。web节点【听着像】也是分布式的,然后我们有专门的文件下载服务器,去搞这一套。这一套系统大概有2526台服务器。其它的,还有其它系统的一些服务器。大概一共有30多台吧。

我:您是说,您这里是分析那种类似软件市场,用户什么下载的多……

面试官:用户上我们这里来……【听不清】

  我们这里的用户请求量也比较大,每天独立用户都有二三百万……

我:是海外用户多吗?

面试官:对啊,全是海外用户

我:他们用您这儿,是做什么呢?就是下载手机上的东西吗?

面试官:对啊

我:哦,就相当于海外的“小米市场”?只不过不是国内用户用,而是海外用户用?

面试官:对,海外用户。第一,海外技术需要注意的问题非常多。【听不清】

  比如,下载服务器,全球用户都往你这里下载,下载服务器不能放在国内吧?对不对?下载,还要保证全球布点,怎么保证全球的各个点都能同步完成啊?刚才说的那些问题,都是我们这里遇到的问题。

  比如网络,用户连我们的网络,是不是快了,需要限速。还有,我们的网络情况是什么样的,是不是超了。还有下载,国外下载是比较贵的,如何防它,比如万一那个机房的人使个坏,知道了你的目录,把东西下载了,如何防它刷流量。

  我们公司的业务,主要就是这些。

  正常的搭建服务器、维护,搭建虚拟化,都会遇到。我们一切工作中遇到的问题,市面上基本都有,都遇到过。技术也是市面上的技术,没有特别高大上的技术。

  其它的,我再说一下薪资待遇。基本工资、奖金、餐补、过节费,13薪,其它就没什么了。餐补是130

  试用期是全额工资,但是有6个月。如果表现好,可以提前转正。试用期内,和正式员工没有任何区别,什么都一样。

  其它的,就没有什么了。我们公司,大体就是这样的情况。

我:您这儿的服务器有3040台?

面试官:对。

我:您这儿很高端啊。这个东西,不在多。多,有时候也没有用。

面试官:其它就没有什么了,你还有什么问题,想了解的,都可以问我。

我:您说的,很多东西,牵涉到海外业务,我真是……有些东西,我听说过。但是,这些东西……确实是……

  我昨天下午您公司给我打电话说,让我今天来面试。我还看过您公司的介绍,后来找到您公司的官网,没怎么看懂。今天您这样一说,基本上就有数了。

面试官:就对上了,是吗?

我:您一通俗的解释,我就明白了。而且,好像还牵涉大数据,是吗?

面试官:我们的分析师没在……【听不清】,是在X县分析的。那里有数据分析团队。那个哥们也很厉害,把线上的日志拽下来,然后做数据分析、数据挖掘……也有。

  这是我们的【指了指这一层楼】,楼上、楼下,还有深圳,都有。

  其它的,就没有什么了。

我:我是没有什么问题了,感觉您说的很清楚了。

面试官:没问题,如果正常情况下,如果面试上,我们会给你打电话。到时候,如果需要什么材料,我会告诉你。其它就没有什么了。

我:行,行

【我收拾东西】

面试官:感谢你来面试

我:谢谢,谢谢

【一起离开这层楼,告别,离开】