运维面试题库(附答案)
一、系统基础与常用命令
1. 你常用到的命令?不要说过于简单的命令如cp、mv、cd
答:
· top:查看CPU状态
· free -h:查看内存使用量
· fdisk -l:查看磁盘分区
· df -h:查看磁盘使用情况
· netstat 或 lsof -i:端口号:查看服务端口
· telnet:查看端口是否可以连通
· ping:查看是否可以连接
· scp:将文件传输到另一台服务器上
· find:在系统中查找文件
二、网络基础(数通)
2. TCP的三次握手、四次挥手?
答:
· 三次握手(建立连接):
1. 客户端发送SYN报文给服务端
2. 服务端回复SYN+ACK报文
3. 客户端回复ACK,连接建立
· 四次挥手(断开连接):
1. 客户端发送FIN报文
2. 服务端回复ACK
3. 服务端发送FIN报文
4. 客户端回复ACK,连接关闭
3. OSI七层网络模型都是什么?
答: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。(简化记忆:物、数、网、传、会、表、应)
三、开发与脚本(Shell)
4. Shell是基础,进阶学了什么?
答: 进阶学了Go(web框架是Gin)和Python(web框架是Django和Flask)。
5. 如何把一个命令定义成一个变量?
答: 使用变量赋值语法,例如:name='ls /root',后续使用 $name 或 ${name} 来引用。
6. awk、grep、sed分别用来做什么?
答:
· grep:过滤
· awk:列过滤
· sed:替换
7. Shell脚本中for循环和if条件判断怎么用?
答:
· if判断:
```bash
if [ 条件 ]; then
执行语句
elif [ 条件 ]; then
执行语句
else
执行语句
fi
```
· for循环:
```bash
for i in 列表; do
执行语句
done
```
8. 如何写一个日志切割脚本?或者给nginx做日志切割?
答:
```bash
#!/bin/bash
file1=/var/log/nginx/nginx.log
date=$(date +%F) # 格式如2025-03-13
# 不能用mv直接切割,否则不重启服务将不再产生新日志文件
cp $file1 ${file1}_$date
echo ' ' > $file1
```
然后用 crontab -e 添加定时任务:
```
0 0 * * * sh /root/nginx.sh
```
四、容器化(Docker)
9. 你用过哪些docker命令?
答:
· docker build:打包镜像
· docker push:上传镜像
· docker pull:拉取镜像
· docker run:启动镜像(所有参数都有可能被问)
· docker rm $(docker ps -qa):删除所有不在运行的容器
· docker rmi $(docker images -qa):删除所有不在运行的镜像
10. 大厂可能会问docker的概念,你怎么理解?
答: Docker是一种容器化技术,通过命名空间(Namespace)实现资源隔离,通过Cgroups实现资源限制。它比虚拟机更轻量,因为共享宿主机内核,启动速度快,资源占用少。
五、自动化(Ansible)
11. Ansible常用模块有哪些?你用过哪些?
答: 常用模块包括:command、shell、copy、file、yum、service、template、user、ping 等。
12. 谈谈你对DevOps理念的理解?
答: DevOps是开发(Development)和运维(Operations)的结合,强调自动化、持续交付、快速反馈。核心是打破开发和运维的壁垒,通过CI/CD流水线实现代码的自动构建、测试、部署,提高交付效率和质量。
六、数据库(MySQL)
13. MySQL主从复制的原理是什么?
答:
· 主服务器(Master):负责处理所有的写操作和事务,将所有更改(如INSERT、UPDATE、DELETE)记录到binlog(二进制日志)中。
· 从服务器(Slave):通过读取主服务器的binlog来获取数据更改信息,并应用到自身数据中。
· 核心机制:从服务器通过一个I/O线程连接到主服务器,读取binlog并将其存储到本地的relay log(中继日志)中;然后由SQL线程从relay log中读取事件并应用到从服务器的数据库中。
14. MySQL常用的查询语句?
答:
· show databases; — 查询所有数据库
· show tables; — 查询当前库的所有表
· select * from 表名 where 条件; — 条件查询
· update 表名 set 字段名=修改值 where 条件; — 条件更新
· mysqldump -u 用户名 -p 密码 数据库名 表名 > info.sql — 备份导出
七、中间件
Nginx
15. 如何不重启nginx服务来重载配置文件?
答:
1. 先用 nginx -t 确认配置文件正确性
2. 再用 nginx -s reload 重载配置文件
16. Nginx负载均衡是在四层做的还是七层做的?用什么模块?
答: 都可以。
· 四层(TCP层):基于IP+端口,使用 stream 模块
· 七层(HTTP层):基于IP+端口+URL,使用 upstream 模块
17. 反向代理和正向代理的原理分别是什么?
答:
· 正向代理:代理的是客户端。客户端通过代理服务器访问外部资源,服务端不知道真实客户端是谁。
· 反向代理:代理的是服务端。客户端访问代理服务器,代理将请求转发给后端的真实服务器,客户端不知道真实服务端是谁。
18. Nginx的正则匹配规则有哪些?
答:
· =:精确匹配
· ~:正则匹配,区分大小写
· ~*:正则匹配,不区分大小写
· ^~:匹配普通字符,优先级比空格高;表示不进行正则匹配,匹配的字符串越长,优先级越高
Keepalived
19. Keepalived高可用的原理是什么?
答: 主服务器通过VRRP协议向从服务器发送心跳检测。如果主服务器不再发送心跳,从服务器将会认为主服务器挂了,就会接替主服务器继续工作(VIP漂移)。
20. 脑裂问题是怎么引发的?怎么解决?
答:
· 引发原因:当主从服务器之间的网络断开时,从服务器收不到主服务器的心跳,误认为主服务器已挂,于是自己也接管VIP,导致两台服务器同时拥有VIP,造成冲突。
· 解决方法:增加仲裁机制,例如通过第三方设备或ping网关等方式来确认主服务器是否真的挂了,避免误判。
Redis
21. Redis哨兵(Sentinel)模块的原理是什么?
答: 哨兵是一个独立的进程,用于监控Redis主从集群。它会定期向各节点发送心跳检测,如果发现主节点不可达,哨兵会通过投票机制从从节点中选举出一个新的主节点,实现自动故障转移。
22. Redis集群模式的原理是什么?
答: Redis集群采用槽位(Slot)分区,总共16384个槽位,分布在各个主节点上。每个key通过CRC16算法取模映射到对应的槽位,从而实现数据分片。集群支持主从复制和自动故障转移。
23. Redis有哪几种基本数据类型?
答: String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合)。
八、监控(Prometheus)
24. Prometheus监控生态包含哪些组件?
答: Prometheus + Grafana + Alertmanager + Exporter。
25. 你都监控什么东西?
答:
· 服务器层面:CPU、内存、磁盘、网络(使用率和I/O)
· 中间件监控:MySQL(连接数)、Redis(连接数)、RocketMQ(消费情况)
· 应用层面:端口和接口监控(是否正常)
· Exporter分类:
· node_exporter:监控服务器
· mysql_exporter:监控MySQL
· blackbox_exporter:监控端口和接口探活
九、云计算
26. 你用过哪些云计算产品?
答: ECS服务器、RDS数据库、Redis缓存、OSS对象存储(或OBS、NAS)、ELB负载均衡、WAF防火墙。
十、Kubernetes(K8S)
27. K8S需要掌握哪些内容?
答: 部署方式、核心组件、探针(Probe)、亲和性(Affinity)、网络模型、Pod状态、控制器类型、标签(Label)、污点(Taint)。
十一、扩展学习方向(附在笔记中作为进阶建议)
· 尽量去学一下Java微服务:Nacos、RocketMQ、Kafka、ZooKeeper、XXL-JOB
· 去了解Nginx日志,防止DDOS攻击
· 全链路监控:微服务调用方式和调用时间
评论区