Q1:简单自我介绍一下,还有你所学的东西
A1:姓名性别这些不谈,就读于**大学,**专业的大三学生,投了阿里的数据研发岗......
(之后我有一点跑题,扯了一会儿我的专业,估计小哥哥从中没有挖掘到可以提问的点,居然打断了我。。。断了我。。了我。我。。。。)
Q2:好的,那既然你投的是数据研发工程师,那谈谈你对这个岗位的理解?或者你觉得什么是数据研发?
A2:阿里有数据研发、数据分析、数据挖掘。数据分析应该是应该是和大数据相关的吧,利用大数据技术在传统数据领域进行创新。在信息爆炸的时代,对海量的数据仓库进行建设和数据分析,探索大数据的解决方案
(看似是比较靠谱的回答了,但是,naive!!!那是我事后自己总结的我现在想起我的回答都想对自己说声“傻bi”,我居然告诉人家我比较中意的是运维岗,但是看到招聘要求之后觉得数据研发和运维要求差不多,所以投了数据研发,欲哭无泪.jpg)
(估计面试的小哥哥也欲哭无泪,你丫啥叫数据研发都不知道就跑来投!依然耐心的解释数据研发和运维蛮大区别的,但是既然你投了数据研发我还是得从岗位本身去考核你)【我估计小哥哥当时想打死我的心都有吧hhhh
Q3:那咱们聊聊你的项目吧,你的第一个项目是,利用varnish+nginx实现CDN加速,简单介绍一下工作原理?
A3:CDN需要自己搭建,一般主流方案有3种,squid、varnishi、nginx+memcache
squid功能全面,但架构太老。varnish内存缓存,速度快但是内存缓存也限制了它的容量。nginx本身是反向代理/web服务器,可以用这个搞搞副业,再加上memcache作第三方模块作为缓冲,性能上基本可以达到varnish
基于以上这些优缺点,创新性地提出一个小想法,用varnish+nginx来搭建CDN,(nginx+memcache适合缓存纯文本体积较小的内容,我知道淘宝是用tengine+squid如果不出意外的话)。
CDN(Content Delivery Network)内容分发网络,工作原理是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输更稳定更快。那么为什么要使CDN加速呢?为了应对某一时段访问数量激增,解决网络访问路径过长,使用户实现高质量的访问。这里就得不说CDN的原理了,我要访问的服务器在北京,我人在西安,那么就把北京服务器上我的数据复制到西安的服务器上,这么个原理。CDN加速的优点是成本低、速度快,所以说这个功能还是很值得实现的
想到这个点子主要得益于nginx功能强大,varnish有点像是在架构基础上山寨进去的,有点这么个意思,nginx作为一个高性能的HTTP和反向代理服务器(反向代理:代理服务器来接受客户端上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给客户端),最大的特点是对高并发的支持和高效的负载均衡。如果把服务器比作饭店,没有nginx,一桌厨师就得服务一桌顾客,点菜炒菜上菜收银全是厨师负责,n桌顾客就需要n个厨师,有了nginx就像有了服务员,分担了原来厨师的工作,厨师只用专心负责炒菜就好了,饭店效率就大大提高了。nginx在实验中作web站点
varnish,之所以会选用varnish作反向代理是觉得varnish的关注度好像不是特别高,不如memcache。真正开始工作的时候,如果有新的HTTP连接过来,varnish负责接收,然后叫醒某个等待中的线程,并把具体的处理过程交给它,这是一个接收缓存的过程。接下来等到Worker线程读入HTTP请求的URI后,查找已有的object,如果命中缓存,则直接将结果反馈给客户端。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复,这是varnish原本的工作机制。但是加入了nginx后,没有命中缓存,varnish就会访问后端服务器nginx,之前提到nginx的一大优势是负载均衡和支持高并发,nginx这个时候将结果反馈给varnish,再通过varnish反向代理的作用将结果反馈给客户端,将信息在本地缓存下来,下一次就可直接访问
与其说是nginx+varnish 实现CDN加速,不如说是刚好将二者的优点结合到一起,取彼之长补己之短的意思
(盒盒!如果你觉得我在面试时候把这些全回答出来那就图样了。并没有啊啊啊!!!这些都是经过深刻反思之后自己总结的,都是泪啊,我擦泪。。。)
Q4:那你觉得nginx和tomcat有什么区别呢?或者说各自的优点是什么?
A4:nginx在之前的项目中提到,最大的功效是支持负载均衡和高并发。两个都是web服务器,都是apache开发的,都有http服务功能
但是
nginx:
轻量级:nginx应该算是轻量级服务器的首选,占用更少的内存和资源,这个商用价值应该更高些吧
抗并发:这是众所周知的优点而且也是个非常具有实际意义的优点
简单:高度模块化,配置简洁,还很容易启动,启动之后几乎是7*24h不间断运行,这就很棒棒了
有名:开源而且作为一个后起之秀(和apache相比)迅速走红,在各种社区的活跃度很高,通过各种程序猿踊跃建言献策之后各种模块迅速出品
tomcat:
轻量级:tomcat对于JSP 程序来说是首选
不抗并发:处理不了高并发问题,nginx有的这个巨大优点tomcat没有,所以nginx和tomcat通常配合使用(1.利用nginx反向代理的优势分发请求,开始分工,动态资源交给tomcat,静态资源交给nginx,由nginx返回给浏览器,大大减轻了tomcat的压力:2.实现负载均衡,当业务压力增大,一个tomcat实例不足以处理,就可以启动多个tomcat实例进行水平扩展,又利用nginx的负载均衡功能把请求分发给不同的实例)
处理HTML页面的功能,但是处理静态HTML能力不如apache
(我再补充一个apache吧,虽然这次没被问到,一家人最重要的就是整整齐齐嘛,万一下次哪家面试又被问到><)
apache:
模块多:模块超多,基本想要的模块都能找到,像个机器猫似的
稳定:apache最大的优点应该是稳定性,bug也比nginx少,相对较少吧只能说是
apache与nginx相比的核心区别是:apache是同步多进程,一个连接对应一个进程
nginx是异步多进程,多个连接对应一个进程
也各有优势,比如nginx的优势是处理静态请求,apache适合处理动态请求。两者配合使用的时候前段用nginx作反向代理,apache作后端处理动态请求
(以下是就本项目进行的扩展,有些是本菜鸟自己扩展的,笨鸟先飞我还是多扩展一点吧QWQ)
Q5:nginx的工作原理能介绍一下吗?什么是负载均衡?怎样实现的?
A5:nginx是根据需求来运行进程的,一般是一个master和多个worker,配置了缓存的话还有缓存加载器进程和缓存管理器进程等等。所有的进程只含有一个线程,进程间的通信是通过“共享内存”来实现。刚才说到他有一个master嘛,主进程,master比其他几个都要高端一点,它是用root身份来运行
负载均衡:简单来说就是将多个工作负载分布到多个服务器上来提高网站或者是数据库的性能
一个没有负载均衡的web架构是不可靠的,如果这个服务器宕掉了,用户就没办法访问了。假设这个服务器不宕掉,如果有很多用户都来访问这个服务器,服务器处理不了那么多请求,就会加载缓慢或者无法连接
实现原理:在服务器超负荷的时候,引入一个负载均衡器和一个web服务器,就可以缓解故障了。通常情况下,所有的后端服务器都会保证他们服务器上的内容是相同的,不管用户使哪个服务器响应,都能收到一致的内容。引入了负载均衡器之后,用户先访问负载均衡器,然后负载均衡器再将请求转发给后端的服务器。但是这里又暴露了一个弊端就是单点故障。也可以解决,再引入一个负载均衡器就行了。之前提到,还引入了一个web服务器,此时最少就有两个web服务器了,那么到底怎么选呢?要翻谁的牌子呢?负载均衡器就犯难了,就像皇帝选妃一样选漂亮的,负载均衡器选的是健康的,能够正常做出反应的。这就需要健康检查了。负载均衡的算法有三种轮询、最小连接和source。之前还提到不光引入了web服务器,还引入了负载均衡器,要解决负载均衡的单点故障问题,也可以将第二个负载均衡器连接到第一个上,形成一个集群。主负载均衡器发生了故障,就将用户需求转移到第二个负载均衡器上。但是这里又有一个弊端是,DNS更改后需要时间才能生效。解决方法是用浮动IP解决IP地址重新映射。
Q6:进程和线程的区别是什么?
(这个是本菜鸟自己扩展的,我怕被问到)
A6:之前对线程和进程的理解一直比较片面和肤浅,觉得进程包含线程,进程是线程的容器,进程是爹妈,线程是他的众多儿子。书面一点讲说进程是有一定独立能力的,在计算机中已经运行的程序的实体。形象一点说,进程就是一个公司里的项目组,项目组里得有人干活呀,那么每个程序员就是一个线程。也有一个程序员就撑起一个项目组的,这就是一个进程对应一个线程。或者是我在玩电脑,我开了QQ,又开了腾讯视频,还开了QQ音乐,这就是开进程。但是在QQ这个进程里,我同学找我了,对话框弹出来了,这是一个线程,我给他发文字,传输文字这是一个线程,给他发语音,传送语音这又是一个线程。
Q7:那你在这个项目中有遇到什么难点吗?你是怎样解决的?
(然后我进行了一个作大死的回答,我说我忘了,我tm居然给忘了。确实忘了,我去年7月就做的这个项目了,然后我仿佛看到了小哥哥的生无可恋脸。。。)
A7:等我再去把项目熟悉一下之后再来回答,我一定会回来的!!!
(因为投了数据研发岗,所以被问了数据库相关的东西,下面请看我是如何作死的。。。)
Q8:我看你写了熟悉Mysql,你能介绍一下怎样实现快速查找吗?你知道索引结构是怎样的吗?你学过数据结构吗?
A8:不知道,不知道,没学过。。。:
(我真是一问三不知啊,不知道对方啥心情,此时还是耐着性子问下一个问题hhh)
Q9:好,那熟悉TCP/IP协议,TCP有几次握手,具体过程是怎样的?
(啊啊啊苍天啊,我都要被问哭了,终于等到一个我能对答如流的问题了。。。)
A9:(果断地愉悦地)3次。因为3次是最可靠的。我把这个TCP三次握手的过程形象的理解为打电话的过程
假设在一个通话质量不佳的环境下我们进行通话(这里的我们指我和面试官)
我说:喂,你好,你能听到我说话吗(第一次)
面试官说:你好,我能听到(第二次)
我说:哦好的我也能听到你说话(第三次)
Q10:那为什么不是2次,也不是4次呢?
A10:如果是两次的话,不好判断服务器端是否做好接收准备,也许他在忙碌或者没准备好,这些情况都无法判断,还是打电话的过程
我说:喂,你好,你能听得到我说话吗(第一次)
面试官:你好,我能听得到(第二次)
这就没下文了,我就不知道你到底能不能听得到我说话
如果是四次呢,第四次又显得非常多余,还是模拟打电话的场景
我说:喂,你好,你能听得到我说话吗(第一次)
面试官:你好,我能听得到你说话(第二次)
我说:哦好的我能听得到你说话(第三次)你能听得到我说话吗(第四次)
这就显得我非常傻bi了
(小哥哥此时终于欣慰地连说了三个对,对对对,好><)
(此时估计是看我找到了一点面试状态,开始问项目了,我真是高兴得太早。。。)
Q11:那说说你的第二个项目吧?怎样实现的?工作原理是怎样的?
A11:第二个项目是ELK+redis+http
(以下的回答不是我面试时回答上来的,而是我现在含泪总结的!!!擦泪。。。)
ELK是Elasticsearch + Logstash + Kibana组合在一起形成的一套监控架构,很多公司利用它来搭建海量日志分析平台。
三者各有分工,Elasticsearch 担任的角色是搜索服务器,Logstash是一个用于管理日志和事件的工具,你可以用它去收集日志、转换日志、解析日志并将他们作为数据提供给其它模块调用,Kibana是一个优秀的前端日志展示框架,它可以非常详细的将日志转化为各种图表,为用户提供强大的数据可视化支持。
redis是一个高性能的key-value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
http是超文本传输协议,凡事WWW文件都必须遵守这个网络协议
工作原理:ELK的架构是Logstash首先在各个应用中设置一个Shipper节点来收集日志,像个特务,然后转化为统一格式的日志数据,收集转化完之后,将信息转入Message Broker(也就是redis数据库中)存储,存储是利用redis中的list来完成(实际上是一种双向链表结构,通过lpush、lpop、rpush、rpop这几个命令来控制链表中数据出入,如果从链表的两头插入或删除元素,会非常的高效,即使链表中已经存储了上百万条的记录,也可以在很短的时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的)。之后日中心Logstash得indexer节点从Broker中读取日志,分析日志,再按照日志流转存到ElasticSearch中建立索引,以便日后查找、搜索、分析。最后的展示工作就由Kibana来完成,Kibana是一个功能强大、丰富的web界面,从ElasticSearch中读取数据,支持各种查询、展示
Q12:你在这个项目中遇到的难点有哪些?最终如何解决的呢?
A12:首先下载安装完ElasticSearch的RPM安装包之后,就可以启动了,但是发现启动不了,就去看日志,日志的警告信息说文件数至少为65535,改一下就好了,可以正常启动了
接下来是安装Kibana,通过http访问,可以看到kibana页面
最后安装Logstash,Logstash在这个项目中的角色可说是举足轻重,负责输入、过滤、输出(均在配置文件中执行),每个实例也是根据需求制定。
首先是中心节点,负责将Broker中收集到的日志流转化到ElasticSearch中,这需要创建一个配置文件,创建完启动完了之后,往redis中push一条数据来测试是否成功,再通过kibana界面查看
其次是shipper节点,该节点负责收集日志并将日志流发送给redis。这个节点需要配置。配置完成后,Logstash会对日志进行检测,一旦发现发生了变化,会将变化发送至redis中。Logstash的过滤功能中还有很多插件,比如grok插件可以解析日志格式,date插件可以添加时间戳......可扩展性很强
在对http进行压力测试的时候,ELK显示的信息量没有达到实际日志量,就是两个数字不相吻合。就像可能会是数据库的原因,就去找redis的原因,因为redis的存储量达到他可以占用的内存后,多余的信息就被自动删除了。然后在redis的配置文件中修改了maxmemory,要告诉他占用多少物理内存后开始拒绝后续的写入请求,这样就解决了
如果一台主机不够,还可以增加多台主机,这就运用到了自动化运维的知识
Q13:你平时shell常用的命令有哪些?
A13:平时学习时用的比较多的是awk、sed
(以下是本菜鸟针对这一问题的扩展,毕竟我这项实在是太弱太弱。。。)
Q:shell脚本是用来解决什么的?是必须的吗?
A:shell是解决用户与操作系统的通信问题的,不管是命令行shell还是图形化shell,可以理解为命令解释器。一个shell就相当于一个文本文件,文件里边有一个或多个命令。作为系统管理员,经常需要使用多个命令来完成一项任务,将这些命令添加在一个文本文件来完成任务,这就是shell脚本
Q:awk的用途是什么?
A:在文件或者字符串中浏览和抽取信息,概括来说就是操纵文本文件中的数据
Q:怎么使用awk?
A:awk 用法是固定的,awk '{pattern + action}' {filenames} 表示 awk,单引号,花括号,跟上要中查找的内容,还有找到匹配内容时所执行的一系列命令
Q:举个例子?
A:我要打印3个数字v1,v2,v3 echo | awk '{var1="v1";var2="v2";var3="v3"; print var1"-"var2"-"var3;}'
一定要有双引号,双引号是连接符
Q:sed的用途是什么?
A:批量修改文本内容,文件中的字符串的替换、移动、删除、与搜寻数据行等等
Q:怎么使用sed?
A:sed '[选项] [动作]' filename 表示sed 后跟上参数或者动作,最后跟上文件名
Q:举个例子?
A:sed -e '5c\hello world!!!' filename
Q:shell中“$?”标记的用途是什么?
A:检查前一行的命令是否执行成功,结束状态是0,表示成功,不是表示不成功
Q14:你说你有Java基础?那你知道***吗?用Java干什么呢?
A14:不知道啊。平时用来写过一些记事本啊,计算器啊之类的小程序
(我靠我没有听清,好吧,听清了有很大概率我也不知道,不说了,滚去看Java了。。。)
至此,面试所有问题均问完。总的来说还是没有偏离简历这个考纲,所以简历的内容一定要熟门熟路才行,千万不要托大,不要把自己包装得过于完美,因为这些东西你知道别人也一定知道,在他们看来这都是非常小儿科的,你不知道的别人也知道,所以你需要不断的学习。一句话,还是要多读书啊,over!