SRE运维工程师 面试题,你能答几道?
Linux 和网络
1、Linux系统的/data目录下有大量目录和文件,现在需要找出该目录下所有以demo开头的txt文件,并将其中的字符abc改成ddd?请给出相关的命令。
find /data -type f -name "demo*.txt" -exec sed -i 's/abc/ddd/g' {} + #这里的命令解释如下 #find /data -type f -name "demo*.txt":在/temp目录下查找所有以test开头并且扩展名为.txt的文件。 #-exec ... {} +:对每个找到的文件执行指定的命令。{}是一个占位符,代表当前找到的文件名。 #sed -i 's/abc/ddd/g' {}:使用sed命令替换文件内容。-i选项表示直接修改文件内容。 #'s/abc/ddd/g'是一个替换表达式,表示将abc替换为ddd。g标志表示全局替换,即替换每一行中的所有匹配项。
2、top 命令的显示结果中,关于CPU结果的us、sy、id、wa、st分别代表什么?
us 表示用户空间使用的 CPU 时间百分比。 sy 表示内核空间使用的 CPU 时间百分比。 id 表示空闲的 CPU 时间百分比。 wa 表示等待 I/O 操作的 CPU 时间百分比。 st 表示被其他虚拟机占用的 CPU 时间百分比(仅在虚拟化环境中出现)。
3、软链接与硬链接的区别?
软链接与硬链接的简明扼要区别如下: 本质:硬链接是同一文件的多个名字,指向同一inode;软链接是特殊文件,指向另一文件或目录的路径。 跨文件系统:硬链接不能跨文件系统;软链接可以。 链接对象:硬链接只能链接到文件;软链接可以链接到文件或目录。 存储空间:硬链接不占用额外空间(与源文件共享);软链接占用少量空间(存储路径信息)。 删除原始文件影响:删除硬链接指向的源文件,硬链接仍有效;删除软链接指向的源文件,软链接失效。 总结:硬链接更像文件的别名,而软链接像指向文件的快捷方式。硬链接更稳定,但灵活性不如软链接。
4、简述TCP三次握手的过程?
TCP三次握手是建立TCP连接时的过程。在三次握手中: 1)客户端发送一个SYN(同步)数据包到服务器, 2)服务器接收并回应一个SYN-ACK(同步-确认)数据包, 3)客户端再回应一个ACK(确认)数据包。 这样,客户端和服务器之间就建立了一个可靠的TCP连接。
5、进程和线程的区别是什么?
进程和线程的主要区别在于它们的独立性、资源分配、通信方式、开销以及并发性等方面。 进程是独立的执行单元,具有独立的地址空间和资源,而线程则是进程的一部分, 共享进程的地址空间和资源。这些差异使得进程和线程在操作系统中各自扮演着不同的角色,以满足不同的执行需求。
6、TCP和UDP协议有什么区别?
TCP和UDP协议的主要区别如下: 连接性:TCP是面向连接的,需要先建立连接;UDP是无连接的,直接传输数据。 可靠性:TCP提供可靠的数据传输,确保数据完整和有序;UDP不保证可靠性,可能丢包或乱序。 传输效率:TCP因有确认和重传机制,效率较低;UDP无此机制,传输更快。 适用场景:TCP适用于对可靠性要求高的场景,如文件传输;UDP适用于实时性要求高的场景,如视频会议。 综上所述,TCP注重可靠性,UDP注重效率,选择协议时需根据具体需求权衡。
7、Keepalived的工作原理是什么?
Keepalived的工作原理主要基于VRRP(虚拟路由冗余协议)实现高可用性服务。 它通过运行在每台服务器上来监测整个集群的运行状态,并提供故障切换和负载均衡功能。
8、 time_wait如何产生的,有什么优化方法?
TIME_WAIT状态是在TCP连接关闭过程中产生的一种状态。当TCP连接主动关闭的一方发起关闭连接请求后,它会进入TIME_WAIT状态。这个状态会持续一段时间,通常是2MSL(Maximum Segment Lifetime, 最大分节生命期)的时间长度。MSL是IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。在这段时间内,主动关闭的一方会保持这个连接状态,以确保在网络中的所有数据包都已经消失,防止旧的数据包被错误地传递到新的连接中。 TIME_WAIT状态的存在主要是为了实现TCP全双工连接的可靠释放,以及确保旧的数据包在网络中因过期而消失。然而,过多的TIME_WAIT状态可能会导致端口资源耗尽,从而影响新的连接建立。 针对TIME_WAIT状态的优化,有几种常见的方法: 1)修改内核参数:通过调整内核参数来缩短TIME_WAIT的等待时间。例如,可以修改tcp_tw_reuse和tcp_timestamp参数,使得处于TIME_WAIT状态的连接在特定条件下可以被重用。需要注意的是,tcp_tw_reuse参数只在调用connect()函数时起作用,因此它主要用于客户端(主动连接的一端)。 2)扩大本地端口范围:如果本地端口范围设置得太小,可能会导致端口耗尽和TIME_WAIT状态的增加。通过修改内核参数,如ip_local_port_range,可以扩大本地端口范围,从而减少端口耗尽的风险。 3)开启TCP连接复用:TCP连接复用可以在TIME_WAIT状态的连接被关闭后,立即将其端口重新分配给新的连接,而不必等待TIME_WAIT状态结束。这可以通过修改系统配置文件(如/etc/sysctl.conf)并重启相关服务来实现。 需要注意的是,虽然这些方法可以优化TIME_WAIT状态的处理,但也需要谨慎使用,以避免引入新的问题或安全隐患。在修改系统参数或配置之前,建议充分理解其影响并备份相关配置。
容器技术
1、Docker的网络模式有哪些?
**Docker网络模式简述:** - **Bridge**(默认):创建独立的虚拟网桥,容器间可互通,通过端口映射与宿主机通信。 - **Host**:容器使用宿主机网络栈,与宿主机共享IP和端口。 - **None**:无网络功能,用于完全隔离网络环境的场景。 - **Container**:复用另一个容器的网络栈,两个容器共享网络资源。 另外,Docker还支持自定义网络(如Overlay),以满足更复杂、跨主机的网络需求。
2、K8s有哪些组件,用途分别是什么?
**Kubernetes核心组件及用途简述:** - **kube-apiserver**:集群的统一接口,处理API请求并维护集群状态数据。 - **etcd**:分布式键值存储系统,存储集群配置和状态信息。 - **kube-scheduler**:负责Pod在Node上的智能调度。 - **kube-controller-manager**:运行多个控制器以维持集群期望状态(如副本数量、节点状态等)。 - **kubelet**:每个Node上运行,接收指令执行容器操作并与Container Runtime交互。 - **Container Runtime**(如Docker):管理镜像与容器生命周期。 - **kube-proxy**:实现服务发现与负载均衡功能。 其他关键组件: - **kube-dns/CoreDNS**:提供内部DNS解析。 - **Ingress Controller**:管理外部访问路由规则。 - **Service Account & Token Manager**:为Pod提供安全API访问凭据。 - **Dashboard**:可视化管理和监控界面。 - **Volume插件/CSI**:支持各种存储卷类型动态挂载到Pod中。 - **网络插件**(如Calico、Flannel):实现跨节点容器网络互通。
3、为什么K8s要使用Pod,而不直接使用容器,这样能带来什么好处?
Kubernetes 使用 Pod 而非直接操作容器,主要原因包括: - **资源共享**:Pod 内的多个容器共享网络命名空间、存储卷等资源,简化了配置与交互。 - **性能优化**:减少容器间通信开销,提高效率,尤其适用于紧密耦合的应用组件。 - **生命周期同步**:Pod 内所有容器统一创建、调度和销毁,便于管理相关联的服务或应用组件。 - **抽象层级提升**:提供跨容器运行时的兼容性,用户关注点集中于Pod层面而非底层容器技术。 - **封装便捷性**:通过Pod封装多容器应用为一个调度单元,利于集群调度系统处理。
4、Kubernetes 中的 Deployment 和 StatefulSet 有何区别?
**Deployment vs StatefulSet 简要对比:** - **Deployment**: - 管理无状态应用,实例间可互换。 - 支持自动扩缩容和滚动更新。 - Pod 副本不保证网络标识持久性和有序创建/销毁。 - **StatefulSet**: - 管理有状态应用,如数据库,需要稳定的网络标识和持久化存储。 - 每个Pod具有唯一、持久的名称和网络标识,且有序创建/销毁。 - 与PersistentVolumes绑定以确保数据持久性,即使Pod重启或重新调度也不会丢失数据。 - 创建、升级时保持严格的顺序和稳定性。
5、解释一下 Kubernetes 中的亲和性调度(Affinity Scheduling)和反亲和性调度(Anti-Affinity Scheduling)。
亲和性调度(Affinity Scheduling)在Kubernetes中用于确保Pod被调度到具有特定标签的Node节点上,以满足性能、可用性或合规需求。它包含硬亲和性和软亲和性,分别对应强制要求和优先级较高的偏好设置。 反亲和性调度(Anti-Affinity Scheduling)则相反,旨在避免Pod被调度到带有特定标签的Node上,主要用于实现Pod之间的隔离和提高容错性。同样有硬反亲和性和软反亲和性之分。 两者结合使用,为Kubernetes集群提供了更精细化的Pod调度策略,使得Pod能够按预设规则灵活分布于不同节点。
监控系统
1、讲讲你对监控的理解,监控的目的是什么?
监控,顾名思义,是对特定对象或系统的实时观测和数据收集过程,以确保其正常运行、及时发现异常情况并进行有效管理。其目的是: 状态感知:通过持续收集各类性能指标(如系统资源利用率、网络流量、业务请求量等),了解被监控对象的实时状态和健康状况。 故障预警:在问题发生初期或即将发生时发出预警,防患于未然,减少因故障导致的服务中断时间。 问题定位与分析:当出现问题时,能够快速定位故障点,为运维人员提供详细的问题分析依据,提高排障效率。 性能优化:通过对历史数据的分析,可以评估系统瓶颈,指导资源合理分配,优化系统架构和服务性能。 安全保障:对于信息系统而言,监控也是安全保障的重要环节,可以及时发现并阻止潜在的安全威胁和攻击行为。 综上所述,监控的核心目标在于提升服务的稳定性和可用性,降低运维成本,并为企业决策提供有力的数据支持。
2、Prometheus的主要组件有哪些?
Prometheus的主要组件包括: Prometheus Server:核心,负责抓取并存储监控数据,提供查询和告警规则管理。 Exporter:将第三方服务数据转换为Prometheus可读格式。 Pushgateway:支持临时任务推送监控数据。 Alertmanager:处理告警信息,实现通知逻辑。 Service Discovery:自动发现被监控服务的机制。 另外,常与Prometheus配套使用的还有: Grafana:用于数据可视化和仪表盘构建。 远程存储适配器(可选):对接远程存储系统以持久化数据。
3、Prometheus的Exporter有什么用途,你用过哪些Exporter?
Prometheus的Exporter主要用于将不同服务、系统和硬件设备的监控数据转换成Prometheus可以识别和抓取的时间序列格式。这些Exporter通常部署在被监控的目标上,通过HTTP端口暴露标准化的/metrics接口,使得Prometheus Server能够周期性地拉取并存储相关指标。 Prometheus Exporter的用途: Node Exporter:用于收集主机级别的资源使用情况,如CPU、内存、磁盘空间、网络流量等。 MySQL Exporter:专门用于从MySQL数据库中提取性能指标,如查询速率、连接数、缓存命中率等。 Redis Exporter:用于监控Redis数据库的键值统计、内存占用以及命令执行情况等信息。 JMX Exporter:针对Java应用程序,通过JMX(Java Management Extensions)接口暴露应用内部的各种性能指标。 Kafka Exporter:用以获取Apache Kafka集群的各项关键性能指标,例如分区、主题、生产者与消费者统计数据。 HAProxy Exporter:用于收集HAProxy负载均衡器的状态、会话数量、吞吐量及延迟等指标。 Blackbox Exporter:进行HTTP(S)、DNS、TCP等各种网络服务的黑盒监控,测试服务可用性和响应时间。 除了上述通用Exporter之外,还有许多其他特定于服务或系统的Exporter,比如Nginx Exporter、ZooKeeper Exporter、Cassandra Exporter等等,它们都分别针对各自的服务提供相应的监控数据给Prometheus。用户可以根据自己的技术栈和监控需求选择合适的Exporter或者开发自定义的Exporter来满足个性化监控要求。
4、如何使用Prometheus监控HTTP服务?
要使用Prometheus监控HTTP服务,可以简化为以下步骤: 安装并配置Prometheus。 在Prometheus配置中设置服务发现,以识别HTTP服务。 在HTTP服务中添加Prometheus格式的监控指标端点。 在Prometheus中配置监控规则(如警报)。 启动Prometheus并查看监控数据。 可选:使用Grafana进行可视化展示。 这些步骤概述了基本的Prometheus监控设置流程,具体细节可参考官方文档。
5、Prometheus是否支持高可用性(HA)部署?如果是,如何实现?
Prometheus支持高可用性部署。实现方式包括: 使用多副本集群,提高可用性和性能。 利用服务发现和标签选择器自动发现服务。 数据持久化和备份,确保数据稳定性。 设计分布式架构,如使用Prometheus Federation,处理性能瓶颈和数据汇总问题。 具体实现方式需根据环境和需求定制。
网站运维
1、当访问网站时出现401、404和503错误时,分别是什么原因导致的?
当访问网站时出现401、404和503错误时,它们各自代表不同的原因: 401错误:未授权错误(Unauthorized)。这通常意味着用户没有提供正确的身份验证凭据,或者用户没有足够的权限访问请求的资源。简单来说,就是用户没有通过网站的认证,无法访问页面内容。 404错误:页面未找到错误(Not Found)。这表示用户请求的页面在服务器上不存在。可能是因为页面已被删除、移动或从未存在过。用户输入的URL可能有误,或者网站的内容结构已经改变。 503错误:服务不可用错误(Service Unavailable)。这通常是由于服务器暂时过载或正在进行维护而无法处理请求。这是一种服务器端的错误,表明服务器当前无法提供服务,用户需要等待一段时间再试。 这些错误码是HTTP协议中定义的,用于帮助用户和开发人员了解访问网站时发生的问题类型。
2、网站发布中的灰度发布是指什么?
灰度发布(Gray Release),又称灰度测试或金丝雀发布,是一种在发布新版本或更新功能之前,允许部分用户访问新版本或功能的策略。通过逐步扩大用户范围,降低发布风险,确保整体系统稳定,最终完成全面推广。这种策略有助于优化产品设计并提升用户体验。
3、什么是反向代理?
反向代理是介于用户和目标服务器之间的代理服务器。用户访问反向代理服务器,再由其转发请求至目标服务器,对用户隐藏了真实服务器的地址,提高了安全性和访问速度。常用于Web加速,提升网站性能。
4、Nginx的优点有哪些?
Nginx的优点主要包括: 高性能:能轻松处理大量并发连接,适用于高流量场景。 高可靠性:采用多进程设计,保证服务的连续性和稳定性。 配置灵活:模块化设计,易于扩展和定制。 负载均衡:支持多种算法,实现分布式处理和负载均衡。 反向代理:支持高效缓存和加速,提升网站性能。 安全性高:能有效抵御网络攻击。 综上,Nginx是一款功能强大、性能优越的Web服务器和反向代理服务器。
5、如果一个网站的打开速度很慢,请说下你的排查思路?
网站打开速度慢,排查思路如下: 网络检查:首先确认用户网络是否稳定,尝试更换网络环境或使用其他设备访问,排除网络问题。 服务器性能:检查服务器负载、带宽、CPU及内存使用情况,确保服务器性能足够。 网站代码优化:检查是否有冗余代码、无效请求或过大的文件,优化代码结构,减少资源加载时间。 图片和媒体优化:压缩图片大小,使用适当的格式,减少视频和音频文件的大小和加载时间。 数据库查询优化:检查数据库查询是否高效,优化慢查询,减少数据库负担。 第三方服务:确认是否有外部API或服务调用影响加载速度,优化或替换慢响应的第三方服务。 CDN加速:考虑使用CDN(内容分发网络)来加速网站内容的分发。 浏览器缓存:利用浏览器缓存机制,减少重复加载相同资源。 日志分析:查看服务器和网站日志,分析慢请求的来源和原因。 使用工具:利用网页性能测试工具(如PageSpeed Insights、GTmetrix等)分析性能瓶颈。 综合以上各点,可以系统地排查网站打开速度慢的问题,并进行相应的优化。