8# SRE 工程师的面经 (WIP)

 

# 运维

1. [运维](#运维)
   1. [线下一个服务响应很慢, 你如何排查? 排查流程是?](#线下一个服务响应很慢-你如何排查-排查流程是)
      1. [排除法](#排除法)
         1. [首先检查负载均衡系统](#首先检查负载均衡系统)
         2. [检查应用服务器](#检查应用服务器)
         3. [检查与应用相关文件服务器](#检查与应用相关文件服务器)
         4. [检查缓存服务器. 同上](#检查缓存服务器-同上)
         5. [检查数据库](#检查数据库)
         6. [排查是否被挂马](#排查是否被挂马)
         7. [排查最近更新的业务程序是不是用了奇怪的死循环或者海量查询](#排查最近更新的业务程序是不是用了奇怪的死循环或者海量查询)
   2. [熔断, 限流, 降级的区别?](#熔断-限流-降级的区别)
   3. [Linux 系统](#linux-系统)
      1. [都说 Linux 下一切皆文件, 你是怎么理解的?](#都说-linux-下一切皆文件-你是怎么理解的)
      2. [都说 socket 在 Linux 实际是一个文件, 是通过什么技术将 socket 变成一个文件的?](#都说-socket-在-linux-实际是一个文件-是通过什么技术将-socket-变成一个文件的)
      3. [Linux 下软 / 硬连接是什么, 他们有什么区别?](#linux-下软--硬连接是什么-他们有什么区别)
      4. [Linux 下一个用户登录以下文件加载顺序是? `~/.bash_profile, ~/.bash_login, ~/.profile, ~/.bashrc, /etc/profile`](#linux-下一个用户登录以下文件加载顺序是-bash_profile-bash_login-profile-bashrc-etcprofile)
      5. [都说 systemd 他可以并行启动, 他的实现原理是?](#都说-systemd-他可以并行启动-他的实现原理是)
      6. [僵尸进程 / 孤儿进程他们是? 区别是啥?](#僵尸进程--孤儿进程他们是-区别是啥)
      7. [为什么说 ssh 很安全? 具体原理是? 如何保证?](#为什么说-ssh-很安全-具体原理是-如何保证)
      8. [Linux 端口数一共多少, 怎么确定的?](#linux-端口数一共多少-怎么确定的)
      9. [举例 Linux 内置命令](#举例-linux-内置命令)
      10. [ACL 是什么意思?](#acl-是什么意思)
   4. [网络](#网络)
      1. [网络 mtu 是什么? 他发生在那一层, 如果 2 个设备 mtu 值不同, 以谁为准, 那么 2 个设备是如何协商的? 详细协商流程是?](#网络-mtu-是什么-他发生在那一层-如果-2-个设备-mtu-值不同-以谁为准-那么-2-个设备是如何协商的-详细协商流程是)
      2. [0.0.0.0 255.255.255.255 这 2 个 ip 地址是什么意思? 他们的适用场景是? VIP 如何漂移的? 他的底层原理是?](#0000-255255255255-这-2-个-ip-地址是什么意思-他们的适用场景是-vip-如何漂移的-他的底层原理是)
      3. [tunnel VPN 翻墙他实现的原理是, 他是怎么绕过防火墙的, 数据包传输流程, 他在那一层欺骗了防火墙等](#tunnel-vpn-翻墙他实现的原理是-他是怎么绕过防火墙的-数据包传输流程-他在那一层欺骗了防火墙等)
   5. [nginx](#nginx)
      1. [nginx 相关 正向 /反向代理是什么意思? 他们区别是?](#nginx-相关-正向-反向代理是什么意思-他们区别是)
      2. [一般架构 nginx 集群 -> 反向代理 -> tomcat, 为什么不能反过来部署呢?](#一般架构-nginx-集群---反向代理---tomcat-为什么不能反过来部署呢)
      3. [高并发 / 动静分离如何实现?](#高并发--动静分离如何实现)
   6. [Git](#git)
      1. [git 相关 svn/git 分别是? 他们有什么区别?](#git-相关-svngit-分别是-他们有什么区别)
      2. [都说 git 管理 /切分支轻量, 他们轻量在哪里, 具体原理是?](#都说-git-管理-切分支轻量-他们轻量在哪里-具体原理是)
      3. [`git rebase xxx` 发送冲突, 他的根本原因是? 不要说具体场景 `git fetch/git pull` 他们区别是?](#git-rebase-xxx-发送冲突-他的根本原因是-不要说具体场景-git-fetchgit-pull-他们区别是)
      4. [`index / local / remote / workspace` 他们是? 比如 `git add xxx` 他发生了什么?](#index--local--remote--workspace-他们是-比如-git-add-xxx-他发生了什么)
      5. [`git pull` 做了哪些工作?](#git-pull-做了哪些工作)
      6. [`git rebase` 和 `git marge` 区别是?](#git-rebase-和-git-marge-区别是)
   7. [Docker](#docker)
      1. [Dockerfile 优化](#dockerfile-优化)
      2. [`run yum install -y balabala & run yum clean cache` 这么写有问题吗?](#run-yum-install--y-balabala--run-yum-clean-cache-这么写有问题吗)
      3. [导出镜像时如何尽可能压缩体积?](#导出镜像时如何尽可能压缩体积)
      4. [如何解决 ubuntu 容器中没有 `ping, ifconfig, killall` 等命令的问题 是否需要解决这种问题?](#如何解决-ubuntu-容器中没有-ping-ifconfig-killall-等命令的问题-是否需要解决这种问题)
      5. [简单谈谈怎么用 compse 部署个 crud 系统](#简单谈谈怎么用-compse-部署个-crud-系统)
      6. [Docker 的 overlay2 storage driver 比起 overlay 有哪些改进? 是如何做到的?](#docker-的-overlay2-storage-driver-比起-overlay-有哪些改进-是如何做到的)
      7. [swarm 内部负载均衡突然死活路由不到某一个 worker 上了, 如何解决](#swarm-内部负载均衡突然死活路由不到某一个-worker-上了-如何解决)
      8. [`RUN rm -rf some_file` 镜像大小会减小吗?](#run-rm--rf-some_file-镜像大小会减小吗)
      9. [Docker Compose 概述](#docker-compose-概述)
      10. [都是 docker 轻量级, 他轻量在哪里, 从技术角度分析, 咱们都是搞技术, 不需要从产品角度分析他为什么轻量?](#都是-docker-轻量级-他轻量在哪里-从技术角度分析-咱们都是搞技术-不需要从产品角度分析他为什么轻量)
      11. [`docker volume, bind, mount` 他们区别是什么? 如何构建最小的镜像, 说说你的思路?](#docker-volume-bind-mount-他们区别是什么-如何构建最小的镜像-说说你的思路)
      12. [`docker -p/P` 他的实现原理是什么?](#docker--pp-他的实现原理是什么)
      13. [`ADD` 和 `copy` 的区别](#add-和-copy-的区别)
      14. [简述 / 阐述 docker 的网络原理, 底层实现](#简述--阐述-docker-的网络原理-底层实现)
   8. [MySQL](#mysql)
      1. [联合索引字段顺序会产生影响吗? 产生什么影响?](#联合索引字段顺序会产生影响吗-产生什么影响)
      2. [什么情况下需要建索引? 什么情况下不建?](#什么情况下需要建索引-什么情况下不建)
      3. [mysql 查看连接数和进程数?](#mysql-查看连接数和进程数)
      4. [慢查询是什么?](#慢查询是什么)
   9. [Redis](#redis)
      1. [redis 哨兵机制主从是如何切换的?](#redis-哨兵机制主从是如何切换的)
   10. [Kubernetes](#kubernetes)
      1. [k8s 请求到达 APIserver 的整个流程](#k8s-请求到达-apiserver-的整个流程)
      2. [k8s 部署应用一共有几种方式](#k8s-部署应用一共有几种方式)
      3. [k8s 自动扩容的底层实现原理](#k8s-自动扩容的底层实现原理)

## 线下一个服务响应很慢, 你如何排查? 排查流程是?

### 排除法

#### 首先检查负载均衡系统

1. 检查系统负载, 内存使用情况;
2. 检查磁盘空间使用情况;
3. 检查系统日志;
4. 检查应用程序运行情况, 执行命令 ipvsadmin, 有转发数而且数字不断变化, 这可以确认应用程序 keepalived 及 lvs 都是正常的.

#### 检查应用服务器

1. 检查服务器应用进程的 CPU, 内存, 磁盘占用情况;
2. 查看系统日志是否有文件系统损坏, 内核异常相关报错;
3. 检查 nginx 是否正常运行;

#### 检查与应用相关文件服务器

1. 检查文件服务器的运行压力;
2. 读日志;

#### 检查缓存服务器. 同上

#### 检查数据库

1. 检查守护进程运行情况;
2. 读日志, 检查是否有错误日志或异常输出;
3. 检查数据库连接进程状况;

#### 排查是否被挂马

#### 排查最近更新的业务程序是不是用了奇怪的死循环或者海量查询

## 熔断, 限流, 降级的区别?

- 熔断: 类似于电器的保险丝, 当某服务出现不可用或响应超时的情况时, 为了防止整个系统出现雪崩, 暂时停止对该服务的调用的行为. 熔断发生后, 通过策略去试探调用某服务, 服务回复可用后停止熔断行为.
- 限流: 上游服务对本服务请求 QPS 超过阙值时, 通过延迟处理, 拒绝处理等行为对请求量进行限制, 以保证本服务不被压垮, 从而持续提供稳定服务. 常见的限流算法有滑动窗口, 令牌桶, 漏桶等.
- 降级: 当服务压力过大时, 通过降低一些需求来保证处理能力持续可用, 譬如降低即时性和数据一致.

## Linux 系统

### 都说 Linux 下一切皆文件, 你是怎么理解的?

- 是一种面向对象的设计思想, 就是说将一切设备当做文件, 从而调用操作文件的接口. 串口, 内存, 蓝牙, 进程信息, 网卡, 建立的每个通讯都是文件. 这个原理与子类都能当做基类访问是一样的, 就是操作系统层面的面向对象思想.

### 都说 socket 在 Linux 实际是一个文件, 是通过什么技术将 socket 变成一个文件的?

- socket 也是一个接口, 本质是对 TCP / UDP / IP 的封装 API.

### Linux 下软 / 硬连接是什么, 他们有什么区别?

- 硬连接指通过索引节点来进行连接. Linux 文件系统中, 保存在磁盘分区中的文件都会获得一个索引节点号号, 多个文件名指向同一索引节点的连接就是硬连接. 硬连接的作用是允许一个文件拥有多个有效路径名 (文件真正删除的条件是与之相关的所有硬连接文件均被删除). Symbolic Link 叫软连接. 软链接文件有类似于 Windows 的快捷方式, 实际上是一个特殊的文件, 文件实际上是一个文本文件, 其中包含的有另一文件的位置信息.

### Linux 下一个用户登录以下文件加载顺序是? `~/.bash_profile, ~/.bash_login, ~/.profile, ~/.bashrc, /etc/profile`

```shell
# load global environment variable
execute /etc/profile
# detect user environment variable
if ~/.bash_profile exists then
execute ~/.bash_profile
# load user environment variable
if ~/.bashrc exists then
execute ~/.bashrc
fi
else
if ~/.bash_login exist then
execute ~/.bash_login
else
if ~/.profile exist then
execute ~/.profile
end if
end if
end if

```

> 非登录情况加载: `~/.bashrc, /etc/bashrc`

### 都说 systemd 他可以并行启动, 他的实现原理是?

- systemd 通过 socket 激活的机制让所有程序全部并行启动, 且仅按照系统启动的需要启动相应的服务.

### 僵尸进程 / 孤儿进程他们是? 区别是啥?

- 僵尸进程: 子进程停止活动但未释放资源.
- 父进程停止后, 依然正常运行的子进程, 会进入 init 进程托管直到任务结束后释放资源.

### 为什么说 ssh 很安全? 具体原理是? 如何保证?

- 结合对称与非对称加密保护通信通道.
- 修改端口, 只用证书登录, ip 黑白名单, 开启两步验证.

### Linux 端口数一共多少, 怎么确定的?

- 65536 (可用的 = 65536-去掉一些系统保留端口 (0-1024)), 即一个 short 类型的量.

### 举例 Linux 内置命令

- 例如: `pwd, echo, which, type`; 使用 `type` 可以查看一个命令是不是内置的.

### ACL 是什么意思?

- Access Control List, Linux 的一个权限管理应用.

## 网络

### 网络 mtu 是什么? 他发生在那一层, 如果 2 个设备 mtu 值不同, 以谁为准, 那么 2 个设备是如何协商的? 详细协商流程是?

### 0.0.0.0 255.255.255.255 这 2 个 ip 地址是什么意思? 他们的适用场景是? VIP 如何漂移的? 他的底层原理是?

### tunnel VPN 翻墙他实现的原理是, 他是怎么绕过防火墙的, 数据包传输流程, 他在那一层欺骗了防火墙等

## nginx

### nginx 相关 正向 /反向代理是什么意思? 他们区别是?

### 一般架构 nginx 集群 -> 反向代理 -> tomcat, 为什么不能反过来部署呢?

### 高并发 / 动静分离如何实现?

## Git

### git 相关 svn/git 分别是? 他们有什么区别?

### 都说 git 管理 /切分支轻量, 他们轻量在哪里, 具体原理是?

### `git rebase xxx` 发送冲突, 他的根本原因是? 不要说具体场景 `git fetch/git pull` 他们区别是?

### `index / local / remote / workspace` 他们是? 比如 `git add xxx` 他发生了什么?

### `git pull` 做了哪些工作?

- `git pull``git fetch + git merge`, 将远程仓库内容拉取到本地再与本地仓库相同分支的内容进行合并.

### `git rebase``git marge` 区别是?

## Docker

### Dockerfile 优化

- 移除 apt 的 cache, 对经常变化的指令放在最后 可以优化增量部分
- 参考 nginx 的 alpine.

### `run yum install -y balabala & run yum clean cache` 这么写有问题吗?

- 有, 一个 `run` 对应一层`layer`, docker 镜像会记录每一次 `run` 直接的 diff, 上面的单独 `run yum clean cache` 并不会减小镜像大小.

### 导出镜像时如何尽可能压缩体积?

- 11

### 如何解决 ubuntu 容器中没有 `ping, ifconfig, killall` 等命令的问题 是否需要解决这种问题?

- 22

### 简单谈谈怎么用 compse 部署个 crud 系统

### Docker 的 overlay2 storage driver 比起 overlay 有哪些改进? 是如何做到的?

### swarm 内部负载均衡突然死活路由不到某一个 worker 上了, 如何解决

### `RUN rm -rf some_file` 镜像大小会减小吗?

### Docker Compose 概述

- Compose 是一个用于定义和运行多容器 Docker 应用程序的工具, 适用于所有环境: 生产, 登台, 开发, 测试以及 CI 工作流程.

### 都是 docker 轻量级, 他轻量在哪里, 从技术角度分析, 咱们都是搞技术, 不需要从产品角度分析他为什么轻量?

### `docker volume, bind, mount` 他们区别是什么? 如何构建最小的镜像, 说说你的思路?

### `docker -p/P` 他的实现原理是什么?

### `ADD``copy` 的区别

- `ADD` 能加载网络源, `copy` 只能加载本地源, `ADD``copy` 的超集.

### 简述 / 阐述 docker 的网络原理, 底层实现

## MySQL

### 联合索引字段顺序会产生影响吗? 产生什么影响?

- 会, 最左优先原则: 要想 SQL 执行的时候能够用到联合索引, 那么联合索引中的第一个字段一定要在 where 语句中, 并且不能让该字段参与任何运算.

### 什么情况下需要建索引? 什么情况下不建?

- 那么如果查询语句的查询条件仅用到 `primary key`, 那么就不需要增加索引, 此外如果查询条件的字段是仅包含两三个值的枚举类型, 也是不需要增加索引.

### mysql 查看连接数和进程数?

- `show processlist`

### 慢查询是什么?

- SQL 的执行时间超过 MySQL 中 `long_query_time` 参数的值的时候, 会被记录到慢查询 SQL 日志文件中.

## Redis

### redis 哨兵机制主从是如何切换的?

## Kubernetes

### k8s 请求到达 APIserver 的整个流程

### k8s 部署应用一共有几种方式

### k8s 自动扩容的底层实现原理


评论

此博客中的热门博文

17# Apache Spark 的学习笔记 (WIP)

20# Apache Kafka 的学习笔记

1# 失败的赛博空间匿名技术的思考