也有段时间没有整理面试题目了,这几天呢,完成了2场实习生和1场校招,十分郁闷,为什么金融运维一点都不关注技术,在乎我的学校成绩,我尼玛想说,学校那么水的课程能说明什么,跟技术有一丁丁点关系吗?我学业成绩不好,就能否定我的专业岗位基础不行吗?唉,劳资想说,你如果质疑我的能力,你就问我,劳资要是被你虐倒是我算我输,学艺不精我就服,看过去有球用。

    这辈子职业生涯都不想进外包和IDC这两种类型的公司,就是TM打杂的,薪资还低,关键是不厚道,比如垃圾胜蓝。这回校招那家是我之前就提到的那家,大多数人对我是认可的,就是我的学校成绩太难看,有点危险啊,还在等消息,希望不被发现我就进入巅峰的轨道了。反正,时时刻刻都要抱着以面试形式的姿态来学习,因为有可能分分钟就丢掉了饭碗。后续我会整理人事面题目,一是以备自己使用,包括未来十年内跳槽、被炒鱿鱼后再求职都是这样的套路问题,以后想用了,直接拿来看看就是了,二来呢,分享给大家,做个好人,不过我会以我自身的口吻描述和回答,各位看官笑笑就好。

    莫要停止向前啊,不然分分钟被淘汰的节奏。网络、数据库、Linux运维、Develops,内容不要太多,但是能了解多少就学多少吧,接下来我要更注重操作了。



1、什么是关系型数据库?什么是非关系型数据库?他们之间有何优势和区别?
答:(1)关系型数据库:建立在关系模型基础上的数据库,是一张拥有关系名称的二维表,关系模型由关系数据结构、操作集合、完整性约束三部分组成。如Mysql和Oracle。
非关系型数据库:一种键值对形式存储的数据结构,虽然它的速度非常快,但基本上只能通过键的完全一致查询获取数据。如Mongodb和
Redis。
(2)SQL优势:支持事务(保证数据的一致性)、支持多表复合查询。
(3)NOSQL优势:擅长大量数据的写入处理,适合字段不固定的应用。
参考文档:http://www.cnblogs.com/chay1227/archive/2013/03/17/2964020.html

2、如果有一天,你发现主从不同步,你咋办?(生产环境太难办了)
答:通过安装pt-table-checksum软件来检查主从一致性,或者在从机上show slave status \G查看SQL线程和IO线程是否Yes
(不太准确)。
解决:分析是IO线程不同步还是SQL线程不同步,首先是分析Mysql的日志情况,一般情况下的是
(1)跳过错误执行同步。set global sql_slave_skip_counter =1;
(2)从主库上拷贝数据到从机上,然后进行导入,最后重新指定master的binlog文件和位置,重新进行主从复制同步。
参考文档:(pt-table-checksum的安装)http://mrxiong.blog.51cto.com/287318/1651349/
(主从不同步解决步骤)http://www.cnblogs.com/lixiansen/p/5667340.html

3、top和ps命令在进程占有资源率的统计方式有什么不同?(别看这些细节还不好说清楚)
答:(1)top命令是实时动态监控进程所占资源的情况,包括内存、CPU、以及进程运行的状态;而ps命令是显示执行命令的这一时刻的所有进程运行情况。
(2)top命令更全面一些,记录当前系统时间,平均负载情况,以及交换分区情况。

4、硬链接有什么用?
答:因为在linux系统中通过硬链接删除大文件速度会很快。

5、初学者在Linux系统的开机启动项如何选择?
答:建议选择六个开机启动项:
①crond:该服务用于周期地执行系统及用户配置的计划任务。有要周期性执行的任务计划需要开启
②iptables: iptables包过滤防火墙,有外网IP时,考虑开启。
③network: 启动系统时,若想激活/关闭启动时的各个网络接口,则应(必须)考虑开启。
④sshd: 远程连接Linux服务器时需要用到这个服务程序,所以必须要开启,否则将无法远程连接到Linux服务器。
⑤rsyslogd:是操作系统提供的一种机制,系统的守护程序通常会使用rsyslog将各种信息收集写入到系统日志文件中,CentOS6以前此服务的名字为syslog。
⑥sysstat:包含监测系统性能及效率的一组工具,比如CPU使用率、硬盘和网络吞吐数据等,这些数据的分析,有利于判断系统运行是否正常。
参考文档:http://ccyypoint2008.blog.51cto.com/5602714/1763539

6、详述iptales工作流程以及规则过滤顺序?(这个问题一时不好回答,没见过这种问问题的方式)
答:工作流程:本地网卡收到源端发过来的数据帧,根据四表五链的规则,进行匹配转发或者丢弃。
过滤顺序:iptables执行规则时,是从从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作(accept, reject, log等),决定下一步执行的情况,后续执行一般有三种情况。
(1)一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
(2)一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
(3)一种是中止所有规则队列的执行。
参考文档:http://www.educity.cn/linux/515608.html

7、如何解释iptables的四表五链?每个表有哪几个链(看图说话才好懂,真拓麻难记啊)
答:NAT表:用来做地址转换的(PREROUTING/OUTPUT/POSTROUTIONG);
filter用来过滤的(INPUT/FORWARD/OUTPUT);
mangle:修改数据包格式的(五条链都有);
raw:(OUTPUT、PREROUTING)设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
PREROUTING:数据包进入路由表之前,用DNAT目的地址替换动作
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:离开路由表之后,用于SNAT源地址替换动作
4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter,如果PRROUTING链上,即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理
参考文档:http://www.360doc.com/content/11/0506/09/706976_114731108.shtml

8、如何使在命令行执行的 iptables 规则永久生效?
答:service iptables save 是临时生效
(1)将规则写入到/etc/sysconfig/iptables中。
(2)将规则写入到/etc/rc.local中

9、linux 服务器忽然变成只读文件系统,是什么情况?(这个问题好像经常被考呀)
答:(1)检查一下文件权限,重新挂载一下根分区,mount -o rw,remount /
(2)用mount命令查看已经挂载的文件系统,有何异常,如果有文件系统是只读的,建议卸载umount -l /dev/sr0(list label)
(3)可能Inode已经使用完了,虽然磁盘还有空间但是没法去写文件了,用df -hi 参数查看一下。必须删除小文件才行结合find。
(4)最差的选择,用光盘引导进入,进入Linux rescue救援模式,进行fsck.ext4 -y /dev/sda进行文件修复,但是要之前备份好
文件,否则可能会产生灾难。
参考文档:http://blog.csdn.net/ablo_zhou/article/details/5530826/

10、为什么要整合apache和tomcat?
答:(1)为了动静分离客户端发出来的请求。tomcat本身作为web服务器可以处理静态内容,但是即要处理静态资源和又要处理动态资源对tomcat服务器的处理压力巨大。
(2)tomcat应用程序服务器对rewrite重定向规则、expires浏览器缓存、gzip传输压缩等功能支持不够好。

11、shell中"."和"source"有什么区别?
答:”.“ 是新产生一个shell进程,然后执行相应的脚本
   source是在当前shell下执行,不再启用其它shell。

12、一主多从环境下,主机器down掉之后,选择哪台slave作为新主?(唉,终于知道他想问什么呢?)
答:选择中继的日志偏移量最大的作为新主。对比选择Relay_Master_Log_File,Exec_Master_Log_Pos最大的作为新的主库,这里我们选择slave1为新的主库,其实如果两个从IO线程一直都是正常,没有落后于主,且relaylog都已经重放完成,两个从是一样的,选择哪个都可以。也能使用keepalived高可用软件实现自动的故障切换。
参考文档:http://wenku.baidu.com/link?url=6HbE86_8JasiUAd6aJmgSa005KRAomGW3QVWZaEODsh_1jNqKTQazQlhxnaRTqJb_e4-8A9O5T_xIVhM8sSTP0TpJtKGXoCvVkq4mZ6iNm3

13、mysql主从的物理特性是什么?(我日啊,现在才想起来当时思必驰技术总监想问啥意思)
答:保证数据的一致性和完整性。但是数据一致是在建立主从关系以后,主创建的数据才会被传入到从机器上面,在这之前的数据,只能进行手工导入(就这么简单吧,我都想不起来,唉,难怪我失业呀)
参考文档:http://blog.chinaunix.net/uid-20639775-id-3254611.html

14、说说读写分离是怎么一回事?
答:(1)读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库处理压力,也能减轻磁盘io压力。主数据库提供写操作,从数据库提供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操作时,数据要同步到从机器上面,这样才能有效保证数据库完整性。
(2)使用mysql-proxy作为读写分离的软件,mysql-proxy的4040端口负责监听前端应用程序发过来的请求,mysql-proxy本身并
不负责读和写的任务,仅仅是充当SQL路由的角色,将写操作发生master上面,将读操作发生在从服务器集群的某个节点上面。这种设计能够很大程度上减轻mysql实例的CPU使用率高居不下的情形下。

15、主从复制中有master,slave1,slave2,...等等这么多MYSQL数据库,那比如一个JAVA WEB应用到底应该连接哪个数据库?(这个问题我应该思考很多次了吧,只能说理论很简单,实施实验没一天是完成不了的,还不是运维能做的是事情)
答:当然,我们在应用程序中可以这样,insert/delete/update这些更新数据库的操作,用connection(for master)进行操作,select用connection(for slaves进行操作。那我们的应用程序还要完成怎么从slaves选择一个来执行select,
例如简单的轮循算法。这样的话,相当于应用程序完成了SQL语句的路由,而且与MYSQL的主从复制架构非常关联,一旦master挂了,某些slave挂了,那么应用程序就要修改了。能不能让应用程序与MYSQL的主从复制架构没有什么太多关系呢?
找一个组件,application program只需要与它打交道,用它来完成MYSQL的代理,实现SQL语句的路由。
mysql proxy并不负责,怎么从众多的slaves挑一个?可以交给另一个组件(比如haproxy)来完成。这就是所谓的MYSQL READ WRITE SPLITE,MYSQL的读写分离。
参考文档:http://biweili.blog.51cto.com/4234993/1839448

16、请从一个运维的角度(非开发),穷尽所有思路,对数据库服务器进行优化?(之所以这么问,是避免回答说些SQL语句优化,可能不是运维面试官想听的答案,开发大佬会接受)
答:(1)老思路,从硬件上改变是最给力,使用固态硬盘做RAID阵列(可能是RAID 1+0),提高磁盘的IO能力
(2)根据业务逻辑,对数据库进行分库分表,是减轻对海量数据的读写压力(不要说是提高读写能力)
(3)分布式集群,以mysql-proxy和ameoba为首的读写分离方案
(4)搭建一台Memcached服务器,用来对查询频繁的数据进行缓存,减轻后端服务器的读压力
(5)配置文件中对参数的优化,比如最大并发连接数、连接超时时间、表缓存和索引缓存。

17、Nginx与Fastcgi整合的原理?
答:Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程
http://blog.csdn.net/sunnyzhangwenhan/article/details/8833296

18、进程的运行类型有哪几种?有何区别。
答:standalone和xinetd。(1)standalone称为独立运行模式,而xinetd称为超级模式,它是基于父进程启动的。
(2)apache服务就是这样的运行模式,standalone是启动一次然后监听所有的连接,而xinetd接到客户端的连接请求才启动,随着连接的结束进程也相应结束。

19、如果Apache服务器只允许192.168.1.1来访问,不允许其他人访问,该怎么设置?
答:在配置文件httpd.conf中,vim httpd.conf
-------------------------
<Directory />  ##用于定义URI的访问控制属性
Order deny,allow ##此处不区分大小写也行的,此处allow和deny的顺序不能反着来
deny from all
allow from 192.169.1.1
</Directory>
----------------------

20、Nginx+Fastcgi的工作原理?(这里漏掉了wrapper派生线程的说法)
答:(1)Nginx服务器监听在80端口。
(2)客户端与服务端建立TCP三次握手,而后,连接建立成功,可以传输数据了。
(3)客户端发出http请求报文,web服务器收到该请求报文会根据URI判断是否是动态请求,如果是动态请求,那么web服务器会通过进程通信找到fastcgi接口,这里的接口可以理解为套接字。
(4)而后,fastcgi接口通过cgi协议将动态请求交给分离式的PHP-FPM进程池进行处理,PHP进程可能会读取后台的数据库,他们之间通过
一种驱动进行通信。
(5)PHP解释器(php.ini)解释执行完毕之后,先把处理结果发送给web服务器,而后web服务器封装http应答报文返回给客户端。
(6)客户端的浏览器进行解析,就能得到想要的页面了。
参考文档:http://www.cnblogs.com/mangguoxiansheng/p/5967745.html

21、什么叫做解释执行?
答:(1)由高级语言编译成一种中间语言,而后中间语言可以在不同平台上再次进行编译成为可执行的程序。
(2)读取一行就向计算机的CPU提交一行,而后再读取一行再提交一行,执行效率有点低下。

22、NFS与FTP还有Samba之间有何区别?(我觉得这种问题实在太愚蠢了,他们完全不同,打不到一竿子上去)
答:(1)NFS是网络文件系统,用于Linux或Unix之间共享文件,基于C/S模式,服务端共享出来,客户端再挂载在本地,有基于TCP传输的,也有
基于UDP传输的,NFS基于IP地址共享不够安全。
(2)FTP是一种文件传输协议,用于上传或下载,服务端的数据端口默认是20,控制端口是21,基于TCP协议传输,windows和linux可以使用FTP,linux和linux之间也能使用FTP,FTP有很严格的权限控制机制。
(3)Samba是windows和linux之间文件和打印机共享的,基于CIFS(通用网络文件系统)协议挂载。

23、用tcpdump嗅探80端口的访问看看谁最高,tcpdump能抓https流量包吗。
答:tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print "$1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr|head -20
(1)tcpdump -i eth0 -tnn dst port 80 -c 1000:统计本机中目标端口为80的数据包,-tnn:直接以IP及port number显示,而非主机名与服务名称,并且不显示时间戳timestamp。-c 1000:count统计1000个数据包。
(2)awk -F"." '{print$1"."$2"."$3"."$4}':对tcpdump的输出一行一行得进行处理,以.作为分隔域,将远程主机IP依次打印出来。
(3)sort:对输出的访问端IP进行排序。
(4)uniq –c:将相同行合并,并统计相同行的数量。
(5)sort –nr:以相同行数量进行排序,反向排序,最大的放在最前面。
(6)head -20:提取前20行

24、nagios和cacti的区别。(自己再复习一下)
答:(1)Cacti主要用来监控网络流量和系统性能,而Nagios主要用来监控主机和服务的状态。
(2)Cacti能够制图,更关注某个时间段内阈值高峰的变化,而Nagios更关注服务状态的变化。
(3)Nagios报警功能更强大,短信和邮件报警,Cacti邮件报警需要下载模板(图像模板、主机模板、数据模板)和web图形界面设置。
(4)Cacti监控一个东西,需要下载模板,在web图形界面进行配置,而Nagios监控一个东西,需要在配置文件中定义并彼此调用。

25、读写分离如何测试?
答:(1)使用任意一台客户端,登陆mysql-proxy代理服务器的4041管理端口,select * from backends;查看主从机器状态;
(2)然后再使用任意一台客户端,登陆mysql-proxy代理服务器的4040读写分离端口,再进行插入表数据,而后,分别在主从机器    
上,查看是否有对应的数据,并且保持一致的功能。
(3)最后,重复(1)步骤,登陆到4041管理端口,观察主从机器状态是否发生了变化,比如Up Up转态。

26、(6)apache处理请求时prefork或者worker模型,而nginx是event模型。
(7)apache的事件IO处理模型是select模型,而Nginx的事件IO处理模型是epoll模型。

27、Nagios报警如何设置,Cacti阈值报警如何设置。你更喜欢使用Cacti还是Nagios呢?
答:Nagios:(1)启动本机自带的Sendmail服务,保证能开启25端口即可。
(2)在Nagios的配置文件中contact.cfg定义联系人的邮件地址,在什么监控指标下进行报警,比如宕掉(d)、不可达(u)、状态恢复(r)、浮动(f),在什么时间段通知。
Cacti:安装一些插件,如thold和setting,在web界面上定义使用率的百分比达到多少就报警。
个人更喜欢使用Nagios,虽然在Nagios配置文件中彼此定义比较麻烦,但是容易排错,而且Cacti能监控的功能,Nagios也能监控,甚至Nagios的功能更多,比如监控路由器、交换机、打印机。
参考文档:Cacti阈值实现邮件报警:http://lizhenliang.blog.51cto.com/7876557/1361618/

28、TCP的有限状态机中各个状态的含义?
答:好像以前整理过,虽然经常接触,但是无法用语言表达具体意思。
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放(这个东西爱考)
LAST_ACK:等待所有分组死掉

29、平滑重启什么意思,Nginx如何做到平滑重启(注意,不是平滑升级)
答:平滑启动的意思是在不停止Nginx服务的情况下,重新加载配置文件,启动新的工作线程,停止旧的Nginx工作线程。
(1)kill -HUP `cat /var/run/nginx.pid`
(2)/usr/local/nginx/sbin/nginx -s reload ##都是通过信号的形式告知给内核

30、Memcached包含哪些模块,slab allocator内存管理机制的基本原理?它有何作用?(这里的slab可以理解为一页内存)
答:模块:内存管理机制(slab),hash算法,多线程及libevent事件处理机制。
slab allocator基本原理是按照预先定义的大小,将内存分割为多种特定长度的trunk块,并将长度相同的trunk块归成slab组,并且slab组的大小
按照一个增长因子的说法进行递增。当Memcached接受到前端客户端应用程序发过来的键值对存储请求时,首先计算数据块是否有足够的大小容纳该记录,如果不够就向系统申请,如果达到了申请上限,就使用LRU算法淘汰掉最近最少使用的数据块,腾出空间来保存新的记录(item)。
作用:尽可能解决内存碎片问题。