Post

【面试】01 运维

【面试】01 运维

现在给你 300 台服务器,你怎么对他们进行管理

  1. 记录管理:cmdb,以后的报表

  2. 统一认证:ldap

  3. 跳板机:非直连,安全

  4. 批量管理工具: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 相关的问题

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 cpu 飙高原因排查(有手就行)

Linux 系统 CPU 使用率和负载高排查方法

linux 系统常见优化方案

硬件、os、应用

服务性能优化思路

前后端代码

性能问题的识别、循环优化、算法优化、减少函数调用、内存管理、并发和多线程、代码重构、避免不必要的计算、编译器优化、性能测试

服务端

缓存

缓存(时间/频率淘汰算法)、

  • 缓存的类型:

    • 内存缓存:Memcached
    • 分布式缓存:Redis
    • CDN 缓存
    • 浏览器缓存
  • 缓存的三大经典问题:

    • 缓存穿透
    • 缓存击穿
    • 缓存雪崩

异步

数据库

  • 索引、复合索引(复合索引的使用遵循“最左前缀”原则,即查询条件必须从索引的最左列开始,并且不能跳过中间的列。)
  • 查询优化:join 替代子查询,select 指定的字段
  • 热读数据缓存
  • 数据库参数
  • 数据库缓冲区
  • 分库分表(一千万的记录不用分)
  • 读写分离:读库、写库;负载均衡
  • 定期索引重建
  • 批量执行语句

过载保护

  • 资源隔离:关键资源与非关键资源隔离,减少影响
  • 动态扩缩容:
  • 限流:限制请求、任务进入/执行数量。
  • 熔断:下游服务异常时,快速返回,防止异常蔓延
  • 降级:系统压力过大时,降低非关键服务的质量。

度量与监控

度量指标定义

Prometheus, Grafana, alertmanager

elk(k 报警)

文档

硬件

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:

慢 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 来记录事务,并提供全局事务的唯一标识,从而实现更高效和安全的复制管理。
  • 超详细的 mysql 数据库 GTID 介绍

  • 基于 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

docker 六种网络模式

time_wait、close_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

集群

标准作业程序 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)

Infiniband 技术概述

监控

使用过的

文件监控:ELK、EFK 资源监控:各种exporter,prometheus, alertmanager

其他监控

  • 夜莺监控( Nightingale ):是一款国产、开源云原生监控分析系统。
  • Nagios:一款网络监控软件

夜莺项目介绍

大数据相关

ClickHouse

ClickHouse是一种OLAP类型的列式数据库管理系统,这里有两个概念:OLAP、列式数据库。

airflow

Airflow 更适合于数据处理任务,如 ETL(提取、转换、加载)流程。

如何学习 Airflow:糙快猛的大数据之路

weblogic/websphere

几种常见 web 容器比较 (tomcat、 jboss 、resin、 weblogic、 websphere、 glassfish)

高性能计算 HPC:slurm、LSF、PBS

在高性能计算(HPC)领域有着广泛的应用,如科学计算、工程分析、数据分析等

在高性能计算(HPC)领域,Slurm 被广泛用于管理集群资源和调度作业。

与其他作业调度系统(如 IBM 的 LSF 和 PBS)相比,Slurm 的一个显著特点是它不需要修改操作系统内核,使其更易于集成和使用。

Slurm 作业调度系统的简介及基本使用

eBPF(extended Berkeley Packet Filter)

eBPF 相对于 Linux Kernel,相当于 JavaScript 相对于 HTML。

增加了 Linux Kernel 的可编程性

初识 eBPF(功能、原理、及一些应用)

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 的区别

10 分钟搞懂 LLMOps

内存相关

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智能解析

nginx集群搭建方案(教你如何搭建nginx集群)

反向代理和正向代理是什么意思

  • 正向代理:客户端安装的代理,用来将发出的不同请求发向不同服务器
  • 反向代理,服务端安装的代理,用来将收到的不同请求法相不同服务器

upstream是什么

就是服务端的池子,所有的状态检查、调度策略都在池子中配置。

4种调度策略是什么

  • 轮询(RoundRobin):默认
  • 最少连接(least_conn)
  • ip哈希(ip_hash)
  • 权重(weight)

Nginx服务器之负载均衡策略(6种)

注:调度策略,写在upstream中

nginx为什么不使用多线程

多线程,会涉及到锁的问题,nginx是一个无状态的服务器,使用多进程,降低线程锁的性能消耗。

动静分离

一个网站,需要后端处理的文件就是动态文件,不需要后端处理的文件就是静态文件(html,css,js)。

nginx动静分离,就是在nginx转发规则,配置静态文件后缀指向A服务器,动态文件/请求指向B服务器。

其实就相当于前后端分离。这样做好处就是提高速度。

nginx/tomcat/apache有什么区别

  • tomcat本质是servlet/jsp应用的容器,可以处理动态页面;
  • apache/nginx本质是http服务器,本身不支持动态页面,但可以通过模块来支持。
  • 一般tomcat动静分离、负载均衡的实现,前面要加一层nginx
nginxapache
多进程、异步、非阻塞多进程、同步、阻塞(高并发拒绝连接)

一文看懂Tomcat、Nginx和Apache的区别

nginx怎么处理http请求的

7个步骤,11个阶段

详情见这里

nginx惊群效应

worker会fork所有监听的端口,当端口有连接时,所有worker都会被“惊”醒,来处理这个连接,只有一个争抢到了锁,开始工作,其他的又开始等待。

在创建资源前增加锁,拿到锁再创建资源。

nginx 支持的 io 并发模型

这个涉及到不同操作平台的io实现不同,nginx自动根据当前平台选择模型。 也可以 use 显式指定。

常见的:

  • epoll: linux 2.6+内核
  • select:

location匹配优先级

精准匹配 开头匹配:^~ 正则匹配 通用:/

Nginx location匹配规则及优先级

nginx全局变量

$host, $hostname, $cookie_name, …

nginx 全局变量设置

nginx gzip压缩

一般而言,只对html, css, js, xml这些文件进行压缩。 其他的图片、视频一般不压缩,耗性能,而且基本没有效果

Nginx性能优化功能- Gzip压缩(大幅度提高页面加载速度)

nginx可以限制什么

浏览器、爬虫、ip等

nginx 限流

控制速率

  • 正常流量:允许一个IP一分钟可以有多少个请求,多余的被拒绝
  • 突发流量:允许一个IP一分钟可以突发多少个请求,到突发瓶颈了,就优先处理其他用户的,然后处理你的

控制并发连接数

  • 允许一个ip可以建立多少并发连接
  • 允许一个nginx 的 虚拟server 可以建立多少并发连接

黑白名单

deny allow

Nginx 限流方式

常见优化

  • 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为什么快

  1. 基于内存实现读写
  2. 单线程,避免线程切换带来的cpu上下文切换消耗,多次读写都在同一个cpu上。
  3. 非阻塞的IO多路复用机制
    1. Redis的IO多路复用,模型跟nginx的是一样的。只不过nginx是多进程,redis是单线程。
    2. 复用可以这么理解:复用一个线程处理连接,在有网络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操作最常用,存对外的字典信息之类的
hashstring存储的对象是一个整体,读整体方便,修改局部不方便。
于是有了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五种数据类型应用场景详解(超级详细版)

Redis的2种过期策略、内存淘汰机制

定期(随机)删除 + 惰性删除

  • 定期删除:redis默认每过100ms,随机抽取一些设置了过期时间的key,检查其是否过期,过期则删除。
  • 惰性删除:在获取某个key时,redis会先检查这个key是否过期,如果过期则删除,且不返回任何东西。

为什么要这样,因为redis中有几十万个key,如果维护定时器,对cpu的消耗是巨大的,cpu要用来处理请求。

但是虽然有上面两个策略,依然会有很多已经过期的key存在。当redis使用越来越久,内存占用到达上限,就会触发内存淘汰机制。

redis有8种内存淘汰机制。最常用的就是allkeys-lru,即淘汰掉最久未使用的key。

Redis中Key的过期策略和淘汰机制

Redis 事务

Redis事务就是一组命令的集合。要么执行成功,要么执行失败。而且由于Redis是单线程执行命令的,所以不会有冲突。 但是不支持回滚。

事务主要通过:

  • MULTI:事务开始。从此行开始,是事务内容。
  • EXEC:事务结束。
    • EXEC结束后,才会提交,返回OK。或错误。
    • EXEC之前,事务内语句执行,将会返回QUEUED,代表已存储到队列中
  • WATCH:后跟key名,从WATCH开始,到EXEC开始前,如果key被改变,则事务不会执行
  • UNWATCH:取消监视key。
  • DISCARD:取消事务

事务的过程:

  • 开启MULTI
  • 入队QUEUED
  • 执行EXEC
  • 取消DISCARD

Redis进阶 - 事务:Redis事务详解

redis 很多key查询

1亿个key,10w个key前缀一样,怎么找出它们。

keys xx:但是这个会阻塞redis,因为redis是单线程的 scan 0 match xx: scan不会阻塞,但是scan是增量的,需要迭代

Redis命令之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,主从复制

  • 主从复制就是主节点负责写,从节点负责读。
  • 主要就是数据冗余 + 读写分离。
  • 但是写都是主节点来做,还是受到单节点性能限制。

主从同步的过程:

  1. 先看是否要全量同步
    • 如果为第一次同步,则进行全量同步
    • 或者距离上次同步的时间过长,主节点复制缓冲区没有完整保持中断期间的写命令,则进行全量同步
  2. 如果需要全量同步,则进行全量同步
    • 主节点bgsave保存rdb文件,传给从节点
    • 从节点接收到之后,清除自己的旧数据,使用新rdb数据加载内存
  3. 将复制缓冲区中的所有写命令发给从节点执行并计入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复制

redis 脑裂

脑裂问题导致的原因都是一样的:

  • 因为集群网络问题,导致集群被分成2个或多个,从而产生2个或多个主节点

redis解决脑裂:

  • 有2个参数,
    • 控制一个master的一个写操作要成功,最少要有几个从节点写成功后才可以。min-replicas-to-write
      • 写不成功,这个主就不可用
    • 控制主从复制延迟超时时长。min-slaves-max-lag

Redis脑裂问题详解及解决方案

缓存穿透

是什么

缓存穿透,就是访问的数据在缓存没有,在后端存储中也没有(也就不会缓存)。

场景:

  • 黑客攻击,访问一堆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 认证体系
This post is licensed under CC BY 4.0 by the author.