【面试】01 运维
现在给你 300 台服务器,你怎么对他们进行管理
记录管理:cmdb,以后的报表
统一认证:ldap
跳板机:非直连,安全
批量管理工具:salt, ansible
- ansible cmd和shell的区别是什么:管道,shell能用管道,cmd用不了管道
jumpserver,内置 ansible,开源,python + django,可以进行按需修改
- https://bbs.fit2cloud.com/t/topic/924
terraform
Terraform是您和云提供商API之间的一层。Terraform可以帮助您将云基础设施写成代码。
什么是运维
保障企业在运行过程中、以及软件开发生命周期中所需要的IT基础设施、中间件、服务器、存储、软件产品本身的部署、持续运维,保障稳定性。
总体来说,就是保障服务稳定性的岗位。
服务会有多种,基础服务(代码存储、用户存储、数据存储)、业务系统(对内业务 oa, erp、对外业务),这些服务,都是运维人员可以保障的。
raid0,1,5
- raid0:最少 2 块盘。1 块磁盘坏掉,阵列无法正常工作。完全没有冗余,读写速度最快。N 块盘组合后的磁盘空间为:N。
- raid1:最少 2 块盘。只要 1 块磁盘正常,就可以正常工作。冗余最高,读速度最快,写速度最慢。N 块盘组合后的磁盘空间为:1。
- raid5:最少 3 块盘。1 块磁盘坏掉,还可以正常工作。N 块盘组合后的磁盘空间为:N-1。
- raid6:最少 4 块盘。2 块磁盘坏掉,还可以正常工作。N 块盘组合后的磁盘空间为:N-2。
- raid10:最少 4 块盘。n/2 块磁盘坏掉,还可以正常工作。N 块盘组合后的磁盘空间为:N/2。
LVS, Nginx, HAProxy 有什么区别,怎么选择
简单来说:
LVS:四层
Nginx:七层
HAProxy:四层和七层都可以
lvs 一般还和 keepalived,来实现 vip 的高可用。
- keepalived: 控制器故障转移的 VRRP 协议
LVS
LVS 四种模式
使用 lvs 后一般的访问流程为:CIP<==>VIP==DIP<==>RIP。
- CIP:客户端的 IP。
- VIP:虚拟服务 IP,LB 的外网 IP,也就是客户端请求的 IP。
- DIP:LB 内网的 IP,负责与 RS 的连接与通信。
- RIP:RS 的 IP。
四种模式:
- DR:修改数据包的目标 mac,返回流量不经过 LVS。要求:LVS 和 RS 在同一物理网段内,RS 上要配置 VIP。(最常见)
- TUN:不修改数据包,把数据包封装后,扔给某个 RS,返回流量不经过 LVS。要求:RS 上要配置 VIP。
- NAT:lVS 对请求数据包,修改 DstIP,对响应的数据包,修改 SrcIP。
- FULLNAT:LVS 对请求数据包,修改 SrcIP 和 DstIP,对响应数据包,修改 SrcIP 和 DstIP,这样,返回流量不经过 LVS。
文档:
LVS 十种调度算法
- 轮询、加权轮询
- 最少连接、加权最少连接、基于局部性的最少连接、带复制的基于局部性的最少连接
- 目标地址散列调度算法、源地址散列调度算法
- 最短延迟调度
- 最少队列调度
LVS负载均衡——LVS简介、四种工作模式、十种调度算法、流量转发过程
keepalived脑裂
脑裂问题是分布式系统的共性问题,出现这个情况的原因,就是网络问题,导致集群被分成了两个或多个。
keepalived一般解决就是:
- 加仲裁者、心跳检测。
- 运行一个检查脚本,持续监测网关连通性,不通则关闭本机keepalived。并发送报警
CDN
https://cloud.tencent.com/developer/article/1779335
理解
CDN 最重要的用途:为了加速网站的访问(就近访问)。
在用户和服务器之间增加缓存层,缓存层的节点分布在不同的地点,将用户的访问请求引导到最优的缓存节点而不是服务器源站点,从而加速访问速度。
CDN 主要功能是在不同的地点缓存内容,通过负载均衡技术,将用户的请求定向到最合适的缓存服务器上去获取内容。
CDN 的加速资源是跟域名绑定的。
场景
1、网站站点/应用加速(静态资源)
2、视音频点播/大文件下载分发加速
3、视频直播加速
4、移动应用加速
代理服务器
应用层(HTTP,FTP)代理服务器:
squid:磁盘缓存(企业版一般用它)
varnish:内存缓存
传输层(TCP)代理服务器:
- sock5
docker 代理服务器:
- https://github.com/dqzboy/Docker-Proxy
中间件
中间件这个概念,主要侧重用途。
如果一个软件,他的主要用途是让不同的应用交换数据,或者作为分布式系统中的数据交换工具。
当以数据交换这个角色来讨论时,它就是中间件。
比如:
mysql 如果是作为不同应用的数据共享层,那他就是中间件。
mysql 如果只是后端服务的一部分,用来存储、检索数据,那就不是中间件。
Linux 软硬链接
软链接:相当于源文件的快捷方式。软链接文件的 inode 和源文件的 inode 不同,可以跨分区,删除源文件,软链接文件不可用。
硬链接:相当于源文件的另一个入口。硬链接文件的 inode 和源文件的 inode 相同,不可以跨分区,删除源文件,硬链接文件依然可用。
- 硬链接不能跨文件系统,也不能对目录做硬链接
Linux中,一切皆文件
网站慢,定位
大方向上来看,网站慢,有三个方向的问题:(来回)请求慢、(服务端)执行慢、(本地)加载慢。
请求慢:
dns 解析慢:ping
线路连接慢:traceroute
执行慢:
- 服务器瓶颈:cpu, mem, disk io, net io。
- 程序 bug:日志分析,哪一步慢
数据库:
- 内网连接串
- 数据库性能瓶颈
死锁、慢 sql:show processlist;
- 死锁:开发一起看
- 慢 sql:索引,sql 优化
加载慢:
F12 看:
大文件:
- 提高带宽、cdn 加速、压缩文件、减少 http 请求、异步加载、静态资源使用独立域名,减少 cookie 传输
- 外部链接:谷歌字体这些
- 404 资源:需要清除调用
https://zhuanlan.zhihu.com/p/101620459
机器卡,定位
找到有问题的进程
cpu: top, pidstat, perf,找到有问题的进程
- 过载
- 空闲
- mem: free, sar,缓冲区是否持续变化,进程正在运行中,缓冲区分析工具来寻找进程
- disk: iostat/sar, pidstat,找到有问题的进程
- net: netstat, ifconfig, ss 查看发包
常见命令:
- cpu: top, htop
- mem: free
- net: ifconfig, netstat, iftop, ss, tcpdump
- disk: iostat, iotop
- other: vmstat, sar
文档:
- 性能之巅:定位和优化程序 CPU、内存、IO 瓶颈
- cpu: 性能:如何迅速分析出系统 CPU 的瓶颈在哪⾥
- mem: 性能:如何快速找出系统内存瓶颈
- disk: 基础:如何迅速分析出系统 IO 的瓶颈在哪里
- net: 性能:网络数据传输慢,问题到底出在哪里了?
cpu 相关的问题
cpu 低,负载高:
- 负载说的是 cpu 任务队列,负载高,说明队列里面的任务多,但是 cpu 却不高。
- 一般的可能是:(磁盘/网络/swap)I/O 耗时、内存 swap 交换频繁、大量进程/线程切换 cpu、僵尸进程
cpu 高:
找到有问题的代码:java
- top:找到进程 id
- top -Hp:找到线程 id
- jstack 打印进程堆栈,grep 线程的堆栈信息,就能找到问题代码
找有问题的代码:python
cpu 占用高,top 找不到:
- 被攻击,top、ps 等系统命令被修改
- stat 命令查看 top, ps
linux 系统常见优化方案
硬件、os、应用
os:
- 文件系统、内存、网络、内核
- /etc/sysctl.conf
- /etc/security/limits.conf
应用:
- 监控(指标、日志)
- 构建卓越:高性能服务器架构设计与优化的全方位探索
- Linux 内核的参数优化(尽量详细的总结)
- Linux 性能调优之网络内核参数优化
服务性能优化思路
前后端代码
性能问题的识别、循环优化、算法优化、减少函数调用、内存管理、并发和多线程、代码重构、避免不必要的计算、编译器优化、性能测试
服务端
缓存
缓存(时间/频率淘汰算法)、
缓存的类型:
- 内存缓存:Memcached
- 分布式缓存:Redis
- CDN 缓存
- 浏览器缓存
缓存的三大经典问题:
- 缓存穿透
- 缓存击穿
- 缓存雪崩
异步
- 异步队列:RabbitMQ, Kafka
- 作用:异步任务、应对流量激增、分布式系统数据一致性、异常重试
- 页面调 10 个上游接口,如何做高并发?
数据库
- 索引、复合索引(复合索引的使用遵循“最左前缀”原则,即查询条件必须从索引的最左列开始,并且不能跳过中间的列。)
- 查询优化:join 替代子查询,select 指定的字段
- 热读数据缓存
- 数据库参数
- 数据库缓冲区
- 分库分表(一千万的记录不用分)
- 读写分离:读库、写库;负载均衡
- 定期索引重建
- 批量执行语句
过载保护
- 资源隔离:关键资源与非关键资源隔离,减少影响
- 动态扩缩容:
- 限流:限制请求、任务进入/执行数量。
- 熔断:下游服务异常时,快速返回,防止异常蔓延
- 降级:系统压力过大时,降低非关键服务的质量。
度量与监控
度量指标定义
Prometheus, Grafana, alertmanager
elk(k 报警)
文档
- 大厂性能优化的 10 大顶级方案 (万字图文史上最全)
- DDD(Domain-Driven Design,领域驱动设计)是一种软件开发方法,也是一种思想,它强调软件系统设计应该以问题领域为中心,而不是技术实现为主导。
- 什么是业务中台、数据中台、技术中台?这回终于解释清楚了
- ES8 生产实践——ELK 监控与告警(Kibana)
硬件
disk, mem, cpu, nic, gpu
客户端
- 浏览器访问优化:减少请求、利用缓存、压缩
- CDN
- 反向代理也可以做一部分缓存
web 组件分离:
- 不同域名资源并行下载
- 静态资源使用独立域名,减少 cookie 传输
微服务架构
- 一个常见的系统:前端 - 展示 - 流量接入层 - 服务层 - 中间件层 - 数据库 - 基础设施
- 简单分为:接入层 - 服务层 - 持久层
- 常见的微服务组件:服务注册、服务发现、负载均衡、服务网关、配置中心、支撑平台、集成框架、分布式事务、调用链、API 管理。
支撑平台:
- 重要性:系统微服务化后,系统将变得碎片化,系统的部署、运维、监控都将比单体应用复杂程度几何倍数上涨,那么,就需要将大量的工作自动化,CI/CD,灰度发布、健康检查、性能监控等等。可以这么说,支撑平台技术不足,就不要使用微服务架构。
- 服务网格,无入侵的服务治理
- 容器化与编排
大型中台化架构:
- 中台不是从零开始,而是需求驱动,公司一定是已经积累了行业内很多场景的业务和技术能力,只不过因为要解决系统重复建设、能力复用性低,开始建设中台,服务业务与技术。
- 但是不要觉得业务量一上来,立马就要建设中台,现在云平台的支撑能力已经很高了,抗住 1w 的 qps 不成问题。
mysql 相关
程序怎么读写分离
总的来说,就是在配置数据库连接串那里,有的是master/slave,有的是write/read,指向不同的读写数据库即可。
Python项目实战 10.2:性能优化:MySQL读写分离 SpringBoot实现MySQL读写分离
mysql 分库分表分区分片
io 瓶颈:
- 磁盘读 io 瓶颈:读的热点数据太多,数据库缓存放不下,每次查询都会有大量 io
- 网络 io 瓶颈:请求的数据太多,网络带宽/数据库连接不够
cpu 瓶颈:
- sql 本身要优化
- 查询数据量大
分库(提高数据库本身的瓶颈)
- 就是垂直切分,按逻辑将表存在不同的库中
分表(侧重提高并发性能):
应用层面(一般指这个)
- 垂直拆分:分字段
- 水平拆分:分记录
代理层面:通过代理 merge 引擎,将表分成若干子表,对应用保留一个“表壳”。
分区(提高读写性能):
- 将一张表分散存储在不同物理块中。
分片(能不用就不用)
- 相当于分库+分表
doc:
- 一篇文章搞懂 MySQL 的分库分表
- MySQL 的分片(二)——MySQL 分片
- (二十三)MySQL 分表篇:该如何将月增上亿条数据的单表处理方案优雅落地?
- 分布式数据库中间件:大厂原来都这么对 MySQL 分库分表!(上)
- 分布式多租户数据库:Django-Multitenant,分布式多租户数据库项目实战
慢 sql 怎么处理
慢 sql,就是指执行时间较长的 sql 操作。
导致慢 sql 的原因:
- 缺乏索引
- 数据量大
- 查询条件不当:where/子查询/join 不对
- 锁等待
- 硬件资源不足
- 设计不合理
怎么处理:
- 增加索引、定期重建索引
- 分库分表、定期清理无用数据
- 优化查询
- show processlist, explain(django 这些不常用)
- 升级硬件资源
文档:
主从同步方案
binlog+position
- 异步复制(主库事务不等待一个从库成功)
半同步复制(主库事务只等待一个从库成功)
- 5.7.2 有一个幻读问题
- 5.7.2 之后增加一个参数,主库事务等待成功返回,主库再提交。
- 全同步复制(主库事务需要等待所有从库成功)
GTID(Global Transaction Identifier):
- 是 MySQL 5.6 及以后版本中引入的一个关键特性,以事务为单位管理复制,不再需要靠 log_file 和 log_pos 来定位复制位置,在主从切换、故障恢复时更加简单。
- GTID 实际上是构建在 binlog 之上的一个增强功能,它利用 binlog 来记录事务,并提供全局事务的唯一标识,从而实现更高效和安全的复制管理。
- 基于 GTID 搭建主从 MySQL
MHA(Master High Availability)
- 目的在于维持 Master 主库的高可用性。
- 目前 MHA 主要支持一主多从的架构,要搭建 MHA,要求一个复制集群中必须最少有三台数据库服务器
- 侧重点在切换,需要自行准备 vip 切换等工具、脚本
- MySQL 高可用方案–MHA 原理
MGR(MySQL Group Relication)
- mysql 官方的高可用、强一致、vip 切换
可以考虑:
- MGR+单主+异地 slave
文档:
mysql 怎么不停机迁移
方法一:代码修改:双写双读
- 挂从库
- 修改写入代码:双写
- 新老库迁移
- 数据追平校验
- 修改读取代码:双读
- 灰度只读新库
- 关闭老库写入
- 去掉无用的双读、双写代码
方法二:代码修改:双读(不用双写)
- 挂从库
- 开启数据同步:DataX, DBSyncer, canal, databus 等工具实现数据迁移
- 数据追平校验
- 修改读取代码:双读
- 灰度只读新库
- 代码只写新库
- 关闭数据同步
- 去掉无用的双读代码
文档:
mysql 集群故障转移
故障自动转移:
- MHA自动:
- 对比binlog最大的,作为主。
- 修改其他slave,change它们的master
- 手动:
- 停止新master的slave
- 重置reset新master的slave。
- 目的:以后再作为主的时候,可以开始全新的同步过程
- reset后,主库会重新计算master-slave之间的binlog/gtid的差集
旧master恢复后:
- 配置成为新master的slave,change master to xxx;
- start slave
- show slave status。目的:确保slave_io, slave_sql都running
- set global read_only=1。目的:slave数据库只读。
MySQL案例:MHA实现主备切换(主从架构)万字详解 MySQL MHA详细搭建过程 记一次 MySQL 主从同步异常的排查记录,百转千回!
分布式数据库
分布式数据库,不同于主从复制,分库分表等方法实现的“伪分布式”。 它是真正的你不用关心表、库的存储,只需要关注横向扩展的数据库即可。
常见 web 攻击
ddos 攻击:主要针对 ip,影响整个网络。通过大量,分布,持续的请求,淹没正常请求,或者耗尽服务器资源(cpu, mem, net)。
cc 攻击:主要针对网站页面,影响 web 服务。通过模拟真实用户,攻击那些需要大量计算资源来处理的页面。
waf:
根据 ip、url,来进行允许、拒绝。
黑白名单、区域封禁、规则防护
docker 相关
docker 安全隐患
最主要的就是特权模式、非官方镜像。
docker 网络模式
默认 bridge,微服务用 overlay。
其他:host, none, container
time_wait、close_wait 过多怎么处理
time_wait:
原因:
- 出现在“客户端”角色的服务器上。但是在 web 服务器上,HTTP 协议基于 TCP 协议,关闭 TCP 连接的是 Server 端,所以 web 服务器上就会出现很多 time_wait。
- 要么是对方没有返回,要么是自己没有重用。
解决:
- 修改内核参数,服务器能够快速回收和重用那些 TIME_WAIT 的资源。
- 负载均衡,增加服务能力,提高服务器个数。
文档:
close_wait:
原因:
- 对方关闭了链接,自己没有关闭。
- 这种就是服务本身的问题,服务器对于程序抢占的资源,没有主动回收的权利,除非终止服务运行。
tmpfs 是什么
拿出一部分内存空间,来存储文件。它的 io 速度会远大于磁盘 io。
但是重启会被清空。
文档:
虚拟化工具
windows:
- VMware Workstation Player
- VirtualBox
- QEMU
- Proxmox VE
- Hyper-V
- Parallels
- Gnome Boxes
- Red Hat Virtualization
- Boot Camp
Linux
- OpenVZ
- KVM
- Xen
- oVirt
集群
- openstack: [云计算]OpenStack 这一篇就够了!
标准作业程序 SOP(Standard Operate Procedure)
标准作业程序,将某一事件的标准操作步骤以统一的格式描述出来,用于指导和规范日常工作。
rabbitmq, rocketmq, kafka, pulsar
- 吞吐量在十万以下:rabbitmq
- 吞吐量在十万~百万:rocketmq
- 吞吐量在百万级以上:kafka、pulsar
2024 消息队列“四大天王”:Rabbit、Rocket、Kafka、Pulsar 巅峰对决
混沌工程
在高可用系统中,注入各种各样的 “哦,原来这也能出现的”错误。
从成本上考虑,我们不需要模拟所有的故障,进需要考虑那些经常发生的故障。
混沌工程(Chaos Engineering) 到底是什么?
无线带宽 InfiniBand (IB)
是一种高带宽、低延迟,涉及到多种技术与硬件。
IB 交换机、IB 网卡。
万兆,4 万兆,6 万兆,十万兆。
RDMA over Converged Ethernet (RoCE)
监控
使用过的
文件监控:ELK、EFK 资源监控:各种exporter,prometheus, alertmanager
其他监控
- 夜莺监控( Nightingale ):是一款国产、开源云原生监控分析系统。
- Nagios:一款网络监控软件
大数据相关
ClickHouse
ClickHouse是一种OLAP类型的列式数据库管理系统,这里有两个概念:OLAP、列式数据库。
airflow
Airflow 更适合于数据处理任务,如 ETL(提取、转换、加载)流程。
weblogic/websphere
几种常见 web 容器比较 (tomcat、 jboss 、resin、 weblogic、 websphere、 glassfish)
高性能计算 HPC:slurm、LSF、PBS
在高性能计算(HPC)领域有着广泛的应用,如科学计算、工程分析、数据分析等
在高性能计算(HPC)领域,Slurm 被广泛用于管理集群资源和调度作业。
与其他作业调度系统(如 IBM 的 LSF 和 PBS)相比,Slurm 的一个显著特点是它不需要修改操作系统内核,使其更易于集成和使用。
eBPF(extended Berkeley Packet Filter)
eBPF 相对于 Linux Kernel,相当于 JavaScript 相对于 HTML。
增加了 Linux Kernel 的可编程性
MLOps、DataOps、AIOps、LLMOps
关系:
- DataOps 是 MLOps 的延伸。
DataOps/MLOps/LLMOps/GenAIOps/RAGOps/…:
- 是 Ops 在 Data/ML/LLM 领域的应用,主体是 Data/ML/LLM。
- 管理各自生命周期的工具、最佳实践。
- AIOps 是 AI 在 Ops 领域的应用,主体是 Ops。
MLOps:
- 数据自动化准备
- 模型自动化训练、迭代
- 模型自动化部署、监控
LLMOps
- 选择基础模型
- 适配下游任务:提示工程、微调、外部数据
- 评估
- 部署和监控
1 张表看懂 MLOps 与 DataOps、AIOps 的区别
内存相关
OOM机制
根据每个进程的内存、RSS、swap、页表占用内存进行打分,kill掉得分最高的。
实时所有进程的oom_score得分可以通过运行命令/脚本来获取到。
Linux kernel OOM机制详解 Linux OOM Killer机制 以及防止被OOM Killer杀死的方法
Nginx相关
nginx用来做什么
- 反向代理
- L7负载均衡
nginx优势
- 快
- 配置简单
- 内存消耗低
- 单机10万以上并发连接
- 热部署
- 免费开源
nginx怎么实现高并发的
多进程 + 异步非阻塞
master进程,通过fork()接受和处理请求; 每一个请求,会通过fork()拉起一个worker进程来进行处理; 通常一个请求不会立马完成,所以worker进程在遇到io等待的时候,就回去处理其他请求。 当IO返回时,通知worker进程,worker进程挂起正在处理的事务,来响应客户端请求。
所以几个进程,就可以处理很多并发。
一般worker数量,与cpu核数一致。
什么是C10K问题
Concurrent 10000 connection,并发10k连接
nginx性能瓶颈怎么办
1, 同个域名多个指向 2,双层nginx 3,CDN,DNS服务上进行。如:就近接入、DNS智能解析
反向代理和正向代理是什么意思
- 正向代理:客户端安装的代理,用来将发出的不同请求发向不同服务器
- 反向代理,服务端安装的代理,用来将收到的不同请求法相不同服务器
upstream是什么
就是服务端的池子,所有的状态检查、调度策略都在池子中配置。
4种调度策略是什么
- 轮询(RoundRobin):默认
- 最少连接(least_conn)
- ip哈希(ip_hash)
- 权重(weight)
注:调度策略,写在upstream中
nginx为什么不使用多线程
多线程,会涉及到锁的问题,nginx是一个无状态的服务器,使用多进程,降低线程锁的性能消耗。
动静分离
一个网站,需要后端处理的文件就是动态文件,不需要后端处理的文件就是静态文件(html,css,js)。
nginx动静分离,就是在nginx转发规则,配置静态文件后缀指向A服务器,动态文件/请求指向B服务器。
其实就相当于前后端分离。这样做好处就是提高速度。
nginx/tomcat/apache有什么区别
- tomcat本质是servlet/jsp应用的容器,可以处理动态页面;
- apache/nginx本质是http服务器,本身不支持动态页面,但可以通过模块来支持。
- 一般tomcat动静分离、负载均衡的实现,前面要加一层nginx
nginx | apache |
---|---|
多进程、异步、非阻塞 | 多进程、同步、阻塞(高并发拒绝连接) |
nginx怎么处理http请求的
7个步骤,11个阶段
详情见这里
nginx惊群效应
worker会fork所有监听的端口,当端口有连接时,所有worker都会被“惊”醒,来处理这个连接,只有一个争抢到了锁,开始工作,其他的又开始等待。
在创建资源前增加锁,拿到锁再创建资源。
nginx 支持的 io 并发模型
这个涉及到不同操作平台的io实现不同,nginx自动根据当前平台选择模型。 也可以 use 显式指定。
常见的:
- epoll: linux 2.6+内核
- select:
location匹配优先级
精准匹配 开头匹配:^~ 正则匹配 通用:/
nginx全局变量
$host, $hostname, $cookie_name, …
nginx gzip压缩
一般而言,只对html, css, js, xml这些文件进行压缩。 其他的图片、视频一般不压缩,耗性能,而且基本没有效果
Nginx性能优化功能- Gzip压缩(大幅度提高页面加载速度)
nginx可以限制什么
浏览器、爬虫、ip等
nginx 限流
控制速率
- 正常流量:允许一个IP一分钟可以有多少个请求,多余的被拒绝
- 突发流量:允许一个IP一分钟可以突发多少个请求,到突发瓶颈了,就优先处理其他用户的,然后处理你的
控制并发连接数
- 允许一个ip可以建立多少并发连接
- 允许一个nginx 的 虚拟server 可以建立多少并发连接
黑白名单
deny allow
常见优化
- worker_processes:worker数量
- worker_connections: worker可以建立的连接数=worker_processes*1024
- 1024:历史经验,以及ulimit -n一般默认是1024
- gzip压缩
- 静态文件建立缓存
- 配置日志缓冲
- 超时时间优化
常见配置有什么
1
2
3
4
5
6
###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
###nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
### nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
Redis相关
为什么用缓存
- 高性能:将不常变化但是经常访问的数据,放到缓存中,查询时间几毫秒内。
- 高并发:缓存是走内存的,单机缓存并发量轻松几万到几十万。
Redis为什么快
- 基于内存实现读写
- 单线程,避免线程切换带来的cpu上下文切换消耗,多次读写都在同一个cpu上。
- 非阻塞的IO多路复用机制
- Redis的IO多路复用,模型跟nginx的是一样的。只不过nginx是多进程,redis是单线程。
- 复用可以这么理解:复用一个线程处理连接,在有网络IO的时候,挂起去处理其他的连接,当IO结束后,挂起其他任务,处理客户端相应。这样就可以达到一个线程处理多个连接了。
Redis单线程还是多线程
Redis4.0之前,所有处理都是单线程。所以再删除大key时候还是会卡顿。
4.0开始,引入了多线程,主要用于异步删除。 6/7引入了多线程的读写,增加了吞吐量,但是命令的执行,还是主线程串行执行的
【Redis】高级篇: 一篇文章讲清楚Redis的单线程和多线程
Redis 为什么要用单线程
1,多线程的目的是最大化cpu利用率,但是redis是基于内存操作的,所以cpu不是瓶颈。 2,单线程也不用处理多线程的锁机制、资源竞争机制等。
redis 和 memcached 区别
没怎么研究过,主要就是 redis 了。
- redis支持的数据类型多
- redis支持发布/订阅、异步队列、分布式锁这些功能。
- redis原生支持cluster模式,memcached集群模式需要客户端写到不用分片上
redis的数据类型
string | 最简单的key-value缓存,存储/修改,都是整体的。 | set, get操作 | 最常用,存对外的字典信息之类的 |
hash | string存储的对象是一个整体,读整体方便,修改局部不方便。 于是有了hash,可以获取整体/局部、修改局部 | hset, hget操作 | 比如:用户购物车商品数量的加减,设计成hash,更新读取就很方便 |
list | 有顺序的双向链表,一般用于有(时间)顺序的存储 | lpush, lset, lrange等操作 | 比如:粉丝列表(按时间倒序显示) |
set | 无序集合,一般用于交并差的场景 | sadd, smembers 等操作 | 比如:PV, UV等 |
zset | 有序集合,一般用于计数器、排名等场景 | zadd, zrange等操作 | 比如:热点Top10等 |
如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。 如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。
Redis的2种过期策略、内存淘汰机制
定期(随机)删除 + 惰性删除
- 定期删除:redis默认每过100ms,随机抽取一些设置了过期时间的key,检查其是否过期,过期则删除。
- 惰性删除:在获取某个key时,redis会先检查这个key是否过期,如果过期则删除,且不返回任何东西。
为什么要这样,因为redis中有几十万个key,如果维护定时器,对cpu的消耗是巨大的,cpu要用来处理请求。
但是虽然有上面两个策略,依然会有很多已经过期的key存在。当redis使用越来越久,内存占用到达上限,就会触发内存淘汰机制。
redis有8种内存淘汰机制。最常用的就是allkeys-lru,即淘汰掉最久未使用的key。
Redis 事务
Redis事务就是一组命令的集合。要么执行成功,要么执行失败。而且由于Redis是单线程执行命令的,所以不会有冲突。 但是不支持回滚。
事务主要通过:
- MULTI:事务开始。从此行开始,是事务内容。
- EXEC:事务结束。
- EXEC结束后,才会提交,返回OK。或错误。
- EXEC之前,事务内语句执行,将会返回QUEUED,代表已存储到队列中
- WATCH:后跟key名,从WATCH开始,到EXEC开始前,如果key被改变,则事务不会执行
- UNWATCH:取消监视key。
- DISCARD:取消事务
事务的过程:
- 开启MULTI
- 入队QUEUED
- 执行EXEC
- 取消DISCARD
redis 很多key查询
1亿个key,10w个key前缀一样,怎么找出它们。
keys xx:但是这个会阻塞redis,因为redis是单线程的 scan 0 match xx: scan不会阻塞,但是scan是增量的,需要迭代
redis很多key同一时间过期要注意什么
可能会卡顿,可以给过期时间适当增加一个随机值,使其分散。
redis 持久化
持久化方案
三种:rdb全量,aof增量,混合持久化(4.0)。
rdb全量:
- 说明:
- 相当于数据的备份,恢复快。
- save:同步,阻塞主线程,redis无法提供服务。
- bgsave:异步保存,不阻塞主线程
- 配置文件:save,自动bgsave。
- 配置:指定X秒内,变化的次数超过Y次,则触发BGSAVE备份
- 优势:
- 备份、恢复快
- 劣势:
- 更低的数据安全性(持久性)
aof增量:
- 说明:
- 相当于命令的记录,恢复慢。
- 只记录修改命令。
- 记录三种类型:
- always:每有1条命令修改,就记录
- everysec:每1秒记录1次。(默认)
- no:操作系统决定,缓冲区满后记录。
- 优势:
- 更高的数据安全性(持久性)
- 劣势:
- 文件比rdb大
- 备份、恢复效率比rbd低
混合持久化:
- 生成的备份文件还是一个aof文件,但是里面包含了rdb全量备份数据、aof增量备份数据。
- 这样综合了两者的优缺点。
- 缺点:rdb的数据会存储为aof文件的格式,易读性较差
数据恢复过程
- 把备份的rdb文件/aof文件拷贝到数据目录下,然后检查配置一致,就可以启动redis server了
- 只配置了aof,重启时:
- aof存在:加载aof
- aof不存在:报错
- 配置了aof和rdb,重启时:
- aof存在:加载aof
- aof不存在,rdb存在:加载rdb
- aof不存在,rdb不存在:报错
- 只配置了rdb,重启时:
- rdb存在:加载rdb
- rdb不存在:启动一个空的数据库
aof重写
aof文件是记录修改命令的,修改命令可能会有重复修改同一个key。 重写,就是重新生成aof文件,这样就会只保留最新的修改,给aof文件减负,但是结果是幂等的。 重写期间,服务器不会被阻塞。 但是有一个参数:no-appendfsync-on-rewrite。表示重写期间,是否进行aof写入操作。
- 如果为yes,重写期间的aof日志,会放到缓冲区,等待重写完成后,再进行aof缓冲区写入,会有数据丢失风险
- 如果为no,重写期间依然要写入aof日志,则主线程会阻塞。 重写完毕后:会告诉主线程,让主线程将缓冲区的数据写入aof文件,改名操作。 这个操作,是会阻塞主线程的。
所以,折中的操作:
- 关闭自动重写。auto-aof-rewrite-percentage
- 在业务低谷编写脚本进行定时重写。
- 至于no-appendfsync-on-rewrite,可以设置为no,因为已经在业务低谷了。
- 当然也可以设置为yes,不过就需要关注重写缓冲区的大小配置了。
redis集群
redis集群搭建
redis集群有三种模式: 1,主从复制
- 主从复制就是主节点负责写,从节点负责读。
- 主要就是数据冗余 + 读写分离。
- 但是写都是主节点来做,还是受到单节点性能限制。
主从同步的过程:
- 先看是否要全量同步
- 如果为第一次同步,则进行全量同步
- 或者距离上次同步的时间过长,主节点复制缓冲区没有完整保持中断期间的写命令,则进行全量同步
- 如果需要全量同步,则进行全量同步
- 主节点bgsave保存rdb文件,传给从节点
- 从节点接收到之后,清除自己的旧数据,使用新rdb数据加载内存
- 将复制缓冲区中的所有写命令发给从节点执行并计入aof文件(若为aof备份)
2,哨兵模式
- 哨兵模式就是在主从复制模式的基础上增加了自动故障转移。
- 哨兵模式,就是增加哨兵来监控redis主从复制集群,当主节点不可用,自动选举出来一个从节点,作为新的主节点。
- 理论上,1个哨兵节点就能完成主从切换,但是,考虑到可用性,比如1个哨兵节点所在物理机宕机。
所以,一般哨兵模式的集群是3台。1主2从,同时3个都是哨兵。
- 哨兵模式客户端配置
- 有一个参数,REPLICA_PREFERRED,代表优先从从节点读取数据
- 哨兵模式的故障转移
- 旧主节点宕机
- 1个哨兵ping不通,则认为节点“主观下线”,当大多数节点(majority)都ping不同,则认为节点“客观下线”
- 选举1个哨兵来进行故障转移
- 从其他节点选择一个节点,提升为master节点。更新其他从节点,修改master指向
- 新集群正常工作
- 旧主节点开机
- 哨兵们发现旧主节点,自动将其降级为slave节点
- 旧主节点成为slave节点,从新主节点同步数据
- 哨兵模式 + keepalived实现自动故障转移与恢复
- 哨兵模式正常配置
- keepalived,三个节点都设置为slave,优先级都是100.
- 然后编写检测脚本,如果当前node的redis是role:master,优先级+10
- 关闭nopreempt(即关闭抢占模式),让根据优先级来配置vip。
Redis Sentinel 模式最少几个Sentinel节点 Redis哨兵+keepalived高可用实战
3,cluster
- 真正的分布式架构,支持数据分片、负载均衡、自动故障转移等。
redis集群伸缩
cluster模式,暂无更深研究
redis 半同步复制
- 有2个参数,
- 控制一个master的一个写操作要成功,最少要有几个从节点写成功后才可以。min-replicas-to-write
- 控制主从复制延迟超时时长。min-slaves-max-lag
redis 脑裂
脑裂问题导致的原因都是一样的:
- 因为集群网络问题,导致集群被分成2个或多个,从而产生2个或多个主节点
redis解决脑裂:
- 有2个参数,
- 控制一个master的一个写操作要成功,最少要有几个从节点写成功后才可以。min-replicas-to-write
- 写不成功,这个主就不可用
- 控制主从复制延迟超时时长。min-slaves-max-lag
- 控制一个master的一个写操作要成功,最少要有几个从节点写成功后才可以。min-replicas-to-write
缓存穿透
是什么
缓存穿透,就是访问的数据在缓存没有,在后端存储中也没有(也就不会缓存)。
场景:
- 黑客攻击,访问一堆id=-1的用户,这样子每个请求都会到后端,但都查不到
- 自身代码错误
相当于每次请求都“绕过”缓存,直到数据库,把数据库“打死”。
如果发生了大量存储层空命中,存储负载增大,可能就是缓存穿透。
解决方案
- 对空值的key也缓存
- 维护一个允许列表
- 增加监控报警
缓存击穿
是什么
一个访问量特别大的key,当它过期的时刻,大量的请求直接对到后端数据库,相当于缓存的屏障被击穿了
解决方案
- 数据预热
- 定期预热
- 加锁更新(缓存中没有,则在缓存中加锁,数据库里面更新完了再解锁,这样子其他请求就能走缓存)
- 永不过期
- 实时监控调整(过期时间)
缓存雪崩
是什么
大规模缓存失效,比如缓存服务器宕机,大量key到期,导致巨量请求直接打到后端数据库,DB无响应,整个系统崩溃.
解决方案
- 缓存高可用
- 服务熔断或降级:这个需要引入熔断、降级组件。如springcloud中的hystrix。
- key过期时间:均匀过期、随机过期、永不过期
缓存和数据库的读写一致性怎么保证
读:
- 先读缓存,
- 缓存没有,就读数据库,
- 读完之后,放入缓存,返回响应
写
- 先删除缓存
- 为什么要删除缓存,而不是更新缓存?
- 因为缓存读的频率不一定比更新频率高,会造成计算浪费
- 如果缓存的计算逻辑复杂,但是使用频率低,会造成计算浪费
- 所以可以使用lazy策略,需要的时候,再更新缓存。
- 这个需要的时候,可能是每天定时一次,可能是业务允许第一次慢
- 为什么先删除缓存?
- 避免更新完数据库,删除缓存失败,这样读到的数据就都是旧的
- 不一定要先删缓存,可以增加重试、告警机制
- 为什么要删除缓存,而不是更新缓存?
- 再写数据库
缓存降级
就是当redis缓存的可用性不足时,对非核心服务进行降级。 比如:
- 部分服务不用缓存,直接返回默认值
- 部分非核心服务不支持访问
- 添加购物车可用,但是暂不支持修改收货地址
redis 异步队列
一般有三种方法:
- list:lpush生产,lpop消费,blpop阻塞消费
- celery用redis作为后端代理,来处理定时任务时,就用的是list。
- celery定时任务,是beat在指定时间把任务扔进list。
- pub/sub消费订阅模式:可以一次生产,多次消费。
- 缺点:不会持久化到rds或aof中,当redis宕机,或者消费者下线,生产的消息就会丢失。
- 所以场景要求高的话,就用rabbitmq, rocketmq, kafka/pulsar
- zset实现延迟队列:
- 延迟队列:需要延迟工作的场景,过一段时间再执行的任务
- 可以将时间戳存成score,zadd存入,zrangebyscore获取指定时间戳内的数据
- redis streams(5.0后引入)
- 未深入研究
Celery 图解 Celery + Redis交互过程探究 celery 查看redis队列 Redis 有序集合(sorted set) Redis实现消息队列
redis 分布式锁
1,setnx抢锁,抢到后加expire防止忘释放 2,set命令有参数,可以把抢锁和expire合成一条指令。可能会被误释放 3,特别追求一致性,就用zookeeper
Redis实现分布式锁的7种方案,及正确使用姿势! Redis分布式锁-这一篇全了解
redis优化做过什么
- 不用swap。vm.swappiness,
- 内存淘汰:maxmemory + maxmemory-policy(lru最近最少使用).
- 备份:4.0的混合持久化
- pipeline多命令批量操作(不是运维上的)
Redis性能调优策略 Redis性能优化:全网最全的一篇 Redis性能优化的18招
BigKey
BigKey:
- 一个STRING类型的Key,它的值为5MB(数据过大)
- 一个LIST类型的Key,它的列表数量为20000个(列表数量过多)
- 一个ZSET类型的Key,它的成员数量为10000个(成员数量过多)
- 一个HASH格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)
危害:
- 会导致oom
- 严重的可能导致主从复制失败
监控发现:
- redis-cli xx –bigkeys
- 开源工具扫描rdb文件,redis-rdb-tools
处理:
- 主要就是分拆
一文详解 Redis 中 BigKey、HotKey 的发现与处理
HotKey
HotKey:
- 访问次数显著超过其他key
危害:
- 缓存击穿(主要为hotkey失效导致)
- 可能到达网络瓶颈
监控发现:
- redis-cli xx –hotkeys
- monitor命令,结合开源工具分析redis-faina
处理:
- 分拆key
- 多级缓存
- cluser模式,数据分片存储(适用于多key hot)
[技术分享 | Redis Hotkey?三招定位、五招解决](https://cloud.tencent.com/developer/article/2360939) |
网络相关
证书
- 红帽认证工程师(RHCE),作为 Linux 操作进阶,侧重点在于掌握自动化批量化服务器管理,重点介绍自动化工具 Ansible 操作,包括 Ansible 介绍、Ansible 架构、Ansible 模块和命令、Ansible 剧本编写、Ansible 变量循环判断等等。
- HCNP(Huawei Certified Network Professional),是华为网络认证的中级级别。
- HCIP(Huawei Certified ICT Professional),是华为认证体系中的高级认证。
H3CSE(H3CSE-Security 认证(安全技术高级工程师))是 H3C 推出的网络安全高级工程师认证,主要定位在从事信息安全产品安装、调试、运行、维护人员。涵盖当今网络安全领域三大热门技术:防火墙,VPN 和 IPS。
- ISF(Implementing Secure Firewalls,部署安全防火墙系统)
- BSVPN(Building Secure Virtual Private Networks,构建安全 VPN 网络)
- AIPSC(Advanced Intrusion Prevention System Configuration & Security Audit,入侵防御系统与安全审计)
- H3CSE Ruting & Switching(H3C Certified Senior Engineer for Routing & Switching,H3C 认证路由交换网络高级工程师)证书可以证明其持有者掌握了包括路由、交换、组播、VPN、QoS、基本安全特性等部署园区网络所需的全方位的理论知识和操作技能,可以胜任大中型复杂网络的建设和管理工作。
- H3C 认证体系