Interview Preparation
计算机网络
体系结构
- 应用层:通过应用进程间交互来完成特定网络应用。
协议:定义应用进程间通信和交互的规则。如 DNS、HTTP、SMTP、FTP 等。
交互数据单元:报文。
http 请求和响应的结构:
- 请求、首部、空行、主体
- 状态、首部、空行、实体
- 传输层:负责向两台主机进程间通信提供通用数据传输服务。
协议:TCP、UDP
区别
- TCP:面向连接、点对点、提供全双工通信、可靠传输、流量控制、拥塞控制、面向字节流
- UDP:无连接、可多对多、 面向报文、首部开销小
TCP UDP 是否面向连接 是 否 是否可靠 是 否 传输方式 字节流 报文 传输效率 低 高 所需资源 多 少 应用场景 文件传输、邮件传输 视频、音频、游戏 首部开销 20-60 字节 8 字节 复用:多个应用层进程同时使用下面传输层的服务
分用:传输层信息交付给应用层多个进程
端口在传输层添加
- 网络层:选择合适的网间路由和交换节点,分装数据为分组或包。
- 协议:IP、ICMP、ARP、RARP
- 数据链路层:将网络数据包封装成帧,在物理介质上传输帧。每一帧包括数据和必要的控制信息。
- 协议:OPSF 路由选择协议
- 物理层:实现相邻节点间比特流的透明传送。尽可能屏蔽具体传输介质和物理设备差距。
TCP
三次握手
客户端-SYN 包->服务端
服务端-SYN+ACK 包->客户端
客户端-ACK 包->服务端
目的:建立可靠通信信道,确认双方发送和接受是正常的。
四次挥手
客户端-FIN 包->服务端
服务端-ACK 包->客户端
服务端-FIN 包->客户端
客户端-ACK 包->服务端
目的:发送 FIN 包的一方进入半关闭状态,不再发送数据,但是可以接受数据。
TCP 如何保证可靠传输
- 校验和:发送方计算校验和,接收方校验和,不一致则丢弃。
- 序列号:保证数据包按序到达。
- 确认应答:接收方发送 ACK 包,发送方超时未收到则重传。
- 超时重传:发送方超时未收到 ACK 包则重传。
- 流量控制:接收方发送窗口大小,发送方根据窗口大小发送数据。
- 拥塞控制:慢启动、拥塞避免、快速重传、快速恢复。
- 选择重传:接收方缓存已经收到的数据,发送方重传丢失的数据。
- 停止等待协议:发送方发送数据后等待 ACK 包,接收方收到数据后发送 ACK 包。
停止等待协议:发送一个分组后停止发送,等待对方确认后再发送下一个分组。若收到重复分组,则丢弃,同时确认已收到。
- 出现差错:超时重传
- 确认丢失:接收方丢弃重复收到的消息
- 确认迟到:发送方丢弃重复的确认,接收丢弃重复的消息
- 自动重传 ARQ:发送完一个分组需要设置一个超时计数器,简单、信道利用率低
- 连续 ARQ:发送方维持一个发送窗口,发送窗口内可以连续发送,信道利用率高,不能向发送方反应已接收到的所有分组。
滑动窗口协议:滑动窗口大小代表接收方接受缓冲区的大小。当滑动窗口为 0 时,只有紧急数据和 1 字节的通知数据,通知接收方重新声明希望接受的下一字节和发送方的滑动窗口大小。
拥塞控制:拥塞窗口(cwnd),取决于网络拥塞程度,且动态变化,发送方让自己的发送窗口取拥塞窗口和接收方较小的一个。
- 拥塞算法:慢启动、拥塞避免、快速重传、快速恢复
- 慢启动:cwnd 从 1 开始,每经过一个 RTT,cwnd 加倍。
- 拥塞避免:cwnd 达到慢启动门限 ssthresh 后,每经过一个 RTT,cwnd 加 1。
- 快速重传和快速恢复:如果接收方接受到一个非顺序数据段,会发给发送方一个重复确认,如果发送方收到三个确认,会立即重传,这样就不会重传时要求暂停了,但是多包丢失,工作效率低。
浏览器访问过程
DNS 解析->TCP 连接->发送 HTTP 请求->服务器处理请求并返回 HTTP 报文->浏览器解析渲染页面->连接结束
HTTP
典型状态码
- 200:请求成功
- 202:请求已接受
- 301:永久重定向
- 302:临时重定向
- 304:缓存
- 400:请求错误
- 401:未授权
- 402:需要付费
- 403:禁止访问
- 404:未找到
- 500:服务器错误
- 502:无效网关
- 503:服务器不可用
- 504:网关超时
HTTP 与其他协议的关系
- HTTP: 生成请求报文,解析响应报文
- TCP: 报文分段、报文重组
- IP: 路由选择,寻址
- DNS: 域名解析
http 长连接:在一个 TCP 连接上可以传输多个 HTTP 请求和响应,减少建立和关闭连接的开销。通过 Connection: keep-alive 实现。如何识别多个请求:Content-Length、Transfer-Encoding: chunked。与 TCP Keep-Alive 区别:TCP Keep-Alive 是检测连接是否存活,http 长连接是复用连接。
http 和 https 的区别
- https 需要 CA 证书,http 不需要
- https 默认端口 443,http 默认端口 80
- https 是安全的,http 是不安全的
- https 是加密的,http 是明文的
- https 需要握手,http 不需要
- https 传输速度慢,http 快
IP
IP 地址分类
- A 类: 以 0 开头,1 字节网络号,2^(8-1)-2 个网络号,3 字节主机号,容纳主机数 2^24-2,从 1.0.0.0 到 126.0.0.0。保留地址:0000 和 127
- B 类: 以 10 开头,2 字节网络号,2^(16-2)-1,2 字节主机号, 容纳主机数 2^16-2,从 128.0.0.0 到 191.255.0.0,最多可容纳 2^16-2=65534 个主机。保留地址:128
- C 类: 以 110 开头,3 字节网络号,2^(24-3)-1, 1 字节主机号,容纳主机数 2^8-2 从 192.0.0.0 到 223.255.255.0,最多可容纳 2^8-2=254 个主机。保留地址:192
- D 类: 以 1110 开头,从 224.0.0.0 到 239.255.255.255,用于多播。
- E 类: 以 1111 开头,从 240.0.0.0 到 255.255.255.255, 用于研究。
子网和掩码计算 10.110.12.29 mask 255.255.255.224
子网掩码是 255.255.255.11100000, 所以子网是第四个字节的前三位,10.110.12.29 是 10.110.12.00011101,所以子网号是 000,同一子网下的 IP 地址前三位相同,所以同一子网下的 IP 地址是 10.110.12.00000001 到 10.110.12.00011110,所以主机数是 2^5-2=30。
iptables
四表
- filter: 过滤表,用于过滤数据包,决定是否放行。包括 INPUT、FORWARD、OUTPUT 三个链。
- nat: 网络地址转换表,用于网络地址转换。包括 PREROUTING、POSTROUTING、OUTPUT 三个链。
- mangle: 数据包修改表,用于修改数据包。包括 PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING 五个链。
- raw: 原始数据包表,用于配置豁免某些数据包。包括 PREROUTING、OUTPUT 两个链。
五链
- PREROUTING: 数据包进入路由前
- INPUT: 数据包进入本地后
- FORWARD: 数据包转发时
- OUTPUT: 数据包从本地发出时
- POSTROUTING: 数据包离开路由后
加密
- 对称加密:加密和解密使用相同的密钥,速度快,但是密钥传输不安全。如:AES、DES、3DES、SEED
- 非对称加密:加密和解密使用不同的密钥,速度慢,但是密钥传输安全。如:RSA、DSA、ECC
- https:使用非对称加密传输对称加密的密钥,然后使用对称加密传输数据。
- aes 加密:明文+key+aes 加密函数 = 密文 -> 网络传输 -> 密文+key+aes 解密函数 = 明文
网络安全
网络攻击:
- XSS: 跨站脚本攻击,通过注入恶意脚本,获取用户信息。
- CSRF: 跨站请求伪造,通过伪造用户请求,获取用户信息。
- SQL 注入: 通过注入 SQL 语句,获取数据库信息。
- DDOS: 分布式拒绝服务攻击,通过大量请求,使服务器瘫痪。
- DNS 劫持: 通过劫持 DNS 服务器,获取用户信息。
Cookie 和 Session
- Cookie: 保存在客户端,可以设置过期时间,可以被篡改,可以被禁用。保存字符串。
- Session: 保存在服务器,不可以设置过期时间,不可以被篡改,不可以被禁用。不区分路径,占用服务器资源,保存对象。
重定向原理:浏览器发送请求,服务器返回 302 状态码和 Location 头部,浏览器再次发送请求。
IP 地址 hash 算法:将 IP 地址转换为整数,然后对服务器数量取余,得到服务器索引。
数据结构与算法
数组和链表
- 数组:连续的内存空间,支持随机访问,插入和删除需要移动元素,时间复杂度 O(n)。从栈分配空间。
- 链表:不连续的内存空间,不支持随机访问,插入和删除不需要移动元素,时间复杂度 O(1)。从分配空间。
- 链表的主要作用:实现数据元素按顺序存储,管理长度和数量不固定的数据,实现树和图等数据结构。
排序
排序算法 平均时间复杂度 最好时间复杂度 最坏时间复杂度 空间复杂度 稳定性 冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定 选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定 插入排序 O(n^2) O(n) O(n^2) O(1) 稳定 快速排序 O(nlogn) O(nlogn) O(n^2) O(logn) 不稳定 堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定 归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定 希尔排序 O(n^(1.3)) O(1) 不稳定 - 插入排序:将数组分为已排序区间和未排序区间,每次从未排序区间取出一个元素,插入到已排序区间的合适位置。
- 选择排序:将数组分为已排序区间和未排序区间,每次从未排序区间取出一个元素,插入到已排序区间的末尾。
- 冒泡排序:比较相邻的元素,如果前一个比后一个大,就交换位置。
- 快速排序:选择一个基准元素,将数组分为小于基准元素的区间和大于基准元素的区间,然后递归排序。
- 堆排序:将数组构建成大顶堆,然后将堆顶元素与最后一个元素交换,然后重新构建大顶堆,重复这个过程。
map
实现:
哈希表:数组+链表,通过哈希函数计算 key 的 hash 值,然后通过 hash 值计算数组下标,将 key-value 存储在数组中。
扩容:1.创建更大的数组,2.重新计算 hash 值,3.将数据拷贝到新数组中。
hash 冲突解决方法:开放定址、再 hash、链地址、建立公共溢出区
搜索树:一般采用自平衡二叉搜索树,如 AVL 树、红黑树、B 树、B+树。
哈希表的最差时间复杂度为 O(n),平均时间复杂度为 O(1)。搜索树的时间复杂度为 O(logn)。
链表、栈、队列、堆
- 队列: 先进先出,入队和出队时间复杂度 O(1)。
- 栈: 先进后出,入栈和出栈时间复杂度 O(1)。由编译器分配释放,采用一级缓存。
- 堆:完全二叉树,分为大顶堆和小顶堆,堆顶元素是最大或最小值,插入和删除时间复杂度 O(logn)。多次 free 会导致内存泄漏。由程序员分配释放,采用二级缓存。
数据序列化:将结构体等复杂数据结构的各个属性有序保存在字符数组。作用:方便网络传输、方便协议解释、方便数据存储
二叉树:空集,或者由一个根节点和两个不相交的子二叉树组成。
按照节点度数分类:
- 满二叉树(Full Binary Tree):每个节点要么没有子节点,要么有两个子节点。
- 完全二叉树(Complete Binary Tree):除了最底层,其他层的节点都是满的,且最底层的节点都靠左排列。
按照高度分类:
- 平衡二叉树(Balanced Binary Tree):任意节点的两棵子树的高度差不大于 1。
- 完全平衡二叉树(Perfectly Balanced Binary Tree):所有叶子节点都在最底层,且除了叶子节点外,每个节点都有两个子节点。
按照节点连接方式分类:
- 二叉查找树(Binary Search Tree):左子树上所有节点的值均小于根节点的值,右子树上所有节点的值均大于根节点的值。
- 红黑树(Red-Black Tree):一种自平衡的二叉查找树,通过对节点着色和旋转操作来保持平衡。
红黑树:是一种近似平衡的二叉查找树,能够确保任何一个节点的左右子树的高度差小于两倍。从一个节点到该节点的子孙节点所有路径包含相同数目黑节点
B 树:多路平衡查找树,每个节点最多有 M 个子节点,M>=2,根节点至少有两个子节点,其他节点至少有 M/2 个子节点。
B+树:B 树的变体,非叶子节点不保存数据,只用来索引,所有数据都保存在叶子节点,叶子节点之间通过指针连接。
动态规划:将一个复杂的问题分解为多个子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。
单例模式:保证一个类只有一个实例,并提供一个全局访问点。
- 优点:减少内存开销,避免资源占用,避免对资源的多重占用,设置全局访问点,严格控制客户访问。
- 缺点:扩展困难,不易于测试,与单一职责原则冲突。实例化对象长期未使用,系统会认为是垃圾,会被回收,这将导致对象状态丢失。
设计模式:参考其他日志。
操作系统
进程与线程
- 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
- 线程:进程的实体,是 CPU 调度和分派的基本单位,是比进程更小的能独立运行的基本单位。抢占式调度,线程切换开销小。
- 协程:一种用户态的轻量级线程,协程的调度完全由用户控制。
进程间通信方式:管道、消息队列、信号量、共享内存、socket、stream socket.
- 管道:普通管道、流管道、命名管道。半双工,只能在具有公共祖先的进程间使用。命名管道可以在无关的进程间使用。
- 信号量:用于进程间同步,以及互斥操作。通常作为一种锁机制。
- 消息队列:消息的链表,存放在内核中并由消息队列标识符标识。
- 共享内存:映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
进程状态:创建、就绪、运行、阻塞、终止
进程调度算法:先来先服务、短作业优先、高优先级优先、时间片轮转、多级反馈队列、最高响应比优先、最短剩余时间优先
线程同步:互斥量、信号量、条件变量、读写锁
死锁:互斥、请求与保持、不剥夺、环路等待。避免死锁:动态分配资源、按序申请资源、资源有序分配法、银行家算法。预防死锁:破坏请求与保持条件、破坏不剥夺条件、破坏环路等待条件。
分页和分段:
段:信息的逻辑单位,用户可见。大小不固定,根据完成的功能来划分。向用户提供二维地址空间,段号和段内地址。
页:信息的物理单位,用户透明。大小固定,由系统决定。向用户提供一维地址空间。
分段存储管理:用户程序的地址空间分配为若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。段与段之间可以不相邻接,也不必须连续,离散分布在内存中。段表记录:段号、段长、段基址。
分页存储管理:用户程序的地址空间分配为若干个大小固定的块,称为页,相应地,内存空间分配为若干个物理块,用户程序的任一页都可以放在内存的任一物理块中,实现了离散分配。页表记录:页号、块号。
段页式存储管理:将用户程序的地址空间分成若干个大小不等的段,每段再分成若干个大小固定的页。内存空间分配为若干个物理块,用户程序的任一段的任一页都可以放在内存的任一物理块中。地址变换:段号、页号、页内偏移量。
页面置换算法:最佳置换算法、先进先出算法、时钟(最近最久未使用)算法
- 最佳置换算法:选择在未来最长时间内不再被访问的页面予以置换。
- 先进先出算法:选择在内存中驻留时间最长的页面予以置换。
- 时钟算法:为每个页面设置一个访问位,每次访问页面时,将访问位置 1。当需要替换页面时,查看指针指向的页面的访问位,若为 1,则将其置 0,指针指向下一个页面,直到找到访问位为 0 的页面,替换该页面。
中断和系统调用
中断:计算机执行过程中,出现特殊事件,cpu 暂停当前执行程序,转去执行该事件。
- 异常中断:计算机硬件故障或程序运行出错,如除 0、越界、非法指令等。
- 软中断:由程序员在程序中设置的中断。
- 外中断:由 cpu 以外的事件引起,如 I/O 中断、时钟中断等。
中断优先级:机器错误 > 时钟 > 磁盘 > 网络设备 > 软中断
轮询方式:cpu 不断地轮询各个中断源,检查是否有中断请求,若有,则根据中断类型进行相应的处理。缺点:浪费 cpu 资源。
进程执行级别:用户态和系统态(内核态)
系统调用:用户态进程通过系统调用进入内核态,执行完后返回用户态。会产生一个软中断。
进程级别转换的三种方式:系统调用、异常、外围设备的中断。
异步、同步、阻塞
进程同步的机制:信号量、自旋锁管程、会合、分布式系统。 异步调用获得结果的方式:轮询、回调函数。 阻塞:进程/线程等待消息被挂起的状态。
操作系统功能:进程管理、内存管理、设备管理、文件管理、提供用户接口
程序:静态的,存储在磁盘上的,没有生命的。进程:动态概念且有并行特征,会竞争计算机系统资源,不同的进程可以包含相同的程序。
缓冲区溢出:计算机程序向缓冲区写入数据时,超出了缓冲区的边界,覆盖了其他内存区域的数据。危害:程序崩溃、提权、拒绝服务、跳转并执行恶意代码。
设备管理
- 磁盘调度算法:先来先服务、最短寻道时间优先、电梯算法、扫描算法、循环扫描算法。
内存管理:虚拟内存、内存映射文件、内存堆栈
Linux 文件类型:普通文件、目录文件、设备文件、链接文件
僵尸进程解决方案:杀死父进程、过继给 init 进程。避免产生僵尸进程:使用 signal 函数忽略 SIGCHLD 信号、使用 wait 函数回收子进程、fork 两次。
软连接和硬连接
- 软连接:类似于 windows 的快捷方式,文件的引用,不占用磁盘空间,删除源文件后,软连接失效。
- 硬连接:文件的拷贝,占用磁盘空间,删除源文件后,硬连接仍然有效。
大端序和小端序
- 大端序:高位字节存放在低位地址,低位字节存放在高位地址。
- 小端序:高位字节存放在高位地址,低位字节存放在低位地址。
补码和反码:
- 补码:正数的补码是其本身,负数的补码是其反码加 1。
- 反码:正数的反码是其本身,负数的反码是其符号位不变,其他位取反。
字符集:
- unicode:字符集,每个字符占用两个字节。
- utf-8:编码方式,可变长编码,英文一个字节,中文三个字节。
- utf-16:编码方式,定长编码,英文两个字节,中文两个字节。
- utf-32:编码方式,定长编码,英文四个字节,中文四个字节。
- gbk:编码方式,中文两个字节,英文一个字节。
数据库
数据库事务的四大特性:原子性、一致性、隔离性、持久性
- 原子性:事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
- 一致性:事务执行前后,数据保持一致。
- 隔离性:事务之间互不影响。
- 持久性:事务一旦提交,对数据的修改就是永久性的。
隔离级别:未提交读、提交读、可重复读、可串行化
- 未提交读:一个事务可以读取另一个未提交事务的数据,可能导致脏读。
- 提交读:一个事务只能读取另一个已提交事务的数据,可以避免脏读,但是可能导致不可重复读。
- 可重复读:一个事务只能读取另一个已提交事务的数据,可以避免脏读和不可重复读,但是可能导致幻读。
- 可串行化:一个事务只能读取另一个已提交事务的数据,可以避免脏读、不可重复读和幻读,但是效率低下。
数据库索引:B+树,增加查询速度,但是索引自身需要占用空间,且降低了增删改的速度,因为每次增删改都需要更新索引。hash 索引,链表索引。
主键、外键、唯一索引、普通索引
- 主键:唯一标识一条记录,不能为 null,一个表只能有一个主键。用于保证数据完整性。
- 外键:表的外键是另一表的主键,用来建立两个表之间的联系,可以有多个外键。用于保证数据一致性。
- 唯一索引:索引列的值必须唯一,但是可以为 null。一个表可以有多个唯一索引。
- 普通索引:提高查询速度。
数据库三大范式:第一范式、第二范式、第三范式
- 第一范式:属性不可再分。
- 第二范式:属性完全依赖于主键。
- 第三范式:属性不依赖于其他非主键属性。
数据完整性:实体完整性、参照完整性、用户定义完整性
- 实体完整性:主键不能为空。
- 参照完整性:外键必须是另一表的主键。
- 用户定义完整性:满足业务需求。
数据库事务:事务是由一组 SQL 语句组成的逻辑处理单元,事务具有以下四个特性:原子性、一致性、隔离性、持久性。
视图:是从一个或多个表中导出的表,视图是虚拟的,不包含数据,只包含使用时动态检索数据的查询。视图可以简化复杂的 SQL 操作,可以用于保护数据,可以用于更改数据的格式和表示。但是会降低查询性能,可能存在修改限制。
数据库优化:减少数据访问,减少交互次数,减少数据量,减少锁竞争,减少 CPU 消耗,减少磁盘 IO。
大数据优化:分库分表、读写分离、缓存、异步、索引、分区、垂直拆分、水平拆分、冷热数据分离、负载均衡、集群、分布式、云计算。
高并发解决方案:
横向扩展:通过增加服务器数量来提高系统性能。
引入缓存:将数据缓存在内存中,减少数据库的访问,提高系统性能。
引入消息队列(消峰):通过消息队列解决瞬时高并发的问题,但是如果请求量一直很高,挤压的请求会一直积压在消息队列中,会导致消息队列成为系统的瓶颈。
读写分离:将读请求和写请求分开,读请求发送到从库,写请求发送到主库。
分库分表:将数据分散到多个数据库中,或者将长字段分离到其他表中。
优化 SQL 语句:优化查询语句,减少数据库的访问。
优化数据库结构:降低范式,增加冗余字段,减少关联查询。
单元化:将业务分成多个可扩展的逻辑分区,每个分区都是一个单元,每个单元都可以独立部署,单元之间通过消息队列通信。
引入 ES:对比数据库的 B+树索引,ES 的倒排索引更适合搜索引擎,可以提高搜索效率。这是在解决多维复杂查询的问题。
常用 SQL 语句:
创建数据库:
create database <数据库名>
删除数据库:
drop database <数据库名>
创建表:
create table <表名> (<列名1> <数据类型1> <列级完整性约束1>, <列名2> <数据类型2> <列级完整性约束2>, ..., <表级完整性约束1>, <表级完整性约束2>, ...)
删除表:
drop table <表名>
增加列:
alter table <表名> add <列名> <数据类型> <列级完整性约束>
删除列:
alter table <表名> drop <列名>
修改列:
alter table <表名> modify <列名> <数据类型> <列级完整性约束>
增加主键:
alter table <表名> add primary key (<列名>)
删除主键:
alter table <表名> drop primary key
创建索引:
create index <索引名> on <表名> (<列名>)
删除索引:
drop index <索引名>
创建视图:
create view <视图名> as <select语句>
删除视图:
drop view <视图名>
选择:
select <列名1>, <列名2>, ... from <表名> where <条件> group by <列名> having <条件> order by <列名>
插入:
insert into <表名> (<列名1>, <列名2>, ...) values (<值1>, <值2>, ...)
更新:
update <表名> set <列名1> = <值1>, <列名2> = <值2>, ... where <条件>
删除:
delete from <表名> where <条件>
事务:
commit transaction
、rollback transaction
、begin transaction
连接:
left join
、right join
、full join
、inner join
子查询:
select <列名1>, <列名2>, ... from <表名> where <条件> and <列名> in (select <列名> from <表名> where <条件>)
计数:
select count(*) from <表名> where <条件>
求和:
select sum(<列名>) from <表名> where <条件>
复制表:
select * into <新表名> from <旧表名> where <条件>
删除重复行:
select distinct <列名1>, <列名2>, ... from <表名> where <条件>
分组:
select <列名1>, <列名2>, ... from <表名> group by <列名>
拷贝数据:
insert into <表名> (<列名1>, <列名2>, ...) select <列名1>, <列名2>, ... from <表名> where <条件>
其他
运维
DevOps:通过自动化、协作和持续改进,加速软件交付的速度和频率,同时提高软件质量和系统稳定性。包括:
自动化软件交付:DevOps 团队负责设计、实施和维护自动化的软件交付流程,包括持续集成(CI)、持续交付(CD)以及自动化部署和测试。
环境管理:DevOps 团队负责管理开发、测试和生产环境的配置和部署,确保这些环境的一致性和可靠性。
运维和监控:DevOps 团队负责监控生产系统的性能和稳定性,及时发现并解决问题,确保系统的高可用性和可靠性。
容器化和编排:DevOps 团队可能负责容器化应用程序,并使用容器编排工具(如 Kubernetes)来管理和调度这些容器。
自动化测试:DevOps 团队负责设计和实施自动化测试策略,包括单元测试、集成测试、端到端测试等,以确保软件质量和稳定性。
安全和合规性:DevOps 团队需要关注软件交付过程中的安全性和合规性,确保开发的应用程序符合相关的安全标准和法规要求。
跨团队协作:DevOps 团队需要促进开发、运维和其他相关团队之间的协作和沟通,以确保整个软件交付过程的顺畅进行。
AI 在 Devops 中的应用:
用于自动化测试,包括自动生成测试用例、执行自动化测试脚本、分析测试结果以及识别潜在的缺陷和问题。
优化 CI/CD 流程,例如通过自动化构建、测试和部署流程,以及智能化的部署策略和回滚机制。
用于实时监控系统和应用程序,并自动检测和诊断问题,甚至提出修复建议或执行自动化修复操作。
分析系统和应用程序的性能数据,预测潜在的故障和问题,并提前采取措施以防范故障发生,从而提高系统的稳定性和可靠性。
用于自动化安全审计,识别安全漏洞和威胁,以及执行自动化的安全补丁和修复操作。
用于自动化运维任务,包括自动化故障处理、自动化容量规划和资源优化,以及自动化配置管理和环境部署。
SRE: 一种将软件工程和运维运营原则结合起来的角色和方法论。SRE 的职责是确保系统的可靠性、可用性和可扩展性,以满足用户需求。
监控和警报:设置和维护监控系统,及时发现并解决系统问题。
容量规划:预测系统资源需求,确保系统能够满足用户的负载。
故障响应:快速诊断和解决系统故障,最小化系统的停机时间。
自动化:开发和维护自动化工具和流程,提高效率和可靠性
性能优化:分析和改进系统性能,提高用户体验。
系统设计和架构:参与系统设计和架构决策,确保系统具备可靠性和可扩展性。
紧急事件管理:制定和执行紧急事件响应计划,保障系统的稳定性。
跨团队合作:与开发团队、运维团队和其他相关团队合作,共同解决问题和改进系统。
Devops 和 SRE 的区别和联系
方面 SRE DevOps 主要关注点 系统的可靠性、可用性和可扩展性 软件开发和运维的协同和流程改进 角色定位 一种特定的工程角色 一种文化和方法论 历史背景 起源于 Google,强调运维的工程化和自动化 起源于敏捷开发和持续交付的思想 重点 运维和系统稳定性 开发和运维的协同和流程改进 目标 确保系统高可靠性和可用性,快速响应变化的需求 加强开发和运维之间的合作,提高交付速度和质量 关键实践 监控和警报、容量规划、故障响应、自动化、性能优化 持续集成/交付、自动化部署、配置管理、持续监控 团队合作 与开发团队、运维团队合作,共同解决问题和改进系统 开发团队和运维团队之间的紧密合作和沟通 度量和指标 SLA、SLO、SLI 等度量系统可靠性和可用性的指标 故障率、交付速度、回归测试时间等指标 两者都强调自动化和流程改进,以提高效率和减少人为错误。它们都鼓励开发人员和运维人员之间的合作和沟通,以实现共同的目标。
CPU 占用过高的排错和处理流程:
- 监控系统资源:使用系统监控工具(如 top、htop、或者基于 Web 的监控工具)来确认 CPU 占用情况,并观察是否有任何异常的进程或服务占用大量 CPU 资源。
- 识别高 CPU 消耗的进程:通过命令行工具或监控系统的界面,找出消耗大量 CPU 资源的进程。
- 分析日志:查看系统日志和应用程序日志,以便发现任何相关的错误或异常信息。
- 优化代码:如果高 CPU 占用是由自己开发的应用程序引起的,可以通过代码优化来降低 CPU 消耗,比如减少循环次数、优化算法等。
- 增加硬件资源:如果问题是由于硬件资源不足导致的,可以考虑增加 CPU 核心数或者升级 CPU 性能。
- 限制进程资源:对于某些进程,可以通过操作系统的工具(如 cgroups)来限制其 CPU 使用,以避免其过度占用 CPU 资源。
- 升级软件版本:有时高 CPU 占用可能是由于软件版本问题导致的,升级软件版本到最新稳定版可能会解决一些性能问题。
- 故障转移:如果可能的话,可以通过负载均衡或者故障转移,将部分请求转移到其他服务器上,以减轻当前服务器的负载。
- 横向扩展:如果单台服务器无法满足需求,可以考虑引入更多服务器,采用集群的方式来分担负载。
- 持续监控和优化:定期进行系统性能分析,持续优化系统配置和应用程序性能,以确保服务器资源得到合理利用。
redis 作用:缓存、会话存储、消息队列、存储需要快速访问的数据。
Nginx 作用:反向代理、负载均衡、静态资源处理、高可用、安全防护。
负载均衡算法:轮询、加权轮询、随机、加权随机、最少连接、加权最少连接、源地址哈希、URL 哈希。
Nginx 负载均衡原理
系统设计
监控系统设计
数据收集
组件功能: 数据收集组件负责从各种源(如服务器、应用程序、网络设备等)收集监控数据。这些数据可能包括性能指标、日志文件、配置状态和安全事件。
相关技术:
- 代理: 在目标服务器上安装代理来收集数据,例如使用 Prometheus 的 exporters。
- 无代理: 利用现有的 API 或协议(如 SNMP, JMX, WMI)从远程系统收集数据。
- 日志收集器: 如 Fluentd 或 Logstash,用于收集和转发日志数据。
数据存储
组件功能: 存储组件用于存储收集到的监控数据。它需要能够高效地写入和查询数据。
相关技术:
- 时间序列数据库: 如 Prometheus, InfluxDB,专门为监控数据设计。
- 日志数据库: 如 Elasticsearch, 用于存储日志数据。
- 分布式存储: 如 Apache Cassandra, 可以用于存储大规模的监控数据。
数据处理与分析
组件功能: 数据处理组件负责处理和分析数据,以便从数据中提取有用的信息和洞察。
相关技术:
- 流处理: 如 Apache Kafka Streams 或 Apache Flink,用于实时数据处理。
- 批处理: 如 Apache Hadoop, 用于大规模数据分析。
- 复杂事件处理(CEP): 用于在数据流中识别模式和复杂事件。
警报
组件功能: 警报组件用于在检测到潜在问题时通知运维人员。
相关技术:
- 警报规则引擎: 如 Alertmanager(与 Prometheus 集成),用于定义警报规则和路由警报。
- 通知系统: 如 PagerDuty, OpsGenie, 集成电子邮件、短信和即时消息服务。
可视化
组件功能: 可视化组件允许用户通过图形界面查看数据和警报状态。
相关技术:
- 仪表板: 如 Grafana, Kibana,用于创建和展示监控数据的图形化仪表板。
- 图形库: 如 D3.js, 用于定制数据可视化。
自动化响应
组件功能: 自动化响应组件在检测到问题时可以自动执行操作来解决或缓解问题。
相关技术:
- 自动化执行: 如 Ansible, Puppet, Chef,用于执行自动化脚本和配置管理。
- 自动化修复: 如 Self-healing systems,集成 AI 和机器学习进行故障预测和自动修复。
安全与合规
组件功能: 确保监控系统本身的安全性,并且监控数据的处理符合法规要求。
相关技术:
- 加密: 数据传输和存储时的加密技术。
- 访问控制: 确保只有授权用户能够访问监控系统。
- 审计日志: 记录对监控系统的操作,以供审计和合规使用。
集成与扩展性
组件功能: 监控系统需要与现有的 IT 环境集成,并且能够适应未来技术和需求的变化。
相关技术:
- API: 提供 API 以便其他系统和工具可以与监控系统交互。
- 插件系统: 允许自定义和扩展功能。
职业规划
如果你进入我们公司,你将如何规划的你的职业路线,以及你将如何实现自我价值。
如果我进入贵公司,我会首先深入了解公司的业务和技术栈,并与团队成员沟通,以确定公司的目标和需求。基于这些了解,我会制定个人的职业规划,包括以下几个方面:
技术深度与广度的提升: 我会努力在公司所采用的技术领域内取得专业的深度,并尝试扩展到相关领域,以便更好地理解整个技术栈。这将包括学习新的工具、框架和技术,以及深入了解公司特定领域的最佳实践。
领导力与团队合作: 我将寻求机会参与项目的领导和规划,积极参与团队合作,促进团队协作和知识共享。我也会寻求培养自己的领导技能,以便在适当时机能够承担更多的责任。
持续学习与分享: 我会积极参与行业相关的培训和研讨会,不断提升自己的技术水平和专业知识。同时,我也会乐于与团队成员分享我的经验和知识,促进团队整体的技术提升。
贡献价值与创新: 我将努力在自己的岗位上创造价值,提出改进建议并积极参与解决技术挑战。我也会尝试提出创新性的想法,以帮助公司更好地适应市场变化和技术发展。
通过这些努力,我希望能够在公司中发挥更大的作用,不断提升自己的技术能力和领导力,为公司的发展和创新做出贡献。
你的优点和缺点是什么?
我的优点是善于学习和适应能力强。我乐意接受新的挑战,并且能够快速地掌握新的技能和知识。此外,我注重团队合作,善于沟通和解决问题。至于缺点,有时候我可能会过于追求完美,导致在一些任务上花费过多的时间。我在意识到这一点后,已经在努力寻找平衡,以更好地利用时间和资源。