一名运维工程师面试的经历

描述

笔者其实没有想到去面试,只是在智联上更新了一下简历,就陆陆续续接到很多猎头的邮件和电话,实在是没准备好要去面试,就推掉了几家公司的面试了。正因为笔者也很久没有面试了,笔者也想去面试学习一下,闲话少说,下面就分享给大家笔者在2018年1月4号上午10点30分的面试经历:

首先,猎头或者公司人资会把公司的介绍及岗位要求发到你邮箱(或者QQ、微信),下面这份是猎头发给我的岗位说明,为了职业道德操守,公司的介绍和面试通知信息我就不贴出来了,我就把岗位要求贴出来:

职位描述:

1、 负责应用服务器的安装、配置、优化与维护;

2、 负责应用系统的日志信息备份、管理、维护与分析;

3、 负责应用系统的日常监测于维护、故障处理、性能分析与优化;

4、 负责应用部署系统、环境配置系统、监控系统的开发、部署、升级与维护,建设高性能的运维平台。

岗位要求:

1、 熟悉Linux操作系统的基础知识,熟练使用Linux常用操作命令;

2、 熟练配置Nginx、HAproxy 等应用相关软件的部署、配置与优化维护;

3、 熟悉网络基础知识、熟悉TCP/IP的工作原理,会配交换机或路由器,能熟练的对网络情况进行分析

4、 熟悉shell/perl/python中的一种或多种进行运维程序的开发;

5、 熟悉Nagios,Ganglia等监控软件

看着上面的要求大家是不是觉得要求也不高啊,你要细看就会发现,这家公司要求的还挺多,不仅要会网络知识(熟悉TCP/IP好像是每家单位的都会写这样的要求),还要会开发技能。相信很多做运维的兄弟在网络这一块是个头疼的事情,都对交换机和路由器不怎么会配置和管理。

然后,笔者详细了解他们公司,了解岗位要求,在突击复习一下可能会问到的知识点和技术点。到了面试的这天时间,早早的起床,把牙一定要刷干净,特别是有口臭的兄弟,最好准备点口香糖,到达面试公司前嚼块口香糖,以免因为口气的原因熏到面试官,让你在面试官心里减分。早点要记得吃,如果你是下午面试的话也要吃午饭,吃早点了精气神就有了。还要注意,带上你的简历和一支笔,虽然他们那边也会有你的简历,为了以防万一还是准备好简历。

最后,关键点来了,就是和面试官沟通了,有笔试的公司会让你做些面试题,没有笔试就直接和面试官聊了,下面是我和面试官沟通完之后记住的一些问题,分享给大家看一下,笔者一共记住了7个问题,好像还有两个问题实在想不起来了,如果大家有更恰当的回答一定要贴出来一起探讨和进步:

1、介绍下自己?(几乎每家公司首先都会让你做个自我介绍,好像是必修课一样)

笔者回答:此处省略笔者的自我介绍,笔者建议介绍自己的时间不宜过长,3-4分钟为宜,说多了面试官会觉得你太啰嗦了。说太少了也不行,那样会让人感觉你的经历太简单了、太空了。正常情况下,一般你在做自我介绍的同时,面试官这个时候在看你的简历,他需要一边看简历、一边听你介绍自己,如果你说个几句话就把自己介绍完了,他肯定还没缓过神来,对你的映像会减分的。在介绍的同时思维要清晰,逻辑要清楚,最好是根据你简历上写的经历来介绍,这样可以把面试官的思路带到你这里来,让他思路跟着你走。不要东扯一句,西扯一句。竟量少介绍自己的性格、爱好(最好能不说就不说),你可以简单罗列干过几家公司(最多罗列3家公司/也包含目前所在的公司,注意顺序不要乱),都在那几家公司负责什么工作,都用过什么技术,在着重介绍一下你目前所在的公司是负责哪些工作的,可以稍微详细一点介绍,不要让面试官听着晕头转向的感觉。

2、灰度发布如何实现?

笔者回答:其实对这个问题笔者也答的不好,就不写出来误导大家了。大家有好的方法可以共享出来。不过笔事后在知呼上看到了一位网友的建议觉得不错,大家可以参考看一下 :https://www.zhihu.com/question/20584476

3、Mongodb熟悉吗,一般部署几台?

笔者回答:部署过,没有深入研究过,一般mongodb部署主从、或者mongodb分片集群;建议3台或5台服务器来部署。MongoDB分片的基本思想就是将集合切分成小块。这些块分散到若干片里面,每个片只负责总数据的一部分。 对于客户端来说,无需知道数据被拆分了,也无需知道服务端哪个分片对应哪些数据。数据在分片之前需要运行一个路由进程,进程名为mongos。这个路由器知道所有数据的存放位置,知道数据和片的对应关系。对客户端来说,它仅知道连接了一个普通的mongod,在请求数据的过程中,通过路由器上的数据和片的对应关系,路由到目标数据所在的片上,如果请求有了回应,路由器将其收集起来回送给客户端。

4、如何发布和回滚,用jenkins又是怎么实现?

笔者回答:发布:jenkins配置好代码路径(SVN或GIT),然后拉代码,打tag。需要编译就编译,编译之后推送到发布服务器(jenkins里面可以调脚本),然后从分发服务器往下分发到业务服务器上。

回滚:按照版本号到发布服务器找到对应的版本推送

5、Tomcat工作模式?

笔者回答:Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。

进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:

Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;

Tomcat作为独立服务器:请求来自于web浏览器;

6、监控用什么实现的?

笔者回答:现在公司的业务都跑在阿里云上,我们首选的监控就是用阿里云监控,阿里云监控自带了ECS、RDS等服务的监控模板,可结合自定义报警规则来触发监控项。上家公司的业务是托管在IDC,用的是zabbix监控方案,zabbix图形界面丰富,也自带很多监控模板,特别是多个分区、多个网卡等自动发现并进行监控做得非常不错,不过需要在每台客户机(被监控端)安装zabbix agent。

7、你是怎么备份数据的,包括数据库备份?

笔者回答:在生产环境下,不管是应用数据、还是数据库数据首先在部署的时候就会有主从架构、或者集群,这本身就是属于数据的热备份;其实考虑冷备份,用专门一台服务器做为备份服务器,比如可以用rsync+inotify配合计划任务来实现数据的冷备份,如果是发版的包备份,正常情况下有台发布服务器,每次发版都会保存好发版的包。

总结一下面试注意几点事项,可能笔者也说得不太对,为了我们运维工作的兄弟们都能拿到高薪,大家一定要指证出来一起进步、一起探讨:

第一,你要对自己的简历很熟悉,简历上的写的技能自己一定要能说出个一二,因为面试官的很多问题都会挑你简历上写的问。比如你简历上写了这么一条技能“熟悉mysql数据库的部署安装及原理”。你即然写了这么一条技能,你在怎么不熟悉你也要了解mysql的原理,能说出个大概意思。万一面试官问到了你写的这一条,你都答不上来,那在他心里你又减分了,基本上这次面试希望不大。

第二,如果面试官问到你不会的问题,你就说这个不太熟悉,没有具体研究过,千万别不懂装懂,还扯一堆没用的话题来掩饰,这样只会让面试官反感你。

第三,准备充分,竟可能多的记住原理性的知识,一般面试问的多的就是原理。很少问具体的配置文件是怎么配置的。面试前也要了解清楚“职位描述”和“岗位要求”,虽然有时候大多数不会问到岗位要求的问题,但也要了解和熟悉。

第四,面试完后一定要总结,尽量记住面试官问的每一个问题,回去记录下来,如果问到不会的问题,事后要立马查百度或者找朋友搞清楚、弄明白,这样你才能记劳,下次面试说不定又问到同样的问题。

问完之后,面试官就跟我聊薪资待遇了,问我多少钱能达到自己的要求,我就不便透露了,可以私聊,哈哈,后续笔者会陆陆续续更新以前面试的经历和问题,有需要的朋友可以转载或者收藏起来一起讨论。

2017年2月24号面试

基于大家热情高昂的气氛,笔者又花了一个下午的时间回忆并整理在2017年2月24号笔者在东三环边上(快到东四环了,没有地铁过去,到了四惠还要转公交车)的一家传媒公司的面试经历,还好笔者有做笔记的习惯,把之前面试的问题都记录在案,这一次的面试笔者可是记忆犹新,因为这次这家公司都跟笔者发offer了,实在是真心不想去这家公司就找原因推掉了,大家可别学我这么不靠谱。下面是这家公司中的岗位要求说明:

岗位职责:

1、负责公司产品的版本控制、构建和发布管理;

2、负责公司统一配置库管理工作,权限管理与分配准确及时,定期完成配置备份;

3、负责公司内部开发/测试服务器的运行管理工作;

4、负责Linux操作系统的安装、配置、监控和维护、问题处理、软件升级、 数据备份、应急响应、故障排除等、保证线上环境的稳定运行;

5、负责支撑平台24×7稳定运行,并进行前瞻性容量规划;

6、负责公司机房服务器日常维护及网络系统安装、部署、维护工作。

岗位要求:

1、计算机相关专业本科及以上学历,2年以上运维或配置管理工作经验;

2、至少熟悉一种监控系统搭建,如Nagios/Zabbix/等;

3、至少熟悉一种集群管理工具,如Ansible/SaltStack等;

4、有使用集成发布工具发布构建经验优先。比如:bamboo或者Jenkins;

5、熟悉Unix/Linux操作系统,熟悉Weblogic/tomcat等中间件,能够编写shell脚本,熟悉软件开发过程及过程产品,有一定的网络基础;

6、熟悉rsyslog, flume等日志收集和处理系统;

7、具有强烈的安全意识及较强的沟通协调和学习能力,良好的团队合作精神,工作积极主动。

过去之后,前台美眉把我带到他们公司的地下室,我扫视了一下周围的环境,貌似旁边就是机房,因为我听到服务器的声音。等了几分钟,面试官下来了,面试官目测比较瘦,看着跟我身材差不多(应该不到120),他说他是负责运维部的,然后开始就叫我先自我介绍,都是一个套路,免不了介绍的,所以兄弟们一定要把自我介绍练好。然后开始问我问题了,跟面试官聊得还行,问我应该有不下10个以上的问题,我记住了下面有10个问题:

1、LVS负载的原理,和Nginx负载有啥区别?

笔者回答:这个问题我觉得面试官司没问好,正常都会这么问“LVS有哪些负载均衡技术和调度算法?“。我回答就是按我说的这种问法回答的,反正他也频繁点头,当然,笔者回答的可能没有下面我整理出来的那么详细,大概意思我都说明白了。

LVS是Liunx虚拟服务器的简称,利用LVS提供的负载均衡技术和linux操作系统可实现高性能、高可用的服务器集群,一般LVS都是位于整个集群系统的最前端,由一台或者多台负载调度器(Director Server)组成,分发给应用服务器(Real Server)。它是工作在4层(也就是TCP/IP中的传输层),LVS是基于IP负载均衡技术的IPVS模块来实现的,IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR,详述如下:

 VS/NAT: 即(Virtual Server via Network Address Translation)

也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。

可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。

 VS/TUN :即(Virtual Server via IP Tunneling)

也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。

 VS/DR: 即(Virtual Server via Direct Routing)

也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。

回答负载调度算法,IPVS实现在八种负载调度算法,我们常用的有四种调度算法(轮叫调度、加权轮叫调度、最少链接调度、加权最少链接调度)。一般说了这四种就够了,也不会需要你详细解释这四种算法的。你只要把上面3种负载均衡技术讲明白面试官就对这道问题很满意了。接下来你在简单说下与nginx的区别:

LVS的优点:

抗负载能力强、工作在第4层仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器IO的性能不会受到大流量的影响;

工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat;

应用范围比较广,可以对所有应用做负载均衡;

配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。

LVS的缺点:

软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。

如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦,相对而言,Nginx/HAProxy+Keepalived就简单一点

Nginx的优点:

工作在OSI第7层,可以针对http应用做一些分流的策略。比如针对域名、目录结构。它的正则比HAProxy更为强大和灵活;

Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;

Nginx安装和配置比较简单,测试起来比较方便;

可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;

Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点;

Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web环境,大有和LAMP环境分庭抗礼之势,Nginx在处理静态页面、特别是抗高并发方面相对apache有优势;

Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,有需求的朋友可以考虑用其作为反向代理加速器;

Nginx的缺点:

Nginx不支持url来检测。

Nginx仅能支持http和Email,这个它的弱势。

Nginx的Session的保持,Cookie的引导能力相对欠缺。

2、redis集群的原理,redis分片是怎么实现的,你们公司redis用在了哪些环境?

笔者回答:reids集群原理:

其实它的原理不是三两句话能说明白的,redis 3.0版本之前是不支持集群的,官方推荐最大的节点数量为1000,至少需要3(Master)+3(Slave)才能建立集群,是无中心的分布式存储架构,可以在多个节点之间进行数据共享,解决了Redis高可用、可扩展等问题。集群可以将数据自动切分(split)到多个节点,当集群中的某一个节点故障时,redis还可以继续处理客户端的请求。

redis分片:

分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集。当数据量大的时候,把数据分散存入多个数据库中,减少单节点的连接压力,实现海量数据存储。分片部署方式一般分为以下三种:

(1)在客户端做分片;这种方式在客户端确定要连接的redis实例,然后直接访问相应的redis实例;

(2)在代理中做分片;这种方式中,客户端并不直接访问redis实例,它也不知道自己要访问的具体是哪个redis实例,而是由代理转发请求和结果;其工作过程为:客户端先将请求发送给代理,代理通过分片算法确定要访问的是哪个redis实例,然后将请求发送给相应的redis实例,redis实例将结果返回给代理,代理最后将结果返回给客户端。

(3)在redis服务器端做分片;这种方式被称为“查询路由”,在这种方式中客户端随机选择一个redis实例发送请求,如果所请求的内容不再当前redis实例中它会负责将请求转交给正确的redis实例,也有的实现中,redis实例不会转发请求,而是将正确redis的信息发给客户端,由客户端再去向正确的redis实例发送请求。

redis用在了哪些环境:

java、php环境用到了redis,主要缓存有登录用户信息数据、设备详情数据、会员签到数据等

3、你会怎么统计当前访问的IP,并排序?

笔者回答:统计用户的访问IP,用awk结合uniq、sort过滤access.log日志就能统计并排序好。一般这么回答就够了,当然你还可以说出其它方式来统计,这都是你的加分项。

4、你会使用哪些虚拟化技术?

笔者回答:vmware vsphere及kvm,我用得比较多的是vmware vsphere虚拟化,几本上生产环境都用的vmware vsphere,kvm我是用在测试环境中使用。vmware 是属于原生架构虚拟化技术,也就是可直接在硬件上运行。kvm属于寄居架构的虚拟化技术,它是依托在系统之上运行。vmware vcenter

管理上比较方便,图形管理界面功能很强大,稳定性强,一般比较适合企业使用。KVM管理界面稍差点,需要管理人员花费点时间学习它的维护管理技术。

5、假如有人反应,调取后端接口时特别慢,你会如何排查?

笔者回答:其实这种问题都没有具体答案,只是看你回答的内容与面试官契合度有多高,能不能说到他想要的点上,主要是看你排查问题的思路。我是这么说的:问清楚反应的人哪个服务应用或者页面调取哪个接口慢,叫他把页面或相关的URL发给你,首先,最直观的分析就是用浏览器按F12,看下是哪一块的内容过慢(DNS解析、网络加载、大图片、还是某个文件内容等),如果有,就对症下药去解决(图片慢就优化图片、网络慢就查看内网情况等)。其次,看后端服务的日志,其实大多数的问题看相关日志是最有效分析,最好用tail -f 跟踪一下日志,当然你也要点击测试来访问接口日志才会打出来。最后,排除sql,,找到sql去mysql执行一下,看看时间是否很久,如果很久,就要优化SQL问题了,expain一下SQL看看索引情况啥的,针对性优化。数据量太大的能分表就分表,能分库就分库。如果SQL没啥问题,那可能就是写的逻辑代码的问题了,一行行审代码,找到耗时的地方改造,优化逻辑。

6、mysql数据库用的是主从读写分离,主库写,从库读,假如从库无法读取了、或者从库读取特别慢,你会如何解决?

笔者回答:这个问题笔者觉得回答的不太好,对mysql比较在行的朋友希望能给点建议。以解决问题为前提条件,先添加从库数量,临时把问题给解决,然后抓取slow log ,分析sql语句,该优化就优化处理。慢要不就是硬件跟不上,需要升级;要不就是软件需要调试优化,等问题解决在细化。

7、cpu单核和多核有啥区别?

笔者回答:很少有面试官会问这样的问题,即然问到了,也要老实回答。还好笔者之前了解过CPU,我是这么说的:双核CPU就是能处理多份任务,顺序排成队列来处理。单核CPU一次处理一份任务,轮流处理每个程序任务。双核的优势不是频率,而是对付同时处理多件事情。单核同时只能干一件事,比如你同时在后台BT下载,前台一边看电影一边拷贝文件一边QQ。

8、机械磁盘和固态硬盘有啥区别?

笔者回答:我擦,啥年代了,还问磁盘的问题,这面试官有点逗啊。那也要回答啊:

HDD代表机械硬盘,SSD代表固态硬盘。首先,从性能方面来说,固态硬盘几乎完胜机械硬盘,固态硬盘的读写速度肯定要快机械硬盘,因为固态硬盘和机械硬盘的构造是完全不同的(具体的构造就没必要解释了)。其次,固态盘几乎没有噪音、而机械盘噪音比较大。还有就是,以目前的市场情况来看,一般机械盘容量大,价格低;固态盘容量小,价格偏高。但是企业还是首选固态盘。

9、说一下用过哪些监控系统?

笔者回答:这个监控的问题又问到了,笔者在2018年1月4号也被问到类似这样的问题,笔者曾经用过zabbix、nagios、 cacit等。但是在这次面试中只说用过zabbix和nagios。说完了之后,面试官就让我说一下这两个监控有啥区别:

从web功能及画图来讲:

Nagios简单直观,报警与数据都在同一页面, 红色即为问题项。Nagios web端不要做任何配置。 Nagios需要额外安装插件,且插件画图不够美观。

Zabbix监控数据与报警是分开的,查看问题项需要看触发器,查看数据在最新数据查看。而且zabbix有很多其它配置项, zabbix携带画图功能,且能手动把多个监控项集在一个图中展示。

从监控服务来讲:

Nagios自带的监控项很少。对一些变动的如多个分区、多个网卡进行监控时需要手动配置。

Zabbix自带了很多监控内容,感觉zabbix一开始就为你做了很多事,特别是对多个分区、多个网卡等自动发现并进行监控时,那一瞬间很惊喜,很省心的感觉。

从批量配置和报警来讲:

Nagios对于批量监控主机,需要用脚本在server端新增host,并拷贝service文件。 Nagios用脚本来修改所有主机的services文件,加入新增服务。

Zabbix在server端配置自动注册规则,配置好规则后,后续新增client端不需要对server端进行操作。 Zabbix只需手动在模板中新增一监控项即可。

总体来讲:

Nagios要花很多时间写插件,Zabbix要花很多时间探索功能。

Nagios更易上手,Nagios两天弄会,Zabbix两周弄会。

Zabbix画图功能比Nagios更强大

Zabbix对于批量监控与服务更改,操作更简洁;Nagios如果写好自动化脚本后,也很简单,问题在于写自动化脚本很费神。

10、给你一套环境,你会如何设计高可用、高并发的架构?

笔者回答:

如果这套环境是部署在云端(比如阿里云),你就不用去考虑硬件设计的问题。可直接上阿里云的SLB+ECS+RDS这套标准的高可用、高并发的架构。对外服务直接上SLB负载均衡技术,由阿里的SLB分发到后端的ECS主机;ECS主机部署多台,应用拆分在不同的ECS主机上,尽量细分服务。数据库用RDS高可用版本(一主一备的经典高可用架构)、或者用RDS金融版(一主两备的三节点架构)。在结合阿里其它的服务就完全OK,业务量上来了,主机不够用了,直横向扩容ECS主机搞定。

如果这套环境托管在IDC,那么你就要从硬件、软件(应用服务)双面去考虑了。硬件要达到高可用、高并发公司必须买多套网络硬件设备(比如负载设备F5、防火墙、核心层交换、接入层交换)都必须要冗余,由其是在网络设计上,设备之间都必须有双线连接。设备如果都是跑的单机,其中一个设备挂了,你整个网络都瘫痪了,就谈不上高可用、高并发了。其次在是考虑应用服务了,对外服务我会采用成熟的开源方案LVS+Keepalived或者Nginx+Keepalived,缓存层可以考虑redis集群及Mongodb集群,中间件等其它服务可以用kafka、zookeeper,图片存储可以用fastDFS或MFS,如果数据量大、又非常多,那么可采用hadoop这一套方案。后端数据库可采用 “主从+MHA”。这样一套环境下来是绝对满足高可用、高并发的架构。

对了,在下周一(2018年1月8号)有个海外的电话面试、还有下周二(2018年1月9号)有个网络运维经理岗位的面试,其实这个网络运维经理职位的面试有点不太想去,主要是想了解一下都会问些啥问题,可以为大家分享出来,所以请大家敬请期待吧。。。

2018年1月8号海外电话面试

一次偶然的机会,笔者在一个招聘平台中(我就不细说哪个平台,免得有打广告的意思)刷新岗位的时候突然看到一个新发布的岗位,仔细一看是海外的岗位,上面写的待遇、福利、工作内容笔者都有点兴趣,由于笔者也没有尝试过海外面试的机会和感觉,所以就和发布这个岗位的猎头联系上了。

猎头问我要了简历,并把个人信息详细丰富了一下,比如有没有护照、工作了多久、个人职业规划、期望到手的薪资等等。猎头就把我的简历和详细的个人信息推荐出去了,过了几天时间,猎头通知我简历筛选通过了,约个时间可以进行技术面试(电话面试),然后就这样约在了2018年1月8号上午。

虽然这次是海外面试,但是面试官是我们华人,和面试官在电话中将近聊了2个小时左右,笔者聊的也口干舌燥。这一次面试官将近问了40个左右的问题,量实大有点大,笔者也没记住这么多,大概记住了30多个问题,忘记开录音了,不然这些问题都能分享出来。别看是海外的面试官,其实这次所问的问题在我们国内的面试中也常常会问到的,我们先来看一下海外的公司的岗位要求吧:

岗位职责:

1、日常线上项目的需求处理;

2、新项目上线对接的相关工作;

3、日常运维工具开发、维护、优化;

4、监控业务的运行状态,及时处理项目运行中出现的故障,保障项目服务24x7稳定运行;

5、分析排除系统、数据库、网络、应用等故障及错误;

6、负责服务器的资源调配和系统安全、数据备份。

任职要求:

1. 熟悉linux操作系统, 熟练使用一种或多种脚本语 言(例如 Python/Perl/Shell);

2. 熟悉至少一种共有云技术,多种运维平台工具(Nagios, Zabbix,Puppet等)

3. 熟悉Nginx,Mysql, Redis, Keepalived, LVS等中间件的配置与调优;

4. 熟悉网络部署,多种数据机房故障的发现和排除的工具,有做个跨机房数据同步的优先;

5. 熟悉mysql、redis、mongoDB的安装、维护、性能优化;

6. 了解反向代理、负载均衡原理。

7. 有责任心,耐心,积极肯学的心态以及良好的沟通表达能力和团队合作精神;

其实这个要求,我在上一篇文章也说到过,大多数公司都写得差不多,很多公司自己懒的写,直接照搬别的公司发出来岗位要求,所以我们只要了解它就可以了,面试的时候不一定会问到这些岗位的要求说明,你看这家公司没有写熟悉TCP/IP,其实面试官这一次有问到TCP/IP这个问题的。这次技术面试后总体面试官还是比较满意,后来猎头通知我一面过了,准备安排2018年1月11号下午进行二面(跟我谈薪资、对海外工作的想法、人生规划等话题)。好了,不多说了,大家自己慢慢看我和面试官聊的技术问题吧。

1、介绍下自己?

笔者回答:不管是电话面试还是现场面试,自我介绍是避免不了的,上一篇文章我有详细介绍这块的内容,这里不做解释了,感兴趣的朋友参考我上一篇文章:

总结一下:运维工程师面试的经历及面试相关问题(会持续更新)

2、为什么想着要离开现在的公司?

笔者回答:虽然是面试技术,但也会有很多面试官会不经意的问你这个问题,看起来很随意的问题,其实这个问题里面隐藏了很多信息,最直观的就是看你这个人对企业的忠诚度、还能看你是不是心浮气燥的性格等等。如果你曾经频繁跳过槽,不管出于什么原因,笔者个人都不建议写在简历上,最好能够合并一些工作时间和单位,企业是很担心把你招来后会不会短时间你又跳槽了。当然如果都是因为企业经营不善倒闭所至,就没关系了。说到这里,就想起了笔者曾经一位同事,连续在好几家单位都干倒闭了,这我也不知道说啥好了。。。好了,咋们接着往下走。

3、TCP/IP原理说一下?TCP有哪几个状态,分别是什么意思?

笔者回答:以tcp/ip协议为核心,分五层。tcp工作在第4层,主要有tcp和udp协议。其中tcp是可靠协议,udp是不可靠协议。 tcp传输之前,需要建立连接,通过三次握手实现。

TCP三次握手状态:首先是closed状态,当发起连接后,进入Listen状态,当三次握手之后,进入EST状态。三次握手中间还有一个临时状态:SYN_SENT。SYN_SENT 当应用程序发送ack之后,进入EST状态,如果没有发送,就关闭closed.

总结:大家一定要熟记tcp状态转换图,参考 http://blog.csdn.net/wenqian1991/article/details/40110703 如下图:

image.png

4、有个客户说访问不到你们的网站,但是你们自己测试内网和外网访问都没问题。你会怎么排查并解决客户的问题?

笔者回答:我们自己测了都没问题,只是这个客户访问有问题,那肯定是要先联系到这个客户,能远程最好,问一下客户的网络是不是正常的,访问其它的网站有没有问题(比如京东、百度什么的)。如果访问其它网站有问题,那叫客户解决本身网络问题。如果访问其它网站都没问题,用ping和nslookup解析一下我们的网站是不是正常的,让客户用IP来访问我们的网站是否可行,如果IP访问没问题,那就是客户的DNS服务器有问题或者DNS服务器解析不到我们的网站。还有一种可能就是跨运营商访问的问题,比如我们的服务器用的是北方联通、而客户用的是南方移动,就也有可能突然在某个时间段访问不到,这种情况在庞大的中国网络环境中经常发生(一般是靠CDN解决)。还有可能就是我们的网站没有SSL证书,在公网是使用的是http协议,这种情况有可能就是没有用https协议网站被运营商劫持了。

5、redhat 6.X版本系统 和 centos 7.X版本有啥区别?

笔者回答:桌面系统(6/GNOE2.x、7/GNOME3.x)、文件系统(6/ext4、7/xfs)、内核版本(6/2.6x、7/3.10x)、防火墙(6/iptables、7/firewalld)、默认数据库(6/mysql、7/mariadb)、启动服务(6/service启动、7/systemctl启动)、网卡(6/eth0、7/ens192)等。

6、你会用什么方法查看某个应用服务的流量使用情况?

笔者回答:如果是单一应用的服务器,只需要用iftop、sar等工具统计网卡流量就可以。如果服务器跑了多个应用,可以使用nethogs工具实现,它的特别之处在于可以显示每个进程的带宽占用情况,这样可以更直观获取网络使用情况。

7、说一下你们公司怎么发版的(代码怎么发布的)?

笔者回答:我说什么来着,这个问题又问到了。发布:jenkins配置好代码路径(SVN或GIT),然后拉代码,打tag。需要编译就编译,编译之后推送到发布服务器(jenkins里面可以调脚本),然后从分发服务器往下分发到业务服务器上。

8、elk中的logstash是怎么收集日志的,在客户端的logstash配置文件主要有哪些内容?

笔者回答:input、output两大块配置;input中指定日志(type、path)等,output指定日志输出的目标(host、port)等。

9、ansible你用过它的哪些模块,ansbile同时分发多台服务器的过程很慢(它是逐台分发的),你想过怎么解决吗?

笔者回答:用过ansible的(copy file yum ping command shell)等模块;ansible默认只会创建5个进程,所以一次任务只能同时控制5台机器执行。那如果你有大量的机器需要控制,或者你希望减少进程数,那你可以采取异步执行.ansible的模块可以把task放进后台,然后轮询它。这使得在一定进程数下能让大量需要的机器同时运作起来。

10、nginx有哪几种调度算法,解释一下ip hash和轮询有啥不一样?

笔者回答:常用的有3种调度算法(轮询、ip hash、权重)。

轮询:upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

ip hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

权重:指定轮询几率,权重(weight)和访问比率成正比,用于后端服务器性能不均的情况。

11、nginx你用到了哪些模块,在proxy模块中你配置过哪些参数?

笔者回答:用到过(负载均衡upstream、反向代理proxy_pass、location、rewrite等)。

proxy模块中配置过:proxy_set_header、proxy_connect_timeout、proxy_send_timeout、proxy_buffer_*

12、说一下iptables的原理,有哪些表、哪些链?怎么修改默认策略全部为DROP?

笔者回答:iptables是工作在TCP/IP的2、3、4层。你要说它的原理也不是几话能概括的,当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。

4张表(raw表、mangle表、net表、filter表)

5条链(INPUT链、OUTPUT链、PORWARD链、PREROUTING链、POSTROUTING链)。

全部设置为DROP:

#iptables -P INPUT DROP

#iptables -P OUTPUT DROP

#iptables -P FORWARD DROP

小结:iptables远不止这几句话就能描述清楚的,也不是随便在网上趴些资料就能学好的,需要自己用起来,经过大量的实验和实战才能熟悉它,iptables真的很考验运维人员的技术水平,大家一定要用心学好这个iptables。

13、如何开启linux服务器路由转发功能?

笔者回答:echo ”1“ 》 /proc/sys/net/ipv4/ip_forward

14、nginx中rewrite有哪几个flag标志位(last、break、redirect、permanent),说一下都什么意思?

笔者回答:

last : 相当于Apache的[L]标记,表示完成当前的rewrite规则

break : 停止执行当前虚拟主机的后续rewrite指令集

redirect : 返回302临时重定向,地址栏会显示跳转后的地址

permanent : 返回301永久重定向,地址栏会显示跳转后的地址

301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:

last一般写在server和if中,而break一般使用在location中

last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后匹配

break和last都能组织继续执行后面的rewrite指令

总结:关于nginx rewrite用法,笔者看到一篇文章总结的挺不错 ,可以参考一下 https://www.jianshu.com/p/a1fce9358d44

15、你在shell脚本中用过哪些语法,case语法会用到哪些地方?

笔者回答:一般会用到if语句、for语句、while语句、case语句以及function函数的定义;case语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。最典型的case语法会用到启动服务脚本的处理。

16、linux系统中你会用到什么命令查看硬件使用状态信息?

笔者回答:这个命令就很多了,比如:lscpu(查看cpu信息)、free -m(查看内存信息)、df -h(查看硬盘分区信息)、top(还可以动态查看cpu、内存使用情况的信息),/proc/目录下也可以查看很多硬件信息。

17、我要过滤一段文本(test.txt)中第二列的内容?如果这段文件有很多特殊符号,比如用:(冒号)怎么过滤它的第二段?如果我要过滤这段文本中,其中有一行只有7个符如何实现?

笔者回答: awk ‘{print $2}’ tset.txt

awk -F‘:’ ‘{print $2}’ tset.txt

18、比如开发想找你查看tomcat日志,但是catalia.out特别大,你不可能用vi打开去看,你会怎么查看?如果你用 grep -i”error“ 过滤只是包含error的行,我想同时过滤error上面和下面的行如何实现?

笔者回答:grep -i ”error“ catalia.out

grep -C 1 -i ”error“ catalia.out

参数-C:是匹配前后的行,后面1是匹配前后各1行

19、 怎么编写一个定时计划任务?里面用到的最小单位是什么?

笔者回答:crontab -e,最小单位是分钟

20、zabbix如何修改其中监控的一台服务器中内存阈值信息,比如正常内存使用到了80%报警,我想修改为60%报警?

笔者回答:正常来说,一般会把监控的服务器统一加入到一个模板中,修改模板的其是某一项的监控项参数和告警阈值后,加入模板中的所有主机都会同步。如果单独想修改其中某一台服务器内存告警阈值,需要进入这台主机,单独创建一个告警Triggers,关联这台主机监控内存的项,配置好告警的阈值为60%即可实现。其实,zabbix一切都为图形化操作,如果没有接触过zabbix的朋友,可能听起来不太清楚。

21、mysql主从复制原理说一下?

笔者回答:mysql支持三种复制类型(基于语句的复制、基于行的复制、混合类开进的复制)。

如果你记不住太多内容,可以简单说明一下原理:

(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

(2) slave将master的binary log events拷贝到它的中继日志(relay log);

(3) slave重做中继日志中的事件,将改变反映它自己的数据。

20180112090827.jpg

如果你能详细记住它的原理,可以这么回答:

该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

22、用什么命令可以查看上一次服务器启动的时间、上一次谁登录过服务器?

笔者回答:w命令查看上次服务器启动时间。last命令 查看登录。

23、redis集群原理说一下,正常情况下mysql有多个库,redis也有多个库,我怎么进入redis集群中的第2个库?还有,我想查看以BOSS开头的值?redis持久化是如何实现(一种是RDS、一种是AOF),说一下他们有啥不一样?

笔者回答:这个redis原理的问题又问到了,看样子很多面试官都很关心这个redis,在上一篇文章笔者的一次面试也有这个面试问题。

【集群原理】:其实它的原理不是三两句话能说明白的,redis 3.0版本之前是不支持集群的,官方推荐最大的节点数量为1000,至少需要3(Master)+3(Slave)才能建立集群,是无中心的分布式存储架构,可以在多个节点之间进行数据共享,解决了Redis高可用、可扩展等问题。集群可以将数据自动切分(split)到多个节点,当集群中的某一个节点故障时,redis还可以继续处理客户端的请求。

【切库】:单机情况下用select 2可以切换第2个库,select 1可以切换第1个库。但是集群环境下不支持select。可参考https://yq.aliyun.com/articles/69349

【redis持久化】:持久化通俗来讲就是将内存中的数据写入硬盘中,redis提供了两种持久化的功能(RDB、AOF),默认使用RDB的方式。

RDB:全量写入持久化,而RDB持久化也分两种(SAVE、BGSAVE)。

SAVE是阻塞式的RDB持久化,当执行这个命令时redis的主进程把内存里的数据库状态写入到RDB文件(即上面的dump.rdb)中,直到该文件创建完毕的这段时间内redis将不能处理任何命令请求。

BGSAVE属于非阻塞式的持久化,它会创建一个子进程专门去把内存中的数据库状态写入RDB文件里,同时主进程还可以处理来自客户端的命令请求。但子进程基本是复制的父进程,这等于两个相同大小的redis进程在系统上运行,会造成内存使用率的大幅增加。

AOF:与RDB的保存整个redis数据库状态不同,AOF的持久化是通过命令追加、文件写入和文件同步三个步骤实现的。AOF是通过保存对redis服务端的写命令(如set、sadd、rpush)来记录数据库状态的,即保存你对redis数据库的写操作。

为了大家能够更好的理解redis持久化,笔者建议大家可以看下这两篇文章会比较好理解:

https://www.cnblogs.com/Fairy-02-11/p/6182478.html

http://blog.csdn.net/mishifangxiangdefeng/article/details/48977269

24、你在工作的过程中,遇到过你映像最深的是什么故障问题,你又是如何解决?

笔者回答:这个问题主要也是考你排查故障的思路及用到的相关命令工具,其每个人在工作中都会遇到各种各样的问题(不管是网络问题、应用配置问题、还是APP打开慢/网站打开慢)等等。你只要记住一个你映像最为深刻、最为典型的故障就行。笔者也遇到过各种问题,我在这里就是写出来,怕误导了大家。

25、在linux服务器上,不管是用rz -y命令还是tftp工具上传,我把本地的一个文件上传到服务器完成后,服务器上还是什么都没有,这有可能是什么问题?

笔者回答:根据这种现象有可能是:服务器磁盘满了;文件格式破坏了;或者你用的是普通用户上传,正好上传的目录没有权限;还有可能就是你上传的文件大小超出了该目录空间的范围。

26、你在工作中都写过什么脚本?

笔者回答:这个问题的回答别把话说得太大了,要结合实际情况来回答。写过mysql、redis、mongodb等数据库备份的脚本;服务器文件备份的脚本;日常代码发布的脚本;之前用nagios的时候写过一些nagios插件的脚本。

27、rsync+inotify是实现文件实时同步的,加什么参数才能实现实时同步,--delete参数又是什么意思?

笔者回答:rsync是远程同步工具、inotify是一种强大的异步文件系统系统监控机制。通过inotifywait 中的-m参数可以实现“始终保持事件监听状态”。rsync中的-delete参数是指“ 删除那些DST中SRC没有的文件”。

28、我想查看access.log中哪个IP访问最多?

笔者回答:awk ‘{print $1}’ access.log| sort | uniq -c |sort -rn -k 1 | head -1

上面的具体参数如果有不知道的,大家可以自行百度一下,这里不说参数这么细节的问题

29、在linux系统中,一般都会有swap内存,你觉得使用swap内存有什么好处,在什么情况下swap内存才会被使用?你觉得在生产环境中要不要用swap内存?

笔者回答:好处:在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现。

什么情况下会用swap:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到swap空间中,等到那些程序要运行时,再从swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行swap交换。

30、怎么查看两台服务器之间的网络是不是正常的,服务器是禁ping的?

笔者回答:不能用ping,那可以用telnet对方服务器的端口、或者互相访问对方打开的服务。其它的测试方法笔者也没想到,要是哪位朋友有好的方法不访在下面留言讨论。

31、比如我访问百度网站,有什么方法可以跟踪经过了哪些网络节点?

笔者回答:这个太简单了吧,干运维必备的网络排查技能。用tracert命令就可以跟踪,主要是查询本机到另一个主机经过的路由跳数及数据延迟情况。然后你也可以把具体跟踪后输出的信息也说出来,你能说出来都是为你加分的。

32、如果你们公司的网站访问很慢,你会如何排查?

笔者回答:看到没有,又问到了这个问题,笔者在上一篇文章 2017年2月14号的面试中面试官也问到同样的问题。其实这种问题都没有具体答案,只是看你回答的内容与面试官契合度有多高,能不能说到他想要的点上,主要是看你排查问题的思路。我是这么说的:问清楚反应的人哪个服务应用或者页面调取哪个接口慢,叫他把页面或相关的URL发给你,首先,最直观的分析就是用浏览器按F12,看下是哪一块的内容过慢(DNS解析、网络加载、大图片、还是某个文件内容等),如果有,就对症下药去解决(图片慢就优化图片、网络慢就查看内网情况等)。其次,看后端服务的日志,其实大多数的问题看相关日志是最有效分析,最好用tail -f 跟踪一下日志,当然你也要点击测试来访问接口日志才会打出来。最后,排除sql,,找到sql去mysql执行一下,看看时间是否很久,如果很久,就要优化SQL问题了,expain一下SQL看看索引情况啥的,针对性优化。数据量太大的能分表就分表,能分库就分库。如果SQL没啥问题,那可能就是写的逻辑代码的问题了,一行行审代码,找到耗时的地方改造,优化逻辑。

33、我需要查看某个时间段的日志(比如access.log日志),如何实现?

笔者回答:方法有很多种,比如我要看查的时间是2018年1月9号--1月10号的日志吧。

比如可以用sed命令,格式为:sed -n ‘/起始时间/,/结束时间/p’ 日志文件,如下:

sed -n ‘/09\/Jan\/2018/,/10\/Jan\/2018/p’ access.log

比如可以用grep,格式为:grep -E ‘起始时间|结束时间’ 日志文件,如下:

grep -E ‘09/Jan/2018|10/Jan/2018’ access.log

当然,你还可以结合cat、grep 、awk这些命令一起来使用都行。

2018年1月17号:更新1月8号海外面试的结果

博友们,这段时间笔者有点忙,没有及时更新1月8号那天海外面试的结果,实在抱歉了,大家肯定也都蛮期待我上次海外的面试结果。好了,长话短说,上次说了接下来会有二面,具体是哪个国外和哪个公司我就是在这里就不写出来了,感兴趣的朋友可以单播我加我QQ或微信都行。

过了两天,在下午3点钟左右,笔者接到海外的二面来的电话,我们大概将近又聊了1个小时,听面试官的声音,他说他是做java的,要跟我二面聊一下。我心里想,二面不是人资跟我谈薪资待遇、谈人生理想吗?也不管那么多了,聊就聊吧,别看这小哥是做java的,还挺能聊,几乎把我简历上写的那些技能问了个遍(什么cdn原理?、docker是什么?),这些问题我就不写出来了,因为聊得比较粗,不像一面问的技术都那么细。聊完了相关技术之后,我就问他在那边干了多久,生活如何。

二面的面试官在那边生活了有3年多了,看样子他还是比较满意,那边包吃包住,吃饭时间比较自由,住得还不错,安排了单间住。地方就像国内的二线城市那么大,环境也都很好,就是消费挺高的,比北京的消费高的不是一点点,就拿我们吃的蔬菜来说,我们国内一斤西红柿也就几块钱,那边卖60元左右人民币1斤,什么水果都一样,动不动60、70、80一斤,看着这消费挺吓人的。总体来讲,聊得还不错,对我印象也蛮好,他说后面会安排人和我三面,总算是谈钱了。第二天就接到三面的电话,聊了啥也没啥可说的,我就直接把福利待遇和薪资分享出来吧:

吃住:包吃住,也是住单间、吃公司食堂

薪资:到手2W人民币/月,13薪,年底在分点红啥的

工作时间:跟国内一样,也是双休

年假:一年有20天左右带薪年假,可以回国

五险一金:国外都不缴五险一金,你要自己找回内公司代缴

机票:去工作的机票和签证的费用报销

最后,我要把这些情况跟媳妇反应一下,毕竟要商量着来,单身汉就无所谓可以自己做主。分析了一下利弊和自己2018年的计划之后就委婉的拒绝了海外那边的工作。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分