远算科技-运维开发(面经分享)

秋意零 2024-5-18 277 5/18

远算科技-运维开发

一面

2024年5月16日 | 15点 | 一面 | 30 min 左右

1)自我介绍

2)TCP/IP协议理解

应用层: 这是最接近用户的一层,它为应用程序提供网络服务。应用层协议包括HTTP(用于网页浏览)、FTP(文件传输)、SMTP(邮件发送)、DNS(域名解析)等,它们定义了数据的格式和传输方式。

传输层: 主要有两个重要协议:TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。

  • TCP 提供面向连接的、可靠的、有序的数据传输服务,通过三次握手建立连接,确保数据包按序到达且无误,如果数据包丢失或损坏,则会重新发送。
  • UDP 是无连接的,提供不可靠的数据传输服务,不保证数据包的顺序和到达,但因其简单、开销小,适合对实时性要求高的应用,如在线游戏、VoIP等。

网络层(或称互连网络层): 主要协议是IP(Internet Protocol),负责在不同网络之间寻址和路由数据包。IP协议定义了数据包的格式,并提供了一种标准化的方式将数据从源主机发送到目的主机,即使它们位于不同的网络中。此外,还有ICMP(Internet Control Message Protocol)用于差错报告和控制消息的传递。

网络接口层(或数据链路层、链路层): 在物理网络上传输比特流,负责封装和解封装IP数据包为适合在物理媒介上传输的帧格式。这层的具体实现依赖于底层的物理网络技术,如以太网、Wi-Fi等,并且包括MAC(Media Access Control)地址的使用,用于在同一局域网内的设备间直接通信。

3)MAC地址IP地址如何转换的?

ARP (Address Resolution Protocol) :这是在IP网络中将IP地址映射到MAC地址的关键协议。

当一个设备需要向同一局域网内的另一个设备发送数据包时,它会首先检查自己的ARP缓存表中是否有目标IP地址对应的MAC地址。

如果没有,设备会发送一个ARP广播请求,询问“这个IP地址对应的MAC地址是什么?”接收到请求的设备会用自己的MAC地址响应。

这样,发起请求的设备就可以将这个MAC地址与IP地址关联起来,并在后续通信中直接使用MAC地址进行数据包传输。

4)用户通过浏览器访问网站的具体过程

  1. 用户输入URL
    • 用户在浏览器的地址栏中输入网址(如https://www.qiuyl.com)并按下回车键。
  2. DNS解析
    • 浏览器检查本地缓存是否有该域名的IP地址,如果没有则继续查询。
    • 浏览器向操作系统发出DNS查询请求,操作系统检查本地DNS缓存。
    • 如果本地缓存没有,操作系统向配置的DNS服务器(通常是ISP提供的DNS服务器或公共DNS服务器如Google DNS)发出查询请求。
    • DNS服务器通过递归查询过程,最终找到域名对应的IP地址并返回给操作系统,操作系统再返回给浏览器。
  3. 建立TCP连接
    • 浏览器使用DNS解析得到的IP地址和服务器建立TCP连接。对于HTTPS请求,浏览器首先会与服务器进行TCP的三次握手(SYN, SYN-ACK, ACK)。
  4. TLS握手(如果使用HTTPS)
    • 浏览器与服务器进行TLS握手,协商加密算法,交换加密密钥,建立安全的加密通信通道。
  5. 发送HTTP请求
    • 浏览器通过建立的TCP/TLS连接向服务器发送HTTP请求。请求包括HTTP方法(如GET、POST)、请求头(如User-Agent、Accept)、以及URL等信息。
  6. 服务器处理请求
    • 服务器接收到HTTP请求后,处理请求。服务器可能需要查询数据库、调用其他服务或执行业务逻辑来生成响应。
    • 服务器生成HTTP响应,包括状态码(如200 OK、404 Not Found)、响应头和响应体(如HTML内容、JSON数据)。
  7. 传输HTTP响应
    • 服务器将HTTP响应通过TCP/TLS连接发送回浏览器。
  8. 浏览器接收响应
    • 浏览器接收到HTTP响应后,解析响应头和响应体。对于HTML内容,浏览器会进一步解析HTML文档。
  9. 处理资源请求
    • 在解析HTML文档过程中,浏览器会发现需要加载的额外资源(如CSS、JavaScript、图片等),并发出额外的HTTP请求获取这些资源。
    • 这些资源请求遵循与主请求相同的过程(DNS解析、建立连接、发送请求、接收响应)。
  10. 渲染页面
    • 浏览器在接收到所有必要的资源后,按照HTML、CSS、JavaScript的规范进行页面渲染,将内容显示给用户。
    • 浏览器执行JavaScript代码,处理用户交互,动态更新页面内容。
  11. 用户交互
    • 用户可以与网页进行交互(如点击链接、提交表单、输入文本),浏览器会捕捉这些事件并进行相应的处理,可能会再次发送HTTP请求或更新页面内容。

5)HTTP有几个版本,怎么建立连接的,使用的什么协议

  1. HTTP/0.9:这是最早的版本,1991年发布,功能非常基础,仅支持GET请求,无请求头、响应头及状态码,主要用于传输HTML文本,现已过时。
  2. HTTP/1.0:1996年发布,增加了更多的请求方法(如POST、HEAD)、状态码、请求头和响应头等,但默认情况下每个请求/响应后都会关闭TCP连接,虽然可以使用Connection: keep-alive头部维持连接,以支持复用连接。
  3. HTTP/1.1:1997年发布,成为最广泛使用的版本之一,它默认支持持久连接(persistent connection),允许多个请求响应复用同一个TCP连接,提高了效率。此外,它还引入了管道化(pipelining)、Chunked编码传输大文件、内容编码和压缩等功能。
  4. HTTP/2:于2015年标准化,显著提高了性能,引入了多路复用(Multiplexing)、二进制分帧层、服务器推送(Server Push)等特性,解决了HTTP/1.x中的队头阻塞问题,提高了页面加载速度。
  5. HTTP/3:基于QUIC(Quick UDP Internet Connections)协议,于2019年开始标准化,目的是进一步降低延迟,通过UDP而非TCP传输数据,支持连接迁移、加密、多路复用等高级特性。

建立连接的过程

  • HTTP/1.0及以前:通常每个请求都需要建立一个新的TCP连接,请求完成后关闭连接。如果使用keep-alive,连接会在一段时间内保持打开状态以复用。
  • HTTP/1.1及以后:默认使用持久连接,客户端与服务器建立TCP连接后,可以在同一连接上发送多个请求和接收响应,直至任意一方主动关闭连接。
  • 连接建立步骤
    1. DNS解析:客户端首先将URL中的域名解析为服务器的IP地址。
    2. TCP握手:客户端通过TCP三次握手与服务器建立连接。这个过程包括SYN(同步序列编号)请求、SYN-ACK(带有确认的同步序列编号)响应和ACK(确认)响应。
    3. 发送HTTP请求:一旦TCP连接建立,客户端就会发送HTTP请求报文,包含请求行(方法、URL、协议版本)、请求头和可能的请求体。
    4. 接收HTTP响应:服务器处理请求后,返回HTTP响应报文,包含状态行(协议版本、状态码、状态消息)、响应头和响应体。
    5. 连接关闭或复用:根据HTTP版本和Connection头部,决定是否关闭连接或继续复用连接发送更多请求。

协议

  • HTTP/1.x 和 HTTP/2:使用的是TCP协议。
  • HTTP/3:使用的是QUIC协议,而QUIC是基于UDP的。

6)如果网站流量很大如何处理、运维层面、后端层面

运维层面:

  1. 负载均衡:部署负载均衡器,如Nginx、HAProxy或云服务商提供的负载均衡服务(如AWS的ELB、阿里云的SLB等),将用户请求均匀分配到多个后端服务器,避免单点过载。
  2. CDN(内容分发网络):使用CDN将静态资源(如图片、视频、CSS、JavaScript)缓存到全球各地的边缘节点,使用户可以从最近的服务器获取内容,减少延迟和带宽消耗。
  3. 监控与报警系统:实施全面的监控,包括服务器性能、网络流量、应用状态和数据库健康状况,设置合理的阈值并配置报警机制,以便在问题发生时快速响应。
  4. 自动扩展:利用云平台的自动扩展功能或自建脚本,根据流量动态增加或减少服务器实例数量,确保资源与实际需求相匹配。
  5. 缓存策略:合理使用缓存技术,如Redis、Memcached或数据库缓存,减少对后端数据库的直接访问,提高响应速度。
  6. 日志管理和分析:实施有效的日志收集、存储和分析策略,如使用Elasticsearch、Logstash和Kibana(ELK Stack),帮助快速定位问题并优化系统。

后端层面:

  1. 数据库优化:实施读写分离、分库分表策略,使用索引优化查询性能,考虑使用NoSQL数据库或缓存系统减轻关系型数据库的压力。
  2. 服务拆分与微服务架构:将大型应用拆分为多个小型、独立的服务,每个服务负责特定功能,便于独立扩展和维护,提高系统的灵活性和可伸缩性。
  3. 异步处理:采用消息队列(如RabbitMQ、Kafka)处理耗时任务,将请求异步处理,避免阻塞主线程,提升响应速度。
  4. 代码优化:优化后端代码,减少不必要的计算和数据库查询,提高执行效率。
  5. API Gateway:使用API网关管理API流量,实现路由、限流、认证等功能,减轻后端服务压力。
  6. 安全与风控:加强安全防护,如DDoS防御、WAF(Web应用防火墙)、定期安全审计,以及事前的风险识别与预防策略。

7)了解SRE理念?

SRE(Site Reliability Engineering,网站可靠性工程)是由谷歌开发的一种方法,旨在提高软件系统的可靠性、可扩展性和性能。以下是SRE的核心理念:

  1. 可靠性
    • 服务级别协议(SLA)是对外承诺的服务可用性百分比,例如99.99%的正常运行时间。
    • 服务级别指标(SLI)是量化服务性能和可靠性的具体指标,如请求的平均响应时间、错误率等。
    • 服务级别目标(SLO)是内部设定的目标,确保达到或超过SLA,例如将错误率控制在0.01%以下。
  2. 自动化运维
    • 强调通过自动化工具和脚本来减少人工操作,提高效率和准确性,减少人为错误,实现快速故障恢复。
  3. 防错设计与容错机制
    • 在系统设计阶段就融入容错和冗余机制,确保单一故障点不影响整个服务的可用性。
  4. 限流与降级策略
    • 在系统面临高负载压力时,采取措施如流量控制、服务降级,以保护核心服务不受影响。
  5. 监控与告警
    • 实施全面的系统监控,及时发现并响应异常,确保问题能够迅速被识别并处理。
  6. 持续改进与迭代
    • SRE团队花费不超过50%的时间进行运维工作,其余时间投入到项目中以改善系统架构、优化流程和开发自动化工具,推动技术债务的偿还。
  7. 文化和心态
    • SRE文化强调团队合作、风险管理、数据驱动决策以及对变化的适应能力,鼓励工程师既要有开发新功能的能力,也要有维护和优化现有系统的心态。

8)熟悉什么语言?Python的元组、列表、字典区别

元组:不可变、有序,适合存储固定数据。例如:q = (1,2,3)

列表:可变、有序,适合存储动态数据。例如:q = [1,2,3]

字典:可变、键唯一,适合存储键值对并进行快速查找。例如:q = {"key1":"value1","key2":"value2"}

9)Python的元组、列表、字典他们的时间复杂度

元组:主要用于存储固定数据,其操作的时间复杂度通常较低,但由于不可变性,不支持修改操作。

列表:灵活且常用,适用于需要动态修改的情况,但某些操作如插入和删除在最坏情况下时间复杂度较高。

字典:适用于键值对存储和快速查找,大多数操作的摊销时间复杂度为 O(1),性能优异。

10)如果要你设计一个工单系统你会怎么设计

用户角色

  • 客户:提交工单,查看工单状态,更新工单信息。
  • 技术支持人员:查看分配给自己的工单,更新工单状态,解决工单问题。
  • 管理员:管理用户、分配工单、查看所有工单状态和统计数据。

核心功能

  • 工单管理:创建、查看、更新、关闭工单。
  • 用户管理:注册、登录、权限管理。
  • 通知系统:在工单状态变化时通知相关人员(如邮件、短信)。
  • 统计分析:生成工单处理情况的报表和图表。
  • 搜索和过滤:根据条件搜索和过滤工单。
  • 附件支持:上传和下载与工单相关的附件。

11)对监控理解,使用过哪些监控软件

监控是确保系统、网络和应用程序正常运行的重要手段。监控系统可以帮助检测和预防潜在问题,提高系统的可靠性和可维护性。

12)Prometheus监控指标存储在哪里的

Prometheus 主要使用自己的数据库系统——Prometheus Time Series Database (TSDB) 来存储监控数据。这个数据库专门为存储时间序列数据而设计,可以高效地处理大量的监控指标数据。

Prometheus TSDB 在本地磁盘上存储数据,你可以在 Prometheus 的配置文件中指定存储位置。这个位置通常是通过配置文件中的 --storage.tsdb.path 选项来设置的,例如,你可以将其设置为某个特定的目录,如 /data/prometheus

此外,Prometheus 还支持通过远程存储接口将数据推送到外部数据库,如 InfluxDB、OpenTSDB 或长期存储解决方案,比如 Thanos 或 Cortex。这样可以帮助进行更长期的数据保存或在更复杂的查询需求中提供帮助。

这篇文章有用吗?

点击星号为它评分!

平均评分 4.5 / 5. 投票数: 2

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

- THE END -

秋意零

5月18日20:41

最后修改:2024年5月18日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论