本文档基于4份运维/云计算面试题资料去重整理,按板块分类,补充详细答案,适合面试背诵。
资料来源:《174道运维工程师面试题》《面试题简答》《云计算笔试面试题库》《运维工程师面试题库—综合》
一、综合与运维理念
1. 什么是运维?游戏运维、开发运维、应用运维、系统运维的分工?
运维是指对互联网产品的服务器、应用、数据库、网络等进行规划、部署、监控、维护、优化和故障处理,保障业务7×24小时稳定运行。
分工:
- 系统运维:负责操作系统层面的维护,包括服务器装机、系统优化、网络配置、安全加固、硬件故障处理等
- 应用运维:负责业务应用的部署、发布、监控、故障排查,与开发对接密切
- 开发运维(DevOps):负责CI/CD流水线建设、自动化工具开发、容器化部署、基础设施即代码等
- 游戏运维:除常规运维外,还需关注游戏服务器的特殊需求,如玩家数据安全、版本更新不中断、防外挂攻击、合服迁服等
2. 运营人员的工作内容
- 日常监控:服务器资源监控、应用状态监控、业务指标监控
- 故障处理:及时响应告警,定位并解决故障
- 发布部署:配合开发完成代码上线、版本发布
- 性能优化:系统优化、应用优化、数据库优化
- 安全加固:漏洞修复、权限管理、攻击防护
- 文档编写:运维文档、故障报告、操作手册
- 自动化建设:脚本开发、工具建设、流程优化
3. 300台服务器如何管理?
- 跳板机/堡垒机:统一登录入口,权限控制,操作审计
- 配置管理工具:SaltStack、Ansible、Puppet、Chef,批量配置管理
- CMDB资产管理系统:记录服务器信息、配置、归属、状态
- 监控系统:Zabbix/Prometheus,统一监控告警
- 自动化部署:Jenkins+GitLab CI/CD,一键发布
- 标准化:系统镜像标准化、配置标准化、命名规范
- 批量操作工具:pssh、pdsh、ansible ad-hoc
4. 常用中间件有哪些?
- Web服务器:Nginx、Apache、Tomcat
- 负载均衡:LVS、HAProxy、Nginx、SLB
- 缓存:Redis、Memcached、Varnish、Squid
- 消息队列:RabbitMQ、Kafka
- 数据库:MySQL、MongoDB、Redis、Elasticsearch
- 协调服务:Zookeeper、etcd
- 日志:ELK(Elasticsearch+Logstash+Kibana)
- 监控:Zabbix、Prometheus、Grafana
5. 自动化工具有哪些?
- 配置管理:Ansible、SaltStack、Puppet、Chef
- 持续集成:Jenkins、GitLab CI、Travis CI
- 容器编排:Kubernetes、Docker Swarm
- 基础设施即代码:Terraform
- 批量执行:pssh、pdsh、fabric
6. 你对运维工程师的理解和工作认识?
运维工程师在公司中责任重大,需要保证时刻为公司及客户提供最高、最快、最稳定、最安全的服务。运维工程师的一个小小的失误,很可能会对公司及客户造成重大损失,因此运维工程师的工作需要严谨及富有创新精神。
核心能力:
- 扎实的Linux系统和网络基础
- 故障排查和应急响应能力
- 自动化和脚本开发能力
- 安全意识和风险把控能力
- 沟通协作能力
二、Linux系统基础
1. 常见Linux发行版有哪些?
- RedHat系列:RHEL、CentOS、Fedora、Rocky Linux、AlmaLinux
- Debian系列:Debian、Ubuntu、Linux Mint
- SUSE系列:openSUSE、SUSE Linux Enterprise
- 其他:Arch Linux、Gentoo、Alpine(容器常用)
Unix系统:Solaris(Sun)、HP-UX(惠普)、AIX(IBM)、FreeBSD
2. Linux系统开机启动流程
CentOS 6(SysVinit):
- POST加电自检(BIOS)
- 读取MBR(主引导记录)
- Boot Loader(GRUB)引导
- 读取grub.conf,加载内核Kernel
- 加载initramfs(虚拟文件系统)
- 启动init进程(PID=1)
- 读取/etc/inittab确定运行级别
- 执行/etc/rc.d/rc.sysinit初始化系统
- 启动对应运行级别的服务(/etc/rc.d/rcN.d/)
- 执行/etc/rc.d/rc.local
- 执行/bin/login,进入登录界面
CentOS 7(Systemd):
- UEFI/BIOS初始化,POST自检
- 加载MBR,GRUB2引导
- 加载内核Kernel和initramfs
- 内核初始化,启动systemd进程(PID=1)
- systemd执行multi-user.target
- 启动getty.target及登录服务
- 启动graphical.target需要的服务(图形模式)
运行级别:
| 级别 | 说明 |
|---|---|
| 0 | 关机 |
| 1 | 单用户模式(救援模式) |
| 2 | 多用户模式,无NFS |
| 3 | 完全多用户模式(命令行,生产常用) |
| 4 | 保留 |
| 5 | 图形桌面模式 |
| 6 | 重启 |
3. CentOS 6和CentOS 7的区别
| 对比项 | CentOS 6 | CentOS 7 |
|---|---|---|
| 桌面环境 | GNOME 2.x | GNOME 3.x |
| 默认文件系统 | ext4 | xfs |
| 内核版本 | 2.6.x | 3.10.x |
| 启动加载器 | GRUB Legacy | GRUB2 |
| 防火墙 | iptables | firewalld |
| 默认数据库 | MySQL | MariaDB |
| 文件结构 | /bin、/sbin、/lib在根下 | 移到/usr下 |
| 主机名配置 | /etc/sysconfig/network | /etc/hostname |
| 时间同步 | ntp / ntpq -p | chrony / chronyc sources |
| 修改时区 | vim /etc/sysconfig/clock + ln -s | timedatectl set-timezone |
| 修改语言 | vim /etc/sysconfig/i18n | localectl set-locale |
| 服务管理 | service/chkconfig | systemctl |
| 网络命令 | netstat/ifconfig/route | ip/ss |
| 重启关机 | shutdown/reboot | poweroff/systemctl |
| 单用户模式 | init S | systemctl rescue |
| 启动模式 | vim /etc/inittab id:3:initdefault | systemctl set-default multi-user.target |
4. Linux文件系统类型
- ext4:第四代扩展文件系统,CentOS 6默认,支持最大1EB分区,最大16TB文件
- xfs:高性能日志文件系统,CentOS 7默认,支持最大8EB分区,适合大文件和高并发
- btrfs:B-Tree文件系统,支持快照、子卷、数据校验
- swap:交换分区,虚拟内存
- tmpfs:内存文件系统,/dev/shm默认使用
5. 符号链接与硬链接的区别
| 对比项 | 硬链接 | 软链接(符号链接) |
|---|---|---|
| 本质 | 同一个文件的多个入口 | 快捷方式,指向原文件 |
| inode | 相同inode号 | 不同inode号 |
| 跨分区 | 不可以 | 可以 |
| 对目录 | 不可以(除root特殊) | 可以 |
| 删除源文件 | 仍可访问 | 链接失效(变红) |
| 文件大小 | 与原文件相同 | 仅保存路径字符串 |
| 命令 | ln 源文件 链接名 | ln -s 源文件 链接名 |
6. Linux权限说明
- 基本权限:r(读,4)、w(写,2)、x(执行,1)
- 三组权限:所有者(u)、所属组(g)、其他(o)
- 特殊权限:
- SUID(4):文件执行时以所有者身份运行,如/usr/bin/passwd
- SGID(2):目录下新建文件继承目录属组
- Sticky(1):只有文件所有者和root可删除,如/tmp
7. 用户管理命令
useradd username # 创建用户
useradd -s /sbin/nologin username # 创建禁止登录的用户
userdel -r username # 删除用户及家目录
passwd username # 设置密码
usermod -aG group username # 将用户加入组
groupadd groupname # 创建组
id username # 查看用户信息
8. 进程管理
ps aux各字段含义:
| 字段 | 说明 |
|---|---|
| USER | 进程所有者 |
| PID | 进程ID |
| %CPU | CPU占用率 |
| %MEM | 内存占用率 |
| VSZ | 虚拟内存集(进程占用的虚拟内存空间,KB) |
| RSS | 物理内存集(进程实际占用的物理内存,KB) |
| TTY | 终端 |
| STAT | 进程状态(R运行/S睡眠/D不可中断睡眠/Z僵尸/T停止) |
| START | 启动时间 |
| TIME | 累计CPU时间 |
| COMMAND | 命令 |
常用命令:
top # 实时进程监控
htop # 增强版top
kill -9 PID # 强制杀死进程
killall processname # 按名称杀进程
pstree -p # 进程树
僵尸进程: 子进程已结束但父进程未调用wait()回收,状态为Z。解决:杀死父进程或重启服务。
9. 系统资源查看
free -h # 内存使用
df -h # 磁盘使用
df -i # inode使用
du -sh /path # 目录大小
uptime # 负载和运行时间
top / htop # CPU和进程
vmstat 1 5 # 系统整体状态
iostat -xk 1 5 # IO状态
mpstat 1 5 # CPU多核状态
sar -n DEV 1 5 # 网络流量
10. CPU利用率和CPU负载的区别
- CPU利用率:程序运行期间实时占用CPU的百分比
- CPU负载:一段时间内正在使用和等待使用CPU的平均任务数
- 利用率高不一定负载大:一个程序100%利用率,负载=1;两个程序各100%利用率,负载=2
- 电话亭比喻:电话=CPU,正在打电话和排队等待的人=任务数
11. Linux系统优化(安全加固)
- 不用root,添加普通用户,通过sudo授权管理
- 更改默认SSH端口,禁止root远程连接
- 定时自动更新服务器时间(ntp/chrony)
- 配置国内yum源
- 关闭selinux及iptables(高并发或有外网IP需打开)
- 调整文件描述符数量(/etc/security/limits.conf)
- 精简开机启动服务(crond、rsyslog、network、sshd)
- 内核参数优化(/etc/sysctl.conf)
- 更改字符集支持中文
- 锁定关键系统文件(chattr +i /etc/passwd)
- 清空/etc/issue,去除系统版本显示
文件描述符优化:
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft noproc 65535
* hard noproc 65535
12. 内核参数优化
# /etc/sysctl.conf
fs.file-max = 999999 # 最大句柄数
net.ipv4.tcp_max_tw_buckets = 6000 # TIME_WAIT最大数量
net.ipv4.ip_local_port_range = 1024 65000 # 端口范围
net.ipv4.tcp_tw_recycle = 1 # TIME_WAIT快速回收
net.ipv4.tcp_tw_reuse = 1 # TIME_WAIT重用
net.ipv4.tcp_keepalive_time = 30 # keepalive间隔
net.ipv4.tcp_syncookies = 1 # 防SYN攻击
net.core.somaxconn = 40960 # 监听队列长度
net.core.netdev_max_backlog = 262144 # 网络设备队列
net.ipv4.tcp_max_syn_backlog = 262144 # SYN队列长度
net.ipv4.tcp_rmem = 10240 87380 12582912 # TCP接收缓存
net.ipv4.tcp_wmem = 10240 87380 12582912 # TCP发送缓存
执行 sysctl -p 使配置生效。
13. Linux系统中病毒怎么解决?
- 最简单有效:备份数据后重装系统
- 排查方法:
top找到CPU使用率最高的进程ps aux找到病毒文件位置(病毒文件命名通常较乱)rm -f删除病毒文件- 检查计划任务、开机启动项、病毒文件目录
- 删了又自动创建:
- 先断外网(病毒失去外联能力)
iftop查看连接外网情况netstat查看外网IP和端口lsof -p pid查看进程打开的文件ps axu逐个排查冒牌货进程(如/usr/bin/.sshd)- 杀掉母进程,删除可执行文件
chattr +i锁定关键文件防止篡改
14. 服务器开不了机排查步骤
- 硬件层面:检查电源、电源线、电源指示灯、风扇是否转动
- BIOS/UEFI:能否进入BIOS,检查硬件识别情况
- 引导阶段:
- 检查硬盘是否被识别
- 检查引导顺序
- MBR/GRUB是否损坏
- 系统启动阶段:
- 单用户模式启动查看报错
- 救援模式(Rescue Mode)修复
- 检查/etc/fstab挂载是否正确
- 检查根分区是否满
- 检查文件系统损坏(fsck)
- 日志排查:查看/var/log/messages、/var/log/boot.log
15. 释放缓存
sync # 先同步数据到磁盘
echo 1 > /proc/sys/vm/drop_caches # 释放页缓存
echo 2 > /proc/sys/vm/drop_caches # 释放dentries和inodes
echo 3 > /proc/sys/vm/drop_caches # 释放所有缓存
16. MBR是什么?作用?
MBR(Master Boot Record,主引导记录)位于硬盘0柱面0磁头1扇区,共512字节:
- 446字节:主引导程序(boot loader)
- 64字节:分区表(DPT),每个分区表项16字节,最多4个主分区
- 2字节:magic number(55AA),标记MBR有效性
备份MBR:
dd if=/dev/sda of=/root/mbr bs=512 count=1
恢复MBR:
dd if=/root/mbr of=/dev/sda bs=512 count=1
仅恢复分区表:
dd if=/root/mbr of=/dev/sda bs=512 skip=446 count=66
17. Linux分区方案
网站集群节点(300G硬盘,16G内存):
- /boot:200M
- swap:8-16G(内存>=8G时)
- /:剩余全部
数据库存储节点:
- /boot:200M
- /:50-200G
- swap:8-16G
- /data:剩余全部
大企业通用方案:
- /boot:200M
- /:50-200G
- swap:8-16G
- 剩余保留不分区,按需分配
2T硬盘32G内存:
- /boot:200M
- swap:64G
- /:约1984G
6T硬盘128G内存:
- /boot:200M
- swap:256G
- /:约5888G
18. 磁盘空间满但df显示60%的原因
- inode耗尽:文件数量太多(大量小文件),inode用完了但block还有剩余
- 检查:
df -i - 解决:删除小文件或重新分区增大inode比例
- 检查:
- 磁盘配额:用户或组达到配额限制
- 检查:
quota -uv username
- 检查:
- 文件被删除但进程仍在使用:rm只是解除链接,进程仍占用空间
- 检查:
lsof | grep deleted - 解决:重启相关进程或用>清空文件
- 检查:
19. 删除nginx日志后空间还是满的原因
原因:文件被进程打开使用,rm只是删除目录项(unlink),进程仍在读取写入,空间不会释放。
解决方法:
- 重启nginx服务:
systemctl restart nginx - 用清空方式而非删除:
> /var/log/nginx/access.log - 配置logrotate自动切割日志
20. 常用命令速查
取IP地址:
# 方法1:cut
ifconfig eth0 | sed -n '2p' | cut -d ":" -f2 | cut -d " " -f1
# 方法2:awk
ifconfig eth0 | awk 'NR==2' | awk -F "[: ]+" '{print $4}'
# 方法3:sed
ifconfig eth0 | sed -n '/inet addr/p' | sed -r 's#^.*ddr:(.*)Bc.*$#\1#g'
# CentOS7
ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1
TCP连接状态统计:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
访问量TOP IP:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
每个IP连接数:
netstat -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn
tcpdump嗅探80端口:
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -20
随机密码生成:
cat /dev/urandom | head -1 | md5sum | head -c 32
查看二进制文件:
hexdump -C filename
取文件第4-7行:
sed -n '4,7p' aaa.txt
查找大文件:
find /usr -type f -size +10240k
删除7天前日志:
find /app/logs -type f -mtime +7 -name "*.log" -exec rm -f {} \;
# 或
find /app/logs -type f -mtime +7 -name "*.log" | xargs rm -f
内存使用率:
free -m | awk '/Mem/{print $3/$2*100"%"}'
查看/var/log文件数:
ls -lR /var/log | grep "^-" | wc -l
查看当前登录用户:
w
who
21. vi/vim操作
三种模式: 默认模式、编辑模式、命令模式
一般模式:
| 命令 | 功能 |
|---|---|
| yy | 复制当前行 |
| nyy | 复制n行 |
| p | 粘贴 |
| dd | 删除当前行 |
| ndd | 删除n行 |
| dG | 删除全部(从当前行到末尾) |
| x | 删除字符 |
| u | 撤销 |
| . | 重复上一次操作 |
| G | 跳到末行 |
| gg | 跳到首行 |
| 0 | 跳到行首 |
| $ | 跳到行尾 |
编辑模式:
| 命令 | 功能 |
|---|---|
| i | 当前位置插入 |
| I | 行首插入 |
| a | 下一字符插入 |
| A | 行尾插入 |
| o | 下行新开一行 |
| O | 上行新开一行 |
| r | 替换一次 |
| R | 一直替换 |
命令模式:
| 命令 | 功能 |
|---|---|
| /word | 向下查找 |
| ?word | 向上查找 |
| n | 重复查找 |
| N | 反向查找 |
| :%s/old/new/g | 全文替换 |
| :n1,n2 s/old/new/g | 区间替换 |
| :set nu | 显示行号 |
| :wq | 保存退出 |
| :q! | 不保存退出 |
| :90 | 跳到第90行 |
22. SecureCRT快捷键
| 快捷键 | 功能 |
|---|---|
| Ctrl+a | 光标移动到行首 |
| Ctrl+c | 终止当前程序 |
| Ctrl+d | 删除光标前字符或退出 |
| Ctrl+e | 光标移动到行尾 |
| Ctrl+l | 清屏 |
| Ctrl+u | 剪切光标以前的字符 |
| Ctrl+k | 剪切光标以后的字符 |
| Ctrl+y | 粘贴u/k的内容 |
| Ctrl+r | 查找最近用过的命令 |
| Tab | 命令或路径补全 |
| Ctrl+Shift+c | 复制 |
| Ctrl+Shift+v | 粘贴 |
23. rpm和yum的区别
- rpm:RedHat Package Manager,本地包管理工具,需要手动解决依赖
- 安装:
rpm -ivh package.rpm - 卸载:
rpm -e package - 查询:
rpm -qa | grep package
- 安装:
- yum:Yellowdog Updater Modified,基于rpm的前端包管理工具,自动解决依赖
- 安装:
yum install -y package - 卸载:
yum remove -y package - 更新:
yum update -y package - 搜索:
yum search keyword
- 安装:
rpm安装有依赖的包:
# 方法1:先安装依赖包
rpm -ivh libaio.rpm && rpm -ivh mysql.rpm
# 方法2:使用yum本地安装
yum localinstall -y package.rpm
# 方法3:--nodeps强制安装(不推荐)
rpm -ivh --nodeps package.rpm
24. Linux系统文件只读怎么办?
- 检查是否挂载为只读:
mount | grep / - 重新挂载为读写:
mount -o remount,rw / - 如果无法remount,进入救援模式执行fsck修复文件系统
- 检查磁盘是否有坏道:
badblocks /dev/sda - 检查是否被chattr锁定:
lsattr /etc/passwd
25. 误操作rm -rf *的后果
- 如果在/目录执行:系统基本瘫痪,需要重装
- 如果在数据目录执行:数据丢失,需从备份恢复
- 预防措施:
- 重要数据定期备份
- 使用rm时先ls确认
- 设置rm别名(危险操作确认)
- 使用trash-cli替代rm
- 关键文件加chattr +i保护
三、Shell脚本与正则
1. Shell预定义变量
| 变量 | 含义 |
|---|---|
| $0 | 脚本名称 |
| $1-$n | 位置参数(第1到第n个参数) |
| $# | 参数个数 |
| $? | 上一个命令的返回值(0成功,非0失败) |
| $* | 所有参数作为一个整体 |
| $@ | 所有参数,每个独立 |
| $$ | 当前进程PID |
| $! | 上一个后台进程PID |
2. 正则表达式
基础正则(BRE):
| 符号 | 含义 |
|---|---|
| ^ | 行首 |
| $ | 行尾 |
| . | 任意单个字符 |
| * | 前一个字符出现0次或多次 |
| [] | 字符集,匹配其中任意一个 |
| [^] | 排除字符集 |
| \ | 转义字符 |
扩展正则(ERE):
| 符号 | 含义 |
|---|---|
| + | 前一个字符出现1次或多次 |
| ? | 前一个字符出现0次或1次 |
| | | 或 |
| () | 分组 |
| {n} | 前一个字符出现n次 |
| {n,} | 至少n次 |
| {n,m} | n到m次 |
3. 常用脚本示例
IP存活检测脚本:
#!/bin/bash
for ip in $(seq 1 255)
do
{
ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "192.168.1.$ip UP"
else
echo "192.168.1.$ip DOWN"
fi
}&
done
wait
日志切割脚本:
#!/bin/bash
LOG_PATH="/opt/logs/access.log"
BACKUP_PATH="/tmp/$(date +%Y%m%d).access.log"
cp $LOG_PATH $BACKUP_PATH
echo > $LOG_PATH
MySQL备份脚本:
#!/bin/bash
BACKUP_DIR="/data/backup"
DATE=$(date +%Y%m%d)
mysqldump -uroot -p123456 --all-databases --single-transaction > $BACKUP_DIR/all_$DATE.sql
gzip $BACKUP_DIR/all_$DATE.sql
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
批量添加用户脚本:
#!/bin/bash
for user in user1 user2 user3
do
useradd $user
echo "123456" | passwd --stdin $user
done
MySQL主从监控脚本:
#!/bin/bash
IO_STATUS=$(mysql -uroot -p123456 -e "show slave status\G" | grep "Slave_IO_Running" | awk '{print $2}')
SQL_STATUS=$(mysql -uroot -p123456 -e "show slave status\G" | grep "Slave_SQL_Running" | awk '{print $2}')
if [ "$IO_STATUS" != "Yes" ] || [ "$SQL_STATUS" != "Yes" ]; then
echo "MySQL主从同步异常!" | mail -s "MySQL告警" admin@example.com
fi
网站访问监控脚本:
#!/bin/bash
URL="http://www.example.com"
STATUS=$(curl -o /dev/null -s -w "%{http_code}" $URL)
if [ $STATUS -ne 200 ]; then
echo "网站异常,状态码:$STATUS" | mail -s "网站告警" admin@example.com
fi
nginx日志按时间段统计IP:
# 统计10点到12点之间访问IP排名
awk '$4 >= "[10/Aug/2024:10:00:00" && $4 <= "[10/Aug/2024:12:00:00"' access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
rsync启动脚本:
#!/bin/bash
# chkconfig: 2345 80 20
case "$1" in
start)
rsync --daemon
echo "rsync started"
;;
stop)
pkill rsync
echo "rsync stopped"
;;
restart)
pkill rsync
sleep 1
rsync --daemon
echo "rsync restarted"
;;
*)
echo "Usage: $0 {start|stop|restart}"
;;
esac
4. 冒泡排序
#!/bin/bash
arr=(5 3 8 1 9 2)
len=${#arr[@]}
for ((i=0; i<len-1; i++))
do
for ((j=0; j<len-i-1; j++))
do
if [ ${arr[j]} -gt ${arr[j+1]} ]; then
temp=${arr[j]}
arr[j]=${arr[j+1]}
arr[j+1]=$temp
fi
done
done
echo ${arr[@]}
5. 1加到100
# 方法1:for循环
sum=0
for i in $(seq 1 100)
do
sum=$((sum+i))
done
echo $sum
# 方法2:公式
echo $((100*101/2))
# 方法3:awk
seq 100 | awk '{sum+=$1} END{print sum}'
6. crontab定时任务
# 格式:分 时 日 月 周 命令
00 00 * * * /bin/sh /root/backup.sh # 每天凌晨0点
*/5 * * * * /bin/sh /root/check.sh # 每5分钟
00 02 * * 0 /bin/sh /root/week.sh # 每周日凌晨2点
00 00 1 * * /bin/sh /root/month.sh # 每月1号凌晨
# 11月份内,每天早上6点到12点,每隔2小时执行
0 6-12/2 * 11 * /usr/bin/httpd.sh
7. find命令高级用法
# 查找大于100K的文件移动到/tmp
find /data -type f -size +100k -exec mv {} /tmp/ \;
# 查找最后创建时间3天前的*.log文件并删除
find /data -type f -name "*.log" -ctime +3 -delete
# 查找当前目录创建时间超过7天的文件压缩
find ./ -type f -mtime +7 -exec gzip {} \;
# 查找/usr目录下超过1M的文件
find /usr -type f -size +10240k
# 查找子目录文件数量
find /path -type f | wc -l
8. awk/sed/grep常用操作
# grep:过滤包含error的行
grep "error" /var/log/messages
grep -v "error" file # 反向匹配
grep -i "error" file # 忽略大小写
grep -E "error|warning" file # 扩展正则
# sed:替换
sed 's/old/new/g' file # 全局替换
sed -i 's/old/new/g' file # 直接修改文件
sed -n '4,7p' file # 打印4-7行
sed '/^$/d' file # 删除空行
# awk:列处理
awk '{print $1,$3}' file # 打印第1和第3列
awk -F: '{print $1}' /etc/passwd # 指定分隔符
awk '{sum+=$1} END{print sum}' file # 求和
四、计算机网络
1. OSI七层模型
| 层级 | 名称 | 功能 | 协议 | 数据单位 |
|---|---|---|---|---|
| 7 | 应用层 | 网络服务与用户接口 | HTTP、FTP、SMTP、DNS、Telnet、HTTPS、POP3、DHCP | 数据 |
| 6 | 表示层 | 数据表示、安全、压缩 | JPEG、ASCII、加密、压缩 | 数据 |
| 5 | 会话层 | 建立、管理、终止会话 | 会话协议 | 数据 |
| 4 | 传输层 | 端口号、流控、差错校验 | TCP、UDP | 段(Segment) |
| 3 | 网络层 | 逻辑地址、路由选择 | IP、ICMP、IGMP、ARP、RARP | 包(Packet) |
| 2 | 数据链路层 | MAC地址、帧、差错校验 | Ethernet、PPP | 帧(Frame) |
| 1 | 物理层 | 比特流、传输介质 | 电气特性 | 比特(Bit) |
五层模型将表示层和会话层合并到应用层。
2. TCP三次握手
- 第一次握手:客户端发送SYN包(syn=j),进入SYN_SEND状态
- 第二次握手:服务器收到SYN,回复SYN+ACK包(syn=k, ack=j+1),进入SYN_RECV状态
- 第三次握手:客户端收到SYN+ACK,发送ACK包(ack=k+1),双方进入ESTABLISHED状态
为什么需要三次握手? 防止已失效的连接请求报文段突然又传送到服务器,导致服务器错误地建立连接,浪费资源。
3. TCP四次挥手
- 客户端发送FIN,进入FIN_WAIT_1
- 服务器回复ACK,进入CLOSE_WAIT;客户端收到后进入FIN_WAIT_2
- 服务器发送FIN,进入LAST_ACK
- 客户端回复ACK,进入TIME_WAIT(等待2MSL);服务器收到后关闭
为什么需要四次挥手? TCP是全双工通信,双方都需要独立关闭连接。客户端发FIN表示不再发送数据,但还可以接收数据;服务器需要确认收到后,再发送自己的FIN。
4. TCP和UDP的区别
| 对比项 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠,有确认重传 | 不可靠 |
| 传输效率 | 较低 | 较高 |
| 资源占用 | 较高 | 较低 |
| 应用场景 | HTTP、FTP、SSH、邮件 | DNS、视频直播、游戏、语音 |
5. HTTP状态码
| 状态码 | 含义 |
|---|---|
| 2xx 成功 | |
| 200 | OK,请求成功 |
| 201 | Created,资源创建成功 |
| 204 | No Content,无内容 |
| 3xx 重定向 | |
| 301 | Moved Permanently,永久重定向 |
| 302 | Found,临时重定向 |
| 304 | Not Modified,未修改(缓存) |
| 4xx 客户端错误 | |
| 400 | Bad Request,请求错误 |
| 401 | Unauthorized,未授权 |
| 403 | Forbidden,禁止访问 |
| 404 | Not Found,资源不存在 |
| 410 | Gone,资源已永久删除 |
| 413 | Request Entity Too Large,请求体过大 |
| 499 | 客户端主动关闭连接(Nginx特有) |
| 5xx 服务端错误 | |
| 500 | Internal Server Error,服务器内部错误 |
| 502 | Bad Gateway,网关错误(后端异常) |
| 503 | Service Unavailable,服务不可用 |
| 504 | Gateway Timeout,网关超时 |
6. HTTP版本区别
- HTTP/1.0:短连接,每次请求都建立新TCP连接
- HTTP/1.1:长连接(keep-alive),管道化,请求排队
- HTTP/2.0:多路复用,头部压缩,服务器推送,二进制分帧
- HTTP/3.0:基于QUIC(UDP),0-RTT握手,无队头阻塞
7. IP地址分类
| 类别 | 范围 | 默认掩码 | 用途 |
|---|---|---|---|
| A | 1.0.0.0 – 126.255.255.255 | 255.0.0.0 (/8) | 大型网络 |
| B | 128.0.0.0 – 191.255.255.255 | 255.255.0.0 (/16) | 中型网络 |
| C | 192.0.0.0 – 223.255.255.255 | 255.255.255.0 (/24) | 小型网络 |
| D | 224.0.0.0 – 239.255.255.255 | – | 组播 |
| E | 240.0.0.0 – 255.255.255.255 | – | 保留 |
私有IP:
- A类:10.0.0.0/8
- B类:172.16.0.0/12
- C类:192.168.0.0/16
8. 子网计算
/27掩码(255.255.255.224):
- 主机位:5位
- 总地址数:2^5 = 32
- 可用主机数:32 – 2 = 30(减网络地址和广播地址)
/26掩码(255.255.255.192):
- 主机位:6位
- 总地址数:2^6 = 64
- 可用主机数:62
示例:10.0.14.70/26
- 网络地址:10.0.14.64
- 广播地址:10.0.14.127
- 可用范围:10.0.14.65 – 10.0.14.126
9. DNS域名解析过程
- 客户端查询本地DNS缓存(浏览器缓存→系统缓存→hosts文件)
- 向本地DNS服务器(LDNS)发起查询
- LDNS查询自己的缓存,有则返回
- 无缓存则LDNS向根域名服务器(.)发起迭代查询
- 根服务器返回顶级域(.com)服务器地址
- LDNS向顶级域服务器查询,返回权威域名服务器地址
- LDNS向权威服务器查询,返回域名对应的IP
- LDNS将结果返回客户端并缓存
递归查询:客户端→LDNS,LDNS必须返回最终结果
迭代查询:LDNS→根→顶级域→权威域,每次返回下一级地址
常见记录类型:
- A:域名→IPv4
- AAAA:域名→IPv6
- CNAME:域名→域名(别名)
- MX:邮件交换记录
- TXT:文本记录(SPF、DKIM)
- NS:域名服务器记录
- PTR:反向解析(IP→域名)
10. DHCP工作流程(四步)
- DHCP Discover:客户端广播发送,寻找DHCP服务器
- DHCP Offer:服务器回复,提供IP地址等信息
- DHCP Request:客户端广播,请求使用该IP
- DHCP ACK:服务器确认,分配IP
11. NAT和PAT
- NAT(Network Address Translation):网络地址转换,将私有IP转换为公网IP
- 静态NAT:一对一
- 动态NAT:地址池
- PAT(Port Address Translation):端口地址转换,多对一,通过端口号区分不同连接,也叫NAPT
12. 静态路由和动态路由
- 静态路由:手动配置,适合小型网络,稳定但不灵活
- 动态路由:通过路由协议自动学习,适合大型网络
- RIP:距离矢量协议,最大跳数15
- OSPF:链路状态协议,SPF算法
- BGP:边界网关协议,自治系统间路由
13. 二层交换机和三层交换机区别
| 对比项 | 二层交换机 | 三层交换机 |
|---|---|---|
| 工作层级 | 数据链路层 | 网络层 |
| 工作原理 | 基于MAC地址端口转发 | 一次路由,多次交换 |
| 功能 | 不能配IP,VLAN间需三层设备 | 有路由功能,可配VLAN IP,VLAN间直接通信 |
| 应用 | 接入层、汇聚层、小型局域网 | 核心层、大型局域网 |
| 支持协议 | 物理层、数据链路层 | +网络层协议 |
14. VLAN和VXLAN
- VLAN(Virtual LAN):虚拟局域网,二层隔离,最多4096个
- VXLAN(Virtual Extensible LAN):虚拟扩展局域网,用MAC-in-UDP封装,支持1600万个,适用于云计算大二层网络
15. 防火墙区别
- 硬件防火墙:性能高,专业,成本高
- 软件防火墙:iptables/firewalld,灵活,成本低
- 云防火墙:云上安全组,弹性伸缩
iptables四表五链:
- 四表:raw、mangle、nat、filter
- 五链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
16. 常见协议端口
| 协议 | 端口 |
|---|---|
| FTP | 21(控制)、20(数据) |
| SSH | 22 |
| Telnet | 23 |
| SMTP | 25 |
| DNS | 53 |
| DHCP | 67(服务器)、68(客户端) |
| HTTP | 80 |
| POP3 | 110 |
| NTP | 123 |
| HTTPS | 443 |
| rsync | 873 |
| MySQL | 3306 |
| Redis | 6379 |
| Tomcat | 8080 |
| Zabbix | 10050(Agent)、10051(Server) |
| Kafka | 9092 |
| Elasticsearch | 9200 |
| RabbitMQ | 5672、15672(Web) |
17. 网络排错
网站无法访问排查:
- 先切换服务保障正常
- ping检测连通性
- dig/nslookup查DNS解析
- traceroute查路由路径
- 检查服务器本身(服务状态、端口、防火墙)
- 协调开发查程序日志
访问慢排查:
- 本地网络测试
- 网站响应时间(F12开发者工具看各阶段耗时)
- 故障诊断命令(ping、traceroute、mtr)
- 图片/JS/CSS压缩优化
- 数据库/服务器资源
- 网站程序设计
上不了网:
- ping网关和其他机器
- 检查网卡禁用/IP/DNS/网关
- 网卡驱动
- 网线/网卡灯
18. 568A和568B线序
- 568A:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕
- 568B:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕
- 直通线:两端都是568B(不同设备连接)
- 交叉线:一端568A一端568B(相同设备连接)
19. tcpdump常用命令
# 监听指定主机和端口
tcpdump 'host 192.168.1.1 and port 80' -w tcpdump.log
# 实时抓取80端口
tcpdump -nn tcp port 80
# 监听来自指定IP的80端口流量
tcpdump -i eth0 src host 192.168.0.1 and tcp port 80
# 查看ping包
tcpdump -i eth0 icmp
# 嗅探80端口访问TOP IP
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -20
20. iptables端口转发
# 将本地80端口转发到8080
iptables -t nat -A PREROUTING -d 192.168.2.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.1:8080
# 只允许远程主机访问80端口
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
# 限制每秒新建连接数
iptables -A INPUT -p tcp --dport 80 -m limit --limit 1/second --limit-burst 3 -j ACCEPT
五、基础服务
1. FTP主动模式和被动模式
主动模式(PORT):
- 客户端连接服务器21端口建立命令链路
- 客户端开放一个大于1024的端口,告诉服务器来连接
- 服务器从20端口主动连接客户端的大端口,建立数据链路
被动模式(PASV):
- 客户端连接服务器21端口建立命令链路
- 服务器开放一个大于1024的端口,告诉客户端来连接
- 客户端从大于1024的端口连接服务器的大端口,建立数据链路
区别: 主动模式是服务器主动连客户端,被动模式是客户端主动连服务器。被动模式更适合客户端在防火墙后的场景。
2. NFS
NFS(Network File System)网络文件系统,允许不同主机通过网络共享文件。
- 端口:2049
- 配置文件:/etc/exports
- 常用参数:rw(读写)、ro(只读)、sync(同步)、async(异步)、no_root_squash(不压缩root)
# 服务端配置
echo "/data 192.168.1.0/24(rw,sync,no_root_squash)" >> /etc/exports
exportfs -rv
systemctl start nfs
# 客户端挂载
mount -t nfs 192.168.1.10:/data /mnt/nfs
3. Samba
Samba用于Linux和Windows之间的文件共享,基于SMB/CIFS协议。
- 配置文件:/etc/samba/smb.conf
- 端口:139、445
- 用户管理:smbpasswd -a username
4. VPN
VPN(Virtual Private Network)虚拟专用网络,在公网上建立加密隧道。
常见类型:
- IPsec VPN:站点到站点,适合企业互联
- SSL VPN:远程接入,浏览器即可使用
- OpenVPN:开源,跨平台
- WireGuard:轻量高性能
5. NTP时间同步
- CentOS 6:ntpd,配置文件/etc/ntp.conf
- CentOS 7:chronyd,配置文件/etc/chrony.conf
# chrony配置
server ntp.aliyun.com iburst
allow 192.168.1.0/24
# 查看同步状态
chronyc sources
chronyc tracking
6. 邮件服务
- SMTP:发邮件,端口25(加密465/587)
- POP3:收邮件,端口110(加密995)
- IMAP:收邮件,端口143(加密993)
六、磁盘与存储
1. RAID0/RAID1/RAID5原理及特点
RAID0(条带卷):
- 原理:数据分成条带,并行读写到多块磁盘
- 利用率:100%
- 优点:读写性能最高
- 缺点:无冗余,任何一块磁盘损坏,所有数据丢失
- 最少磁盘数:2块
RAID1(镜像卷):
- 原理:数据完全相同地写入两块磁盘(镜像)
- 利用率:50%
- 优点:冗余性最高,读性能好
- 缺点:成本高,写性能一般
- 最少磁盘数:2块(偶数)
RAID5(分布式奇偶校验):
- 原理:数据和校验信息分布在所有磁盘上
- 利用率:(n-1)/n
- 优点:兼顾性能和冗余,允许1块磁盘损坏
- 缺点:重建时间长,有写惩罚
- 最少磁盘数:3块
RAID10(RAID1+0):
- 先镜像再条带,兼顾性能和冗余
- 利用率:50%
- 允许每组镜像坏1块
对比排序:
- 冗余从好到坏:RAID1 > RAID10 > RAID5 > RAID0
- 性能从好到坏:RAID0 > RAID10 > RAID5 > RAID1
- 成本从低到高:RAID0 > RAID5 > RAID1 > RAID10
容量计算:
- 6块300G做RAID5:实际容量 = 5 × 300 = 1500G
- 6块900G做RAID5:实际容量 = 900 × (6-1) = 4500G
2. LVM(逻辑卷管理)
LVM三层结构:
- PV(Physical Volume):物理卷,整个磁盘或分区
- VG(Volume Group):卷组,由一个或多个PV组成
- LV(Logical Volume):逻辑卷,从VG中划分
常用命令:
pvcreate /dev/sdb1 # 创建PV
vgcreate vg0 /dev/sdb1 # 创建VG
lvcreate -L 10G -n lv0 vg0 # 创建LV
mkfs.xfs /dev/vg0/lv0 # 格式化
mount /dev/vg0/lv0 /mnt # 挂载
# 扩展LV
lvextend -L +5G /dev/vg0/lv0
xfs_growfs /dev/vg0/lv0 # xfs扩容
resize2fs /dev/vg0/lv0 # ext4扩容
# 减少LV(需先卸载)
umount /mnt
e2fsck -f /dev/vg0/lv0
resize2fs /dev/vg0/lv0 10G
lvreduce -L 10G /dev/vg0/lv0
3. iSCSI
iSCSI(Internet Small Computer System Interface),将SCSI命令封装在TCP/IP中,通过网络传输块存储。
- 目标端(Target):提供存储的服务器
- 发起端(Initiator):使用存储的客户端
- 端口:3260
4. 文件存储、块存储、对象存储
| 类型 | 特点 | 代表 |
|---|---|---|
| 文件存储 | 目录树结构,按文件访问,支持POSIX | NFS、FTP、Samba |
| 块存储 | 裸设备,按块访问,性能高 | SAN、iSCSI、云盘 |
| 对象存储 | 扁平化,按key访问,海量非结构化数据 | S3、OSS、Swift |
5. Ceph
Ceph是统一分布式存储系统,同时支持块存储、文件存储、对象存储。
核心组件:
- OSD(Object Storage Device):存储数据,处理数据复制、恢复
- MON(Monitor):监控集群状态,维护集群MAP
- MDS(Metadata Server):元数据服务(仅CephFS需要)
- RGW(Rados Gateway):对象存储网关(S3/Swift接口)
Pool类型:
- 副本池(replicated):多副本,默认3副本
- 纠删码池(erasure coded):类似RAID5,节省空间
6. 纠删码(Erasure Coding)
将数据分成n个数据块,计算m个校验块,共n+m块,允许任意m块损坏。
- 例如4+2:4个数据块+2个校验块,允许2块损坏
- 空间利用率:n/(n+m)
- 相比多副本更节省空间,但有计算开销
7. inode和block
- inode:索引节点,存储文件元信息(权限、所有者、大小、时间戳、数据块指针),不存文件名
- block:数据块,存储实际文件内容
- 一个文件占用一个inode,至少一个block
- 文件名存在目录的block中
- df -i查看inode使用情况
8. fsck文件系统检查
# 检查并修复
fsck /dev/sda1
fsck -y /dev/sda1 # 自动修复
# xfs用xfs_repair
xfs_repair /dev/sda1
注意:必须卸载后才能fsck,根分区需进入救援模式。
七、Web服务与反向代理
1. Nginx配置文件结构
# 全局块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# events块
events {
worker_connections 65535;
use epoll;
multi_accept on;
}
# http块
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# server块
server {
listen 80;
server_name www.example.com;
# location块
location / {
root /usr/share/nginx/html;
index index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
}
2. Nginx特点和优缺点
优点:
- 工作在7层,可针对HTTP应用做分流策略(域名、目录结构)
- 正则规则比HAProxy更强大灵活
- 对网络稳定性依赖小,理论上ping通即可
- 安装配置简单,测试方便,错误日志清晰
- 可承担高负载且稳定,硬件不差时支撑几万并发
- 可通过端口检测后端故障,重新提交请求
- 同时是Web应用服务器(LNMP架构)
- 反向加速缓存比Squid快
- 可做静态网页和图片服务器
- 社区活跃,第三方模块多
缺点:
- 仅支持http、https、Email协议
- 健康检查只支持端口检测,不支持URL检测
- 不支持Session直接保持(可用ip_hash解决)
3. Nginx常用模块
| 模块 | 功能 |
|---|---|
| rewrite | URL重写、重定向 |
| access | 来源IP访问控制 |
| ssl | HTTPS安全加密 |
| gzip | 网络传输压缩 |
| proxy | 反向代理 |
| upstream | 负载均衡后端服务器定义 |
| fastcgi | 与PHP-FPM交互 |
| ngx_cache_purge | 缓存清除 |
| limit_req | 限流 |
| limit_conn | 连接数限制 |
| auth_basic | 基础认证 |
| stub_status | 状态监控 |
4. Nginx location匹配规则
优先级从高到低:
=精确匹配^~前缀匹配(匹配后不再检查正则)~区分大小写的正则匹配~*不区分大小写的正则匹配- 普通前缀匹配
/通用匹配
5. Nginx负载均衡策略
| 策略 | 说明 |
|---|---|
| 轮询(默认) | 按顺序依次分配 |
| weight | 加权轮询,权重越大分配越多 |
| ip_hash | 按客户端IP哈希,解决session保持 |
| fair(第三方) | 按后端响应时间分配 |
| url_hash(第三方) | 按URL哈希分配 |
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
ip_hash;
}
6. Nginx优化(10大项)
(1)worker进程优化
worker_processes auto; # CPU核心数或x2,最多8个
worker_cpu_affinity 0001 0010 0100 1000; # CPU亲和力绑定
(2)文件描述符优化
worker_rlimit_nofile 65535;
同时修改/etc/security/limits.conf:
* soft nofile 65535
* hard nofile 65535
(3)事件模型优化
events {
use epoll; # 高效事件模型
worker_connections 65535; # 单进程最大连接数
multi_accept on; # 一次接受多个连接
}
(4)高效传输
sendfile on; # 零拷贝
tcp_nopush on; # 合并发送
tcp_nodelay on; # 不延迟发送
(5)连接超时
keepalive_timeout 60;
client_header_buffer_size 4k;
open_file_cache max=65535 inactive=60s;
open_file_cache_valid 80s;
open_file_cache_min_uses 1;
(6)fastcgi调优
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
(7)gzip压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_comp_level 6;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
(8)expires缓存
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
access_log off;
}
(9)防盗链
location ~* \.(jpg|gif|png|swf|flv)$ {
valid_referers none blocked www.example.com example.com;
if ($invalid_referer) {
return 404;
}
}
(10)内核参数优化(见Linux系统基础章节)
7. 301和302的区别
- 301 Moved Permanently:永久重定向,搜索引擎会把旧URL权重转移到新URL,适合域名更换、URL规范化
- 302 Found:临时重定向,搜索引擎不转移权重,适合临时跳转、A/B测试
8. Nginx高可用
- Nginx + Keepalived:主备模式,VIP漂移
- Nginx + DNS轮询:多活模式
- 云SLB + 多台Nginx
9. Nginx动静分离
location ~* \.(jpg|png|gif|css|js|html)$ {
root /data/static;
expires 7d;
}
location / {
proxy_pass http://backend;
}
10. Nginx正向代理和反向代理
- 正向代理:代理客户端,客户端知道目标服务器,如翻墙、公司上网代理
- 反向代理:代理服务器,客户端不知道后端真实服务器,如Nginx代理Tomcat
11. Apache工作模式
prefork(预派生多进程):
- 启动时预先派生多个子进程
- 每个子进程处理一个请求
- 稳定,但并发量低,内存占用大
worker(预派生多线程):
- 每个子进程派生多个线程
- 每个线程处理一个请求
- 并发量较高,但长连接下线程利用率低
event(worker升级版):
- 通过管理线程调度长连接
- 长连接时线程可处理其他请求
- 线程利用率最高
12. Tomcat
三个端口:
- 8005:关闭端口(SHUTDOWN)
- 8009:AJP协议端口(与Apache连接)
- 8080:HTTP服务端口
JVM内存配置(catalina.sh):
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"
- -Xms:初始堆内存
- -Xmx:最大堆内存
- -XX:PermSize:永久代初始大小
- -XX:MaxPermSize:永久代最大大小
Tomcat优化:
- 调整JVM内存参数
- 开启APR/native库
- 调整连接器(Connector)线程池
- 启用gzip压缩
- 关闭不必要的应用
13. 浏览器输入网址全过程
- 浏览器解析URL,提取域名
- DNS域名解析(浏览器缓存→系统缓存→hosts→本地DNS→根→顶级域→权威域)
- 建立TCP连接(三次握手)
- 发送HTTP请求
- 服务器处理请求,返回HTTP响应
- 浏览器解析HTML,加载CSS/JS/图片等资源
- 渲染页面
- 断开TCP连接(四次挥手)
14. Squid、Varnish、Nginx缓存区别
| 对比项 | Squid | Varnish | Nginx |
|---|---|---|---|
| 类型 | 正向/反向代理缓存 | 专业反向代理缓存 | Web服务器+缓存 |
| 性能 | 一般 | 最高(内存缓存) | 较高 |
| 配置 | 复杂 | 中等 | 简单 |
| 缓存策略 | 丰富 | 丰富(VCL语言) | 基础 |
| 适用场景 | 传统企业缓存 | 高并发缓存 | 通用Web+缓存 |
八、负载均衡与高可用
1. LVS三种工作模式
NAT模式(网络地址转换):
- 原理:负载均衡器修改数据包目的IP为RS的IP,RS处理后返回给LB,LB再修改源IP返回客户端
- 优点:服务器可用任意操作系统,只需LB有公网IP
- 缺点:LB成为瓶颈(进出流量都经过LB),扩展性有限
- RS使用私有IP,与LB在同一网段
DR模式(直接路由,默认):
- 原理:LB和RS都配置VIP,LB通过修改目标MAC地址转发请求,RS处理后直接返回客户端(不经过LB)
- 优点:LB只分发请求,应答包直接返回,性能好,LB不是瓶颈
- 缺点:LB和RS必须在同一局域网(同一广播域),RS需配置VIP并抑制ARP
- 生产环境最常用
TUN模式(IP隧道):
- 原理:LB将请求包封装新IP头发送给RS,RS解封装后处理,直接返回客户端
- 优点:RS可分布在不同地域,有独立公网IP,适合灾备
- 缺点:效率低,RS需支持IP隧道协议,配置复杂
2. LVS调度算法
静态算法(不考虑后端实际状态):
- rr(轮询):按顺序均等分配
- wrr(加权轮询):按权重分配
- sh(源地址哈希):客户端IP固定到同一RS,解决session
- dh(目标地址哈希):目标IP固定到同一RS
动态算法(考虑后端实际状态):
- lc(最少连接):分配给连接数最少的RS
- wlc(加权最少连接,默认):连接数/权重最小的优先
- lblc(基于局部的最少连接):目标IP优先分配给最近使用的RS
- lblcr(带复制的基于局部最少连接):维护目标IP到一组RS的映射
3. LVS/Nginx/HAProxy对比
| 对比项 | LVS | Nginx | HAProxy |
|---|---|---|---|
| 工作层级 | 4层 | 7层 | 4层/7层 |
| 性能 | 最高(无流量) | 较高 | 高 |
| 正则支持 | 不支持 | 强大 | 支持 |
| 健康检查 | 端口 | 端口 | 端口+URL |
| Session保持 | sh算法 | ip_hash | 原生支持+Cookie |
| 协议支持 | 几乎所有TCP | HTTP/HTTPS/Email | TCP/HTTP |
| 配置复杂度 | 较高 | 简单 | 中等 |
| 适用场景 | 超大流量入口 | Web应用负载 | 通用负载均衡 |
选型建议:
- PV超过1000万:LVS(DR模式)+ Keepalived
- PV 1000万以下:Nginx即可
- 需要TCP负载或URL健康检查:HAProxy
- 典型架构:LVS(4层入口)→ Nginx(7层分流)→ 应用服务器
4. Keepalived工作原理
基于VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)协议实现。
- N台服务器组成一个路由器组,有一个master和多个backup
- master持有VIP对外提供服务,定期发送VRRP组播包
- backup收不到VRRP包时认为master宕机,根据优先级选举新master
- 新master接管VIP,实现高可用
三个模块:
- core:核心,主进程启动维护、配置文件加载解析
- check:健康检查
- vrrp:VRRP协议实现
5. Keepalived健康检查
HTTP_GET | SSL_GET {
url {
path /
digest <STRING> # 用genhash生成的摘要
status_code 200 # 期望状态码
}
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
6. 脑裂及防脑裂
脑裂原因:
- 心跳线断开
- 防火墙阻挡心跳包
- 配置错误(优先级相同)
- 网络延迟
防脑裂措施:
- 双心跳线(双线冗余)
- STONITH/Fence(自动隔离故障节点)
- 监控报警,及时人工介入
- 仲裁机制(第三方节点)
7. HAProxy特性
- 支持虚拟主机
- 支持Session保持、Cookie引导
- 支持URL检测后端状态
- 支持TCP协议(可对MySQL读负载均衡)
- 8种负载均衡算法:roundrobin、static-rr、leastconn、source、ri、rl_param、hdr(name)、rdp-cookie(name)
8. 单点故障解决方案
- 负载均衡层:LVS/Keepalived主备
- Web层:多台应用服务器
- 数据库层:主从复制+MHA/MMM高可用
- 缓存层:Redis主从+哨兵/集群
- 存储层:分布式存储(Ceph/GlusterFS)
- DNS层:多线路智能解析
九、数据库-MySQL
1. InnoDB和MyISAM区别
| 对比项 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | 支持 | 不支持 |
| 锁粒度 | 行锁 | 表锁 |
| MVCC | 支持 | 不支持 |
| 外键 | 支持 | 不支持 |
| 全文索引 | 5.6后支持 | 支持 |
| count(*) | 需扫描全表 | 直接读取计数器(快) |
| 崩溃恢复 | 好(事务日志) | 差 |
| 适用场景 | 事务、高并发、频繁更新 | 读多写少、查询统计 |
2. 事务ACID
- A(Atomicity 原子性):事务中操作要么全部成功,要么全部失败
- C(Consistency 一致性):事务前后数据保持一致状态
- I(Isolation 隔离性):并发事务之间互不干扰
- D(Durability 持久性):事务提交后数据永久保存
3. 事务隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(Read Uncommitted) | 可能 | 可能 | 可能 |
| 读已提交(Read Committed) | 不会 | 可能 | 可能 |
| 可重复读(Repeatable Read,MySQL默认) | 不会 | 不会 | 可能(InnoDB通过MVCC+间隙锁解决) |
| 串行化(Serializable) | 不会 | 不会 | 不会 |
4. 索引类型
- 按数据结构:B+树索引、哈希索引、全文索引、R树索引
- 按字段数:单列索引、联合索引(复合索引)
- 按约束:主键索引、唯一索引、普通索引
- 聚簇索引 vs 非聚簇索引:
- 聚簇索引:数据和索引在一起,InnoDB主键索引就是聚簇索引
- 非聚簇索引(二级索引):索引存主键值,需回表查询
索引优化原则:
- 最左前缀原则(联合索引)
- 避免在索引列上使用函数、运算
- 避免隐式类型转换
- like查询避免以%开头
- 覆盖索引(查询字段都在索引中,避免回表)
- MRR(Multi-Range Read)优化回表
5. 锁机制
InnoDB锁类型:
- 共享锁(S锁):读锁,允许多个事务同时读
- 排他锁(X锁):写锁,阻塞其他读写
- 意向锁:表级锁,表明事务即将加行锁
- 间隙锁(Gap Lock):锁定范围,防止幻读
- Next-Key Lock:行锁+间隙锁
查看锁:
SELECT * FROM information_schema.innodb_trx; -- 当前事务
SELECT * FROM information_schema.innodb_locks; -- 当前锁
SELECT * FROM information_schema.innodb_lock_waits; -- 锁等待
6. 死锁
四要素: 互斥、持有并请求、不可剥夺、循环等待
避免死锁:
- 按固定顺序访问资源
- 保持事务简短
- 降低隔离级别
- 使用合理的索引
- 大事务拆分为小事务
7. MySQL主从复制原理
主库:
- 开启binlog
- dump线程:读取二进制日志,响应从库请求
从库:
- IO线程:连接主库,请求binlog,保存到relay log(中继日志)
- SQL线程:读取relay log,重放SQL
复制流程:
- 主库数据更新,写入binlog
- 主库dump线程通知从库IO线程
- 从库IO线程拉取binlog,写入relay log
- 从库SQL线程读取relay log,执行SQL
- 完成数据同步
8. 主从延迟原因及解决
原因:
- 从库太多(超过10个)
- 从库硬件差
- 慢SQL(大事务)
- 单线程复制(5.6前)
- 网络延迟
- 主库压力大,写入频繁
- 从库开启了慢查询日志
解决:
- 减少从库数量
- 提升从库硬件
- 优化慢SQL,避免大事务
- 开启多线程复制(5.6后支持schema级,5.7支持logical_clock)
- 优化网络
- 主从使用相同配置
9. 主从数据一致性校验
工具: pt-table-checksum(Percona Toolkit)
# 主库执行校验
pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --host=127.0.0.1 --user=root --password=123456
# 查看DIFFS列,0表示一致,非0表示不一致
SELECT db, tbl, chunk, this_cnt, master_cnt, this_crc, master_crc, diffs FROM test.checksums WHERE diffs != 0;
修复: pt-table-sync
pt-table-sync --replicate=test.checksums --sync-to-master h=127.0.0.1,u=root,p=123456 --print
pt-table-sync --replicate=test.checksums --sync-to-master h=127.0.0.1,u=root,p=123456 --execute
10. 主从不一致的13种原因
- 人为在从库写入数据
- 主库异常宕机(非干净关闭)
- replicate-ignore/do/rewrite规则
- binlog非ROW格式
- 异步复制本身的延迟
- 从库中断很久,binlog不连续
- 从库启用了存储过程/触发器
- 主从MySQL版本/分支不一致
- 备份恢复时没指定正确参数
- sql_mode不一致
- 一主二从server_id相同
- 自增列配置不一致
- 主从信息保存在文件,刷新非事务安全
11. 主库宕机切换步骤
- 停止业务写入(或确认主库已宕机)
- 检查各从库同步状态(show slave status\G)
- 选择数据最新的从库作为新主库
- 在新主库执行:
STOP SLAVE; RESET SLAVE ALL; RESET MASTER; -- 清空binlog,作为新起点 - 其他从库指向新主库:
CHANGE MASTER TO MASTER_HOST='新主库IP', MASTER_USER='slave', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='xxx', MASTER_LOG_POS=xxx; START SLAVE; - 修改应用配置指向新主库
- 恢复业务
12. MySQL高可用方案
| 方案 | 切换时间 | 数据一致性 | 复杂度 |
|---|---|---|---|
| MHA | 0-30秒 | 好(尽量保证不丢数据) | 中等 |
| MMM | 较快 | 一般(双主可能冲突) | 中等 |
| 半同步复制 | – | 好 | 低 |
| Group Replication | 秒级 | 最好 | 高 |
| 云RDS | 自动 | 好 | 低 |
MHA(Master High Availability):
- 由Manager节点和Node节点组成
- 监控主库,故障时自动切换
- 切换前会对比从库relay log,补全差异
- 适合一主多从架构
13. MySQL备份方式
| 方式 | 工具 | 类型 | 特点 |
|---|---|---|---|
| 逻辑备份 | mysqldump | 逻辑 | 速度慢,适合小数据量,可跨版本 |
| 物理热备 | xtrabackup | 物理 | 速度快,不锁表,支持增量 |
| 冷备 | tar/cp | 物理 | 需停机,最简单 |
| LVM快照 | lvmsnapshot | 物理 | 几乎热备,需LVM |
mysqldump:
# 全库备份
mysqldump -uroot -p123456 --all-databases --single-transaction --master-data=2 > all.sql
# 单库备份
mysqldump -uroot -p123456 --single-transaction dbname > dbname.sql
# 单表备份
mysqldump -uroot -p123456 dbname tablename > tablename.sql
从全库备份恢复单库/单表:
# 恢复单库
mysql -uroot -p123456 --one-database dbname < all.sql
# 恢复单表(需先提取)
sed -n '/^CREATE TABLE.*tablename/,/^UNLOCK TABLES/p' all.sql > tablename.sql
mysql -uroot -p123456 dbname < tablename.sql
14. binlog三种模式
- STATEMENT:记录SQL语句,日志量小,但可能主从不一致(如now()、uuid())
- ROW:记录行变化,数据一致,日志量大(5.7默认)
- MIXED:混合模式,一般用STATEMENT,特殊情况自动切换ROW
15. 双1设置
[mysqld]
sync_binlog = 1 # 每次事务提交都刷binlog到磁盘
innodb_flush_log_at_trx_commit = 1 # 每次事务提交都刷redo log到磁盘
- 双1设置保证数据最高安全性,但性能有损耗
- 从库可适当降低(如sync_binlog=100)提升性能
16. MySQL root密码重置
已知密码修改:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpassword');
FLUSH PRIVILEGES;
忘记密码(CentOS 7):
# 1. 停止MySQL
systemctl stop mysqld
# 2. 跳过权限表启动
mysqld --skip-grant-tables --user=mysql &
# 3. 无密码登录
mysql -uroot
# 4. 修改密码
UPDATE mysql.user SET authentication_string=PASSWORD('newpassword') WHERE user='root';
FLUSH PRIVILEGES;
# 5. 重启MySQL
systemctl restart mysqld
17. 慢查询优化
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = ON
分析工具: mysqldumpslow、pt-query-digest
优化方向:
- 添加合适的索引
- 优化SQL语句(避免select *、避免大事务)
- 分库分表
- 读写分离
- 引入缓存(Redis)
18. drop、truncate、delete区别
| 对比项 | drop | truncate | delete |
|---|---|---|---|
| 类型 | DDL | DDL | DML |
| 删除内容 | 表结构+数据+索引 | 全部数据 | 部分或全部数据 |
| 回滚 | 不可 | 不可 | 可(事务内) |
| 速度 | 最快 | 快 | 慢(逐行删除) |
| 触发器 | 不触发 | 不触发 | 触发 |
| 自增重置 | – | 重置为1 | 不重置 |
19. MySQL CPU飙升500%处理
top确认是否mysqld进程占用高show processlist找出消耗高的SQLkill异常线程- 分析SQL:explain执行计划,加索引、改SQL
- 调整内存参数(buffer_pool_size等)
- 分析连接数激增原因(攻击、慢查询堆积)
20. MySQL睡眠连接(sleep)过多
影响:
- 占用连接数资源
- 占用内存
- 可能导致max_connections耗尽
解决:
- 调整wait_timeout和interactive_timeout(缩短空闲超时)
- 应用层使用连接池,及时释放连接
- 排查是否有连接泄漏
- 适当增大max_connections
21. key_buffer_size参数
- 作用:MyISAM索引缓存大小
- 不重启生效:
SET GLOBAL key_buffer_size = 268435456; - 注意:InnoDB不使用此参数,用innodb_buffer_pool_size
22. 脱离主从结构
STOP SLAVE;
RESET SLAVE ALL; -- 清除主从信息
十、数据库-NoSQL
1. NoSQL和SQL区别
| 对比项 | SQL(关系型) | NoSQL(非关系型) |
|---|---|---|
| 数据结构 | 表、行、列 | 键值、文档、列族、图 |
| 模式 | 固定schema | 灵活schema |
| 事务 | 支持ACID | 一般不支持(或弱事务) |
| 扩展性 | 垂直扩展为主 | 水平扩展 |
| 查询 | SQL语言 | 各有不同 |
| 代表 | MySQL、PostgreSQL | Redis、MongoDB、HBase |
2. Redis为什么快
- 纯内存操作:数据存在内存中,读写速度极快
- 单线程模型:避免了多线程的锁竞争和上下文切换
- I/O多路复用:epoll模型,高并发处理
- 高效数据结构:底层使用跳表、压缩列表等优化
3. Redis数据结构
5种基础:
- String:字符串,最大512M
- List:列表,双向链表
- Hash:哈希,适合存储对象
- Set:无序集合,去重
- Sorted Set(ZSet):有序集合,带score
2种高级:
- HyperLogLog:基数统计
- Stream:消息流(5.0新增)
4. Redis持久化
RDB(快照):
- 定时将内存数据快照保存到磁盘
- 优点:文件小,恢复快
- 缺点:可能丢失最后一次快照后的数据
- 触发:save(阻塞)、bgsave(后台fork)
AOF(追加日志):
- 记录每个写命令,追加到文件
- 优点:数据安全性高,最多丢1秒数据
- 缺点:文件大,恢复慢
- 刷盘策略:always(每条)、everysec(每秒,默认)、no(系统决定)
混合持久化(4.0后):
- RDB做基础,AOF记录增量
- 兼顾恢复速度和数据安全
5. Redis高可用
- 主从复制:一主多从,读写分离
- 哨兵(Sentinel):监控主从,自动故障转移
- 集群(Cluster):分布式,16384个哈希槽,水平扩展
6. Redis三大问题
缓存雪崩: 大量key同时失效,请求全部打到数据库
- 解决:过期时间加随机值、Redis高可用、本地缓存+限流、持久化快速恢复
缓存穿透: 查询不存在的数据,缓存不命中,每次都查数据库
- 解决:布隆过滤器、空值缓存(短过期)
缓存击穿: 热点key失效,大量并发请求打到数据库
- 解决:热点key永不过期、互斥锁(setnx)
7. Redis和Memcached区别
| 对比项 | Redis | Memcached |
|---|---|---|
| 数据结构 | 丰富(5+种) | 仅String |
| 持久化 | 支持 | 不支持 |
| 高可用 | 主从/哨兵/集群 | 客户端一致性哈希 |
| 内存管理 | 虚拟内存(可换出) | 预分配slab |
| 单线程 | 是 | 多线程 |
| 适用 | 复杂数据、持久化需求 | 简单缓存 |
8. Redis优化
- 合理设置过期时间
- 使用批量操作(pipeline、mset)
- 避免大key(String不超过10K,集合不超过5000)
- 使用连接池
- 合理配置maxmemory和淘汰策略
- 慢查询监控
9. MongoDB
- 文档型数据库,BSON格式(JSON二进制)
- 适合存储非结构化数据、日志、物联网
- 副本集(Replica Set)高可用
- 分片(Sharding)水平扩展
十一、消息队列
1. 消息队列的好处
- 解耦:生产者和消费者独立
- 异步:非核心逻辑异步处理,提升响应速度
- 削峰:高峰期请求缓存到MQ,消费者匀速处理
- 重试:消费失败可重试
- 顺序保证:部分MQ支持顺序消息
2. 消息队列两种模式
- 点对点(P2P):一条消息只能被一个消费者消费,如队列
- 发布订阅(Pub/Sub):一条消息可被多个订阅者消费,如Topic
3. RabbitMQ
- 基于AMQP协议,Erlang开发
- 核心概念:Exchange、Queue、Binding、Routing Key
- 交换机类型:direct、fanout、topic、headers
- 支持消息确认、持久化、死信队列
4. Kafka架构
核心组件:
- Producer:生产者
- Broker:Kafka服务器节点
- Topic:主题,消息分类
- Partition:分区,Topic的分片,有序
- Replica:副本,Leader和Follower
- Consumer:消费者
- Consumer Group:消费者组,一个分区只能被组内一个消费者消费
- Offset:消息偏移量
- Zookeeper:协调服务(新版KRaft模式可去掉)
ISR(In-Sync Replicas): 同步副本队列,与Leader保持同步的副本集合。AR = ISR + OSR。
5. Kafka写入流程
- Producer找Partition Leader
- 发送消息到Leader
- Leader写入本地log
- Follower从Leader拉取消息,写入后ACK
- Leader收到所有ISR的ACK后,增加HW(High Watermark)
- Leader回复Producer确认
6. Kafka为什么快
- PageCache:利用操作系统页缓存,读写内存
- 顺序写:消息追加到文件末尾,磁盘顺序写性能接近内存
- 零拷贝:sendfile,数据直接从内核缓冲区到网卡,不经过用户态
- 批量处理:消息批量发送、批量压缩
- Pull模式:消费者主动拉取,按需消费
7. Kafka消息丢失和重复
消息丢失:
- acks=0:不等确认,网络异常或缓冲区满就丢
- acks=1:Leader写入成功即返回,Leader挂掉Follower未同步则丢
- 解决:acks=all,min.insync.replicas>=2,副本数>=3
消息重复:
- 消费后提交offset前消费者挂掉
- 解决:消费者端幂等处理(唯一ID去重)
8. Kafka不支持读写分离的原因
- 数据一致性问题:Follower同步有延迟
- 延时问题:同步需要时间
- Kafka设计目标是高吞吐,读都走Leader
9. Zookeeper
定义: 分布式协调服务,文件系统数据结构 + 通知机制
数据结构: ZNode树,每个节点最多存1MB数据
选举机制:
- 第一次启动:按myid大小选举
- 非第一次:Epoch > ZXID > SID
- 半数以上节点存活即可服务,适合奇数台(3或5)
应用场景:
- 统一命名服务
- 统一配置管理
- 集群管理(上下线感知)
- 分布式锁
- 软负载均衡
10. Zookeeper工作原理(SID/ZXID/Epoch)
- SID(Server ID):服务器唯一标识,即myid
- ZXID(事务ID):全局递增,每次事务+1
- Epoch(选举周期):每次选举+1
- 选举优先级:Epoch大的 > ZXID大的 > SID大的
十二、监控与日志
1. 常见监控软件
- Zabbix:企业级开源监控,功能全面,适合中大型环境
- Prometheus:云原生监控,时序数据库,适合容器/K8s
- Nagios:老牌监控,插件丰富
- Cacti:流量监控,基于SNMP
- Grafana:可视化展示,常配合Prometheus/InfluxDB
2. Zabbix架构
核心组件:
- Zabbix Server:核心服务,处理数据、触发告警
- Database Storage:数据库存储(MySQL/PostgreSQL)
- Web Interface:Web管理界面
- Zabbix Proxy:分布式代理,分担Server压力
- Zabbix Agent:客户端,采集数据
五个程序: zabbix_server、zabbix_agent、zabbix_proxy、zabbix_get、zabbix_sender
3. Zabbix监控方式
- Agent被动:Server主动向Agent请求数据(默认10050端口)
- Agent主动:Agent主动向Server提交数据(10051端口)
- SNMP:网络设备、打印机等
- IPMI:硬件监控(电源、温度、风扇)
- JMX:Java应用监控(Tomcat、JVM)
- SSH/Telnet:远程命令执行
4. Zabbix分布式
- 大于500台主机建议使用分布式
- Proxy分担Server压力,跨地域部署
- Proxy只缓存数据,不处理告警
- 分为主动Proxy和被动Proxy
5. Zabbix自动发现
- 网络发现:按IP范围扫描,自动添加主机
- 主动客户端自动注册:Agent启动后自动注册到Server
- 低级别发现(LLD):自动发现磁盘、网卡、文件系统等,批量创建监控项
6. Zabbix常用术语
- 主机(Host):被监控设备
- 主机组(Host Group):主机分组
- 监控项(Item/Key):具体监控指标
- 触发器(Trigger):告警阈值判断
- 事件(Event):触发器状态变化
- 动作(Action):事件触发的操作(发邮件、远程命令)
- 报警升级(Escalation):告警未处理时逐级升级
- 媒介(Media):告警发送方式(邮件、微信、短信)
- 模板(Template):监控项、触发器、图形的集合
7. Zabbix自定义监控项Key
# 内存
vm.memory.size[available] 可用内存
vm.memory.size[total] 总内存
# Swap
system.swap.size[,free] 可用swap
system.swap.size[,pfree] 可用swap百分比
system.swap.size[,total] 总swap
# CPU
system.cpu.util[,user] 用户态CPU
system.cpu.util[,system] 内核态CPU
system.cpu.util[,iowait] IO等待CPU
system.cpu.util[,idle] 空闲CPU
system.cpu.load[percpu,avg1] 1分钟平均负载/CPU数
system.cpu.load[percpu,avg5] 5分钟平均负载/CPU数
system.cpu.load[percpu,avg15] 15分钟平均负载/CPU数
# 磁盘
vfs.fs.size[{#FSNAME},free] 可用磁盘空间
vfs.fs.size[{#FSNAME},pfree] 可用磁盘百分比
vfs.fs.size[{#FSNAME},total] 总磁盘空间
vfs.fs.size[{#FSNAME},used] 已用磁盘空间
vfs.fs.inode[{#FSNAME},pfree] 可用inode百分比
# 网络
net.if.in[{#IFNAME}] 入站流量
net.if.out[{#IFNAME}] 出站流量
# 进程
proc.num[] 总进程数
proc.num[,,run] 运行中进程数
# 系统
system.localtime 系统时间
system.boottime 启动时间戳
system.hostname 主机名
system.uptime 运行时长
system.users.num 登录用户数
kernel.maxfiles 最大文件句柄数
kernel.maxproc 最大进程数
# Agent
agent.ping 客户端可用性
agent.version 客户端版本
agent.hostname 客户端主机名
# 端口
net.tcp.listen[port] 端口是否监听
8. Zabbix日志监控
key: log[/var/log/message,error]
type: zabbix agent (active) # 必须主动模式
log time format: MMpddphh:mm:ss # 对应日志行头 Sep 14 07:32:38
日志监控原理:
- Server和Agent追踪日志文件大小和最后修改时间
- Agent从上次读取位置继续读取
- 数据记录在数据库,保证断点续读
- 文件轮转时从头读取
- 每秒发送日志量有上限(MaxLinePerSecond),防止CPU过高
9. Prometheus
概述: 开源监控报警系统和时序数据库,Go语言开发,Google BorgMon开源版。
核心组件:
- Prometheus Server:核心,抓取和存储时序数据
- Exporter:客户端,暴露指标(如node_exporter)
- Pushgateway:推送网关(短生命周期任务)
- Alertmanager:告警管理
- Grafana:可视化展示
Server三部分:
- Retrieval:抓取模块
- Storage:存储模块
- PromQL:查询语言
工作模式: Pull模式,主动拉取数据
时序数据类型:
- Counter:计数器,只增不减
- Gauge:计量器,可增可减
- Histogram:直方图,分桶统计
- Summary:汇总,分位数统计
10. ELK架构
组成:
- Elasticsearch:分布式存储检索引擎,基于Lucene,Java开发,RESTful接口
- Logstash:数据收集引擎,JRuby编写,JVM运行,内存占用大
- Kibana:Node.js开发的展示工具,图形化日志分析
工作流程:
- Logstash收集日志(输入→过滤→输出)
- 输出到Elasticsearch存储索引
- Kibana连接ES,可视化查询展示
Filebeat: 轻量级日志搜集器,替代Logstash做收集,资源占用小。
EFK: ES + Fluentd + Kibana,Fluentd用Go语言,常用于K8s。
11. 日志分析常用命令
# 访问量TOP10 IP
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# 按时间段统计
awk '$4 >= "[10/Aug/2024:10:00:00" && $4 <= "[10/Aug/2024:12:00:00"' access.log | wc -l
# 状态码统计
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# UV统计
awk '{print $1}' access.log | sort -u | wc -l
十三、虚拟化与云计算
1. 云计算特征
- 按需自助服务
- 广泛网络访问
- 资源池化
- 快速弹性伸缩
- 可计量的服务
2. 云计算部署模式
- 公有云:第三方提供商,如阿里云、AWS、腾讯云
- 私有云:企业自建,仅供内部使用
- 混合云:公有云+私有云结合
- 社区云:特定社区共享
3. IaaS、PaaS、SaaS
| 模式 | 全称 | 说明 | 代表 |
|---|---|---|---|
| IaaS | 基础设施即服务 | 提供虚拟机、存储、网络 | AWS EC2、阿里云ECS |
| PaaS | 平台即服务 | 提供开发运行平台 | Heroku、阿里云ACE |
| SaaS | 软件即服务 | 直接使用软件应用 | 钉钉、企业微信、Salesforce |
4. 云计算和虚拟化的区别
- 虚拟化是云计算的底层技术之一
- 云计算是一种服务模式,虚拟化是技术实现
- 云计算包含虚拟化、分布式存储、网络、自动化等多种技术
5. 虚拟化产品
- KVM:开源,Linux内核模块,主流
- Xen:早期开源,半虚拟化/全虚拟化
- VMware:商业,功能强大,企业级
- Hyper-V:微软
- OpenVZ:容器级虚拟化(类似LXC)
6. KVM
- 基于Linux内核的虚拟化模块,2.6.20后集成
- 使用Linux调度器,性能接近物理机
- 支持全虚拟化,需CPU支持VT-x/AMD-V
- 管理工具:libvirt、virsh、virt-manager
7. KVM工作流程
- 加载kvm.ko内核模块
- 创建VM,分配CPU、内存、磁盘
- QEMU模拟硬件设备
- VM通过/dev/kvm与内核交互
- CPU指令由KVM处理,IO由QEMU处理
十四、容器-Docker
1. Docker三大组件
- 镜像(Image):只读模板,包含操作系统和应用
- 容器(Container):镜像的运行实例,可读写
- 仓库(Repository):存储镜像,如Docker Hub、Harbor
2. Docker和虚拟机的区别
| 对比项 | Docker容器 | 虚拟机 |
|---|---|---|
| 隔离级别 | 进程级(共享内核) | 系统级(独立OS) |
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | 小(MB级) | 大(GB级) |
| 性能 | 接近原生 | 有损耗 |
| 隔离性 | 一般 | 强 |
| 适用场景 | 微服务、CI/CD | 多OS、强隔离 |
3. Docker使用的技术
- Namespace:六项隔离
- UTS:主机名和域名
- IPC:信号量、消息队列、共享内存
- PID:进程编号
- NETWORK:网络设备、栈、端口
- MOUNT:挂载点
- USER:用户和组
- Cgroups:资源限制(CPU、内存、IO)
- UnionFS:联合文件系统,分层叠加
- Container Runtime:runC、containerd
4. Docker网络模式
| 模式 | 说明 |
|---|---|
| bridge | 默认,容器连接到docker0网桥,NAT访问外网 |
| host | 共享宿主机网络,端口直接占用宿主机 |
| none | 无网络 |
| container | 共享另一个容器的网络命名空间 |
| overlay | 跨主机网络,用于Swarm/K8s |
| macvlan | 容器有独立MAC地址,直接接入物理网络 |
5. Dockerfile常用命令
| 命令 | 说明 |
|---|---|
| FROM | 基础镜像 |
| MAINTAINER | 维护者 |
| RUN | 构建时执行命令 |
| COPY | 复制本地文件到镜像 |
| ADD | 复制文件(支持URL和解压) |
| WORKDIR | 工作目录 |
| ENV | 环境变量 |
| EXPOSE | 暴露端口 |
| VOLUME | 数据卷 |
| CMD | 容器启动时执行(可被覆盖) |
| ENTRYPOINT | 容器启动时执行(不可被覆盖,优先级高) |
ADD vs COPY:
- ADD支持URL和自动解压tar
- COPY只能复制本地文件
- 推荐用COPY,更明确
ENTRYPOINT vs CMD:
- ENTRYPOINT优先级高,exec形式不会被docker run覆盖
- CMD可被docker run后的参数覆盖
- 常组合使用:ENTRYPOINT定命令,CMD传默认参数
6. 联合文件系统(UnionFS)
- 分层叠加:bootfs + rootfs(只读层)+ 读写层
- 镜像层只读,容器层可写
- 修改文件时复制到读写层(Copy-on-Write)
- 优势:共享底层,节省空间,快速分发
7. Docker容器生命周期
Dockerfile → build → Image → run → Container → stop/start/restart → rm
8. docker run vs start
docker run:基于镜像创建并启动新容器docker start:启动已停止的容器
9. docker stop vs kill
docker stop:发送SIGTERM,优雅停止(默认10秒超时后kill)docker kill:发送SIGKILL,强制立即停止
10. Docker数据持久化
- Volume:Docker管理的卷,/var/lib/docker/volumes
- Bind Mount:绑定挂载宿主机目录
- tmpfs:内存文件系统,临时
11. Docker镜像优化
- 选择精简基础镜像(alpine)
- 合并RUN指令,减少层数
- 多阶段构建(multi-stage build)
- 清理缓存(yum clean、rm -rf /var/cache)
- 使用.dockerignore排除不必要文件
12. Harbor
VMware开源企业级Docker Registry,基于docker registry封装。
特性: 角色控制、镜像复制、LDAP/AD、镜像删除垃圾回收、图形界面、审计、RESTful API、中文支持
组件:
- Proxy:nginx反向代理
- Registry:存储镜像
- Core services:UI、WebHook、Token
- Database:MySQL/PostgreSQL
- Job services:镜像复制
- Log collector:日志收集
13. Docker安全配置
- 内核级别:User Namespace、Cgroups、SELinux、Capability、Seccomp
- 主机级别:定期更新、最小化安装
- 网络级别:网络隔离、不使用–net=host
- 镜像级别:可信镜像、扫描漏洞
- 容器级别:非root运行、只读文件系统
- 其他:TLS加密通信、限制资源
14. HTTPS/TLS证书认证流程
- 客户端发起请求,连接服务器进程端口
- 服务器有数字证书(公钥、颁发机构、失效日期)
- 服务器发送数字证书给客户端
- 客户端验证证书合法性,通过则生成随机密钥,用证书公钥加密
- 客户端发送加密后的密钥到服务器
- 服务器用私钥非对称解密,得到客户端密钥
- 服务器用客户端密钥对称加密返回数据
- 客户端用自己密钥对称解密得到数据
单向SSL:只有服务端有证书
双向SSL:客户端也有证书
15. consul服务发现
- 基于Raft算法的分布式KV存储
- Server/Client模式,3或5个Server节点
- 特性:服务注册发现、健康检查、KV存储、多数据中心
- 常与Docker配合实现服务注册发现
十五、容器编排-Kubernetes
1. Kubernetes定义和优势
K8s是Google开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。
优势:
- 自动装箱(资源调度)
- 自我修复(重启失败容器、替换节点)
- 水平扩展(HPA自动伸缩)
- 服务发现和负载均衡
- 滚动更新和回滚
- 密钥和配置管理
- 存储编排
- 批处理执行
2. K8s架构
Master节点:
- API Server:集群入口,RESTful接口,所有组件通信枢纽
- Scheduler:调度Pod到合适的Node
- Controller Manager:控制器管理(节点、副本、服务等)
- etcd:分布式KV存储,保存集群所有数据
Node节点:
- Kubelet:管理本节点Pod,与API Server通信
- Kube-proxy:网络代理,实现Service负载均衡
- 容器运行时:Docker/containerd
3. 创建Pod流程
- kubectl提交Pod定义到API Server
- API Server将信息存入etcd
- Controller Manager检测到新Pod,创建对应控制器
- Scheduler监听未调度Pod,执行调度(预选+优选)
- Scheduler将Pod绑定到目标Node,更新etcd
- 目标Node的Kubelet检测到Pod,启动容器
- Kube-proxy建立网络规则(Service/Endpoint)
4. 核心概念
- Pod:最小调度单元,包含一个或多个容器,共享网络和存储
- Node:工作节点
- Namespace:命名空间,资源隔离
- Label:标签,键值对,用于选择器
- Annotation:注解,附加信息
- Service:服务,Pod的稳定访问入口
- Volume:数据卷
- ConfigMap:配置管理
- Secret:敏感数据管理
5. Pod控制器
| 控制器 | 说明 |
|---|---|
| Deployment | 无状态应用,滚动更新/回滚 |
| StatefulSet | 有状态应用,稳定网络标识和存储 |
| DaemonSet | 每个Node运行一个Pod(日志、监控) |
| Job | 一次性任务 |
| CronJob | 定时任务 |
| ReplicaSet | 副本管理(被Deployment管理) |
6. ReplicaSet和Replication Controller区别
- RC(Replication Controller):旧版,只支持基于等式的选择器
- RS(Replica Set):新版,支持基于集合的选择器(in/notin/exists)
- 一般不直接使用RS,由Deployment管理
7. kube-proxy模式
- userspace:用户态,已废弃
- iptables:内核态,规则匹配,濒临废弃(大规模性能差)
- ipvs:推荐,基于Hash表,高性能,支持更多调度算法(rr/lc/sh/dh等)
8. Pod状态
- Pending:等待调度
- Running:运行中
- Succeeded:成功完成(Job)
- Failed:失败
- Unknown:未知(Node失联)
- Terminating:终止中
9. 重启策略
- Always:总是重启(默认)
- OnFailure:失败时重启
- Never:从不重启
10. 镜像拉取策略
- IfNotPresent:本地没有才拉取(默认)
- Always:总是拉取(latest标签默认)
- Never:从不拉取(只用本地镜像)
11. 健康检查
- LivenessProbe(存活探针):判断容器是否存活,失败则重启
- ReadinessProbe(就绪探针):判断容器是否就绪,失败则从Service摘除
- startupProbe(启动探针,1.17+):判断容器是否启动完成,保护慢启动应用
探针方式:
- ExecAction:执行命令
- TCPSocketAction:TCP端口检测
- HTTPGetAction:HTTP请求检测
12. 调度策略
- Deployment/RC自动调度:默认
- nodeSelector:定向调度(标签匹配)
- NodeAffinity(节点亲和性):
- 硬亲和(requiredDuringSchedulingIgnoredDuringExecution):必须满足
- 软亲和(preferredDuringSchedulingIgnoredDuringExecution):尽量满足
- Taints和Tolerations(污点和容忍):节点排斥Pod,Pod可配置容忍
13. pause容器
- Pod中所有容器的父容器
- 提供网络命名空间共享基础
- PID=1的init进程,回收僵尸进程
- 每个Pod都有一个pause容器
14. init container
- 应用容器启动前运行完成
- 可阻塞、延迟应用启动
- 可访问Secret(应用容器也能,但init常用于初始化)
- 常用于:等待依赖服务、初始化配置、注册等
15. Requests和Limits
- Requests:资源预分配,调度依据
- Limits:资源上限,超过可能被OOM Kill
- CPU单位:m(毫核),1000m=1核
- 内存单位:Mi、Gi
16. Deployment更新策略
- Recreate(重建):先删旧Pod,再建新Pod,有停机
- RollingUpdate(滚动更新,默认):逐步替换
- maxUnavailable:最大不可用Pod数
- maxSurge:最大超出期望Pod数
17. DaemonSet和Deployment区别
- Deployment:管理无状态应用,Pod分布在任意节点,可指定副本数
- DaemonSet:每个Node(或匹配节点)运行一个Pod,用于日志收集、监控Agent
18. port端口说明
- port:集群内部访问Service的端口
- nodePort:外部访问的端口(30000-32767)
- targetPort:Pod的端口
- containerPort:容器内部端口
19. HPA自动扩容
- 基于CPU利用率(或自定义指标)自动伸缩Pod数量
- 需要metrics-server提供指标数据
- 命令:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 - 默认每30秒检测一次
20. Service类型
| 类型 | 说明 |
|---|---|
| ClusterIP | 集群内部虚拟IP(默认) |
| NodePort | 每个Node开放端口,外部可访问 |
| LoadBalancer | 云平台负载均衡器 |
| ExternalName | 外部域名别名 |
| Headless | 无ClusterIP,直接返回Pod IP(StatefulSet用) |
21. Service分发策略
- RoundRobin:轮询(默认)
- SessionAffinity:基于客户端IP会话保持
22. 几种IP
- Node IP:Node物理网卡IP
- Pod IP:Pod虚拟IP(容器网络)
- Cluster IP:Service虚拟IP
23. 外部访问集群服务
- NodePort:简单,端口管理麻烦,只支持四层
- LoadBalancer:云平台,需额外费用
- Ingress:七层转发,基于域名和URL路径,推荐
24. Ingress
- API对象,定义请求转发规则(域名、URL路径→Service)
- 需ingress-controller具体实现
- 常用:ingress-nginx(官方维护)、Traefik、Kong
工作原理:
- ingress-controller与API Server交互,感知ingress规则变化
- 按规则生成nginx配置
- 写入ingress-controller Pod的nginx.conf
- reload生效
25. Scheduler调度过程
预选(Predicate): 过滤不满足条件的节点
- PodFitsResources:资源是否足够
- PodFitsHost:节点名是否匹配
- PodFitsHostPorts:端口是否冲突
- PodSelectorMatches:标签是否匹配
- NoDiskConflict:卷是否冲突
优选(Priorities): 对通过的节点排序
- LeastRequestedPriority:资源使用率低优先
- BalancedResourceAllocation:CPU和内存使用率均衡优先
- ImageLocalityPriority:已有镜像的节点优先
26. 安全机制
- 基础设施隔离:容器与宿主机隔离
- 最小权限原则
- API Server认证(HTTPS/Token)和授权(RBAC)
- Secret保护敏感数据
- 准入控制(Admission Control)
27. 准入控制器
请求经过认证→授权→准入控制→操作对象。
常用插件:
- NamespaceLifecycle:命名空间生命周期
- LimitRanger:资源配额限制
- ServiceAccount:自动添加SA
- DefaultStorageClass:默认存储类
- ResourceQuota:命名空间配额
- NodeRestriction:节点最小权限
28. flannel和Calico区别
| 对比项 | Flannel | Calico |
|---|---|---|
| 方案 | Overlay(UDP/VxLAN) | 纯三层BGP |
| 性能 | 封包解包有损耗 | 无Overlay,性能高 |
| 网络策略 | 基础 | 丰富(基于iptables) |
| 适用 | 简单环境 | 大规模、需网络策略 |
Cilium: 基于eBPF/XDP,零拷贝内核态处理,性能可媲美DPDK。
29. 节点维护
kubectl drain node-1 --ignore-daemonsets --delete-local-data
# 维护完成后
kubectl uncordon node-1
30. 数据持久化方式
- EmptyDir:临时存储,Pod删除即消失
- HostPath:挂载宿主机目录
- NFS:网络文件系统
- PV/PVC:持久卷/持久卷声明,推荐
31. PV和PVC
- PV(PersistentVolume):集群中已配置的存储资源,由管理员创建
- PVC(PersistentVolumeClaim):用户对存储的请求,自动匹配PV
PV生命周期: Available → Bound → Released → Failed
完整流程: Provisioning(配置)→ Binding(绑定)→ Using(使用)→ Releasing(释放)→ Recycling(回收)
32. EFK在K8s中
- Elasticsearch:存储查询
- Fluentd:收集日志,DaemonSet方式部署在每个Node
- Kibana:Web展示
- Fluentd挂载/var/lib/docker/containers和/var/log
33. RBAC
- 基于角色的访问控制
- 可运行时调整,无需重启API Server
- 核心对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding
34. Secret
- 保管密码、OAuth Tokens、SSH Keys等敏感数据
- 三种使用方式:
- ServiceAccount自动使用
- 挂载到Pod中
- ImagePullSecrets拉取镜像
35. CNI
- 容器网络插件化方案
- 只关注创建容器时分配网络、销毁时删除网络
- CNI Plugin:配置网络资源
- IPAM Plugin:管理IP地址分配
- 常用实现:flannel、Calico、Cilium
36. ETCD
- 分布式KV存储,Raft一致性算法
- 保存K8s集群所有数据
- 奇数节点(3或5),半数以上存活即可
- 需定期备份(etcdctl snapshot save)
十六、CI/CD与DevOps
1. 持续集成、持续交付、持续部署
- 持续集成(CI):开发者频繁将代码集成到主干,自动化构建测试,及早发现问题
- 持续交付(CD):在CI基础上,确保代码随时可安全部署到生产环境,人工确认发布
- 持续部署(CD):在持续交付基础上,自动部署到生产环境,无需人工干预
2. CI/CD流程
- 代码提交(Git push)
- 触发构建(Webhook通知Jenkins)
- 拉取代码
- 编译构建(Maven/Gradle/npm)
- 自动化测试(单元测试、集成测试)
- 打包产物(jar/war/docker镜像)
- 部署到测试/生产环境
- 结果通知(邮件/钉钉)
3. Jenkins
- 开源持续集成工具,Java开发
- 支持多种SCM(Git、SVN)
- 丰富的插件生态
- 支持分布式构建(Master+Slave)
- Pipeline as Code(Jenkinsfile)
Jenkins工作流程:
- 开发人员提交代码到Git仓库
- GitLab通过Webhook触发Jenkins
- Jenkins拉取代码,配合JDK/Maven编译、测试、打包
- Jenkins调用Ansible部署到目标服务器
4. Git和SVN区别
- SVN:集中式版本控制,单一中央服务器,客户端只存最新文件
- Git:分布式版本控制,每个客户端都是完整仓库,无中央服务器概念
- Git支持离线工作、分支更轻量、性能更好
5. Git常用命令
git config --global user.name "name" # 设置用户名
git config --global user.email "email" # 设置邮箱
git init # 初始化仓库
git clone url # 克隆仓库
git add . # 添加到暂存区
git commit -m "message" # 提交
git push # 推送到远程
git pull # 拉取远程
git status # 查看状态
git log # 查看日志
git branch # 查看分支
git checkout -b dev # 创建并切换分支
git merge dev # 合并分支
git reset --hard HEAD^ # 回退
6. GitLab和GitHub区别
- GitHub:私有仓库需付费,开源项目首选
- GitLab:可免费创建私有仓库,权限控制更细,适合企业内网搭建私服
- GitLab-ce社区版免费,GitLab-ee企业版收费
7. 代码提交流程
- PM在GitLab创建任务,分配给开发
- 开发git clone拉取代码
- 创建开发分支(git checkout -b dev)
- 开发完成后git commit提交
- GitLab发起Merge Request
- PM审核代码,确认后合并到master
- 关闭issue
8. 公司上线流程
- 开发git push推送到GitLab
- GitLab触发Webhook通知Jenkins
- Jenkins通过GitLab插件拉取代码
- Jenkins调用Maven编译打包
- Jenkins调用Ansible部署到目标服务器
- 灰度发布(先部分节点,观察无误后全量)
9. 网站三种发布模式
- 蓝绿发布:两套环境,蓝色运行当前版本,绿色部署新版本,测试通过后切流量
- 灰度发布:按比例逐步切流量(10%→30%→50%→100%)
- 滚动发布:逐个更新实例,不停机逐步替换
10. DevOps
- 开发(Dev)和运维(Ops)团队协作的文化和实践
- 通过CI/CD流水线自动化交付
- 目标:缩短交付周期、提高质量、降低风险
- 工具链:Git→Jenkins→Docker→K8s→Prometheus→ELK
11. 敏捷和DevOps区别
- 敏捷:软件开发方法论,强调迭代、协作、响应变化
- DevOps:开发和运维协作实践,强调自动化交付
- 两者相辅相成:敏捷推动创新,DevOps管理交付
十七、自动化运维-Ansible
1. Ansible定义和优势
- 基于Python开发的自动化运维工具
- 无Agent,基于SSH通信
- 幂等性(重复执行结果一致)
- 配置简单,YAML语法
- 丰富的模块生态
2. Ansible工作原理
- 管理端读取Inventory(主机清单)
- 通过SSH连接被管理端
- 将模块生成Python脚本,推送到被管理端
- 被管理端执行脚本,返回结果
- 管理端删除临时脚本
3. 配置文件优先级
$ANSIBLE_CONFIG > ./ansible.cfg > ~/.ansible.cfg > /etc/ansible/ansible.cfg
4. 常用模块
| 模块 | 功能 |
|---|---|
| command | 执行命令(不支持管道、重定向) |
| shell | 执行shell命令(支持管道) |
| cron | 定时任务 |
| user | 用户管理 |
| group | 组管理 |
| copy | 复制文件 |
| file | 文件管理(创建、删除、权限) |
| hostname | 修改主机名 |
| ping | 连通性测试 |
| yum | 包管理 |
| service | 服务管理 |
| script | 执行脚本 |
| setup | 收集系统信息(facts) |
| template | 模板渲染(Jinja2) |
| yum_repository | yum源配置 |
5. ad-hoc和playbook区别
- ad-hoc:临时命令,一次性操作,适合简单任务
ansible all -m ping ansible web -m shell -a "uptime" - playbook:YAML文件,可编排复杂任务,适合重复使用
- hosts: web tasks: - name: install nginx yum: name=nginx state=present - name: start nginx service: name=nginx state=started enabled=yes
6. Playbook组成
- hosts:目标主机
- vars:变量
- tasks:任务列表
- handlers:处理器(被notify触发)
- roles:角色
7. 变量
- 全局变量:vars、vars_files、–extra-vars
- 主机变量:host_vars/
- 组变量:group_vars/
- 主机清单变量:Inventory中定义
- facts变量:setup模块收集的系统信息
8. 循环
- name: install packages
yum: name={{ item }} state=present
with_items:
- nginx
- mysql
- redis
9. handler
tasks:
- name: modify config
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx state=restarted
handler只有被notify且任务实际改变时才执行,所有任务结束后执行。
10. Roles目录结构
roles/
nginx/
files/ # 静态文件
templates/ # Jinja2模板
tasks/ # 任务
handlers/ # 处理器
vars/ # 变量
defaults/ # 默认变量(优先级低)
meta/ # 元信息(依赖)
11. Ansible Vault
- 加密敏感数据(密码、密钥)
ansible-vault create secret.yml创建加密文件ansible-vault edit secret.yml编辑- playbook执行时加
--ask-vault-pass
12. 错误处理
- ignore_errors:忽略错误继续
- failed_when:自定义失败条件
- changed_when:自定义改变条件
- block/rescue/always:异常处理(类似try/catch/finally)
十八、安全与堡垒机
1. 堡垒机定义和功能
堡垒机是在特定网络环境下,为保障网络和数据安全,运用技术手段监控和记录运维人员对服务器、网络设备、数据库等的操作行为,以便集中报警、及时处理及审计定责。
4A理念:
- Authentication(认证)
- Authorization(授权)
- Account(账号)
- Audit(审计)
2. 堡垒机功能
- 集中管理、集中权限分配
- 统一认证、集中审计
- 数据安全、运维高效
- 运维合规、风险管控
- 文件传输(RDP/SFTP/FTP/SCP/RZ/SZ)
- 细粒度控制(命令、传输)
3. 常见堡垒机产品
- 收费:行云管家、纽盾堡垒机
- 开源:Jumpserver
4. 堡垒机功能模块
- 运维平台:RDP/VNC、SSH/Telnet、SFTP/FTP、数据库运维
- 管理平台:三权分立、身份鉴别、主机管理、密码托管、电子工单
- 自动化平台:自动改密、自动运维、自动收集、自动授权、自动备份
- 控制平台:IP防火墙、命令防火墙、访问控制、会话阻断、运维审批
- 审计平台:命令记录、文字记录、SQL记录、全文检索、审计报表
5. 身份认证方式
- 本地认证(账号密码)
- 远程认证(AD/LDAP/Radius)
- 双因子认证(UsbKey、动态令牌、短信、手机APP)
- 第三方认证(OAuth2.0、CAS)
6. 运维方式
- B/S运维:浏览器
- C/S运维:客户端(Xshell、CRT)
- H5运维:网页直接打开远程桌面
- 网关运维:SSH网关代理
7. 部署方式
- 单机部署:旁路部署
- HA高可用:主备+VIP
- 异地同步:多数据中心配置同步
- 集群部署:分布式,大量设备管理
8. Jumpserver
- 全球首款完全开源堡垒机,GPL v2.0
- Python/Django开发,Web 2.0
- 分布式架构,支持多机房跨区域
- 组件:Jumpserver(Core)、Coco(SSH/Web Terminal)、Luna(前端)、Guacamole(RDP)
9. Linux安全加固
见Linux系统基础章节”Linux系统优化”部分。
10. DDoS防护
- 流量清洗(高防IP)
- CDN加速
- 防火墙限流
- 云平台DDoS防护(阿里云高防IP)
十九、公有云
1. 阿里云四大件
- ECS(云服务器):基本款,1核1G到32核64G,可升降配
- RDS(云数据库):MySQL/PostgreSQL/SQL Server/MongoDB/Redis
- SLB(负载均衡):流量分发,健康检查,抗DDoS
- OSS(对象存储):海量非结构化数据存储(图片、视频)
2. 阿里云其他产品
- CDN:内容分发网络,就近访问
- VPC:专有网络,隔离的网络环境
- 弹性伸缩:自动增减ECS实例
- DDoS高防IP:抗DDoS攻击
- 安骑士:主机安全(漏洞检测、病毒查杀)
- 证书服务:SSL证书
- 态势感知:安全威胁分析
- 堡垒机:运维审计
- 消息队列MQ:分布式消息中间件
- 万网:域名、虚拟主机、企业邮箱、云解析DNS
3. ECS优势和组件
优势:
- 无需自建机房
- 分钟级交付,快速部署
- 全球数据中心,BGP机房
- 按需使用,弹性伸缩
- 支持GPU/FPGA/裸金属
- 内网访问其他云服务
- 多重安全方案
- 性能监控和主动运维
- 标准API
组件:
- 实例(CPU、内存、OS、网络、磁盘)
- 镜像(OS+应用)
- 块存储(云盘/本地盘)
- 快照(备份恢复)
- 安全组(虚拟防火墙)
- 网络(VPC/经典网络)
4. RDS优势
- 便宜易用,按需变配
- 高性能(参数优化、SQL优化建议)
- 高可用架构和容灾方案
- 高安全性
- 价格约ECS自建的1/3,自购服务器的1/10
5. VPC
- 基于隧道技术的隔离虚拟网络
- 每个VPC独立隧道号
- 可自定义IP范围、网段、路由表、网关
- 组件:交换机、网关、控制器
- 应用场景:托管应用、跨可用区容灾、业务隔离、混合云
6. CDN
- 将源站内容分发到边缘节点,用户就近获取
- 关键概念:加速域名、CNAME记录、边缘节点、源站、回源、回源HOST、协议回源、过滤参数
7. SLB
- 负载均衡实例 + 监听 + 后端服务器
- 全冗余无单点,支持同城容灾
- 抗DDoS攻击
- 亿级并发连接,单实例千万级并发
- 成本比传统硬件负载均衡低60%
8. 公有云和私有云区别
| 对比项 | 公有云 | 私有云 |
|---|---|---|
| IT设施位置 | 第三方数据中心 | 企业内部 |
| 基础设施 | 标准化、同构 | 异构、定制化 |
| 商务模式 | 按需付费,运营成本 | 一次性投入,固定成本 |
| 控制程度 | 租用,不管理底层 | 完全拥有和控制 |
| 适用 | 中小企业、弹性需求 | 大型企业、数据安全要求高 |
二十、非技术面试题
1. 自我介绍
- 基本信息(姓名、工作年限)
- 技术栈和擅长领域
- 项目经验(1-2个代表性项目)
- 个人优势
2. 离职原因
- 正面表述:寻求更好发展、技术挑战、职业规划
- 避免负面:抱怨前公司、领导、同事
3. 对加班的看法
- 运维岗位特性决定需要on-call,可接受合理加班
- 注重效率,通过自动化减少重复性加班
- 故障应急时义不容辞
4. 职业规划
- 短期:熟悉业务,提升技术深度
- 中期:在某一领域(云原生/DevOps/数据库)成为专家
- 长期:技术架构师或技术管理方向
5. 入职后如何开展工作
- 第一周:熟悉环境、文档、团队
- 第一个月:了解业务架构、现有运维体系
- 逐步:发现问题、优化改进、自动化建设
6. 期望薪资
- 了解市场行情
- 给出合理区间,留谈判空间
- 可说”根据公司薪资体系和我的能力,期望在X-Y范围”
7. 你还有什么想问的
- 团队规模和分工
- 技术栈和架构
- 运维流程和规范
- 晋升机制和成长空间
- (不要问工资、假期等HR问题,技术面问技术相关)
8. 运维工程师职责
- 保障系统稳定运行
- 部署发布、监控告警、故障处理
- 性能优化、安全加固
- 自动化建设、文档编写
- 配合开发完成需求
9. 工作中最大的收获
- 技术能力提升(具体技术点)
- 解决问题的思路和方法
- 沟通协作能力
- 责任心和抗压能力
10. 找工作最关注什么
- 技术成长空间
- 团队氛围
- 业务前景
- 薪资待遇
本文档持续更新中,建议结合实际项目经验理解背诵,面试时灵活运用。