在上一篇文章  总结一下:运维工程师面试的经历及面试相关问题(会持续更新) 笔者也讲到会持续更新,由于上一篇文章内容有点长,为了便于大家阅读,所以笔者就另起这篇文章继续来讲述一下笔者的其它面试过程的面试问题。

    其实笔者写这文章的目的很简单,就是想和大家一起探讨和学习咋们做运维的兄弟如何在面试的时候成功率能大幅度的提高,并且能拿到满意的待遇,当然自身还是要不断的学习,提高技术能力。还有就是大家去面试前看一下这篇文章对面试会有所帮助,面试的时候能更加的自信,笔者也想多交些朋友,共同学习和进步。下面分享一下笔者在2018年1月8号和海外面试官司的电话面试是怎么进行的?


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 如下图:

总结一下:运维工程师面试的经历及面试相关问题(续2)_运维

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) slavemasterbinary log events拷贝到它的中继日志(relay log)

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

总结一下:运维工程师面试的经历及面试相关问题(续2)_运维工程师面试_03

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

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

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

SQL slave threadSQL从线程)处理该过程的最后一步。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年的计划之后就委婉的拒绝了海外那边的工作。

  



好了,先到这里吧,总结了这么多、打了这么多字也挺累的,希望大家可以给点鼓励点个赞让我更有动力写下去。

有需要的朋友可以转载或者收藏起来一起讨论。


祝大家过年后都能找到满意的工作,有找的自己满意的工作一定要跟笔者留言分享、或者加我QQ分享给笔者哦。


未完待续,计划在过完年后笔者好好的投些简历出去,共同期待、共同进步吧博友们!!!



喜欢我的文章,请点击最上方右角处的《关注》支持一下!