Linux运维工程师笔试题第十四套

前言

这几天一边看着《nginx高性能WEB服务器详解》,一边看着基础知识。那么最容易入眼的基础知识是什么呢?当然是面试题了,于是乎就找出来一些阿里(含滴滴和蚂蚁金服)的运维面试题,以题带看。

看完之后觉得阿里真的不是盖的,面试题的质量比那些晚上乱七八糟的题质量好多了,细节抠的真是非常细。我记得曾经有一个前辈曾经说过,工作中我们经常注意一些奇淫技巧,但是忽视了基础知识的重要性,现在好多程序员不会认认真真地读本书,喜欢快餐文化,受了市面上很多培训机构的影响,这是要不得的。

最后再说一句,以下所有的题都属于“开放性”试题,可以根据基本点去发散,说出你的理解和认识。但是注意,不要避重就轻耍滑头,问A,可以发散到A1、A2…但是不要发散到X、Y、Z,然后大谈特谈XYZ,这种“小聪明”就是找死的行为。

废话到此为止,上题

1)http一般是无状态的,怎么让它变成有状态的?
[我的答案]http协议跟IP协议、UDP协议一样都是无状态的,http的无状态意思是“每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况”。补充一下,TCP是有状态的,它的请求并不独立,它通过包头的一些控制字段来分别包的关系,这里可以自行脑补一下“三次握手”的图。

那么http是无状态的这一点是无法改变的,那么要变得“有状态”,就需要引入cookiesession,通过这两个机制去实现一个有状态的WEB应用。用一个表达式可以这么理解:Web应用=http协议+session、cookies等状态机制+其他辅助的机制

2)解释一下cookie和session的区别
[我的答案]session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中,session是一个抽象概念,开发者为了实现中断和继续等操作,抽象出来的一个“会话”,接上面那道题,session这个东西是有状态的,服务器要维护一个有状态的东西是很消耗资源的(比如内存和空间),我估计天猫京东那规模的电商,肯定有一个专门的session集群。

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式,cookie是一个实际存在的东西,它是在http协议中定义在header中的字段。同一个域名给的cookie肯定是一样的,所以每一个cookie(key)对应的session(value)是唯一的。

session的常见实现要借助cookie来发送sessionID给客户端,如果浏览器禁用cookie,那么就要通过重写url来获取sessionid,各位可以联想一下电商的购物车,购物车可以实现在一个网站的不同页面把东西都放进一个购物车,这就是session的重点应用。现在也很流行一个token,其实tokensessionid是一个意思。

3)多进程和多线程的区别,自己喜欢用哪个?为什么?
[我的答案]多进程:服务器每当接收到一个客户端信息的时候,从主进程里生成一个子进程与客户端建立连接开始交互,每一个子进程之间互相独立不受干扰,完成任务就收回资源,内存等也会被回收;
多线程:服务器每当接收到一个客户端信息的时候,从主进程里生成一个线程与客户端建立连接开始交互,多个线程位于同一个进程内,可以互相访问同样的内存等资源,彼此之间会有影响;
我个人更喜欢多进程,因为简单粗暴!
关于多进程、多线程、同步、异步的原理,可以去看一下《nginx高性能WEB服务器详解》,第54页到56页的内容。

4) lvs脑裂如何解决,为什么会产生双master?双master时VIP通不通?
[我的答案]产生双master的原因:1)服务器开启了iptables防火墙,阻碍了心跳信息传输;2)服务器心跳网卡等信息写错了,导致心跳信息发送失败;3)心跳方式不搭配,心跳广播冲突;4)软件出bug了;

额外补充一句,要排除脑裂问题,第一步是检查iptables,很可能是由于iptables把心跳信息隔断了,重要的话不说三遍也重要!

其他两个问题不会了,我在实际工作里没有接触到。

5) 为什么TCP比UDP的信息更加可靠?详细说说tcp滑动窗口原理,窗口的大小如何确定。
TCP可靠性由三个机制保证:1. 序号(TCP报文的序号)2. 确认(ACK机制)3. 重传(超时或者冗余的 ACK
tcp在传输的时候,因为接受方B能力有限,不可能一口气吃下所有发送方A所有的数据流信息,所以B要限制A每次发送的字节数量,并且一一确认,确认了之后A才可以继续发。
这样的话,A的在发送数据流的时候就会有四种形态:
1.已发送已确认;
2.已发送但没被确认;
3.未发送但是接受方已经准备好空间来接收;
4.未发送但是接受方尚未准备好空间来接收;
随着数据流的传输,这个形态是会时刻发生变化的,通过接受方B返回的确认信息来改变2的大小,同时B也会根据一次关于发送方A要发送多少字节确认自己的空间来改变3的大小。

6) 简单说说cdn的工作原理,如何评估一个cdn sp做的好不好。
[我的答案]cdn的工作原理:通过权威dns服务器来实现优质节点的选择,通过缓存来减少源站的压力。

IT界有个很有名的比喻,正向代理是“找马云借钱”,反向代理是“给10086打电话”,而反向代理就是CDN的实现原理雏形的一部分。详情可以看:http://www.iweir.cn/zheng-xiang-dai-li-yu-fan-xiang-dai-li/

7)dns查询的过程说一下,为什么要有cname而不是直接返回一个cdn边缘节点的ip。
[我的答案]先说一句题外话,dns主要是基于udp的!
dns查询的过程以www.taobao.com为例:
1.在浏览器键入www.taobao.com,其实真正dns协议里用到的是www.taobao.com.最后还有一个点,可能是因为美观等原因,一般都不显示;
2.查询本地缓存(host文件或者是浏览器的缓存)中有没有该域名对应的记录,有的话就直接用了;
3.向运营商的DNS服务器发起dns解析的请求,一般称运营商的DNS服务器为local dns;
4.local dns会查询本地的缓存,local dns设置的缓存时间是有讲究的,过长过短都不好。另外local dns的查询是运营商的事,这里面水很深,外部不可控(这也是天朝能搭建特色墙的根源的思想雏形);
5.local dns如果没有缓存,会把域名从右往左扫描,依次请求对应的服务器,例如对于域名www.taobao.com.,先去问负责.的根域名服务器,就是传说中全球只有几台的那些服务器,他们会答复.com是谁管理的,然后local dns又去找管理.com的服务器(假设名字为S1),去问问taobao.com是谁管,一般来说,在S1查到的记录是一条cname记录(阿里毕竟大公司,自己管理自己旗下的域名),然后就转到了阿里自己的DNS服务器上来了,一般称之为权威服务器;
6.权威服务器是阿里自己建的,然后根据公司内部的一些配置啊,调整啊,查到www.taobao.com.对应的服务器是谁,返回一个IP地址;
7.local dns缓存这个IP地址,并且回复浏览器;
8.浏览器和对应的IP地址的服务器建立TCP连接,发送HTTP报文;

用图表示就是:
akb48

至于说为什么不返回cdn边缘节点IP,是因为使用CNAME记录可以很方便地变更IP地址,毕竟服务商掌握着IP的生杀大权,哪一天需要换IP了,在这方面很不方便。

8)举例说下正则表达式和扩展正则表达式、例如:url、ip、邮箱的正则表达式?
[我的答案]这三个都是网上找的,正则这个东西还是要多练多写。
url的正则表达式:
([/w-]+/.)+[/w-]+.([^a-z])(/[/w- ./?%&=]*)?|[a-zA-Z0-9/-/.][/w-]+.([^a-z])(/[/w- ./?%&=]*)?
ip的正则表达式:
^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.”+”(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.”+”(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.”+”(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$
邮箱的正则表达式:
^[a-zA-Z0-9.!#$%&’+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61} [a-zA-Z0-9])?(?:.a-zA-Z0-9?)$

9)解释raid0、raid1、raid01、raid10、raid5、raid6,并分析各自读写性能?
[我的答案]https://rorschachchan.github.io/2018/01/31/简析raid0-raid1-raid10-raid01等等硬盘搭配/

10)raid为什么不搞个raid50、raid15,不能搞是因为有什么冲突还是什么等等?
[我的答案]raid50是有的,但是用途不广泛。
raid15我是没听说过,因为raid1的写本身就不强(一样的内容要写两个盘里),raid5的写入能力更烂,那么raid15的磁盘写能力简直就是灾难。而且花了硬盘的钱只能存实际一半的量,正常人都不会这么做的。

拓展阅读

https://segmentfault.com/a/1190000007243675
http://mertensming.github.io/2016/10/19/cookie-session/
https://wizardforcel.gitbooks.io/network-basic/content/index.html
https://coolshell.cn/articles/11564.html
https://coolshell.cn/articles/11609.html
http://blog.sina.com.cn/s/blog_93b45b0f0101a4ix.html
http://www.cnblogs.com/549294286/p/5172435.html
https://wizardforcel.gitbooks.io/network-basic/content/7.html(这个墙裂推荐,基础知识)
http://blog.jobbole.com/105500/
http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.failover.html

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------