面试题总结

面试题

  • 分类
    • 网络基础类面试题
    • Linux系统管理类面试题
    • shell编程类面试题
    • Linux网络服务类面试题
    • 数据库管理类面试题

网络基础

简述ISO/OSI七层模型的分层与作用

  • 应用层
    • 为用户提供服务,给用户一个操作界面
  • 表示层
    • 数据提供表示(0101010——>ABCD)
    • 加密(对称、非对称)
    • 压缩
  • 会话层
    • 确定数据是否需要进行网络传递(来分流)
  • 传输层
    • 对报文进行分组(标准大小)、组装
    • 提供传输协议的选择
      • TCP(传输控制协议):可靠的,面向连接的传输协议
      • UDP(用户数据协议):不可靠的,面向无连接的传输协议
    • 端口封装(确定源端口、目标端口)
    • 差错校验
  • 网络层
    • IP地址编址(源IP,目的IP)
    • 路由选择
      • 静态路由(由管理员静态设置)(对路由器消耗最小)
      • 动态路由(由路由协议决定)
  • 数据链路层
    • MAC地址编址
    • MAC地址寻址
    • 差错校验
  • 物理层
    • 数据实际传输
    • 电气特性定义

TCP/IP四层模型与作用:

  • 应用层
  • 传输层
  • 网络层
  • 网络接口层(数据链路层+物理层)

TCP/IP协议族的组成

  • 应用层:HTTP FTP TFTP SMTP SNMP DNS
  • 传输层:TCP UDP
  • 网络层:ICMP IGMP IP ARP RARP
  • 数据链路层/物理层:PPP PPPOE

简述TCP三次握手的过程

Seq序号

ACK序号(确认号)

SYN:(信)发起一个新连接

FIN:释放一个连接

  • 客户端与服务端
    • A给B发送一个SYN标为1,seq序号=J(随机),A变为SYN_SEND状态
    • B给A发送一个SYN=1,ACK=1,ack序号=J+1,seq=K,B变为SYN_RCVD
    • A接收到报文后变为ESTABLISHED状态,给B发送一个ACK=1,ack=K+1,B进入ESTABLISHED,连接建立。

简述TCP报头

  • 源端口、目的端口、标志、Seq序号、ACK序号、数据、校验和

简述TCP四次挥手过程

  • 客户端与服务端
    • 客户端发送FIN=1,Seq=m(随机)报文,进入FIN_WAIT_1状态
    • 服务端接收后进入CLOSE_WAIT状态,发送一个ACK=1,Seq=m+1给客户端
    • 客户端进入FIN_WAIT_2状态
    • 服务端没有需要传输的数据后进入LAST_ACK状态,发送FIN=1,ACK=1,ack=m+1,seq=n的报文给客户端
    • 客户端进入TIME_WAIT状态,发送ACK=1,ack=n+1的报文给服务端
    • 服务端进入CLOSED状态。

IP地址运算

172.22.141.231/26,该IP位于哪个网段?该网段拥有多少可用IP地址?广播地址是多少

  • 网络地址: .0(起始ip) .255(广播地址)不可以配
  • 广播地址:有效子网掩码中,有几个0就把IP地址的后几位换成1
  • 子网个数:有效子网掩码中,有几个1,子网数就是2的几次方
  • 主机个数:有效子网掩码中,有几个1,子网数就是2的几次方减2

IP地址分类

  • A: IP地址二进制位必须以0开头
    • 1.0.0.0 126.255.255.255 127.0.0.1作为环回地址
  • B:128.0.0.0 191.255.255.255
  • C:192.0.0.0 223.255.255.255
  • D:224.0.0.0 239.255.255.255 组播地址

私有IP

  • A类 10.0.0.0 10.255.255.255
  • B类 172.16.0.0 172.31.255.255
  • C类 192.168.0.0 192.168.255.255

系统管理类

权限优化

简述Linux权限划分原则

  • 注意权限分离(Linux系统权限、数据库权限不要掌握在同一个部门)
  • 权限在满足使用的情况下,最小优先
  • 减少使用root用户,尽量用“普通用户 +sudo提权” 进行日常操作
  • 重要系统文件,如/etc/passwd /etc/shadow /etc/fstab /etc/sudoers等,日常建议使用chattr锁定,需要操作时再打开
  • 使用脚本检测系统中新增的SUID、SGID文件
  • 可以利用工具(chkrootkit)检测rootkit脚本
  • 开启SSH服务密钥登录,修改SSH服务端口

备份策略

  • 重要系统目录

    • /etc/
    • /home/
    • /root/
    • /var/spool/mail/
    • /var/spool/cron/
    • /var/spool/at/
  • Mysql数据库

    • RPM包:/var/lib/mysql/
    • 源码包安装的MYSQL:/usr/local/mysql/data/
  • Apache服务

    • ​ yum/rpm 源码安装
    • 网站内容: /var/www/html/ /usr/local/apache2/htdocs/
    • 配置文件:/etc/httpd/conf/httpd.conf /usr/local/apache2/conf/httpd.conf
    • 日志文件:/var/log/httpd/ /usr/local/apache2/logs
  • 如果有其他服务,也需要重要备份

  • 完整备份(直接备份整个文件)

    • 实现命令: cp、tar、dump、xfsdump
  • 增量备份:每次备份以前一次参考作为参照,只备份新加的内容

    • 实现命令: CentOS 6.x:dump工具
    • 实现命令: CentOS 7.x:xfsdump工具
  • 差异备份:每次备份以第一次备份作为参照物

    • 实现命令:同上

备份频率

  • 实时备份:如mysql主从同步
  • 定时备份:如每天,每周备份,一般通过“脚本+定时任务”实现

备份存储位置

基本原则:不要把鸡蛋放在同一个篮子中

  • 本地备份
  • 异地备份

网站服务器(APACHE)每天产生的日志数量较大,请问如何备份?

  • 系统日志管理工具:logrotate
    • 日志切割
    • 日志轮替
  • Apache服务配置文件自带日志切割功能,但是需要通过脚本进行轮替

RAID

简述RAID0,1,5,01,10

RAID0(独立磁盘冗余阵列)

  • 必须使用两块或两块以上硬盘组成
  • 每块硬盘的大小必须一致
  • 是所有动态磁盘中,数据读写最快的
  • 损坏几率相对最高
  • 没有磁盘容错功能

RAID1

  • 由两块或2的倍数硬盘组成
  • 每块硬盘大小必须一致
  • 硬盘使用率只有50%,写入速度最慢
  • 拥有磁盘冗余

RAID5

  • 由三块或三块以上硬盘组层
  • 每块盘拿出n(总共n个盘)分之一来做奇偶校验
  • 每块盘大小必须一致
  • 磁盘利用率是n-1快盘
  • 利用奇偶校验,拥有磁盘容错功能(只支持1块硬盘损坏)

奇偶校验:异或校验(同为0,异为1)

RAID6:

  • 是RAID 5的增强版
  • 由4块或以上硬盘组成
  • 每块盘大小必须一致
  • 磁盘利用率是n-2快盘
  • 支持磁盘容错,可以支持2块硬盘损坏

RAID10

  • 两两硬盘先组成RAID1,再组成RAID0

软RAID和硬RAID区别

  • 软RAID:由操作系统模拟的RAID,一旦硬盘损坏,操作系统就会损坏,RAID会丧失作用
  • 硬RAID:是由独立于硬盘之外的,硬件RAID卡组成,就算硬盘损坏,也不会导致RAID卡损坏,磁盘容错才能起作用

资源查看

Linux中有许多系统资源需要监控,请问有哪些命令可以查看

综合监控工具dstat

yum -y install dstat 需要手动安装

启动流程

简述LINUX启动过程?

  • 服务器加电,加载BIOS进行系统检测

  • 加载启动引导程序(grub2)

  • 由grub2加载系统内核

  • 由grub2加载inintamfs虚拟文件系统

  • 内核初始化,以加载动态模块的形式加载部分硬件的驱动

  • 内核启动系统的第一个进程,也就是systemd

  • systemd开始调用默认单元组(default.target),并按照默认单元组开始运行子单元组

    • systemd调用sysinit.target,初始化系统
    • systemd调用basic.target单元组,准备操作系统
    • systemd调用multi-user.target单元组,启动字符界面所需程序
    • systemd调用multi-user.target单元组中的/etc/rc.d/rc.local文件,执行文件中的命令
    • systemd调用multi-user.target单元组中的getty.target单元组,初始化本地终端(tty)及登录界面,如果是字符界面启动,到此启动完成。

系统优化

如何进行Linux系统优化?

  • 禁用不需要的服务
    • ntsysv命令最为方便
  • 避免直接使用root用户,普通用户通过sudo授权操作
  • 通过chattr锁定重要系统文件
    • /etc/passwd
    • /etc/shadow
    • /etc/group
    • /etc/gshadow
    • /etc/inittab
  • 配置国内yum源,加快下载速度
  • 配置系统的同时打开最大文件数
    • vi /etc/profile
    • ulimit -SHn 65535
  • 同步时间服务器
    • ntpdate ntp1.aliyun.com
    • 通过crond定时任务,让时间同步命令每5分钟执行一次
  • 更改SSH服务的默认端口,配置SSH密钥登录
  • 配置合理的IPtables防火墙规则
  • 配置合理的SELinux安全上下文
  • 指定合理的监控策略
  • 定时备份系统重要文件(异地)

SHELL

文本截取

有一个b.txt文本,要求将所有域名截取出来,并统计重复域名出现的次数

  • cat b.txt | cut -d "/" -f 3 | sort | uniq -c | sort -nr
    • cut -d "/" -f 3 用/作为分隔符,截取第三段字
    • sort第一次排序
    • uniq -c 显示该行重复次数
    • sort -nr 按照数值从大到小排序

统计处于ESTABLISHED的ip地址并以重复数排序

  • netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d ":" -f 1 | sort | uniq -c | sort -nr

随机字符串

在/atguigu目录下创建10个txt文件,要求文件名由6位随机小写字母加固字符串(_gg)组成,例如:pzjegg_gg.txt

  • /dev/random 以来系统中断生成随机字符串,可以保证数据的随机性,但是生成数据慢,会占用系统进程资源
  • /dev/urandom 不依赖系统中断生成随机字符串,生成数据速度快,但数据随机性不足
  • tr命令:可以对来自标准输入的字符进行替换、压缩和删除,它可以将一组字符变成另一组字符。
#!/bin/bash
if[!-d /atguigu]
then
	mkdir /atguigu
fi
cd /atguigu
for ((i=1;i<=10;i++))
do
	filename=$(tr -dc 'A-Za-z0-9' < /dev/urandom |head -c 6)
	touch "$filename"_gg.txt
done

生成随机数字

$RANDOM 默认生成0-32767的数字

echo $(($RANDOM%1000))

生成1000以内的随机数

网站监测

批量监测多个网站是否可以正常访问,要求用shell数组实现,监测尽量模拟用户真实访问模式(cur -w %{http_code})。

数组
array_n=(1 2 3)

array_n[0]=1

#!/bin/bash
web=(
	http://www.baidu.com
	http://www.bilibili.com
)
for i in ${web[*]}
do
	code=$(curl -o /dev/null -s --connect-timeout 5 w '%{http_code}'$i grep -E "200|302")
	if["$code"!=""]
	then
		echo "$i is ok" >> /root/ok.log
	else
		sleep 10
		code=$(curl -o /dev/null -s --connect-timeout 5 w '%{http_code}'$i grep -E "200|302")
		if ["$code"!=""]
		then
			echo "$i is ok" >> /root/ok.log
		else
			echo "$i is error" >> /root/error.log
		fi
	fi
done

网络服务

提高ssh远程管理的安全等级

  • ssh的登录验证方式
    • 用户密码(口令)
    • 秘钥对
      • 非对称加密
  • ssh的登录端口和监听设置
    • /etc/ssh/sshd_config
      • Port 22 #ssh服务端默认监听端口

      • ListenAddress 0.0.0.0(修改为内网的网段) #ssh默认监听IP地址
  • ssh的登录用户限制
    • /etc/ssh/sshd_config
      • PermitRootLogin yes #是否允许root远程登录

  • ssh的登录超时设置
    • /etc/profile
    • export TMOUT=300
  • ssh登录失败尝试次数
    • /etc/ssh/sshd_config
    • MaxAuthTries 6 #设置客户端登录失败尝试次数为6次

ssh连接过长

/etc/ssh/sshd_config

UseDns yes 取消掉注释改为no反向解析

scp和rsync进行远程文件复制有什么区别

  • scp 全量备份,文件及传输,加密传输,资源消耗低
  • rsync 差异对比,增量备份 分块校验,部分传输 非加密传输 资源消耗高(零散文件较多)

DHCP

请描述通过DHCP服务器获取IP地址的过程

  • DHCPDISCOVER DHCPOFFER DHCPREQUEST DHCPACK
  • 客户端发送DHCP Discover广播报文
  • 服务器寻找一个可用的IP地址,广播一个指定mac地址的DHCP Offer包
  • 客户端在局域网中广播一个DHCPREQUEST包,告诉DHCP服务器我要使用IP资源
  • 服务端反回一个ACK,表示同意并签订租约。
  • 当客户端申请的资源以及被使用时,返回一个NACK包

DHCP续租

  • 客户端使用IP资源租约到一半时间时
  • 客户端向服务器发送一个DHCP Request包
  • 服务端返回ACK包或NACK包

如果DHCP客户机无法找到DH

FTP

简述FTP的主动模式和被动模式的区别

FTP登录与数据传输是两套连接(21:控制端口,20:数据端口)

  • 21端口一直监听
  • 主动模式:服务器主动开启20端口来进行数据传输
  • 被动模式:服务器开放一个随机端口告诉客户端,让客户端主动连接服务器

集群环境中,如何保证所有服务器之间的时间误差较小

手动测试同步:ntpdate 时间服务器IP地址

自动同步:可以将命令写入计划任务

DNS

请描述DNS解析过程

域名:www.baidu.com

根域:.

顶级域:com

二级域:baidu

三级域:www

  • 客户机先查看本地hosts文件,有则直接用来访问web server
  • 没有则向网卡中记录的首选DNS发起查询请求
  • 本地DNS诺有记录则返回给客户端,客户端收到后直接访问web server
  • 若没有,则本地DNS向根域名服务器发起请求,请求解析对应顶级域的IP地址
  • 本地DNS得到顶级域名服务器IP后,再向顶级域名服务器发起请求,请求解析权威DNS服务器的IP地址
  • 本地DNS服务器获取到权威DNS服务器IP地址后,再向其查询具体的完整域名的对应解析记录
  • 最终本地DNS将查询到的对应域名的解析记录发送给客户端,并在本地记录一份

Apache

公司里有一台服务器,需要在上面跑两个网站,并且其中一个网站需要更新域名,请问如何处理?

网站1:www.a.com

网站2:www.b.com www.d.com

  • 虚拟主机
  • rewrite地址重写

http:80

https:443

80→443要使用rewrite

  • 基于IP的虚拟主机
    • 1个网站对应1个IP地址
    • 创建网卡的子接口或者添加新的网卡
    • 编写hosts文件
    • 修改httpd配置文件 /etc/httpd/conf/httpd.conf
      • 文件最尾部 <VirtualHost 192.168.88.20:80>
    • 创建网页地址的目录和文件
    • 重启httpd服务
  • 基于IP+端口的虚拟主机
    • IP一样但是端口不一样
    • 同上
    • 但是要增加 Listen (接口)
  • 基于域名的虚拟主机
    • 基于用户发送的数据包
    • 修改/etc/httpd/conf/httpd.conf的配置文件
    • 修改hosts文件
    • 同上,添加NameVirtualHost:80 一定要开启
    • 在b的虚拟主机设定里开启mod_rewrite.c模块

简述Apache的三种工作模式

  • prefork模式
    • 主进程事先开启n个子进程,每个子进程启动一个线程
    • 优点:稳定,稳定
    • 缺点:需要开启大量的进程,大量消耗系统资源,不擅长高并发请求
  • worker模式
    • 开启n个子进程,每个子进程启m个线程 一对多
    • 优点:并发能力更强
    • 缺点:具有线程安全问题
  • event
    • worker模式的升级版
    • 多了一个Keepalived(TCP长连接)功能
  • 查看方式
    • httpd -V | grep -i "server mpm"

简述Apache常见的优化策略

  • 利用apache自带的rotatelogs工具进行日志切割,保证单个日志文件不过大

    • Customlog
  • 美化错误页面

    • 可以将404,500等错误信息重新定向到网站首页或其他页面,提升用户体验。
  • 配置静态缓存

    • 打开Mod_expires.c模块
    • 此模块一般写到指定的某一个网站标签中

有哪些技术又可以提高网站的安全和效率?

  • CDN

NIGNX

Apache和Nginx各有什么优点,应该如何选择

  • Apache

    • 优点:
      • Apache的rewrite功能比nginx的要强大
      • 模块特别多,基本想要的功能都能找到模块
      • 存在时间较长,文献较全,bug也相对较少
      • 动静态解析都超稳定
    • 缺点:
      • 由于工作模式是同步阻塞型,导致资源消耗高,并发能力较差
  • Nginx

    • 优点
      • 轻量级服务,比apache占用更少的内存及资源
      • 并发能力强,niginx处理请求是异步非阻塞的,而APACHE则是阻塞型的,在高并发下nginx,能保持低资源低消耗高性能
      • 高度模块化的设计,编写模块相对简单
      • 社区活跃各种高性能模块产出迅速
    • 缺点:
      • 动态处理(解析PHP、寻求后台数据库服务)上需要使用fastcgi连接php的fpm服务,相比Apache不占优势不是特别稳定
  • Ningx适合做静态处理,简单,效率高

  • Apache适合做动态处理,稳定,功能高

  • 在并发较高的情况下优先选择nginx,并发要求不高的情况下两者都可以,规模稍大的可以使用Nginx作为反向代理,然后将动态请求负载均衡到后端Apache上

  • 轮询算法

为什么nginx的并发能力较强

同步和异步:

  • Nginx以异步非阻塞方式进行工作
    • 客户端发送request,服务器分配Work进程来处理
    • 能立即处理完的,处理后work进程释放资源,进行下一个request的处理
    • 不能立即处**理完的work进程注册返回事件,然后接着去处理其他request
    • 当之前的request结果返回后,触发返回事件,由空闲work进程接着处理通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大的并发量的目的

写出几个Nginx的常用模块,并描述其功能

  • http_ssl_module

    • 实现服务器加密传输的模块,部署完成后可使用https://协议进行数据传输,保证数据传输过程的安全
    • https:443端口
  • http_image_filter_module

    • 通过该模块可以实现图片裁剪,将过大的图片裁剪为指定大小的图片,生成缩略图,保证传输速率,该选项默认不开启,需要人为指定
  • http_rewrite_module

    • 地址重写模块,功能同APACHE一样
  • http_proxy_module

    • Nginx的反向代理功能,由于Nginx的高并发特性,很多时候我们都选择使用Nginx作为网站的前置服务器,一般会和upstream模块一起使用,完成压力分摊工作
  • http_upstream_module

    • Nginx的负载均衡模块,一般和http_porxy模块一起使用,用来对后台服务器的任务调度及分配,分配原则可以通过算法进行控制

HTTP状态码

写出几个常见的HTTP状态码,并解释出现原因

  • 1**:信息,服务器收到请求
    • 100:客户端应继续其请求
    • 101:切换协议
  • 2**:成功,操作被成功接受并处理
    • 200:ok,请求成功
    • 201:已创建,成功请求创建了新的资源
    • 202:已接受,但未处理完成
    • 204:请求是空的
    • 205:重置内容
    • 206:部分内容,服务器成功处理了部分GET请求
  • 3**:重定向
    • 300:多种选择,请求的资源可以包括多个位置,需要进一步的操作以完成请求,相应可返回一个资源特征与地址的列表用于用户终端选择。
    • 301:永久重定向
    • 302:临时重定向
    • 303:查看其它地址,使用GET和POST请求查看
    • 305:使用代理,所有请求的资源必须通过代理访问
  • 4**:客户端错误,请求包含语法错误或无法完成请求
    • 400:客户端语法错误
    • 401:请求用户的身份认证
    • 402:保留,将来使用
    • 403:服务器理解客户端的请求,但是拒绝此请求
    • 404:服务器无法根据客户端的请求找到资源
    • 405:客户端请求中的方法被禁止
  • 5**:服务器错误,服务器在处理请求的过程中发生错误
    • 500:服务器内部错误,无法完成请求
    • 501:服务器不支持请求的功能,无法完成请求
    • 502:网关不可用
    • 503:由于超载或系统维护,服务器无法处理客户端的请求
    • 504:充当网关或代理服务器,未及时从远端服务器获取请求

MYSQL

MYSQL一主多从,主库宕机,如何合理切换到从库,其他从库如何处理?

  • 让从服务器对主服务器进行备份
  • bin-log日志
  • 开启主服务器的bin-log日志记录功能,将主服务器的bin-log日志传到从服务器,从服务器根据日志内容将数据还原到本地
  • 主从故障切换
    • 登录所有从库查看post信息,使用POST最大的新作为新的主库,然后将从提升为新的主库,登录从库执行stop slave
    • 修改my.cnf配置文件,开启log-bin并重启数据库服务,登录数据库执行restat master,show master status\G;查看主库信息,最后创建授权同步用户与权限和网站使用数据库的用户与权限,最后修改对应服务器的IP地址等信息
    • 登录其他从库,执行change master操作,查看同步状态

单台mysql达到性能瓶颈时,如何击碎性能瓶颈?

  • 数据库代理工具:Amoeba
  • 反向代理、负载均衡

Mysql什么时候创建索引

  • 什么是索引
    • 索引本质是数据结构,排好序的快速查找数据结构,可以提高查找效率数据分身之外,数据库还维护者一个满足特定查找算法的数据结构,这些数据结构可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引
  • 索引的分类
    • 主键索引
    • 单值索引,一个索引只包含单个列,一个表可以有多个单列索引
    • 复合索引,一个索引包含多个列,如电话浦上姓+名字,最好不超过五个字段
    • 唯一索引,所有列的值必须唯一,但是允许有空值
    • 普通索引和唯一索引可以称为辅助索引
  • 索引的劣势是什么
    • 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,索引列也是要占用空间的。
    • 虽然索引大大提高了查询速度,但是会降低更新表的速度,如对表进行INSERT,UPDATE,DELETE。因为更新表示,MYSQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列表的字段,都会调整因为更新所带来的键值变化后的索引信息
    • 索引知识提高效率的一个因素,如果Mysql有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询
  • 什么时候需要创建索引
    • 主键自动建立唯一索引
    • 频发作为查询条件的字段应该创建索引
    • 查询中与其他表关联的字段,外键关系建立索引
    • 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引
    • Where条件里用不到的字段不创建索引
    • 单键\组合索引的选择问题,在高并发下倾向创建组合索引
    • 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度。
    • 查询中统计或者分组字段(group by)
  • 什么时候不需要创建索引
    • 表记录太少
    • 频繁更新的字段
    • 性别、国籍字段。

误操作drop语句导致数据库数据破坏,请给出恢复的实际大体步骤

  • 通过二进制日志恢复数据 bin-log

Redis

如何保证Redis能永久保存数据?

  • 数据持久化
  • Redis是一个key-value存储系统,支持的value类型相对较多
  • 原子性

RDB

  • 在Redis运行时,RDB程序将当前内存中的数据库快照保存到磁盘中。
  • RDBSave
  • RDBRead

AOF

  • 将所有对数据库进行的写入命令记录到AOF文件中

AOF重写流程

  • AOF重写流程
    • AOF重写完成会向主进程发送一个完成的信号
    • 会将AOF重写缓存中的数据全部写入到文件中
    • 用新的AOF文件,覆盖原有的AOF文件
posted @ 2021-03-31 16:32  Gumi-21  阅读(115)  评论(0)    收藏  举报