Linux 运维面试问题总结

时间:2021-11-01 21:51:26

Linux 运维面试问题总结

 

1、详细描述mysql主从复制的方式?(类似跟DRBD高可用的协议类型)

答:

(1)同步复制(C协议:sync):只有在本地和远程磁盘都确定写入已完成时,主节点才会认为写入完成。master的变化,必须等待slave-1,slave-2,...,slave-n完成后才能返回。这样显然不可取,也不是MYSQL复制的默认设置。比如,在WEB前端页面上,用户增加了1条记录,需要等待很长时间。

(2)异步复制(A协议:aysnc):只要主节点完成本地写操作就认为写操作完成,并且复制的数据包会被存储在本地的TCP发送缓存中。master只需要完成自己的数据库操作即可,至于slaves是否收到二进制日志、是否完成操作,不用关心。MYSQL的默认设置。

(3)半同步复制(B协议):当本地磁盘的写已经完成,并且复制的数据包已经到达对应从节点,此时主节点才认为磁盘写已经完成。master只保证slaves中的一个操作成功,就返回,其他slave不管。

 

2、MySQL一主多从模式下,读写分离的原理。(一说到这种问题,最好脑子里有个拓扑图,这样好描述一些,放慢节奏)

答:当代理组件mysq-proxy收到了前端应用程序(比如Java解释器、PHP解释器)的SQL语句请求时,如果是insert/update/delete,那么交给Master来进行写操作,如果是select操作,将读的任务交给一个调度器可以是HAProxy(但不能是LVS,因为LVS仅仅支持对http、mail的分发),该调度器负责选取一定的算法后,如轮询方式,将读操作交给众多slave中的一个slave来进行处理。在这里,mysql-proxy仅仅充当SQL路由的角色,并不进行执行相应的SQL语句。

 

3、如果mysql-proxy , director,甚至master他们中的某些挂了怎么办?

答:这些都容易成为单点故障,毫无疑问要对mysql-proxy、dircetor进行高可用,再搭建一台服务器充当备份角色,当遭遇不测的时候,进行keepalived自动主备切换。如果master挂了,先让slave-1提升为新主,其他的slave都从新主复制日志,也可能其他slave一直都是slave-1(新主)复制日志。

 

4、解释一下在Linux中的负载均衡是什么?

答:当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。

 

5、如果对Mysql服务器进行优化?

答:从数据库层面、从操作系统层面(内存、CPU多线程、本地磁盘IO、网络带宽)、从服务器硬件层面(固态硬盘以及RAID阵列)

这里从数据库层面的优化分析如下:

(1)是否正确设定了表结构的相关属性,尤其是每个字段的字段类型是否为最佳。同时,是否为特定类型的工作组织使用了合适的表及表字段也将影响系统性能,比如,数据频繁更新的场景应该使用较多的表而每张表有着较少字段的结构,而复杂数据查询或分析的场景应该使用较少的表而每张表较多字段的结构等,则进行分表分库

(2)是否为高效进行查询创建了合适的索引。

(3)是否为每张表选用了合适的存储引擎,并有效利用了选用的存储引擎本身的优势和特性。比如是否支持事务的特性

(4)是否基于存储引擎为表选用了合适的行格式(rowformat)。例如,压缩表在读写操作中会降低I/O操作需求并占用较少的磁盘空间,InnoDB支持读写应用场景中使用压缩表,但MyISAM仅能在读环境中使用压缩表。

(5)是否使用了合适的锁策略,如在并发操作场景中使用共享锁,而对较高优先级的需求使用独占锁等。同时,还应该考虑存储引擎所支持的锁类型,诸如表锁、行锁、页锁等等

(6)对my.cnf配置文件参数设置是否为InnoDB的缓冲池、MyISAM的键缓存以及MySQL查询缓存设定了合适大小的内存空间,以便能够存储频繁访问的数据且又不会引起页面换出。比如可以设置缓冲提高其写性能,当客户端提交一个数据时,并不是立即把数据写入到硬盘中,而是放在内存缓冲区里,等缓冲区积累一定程度后,再把它复制到硬盘上,这样可以避免频繁对磁盘IO,那么我们所做的步骤就是对配置文件设置buffer区的缓冲大小。

 

7、Squid代理服务器的工作原理,有何意义?反向代理是什么?透明代理又是什么?(突然反应貌似上次是想问我这个东西)

答:原理:

(1)ClientA发出资源请求,根据客户端上的代理服务配置设置,将请求发送到代理服务器。 (2)然后由代理服务器代表客户端发出请求,假如代理服务器将请求发给了一个web主机 

(3)Web主机将资源返还给代理服务器  

(4)代理服务器将资源返再还给客户端,并将内容存储在缓存中  

(5)ClientB请求与ClientA相同的资源,和ClientA一样,也会将请求发送到代理服务器 (6)代理服务器已有该资源内容,所以代理服务器直接将资源内容发送给客户端ClientB

意义:解决了内网计算机无法上网的问题,因为共享Squid外网IP所以节约了IP地址资源,屏蔽了内网网站的信息,一定程度保证了安全性,同时,它会缓存内容以供下次访问,所以节省了带宽,也提高了访问效率。再者,Squid具有acl和http_access访问控制属性,类似于防火墙的功能。

反向代理:代替互联网上的计算机来访问内网的服务器资源。

透明代理:客户端只需要把网关设置为代理服务器的内网网卡IP即可,无需再做其他设置,便可以通过代理服务器帮它从Internet上取回网页资源。

 

8、代理服务器除了Squid还有哪些?Squid的端口号是多少来着?透明代理实验你是如何测试的?做Squid服务的时候还需要做哪些服务?

答:Nginx也有很好的代理缓存功能,windows系统可以使用proxy-server等;Squid内网端口监听3128,外网监听端口80。

测试:外网web服务器设置一个测试网页,在内网浏览器访问一个外网IP地址(在虚拟机中是可以设置一个公有IP的,也能正常使用),于是返回显示一些访问页面则Squid实验成功,并且使用http-watch插件安装在火狐浏览器上,进行http报文字段分析,第一次访问没有一个hit字段,第二刷新就会有一个hit命中字段,说明缓存成功。而后,查看这个外网web服务器的访问日志以及squid的访问日志。其中web服务器的日志会显示Squid的外网IP,同时,Squid会显示内网客户端的IP。

还需要DNS服务,客户端输入一个URL,没了网关,找不到DNS服务器,只有请求代理服务器,所以只能让代理服务器请求外部并完成域名解析的任务。

 

9、mysql主从复制的优点、读写分离的场合?

答:复制优点:(1) 如果主服务器出现问题, 可以快速切换到从服务器提供的服务;

(2)可以在从服务器上执行查询操作, 降低主服务器的访问压力;

(3) 可以在从服务器上执行备份, 以避免备份期间影响主服务器的服务。

分离场合:读操作(访问)非常大的时候

 

10、Suqid有几种日志、Squid.conf中设置visable_hostname有何意义?

答:(1)access.log、cache.log、store.log 

(2)指定主机名,当访问出错时返回给客户端页面包含的名字,从而帮助管理员分析哪个代理服务器挂了。

 

11、日志过多了怎么办?用什么东西分析日志?如何打印今天访问的日志?日志总共1000行,如何查看其中的200-500行日志?

答:写脚本日志切割,每月一个目录,然后每天是它的子目录;或者logrotate日志轮替,多了的日志不要了。Awstatus专业日志分析工具。grep 关键字,比如今天的日期 grep 24/Aug/2016 access.log 。

head -500 access.log |tail -301

 

12、rsync+inotfiy是双向同步还是单向同步?有几种工作模式?

答:双向同步。shell模式和deamon模式

 

13、为什么要在LVS的后端真实服务器上抑制ARP应答?请解释下ARP工作原理?

答:Director Server和所有的Real server共享VIP,如果有客户端PC发出ARP请求其相应的VIP地址时,Director Server与所有Real server 都做应答的话,就出现问题了,因此,需要禁止Realserver的响应ARP。

ARP原理:源IP地址是自己的,目的IP地址是对方的,源MAC地址是自己的,目的MAC地址为空,以广播形式从本地网卡发送出去,当该数据帧到达对方节点时,对方拆包比对目的IP是否是自己的,如果是,则填上自己的MAC地址,并以单播形式返回过去,如果目的IP和自己网卡的IP不一样,则丢弃。

 

14、Http1.1相比Http1.0做了哪些改进?(运维面试官不喜欢问这个,开发、CTO总监喜欢问这个,因缺思婷,我以后面试别人也不问这个,太特么偏了)

答:

(1)可扩展性、缓存处理、带宽优化、持久连接、HOST头、错误通知、消息传递、内容协商等方面。

(2)http1.0状态响应码有16个,http1.1状态码有24个(不知道)

 

15、http状态码502与504的区别?

答:

(1)502是网关错误,504是网关超时

(2)二者很类似,502是代理服务器后面的真实服务器节点配置出了问题或者已经挂掉了,而504是代理服务器后面的真实服务器已经过载,它要处理的请求报文实在太多,忙不过来了。

(3)502还有一种情况就是nginx与fastcgi即PHP进程配合的不恰当,导致返回502网关错误。

 

16、http应答报文格式是什么?空行有何作用?

答:起始行:协议版本号、状态码、状态信息; 

响应头部:资源文件类型、文件长度、日期等

空行  ##用来告知对端,此报文头部到此截止已经没有了

报文实体内容  ##就是真实的网页代码

 

17、什么是MySQL多实例,如何配置MySQL多实例?

答:

(1)定义:是在同一台机器上面开启多个不同的端口,运行多个MySQL服务进程,这些MySQL多实例公用一套安装程序。

(2)应用场景:a、一台物理数据库服务器支撑多个数据库的数据服务,为提高mysql复制从机的复制效率,采用多实例部署

b、异地灾难备份

(3)作用:有效利用服务器的资源,单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务.

(4)配置方式:a、使用多个配置文件启动不同的进程来实现多实例,这种方式的优势逻辑简单,配置简单,缺点是管理起来不太方便。

b、通过官方自带的mysqld_multi使用单独的配置文件来实现多实例,这种方式定制每个实例的配置不太方便,优点是管理起来很方便,集中管理。

参考文档:http://www.codesec.net/view/194257.html

 

18、如何加强MySQL数据的安全,请你给出可行的思路?(TMD这个话题老生长谈啊)

答:

(1)从操作系统层面,iptables、TCP_wrappers干掉不可信任的外部网络

(2)从数据库层面,对用户的授权加以严格控制,防止内网搞破坏

(3)使用chroot,改变mysql日志文件或数据文件的根目录。

(4)移除或禁用~/.mysql_history文件,因为此文件记录了用户操作命令信息,如果被黑客获取,便能知道数据库的表结构

参考文档:http://soft.chinabyte.com/database/76/12788576.shtml

 

19、工作中数据库被误操作执行了一个删除的SQL语句,你如何完整恢复丢失的数据?(这问题很有思考意义,工作中如果删了,呵呵,完蛋了)

答:

(1)如果是Innodb引擎,并且没有设置自动提交,那么可以通过rollback进行事务回滚

(2)从binlog日志中进行恢复,但是要求日志格式是row的,就麻烦了。

参考文档:http://www.cnblogs.com/gomysql/p/3582058.html

 

20、SQL语句如何优化?

答:

(1)合理添加索引(他妈的这句我记得最清楚)

(2)使用内连接代替子查询,避免使用多表查询

(3)select 使用明确的字段用来代替*号

(4)对表使用别名

(5)用Where 子句替换HAVING 子句因为HAVING 只会在检索出所有记录之后才对结果集进行过滤

 

21、MySQL Sleep线程过多如何解决?

答:现象:MySQL里大量的Sleep线程等待,无法及时释放连接,拖累系统性能。

原因:(1)使用了太多持久连接

(2)程序中,没有及时关闭mysql连接

(3)数据库查询不够优化,过度耗时。

影响:严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃

解决:在配置文件中对wait_timeout值设置的小一点,超过这个时间,就断开Mysql的连接。对于正在运行中的生产服务器,在不能停止服务情况下,以root用户登录到mysql,执行:set global wait_timeout=100

参考文档:http://blog.sina.com.cn/s/blog_78ecbe330101332k.html

 

22、mysql读写分离架构中,如果Master挂了,那么slave上会不会写数据,从而导致数据不一致?

答:不会。master挂了以后,mysql-proxy能够进行健康检查,并且不会再允许有写的请求发过来。

 

23、timw_wait的作用?(相当于问2MSL的作用)

答:

(1)使本次TCP连接中所有网络分组均死掉,避免干扰下一次连接

(2)是ACK报文尽可能到达目的端。

 

24、你知道运维中的常见故障有哪些?

答:

(1)命令所在的安装包丢失,无法继续操作命令

(2)启动配置文件丢失,导致不能重启系统

(3)服务器硬件改动进入了emergency紧急模式

(4)bash文件损坏导致用户无法正常登陆

(5)Nginx负载均衡器出现故障

(6)文件变成了只读模式

(7)错综复杂的网络不通问题

 

25、http协议中,put与post有何区别?

答:

(1)PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。

(2)传输数据的大小不同,前者一般是提交表单的数据,后者一般是附件类的大文件。

 

26、NFS的工作原理?

答:

1)首先服务端启动RPC,并开启111端口

2)服务端启动NFS,并向RPC注册端口信息

3)客户端启动RPC的主程序portmap端口映射,向服务端的111端口建立TCP网络连接,

4)服务端的RPC把NFS随机端口信息反馈给给客户端。

5)客户端通过该NFS随机端口(小于1024)来建立和服务端的连接,以便进行数据的传输

 

27、traceroute 的原理。(UDP数据报的意思仅仅是说上层运输层封装的是UDP,在这里它是三层数据报文)

答:源端向目的端发送不同TTL(time to live )的UDP用户数据报,第一个TTL为1,在经过第一个路由器后,TTL减1,于是变为0,该路由器就会丢弃

该数据包,并向源端发送一个ICMP超时报文,而后,源端发送一个TTL为2的数据包,再经过2个路由器后,TTL又等于0于是又发给源端ICMP超时报文,当到达最后目的主机时,TTL是1,这时候TTL不再减1,主机也不转发数据包,但是由于IP数据包封装的是无法交付的UDP用户数据报,于是目的主机会返回给源端ICMP不可达的差错报告报文。

 

##在这里主要的疑惑是UDP用户数据包怎么就无法交付了,网上的说法是 “前提是发出的UDP数据报中要求的端口在目的主机上没有进程在使用。如果目的主机上正好有进程在使用这个端口,接收这个包并按正常方式处理,这样traceroute就收不到"端口不可达"的错误了。为了避免出现这种情况,UDP数据报的端口很高(书中的实现是初始值33435,以后每发送一次再加1,端口号最大可以到65535)”。  actually,我也不太清楚。

参考文档:http://blog.csdn.net/hero456123/article/details/11472363

 

28、编写脚本实现以下功能;

每天早上5点开始做备份;要备份的是/var/mylog里所有文件和目录可以压缩进行备份;备份可以保存到别一台FTP即器上192、168、1、2 ,FTP帐号aaa,密码 bbb;并且每天的备份文件要带有当天的日期标记

答:

#!/bin/bash
##file:log_bak_ftp.sh
BACKDIR=/var/mylog
TIME=`date +%F`
tar zcf $BACKDIR_$TIME.tar.gz $BACKDIR 
##ftp上传
ftp -n <<EOF
open 192.168.1.2
user aaa bbb
bin ##必须要设置为二进制模式,不然会传输ASCII码的东西,是无法解压的,记住了!
put $BACKDIR_$TIME.tar.gz 
bye
EOF
##crontab -e: 0 5 * * * /bin/bash /root/log_bak_ftp.sh

 

 

29、编写Nginx日志切割脚本,并测量运行时间。

答:

#!/bin/bash
##切割日志,/usr/lcoal/nginx/logs/access.logs/access.log
LOG=/usr/lcoal/nginx/logs/access.log
mkdir /newlog_dir
TIME=${date -d "yesterday" +%Y%m%d}
Year=${date -d "yesterday" +%Y}
Month=${date -d "yesterday" +%Y%m}
mkdir -p /newlog_dir/Year/Month
if [ -d /newlog_dir -a -d /newlog_dir/Year -a /newlog_dir/Year/Month ] ##如果所有目录都存在
then
tar -zcf /newlog_dir/Year/Month/ginx_access_log.${TIME}.tar.gz $LOG
if [ $? -eq 0];then
rm -f $LOG
echo "---$TIME---备份成功---">>/newlog_dir/log_event.txt
fi
fi
##查看时间time bash /cut_log.sh

优秀参考文档:http://www.tianfeiyu.com/?p=2230

 

30、如何杀掉linux系统中所有的带“nginx”字段的进程,请给出详细命令?(批量杀死相关进程的原因)

答:(1)ps aux |grep "nginx" |grep -v grep |xargs kill -9

(2)for KILLPID in `ps aux|grep "nginx"|grep -v grep |awk ‘{print $2}‘ `

do

kill -p $KILLPID

done