运维面试总结

1,340 阅读17分钟

汇总运维在面试过遇到的问题

1、tcp和udp的区别

TCPUDP
tcp是面向连接的,需要经过三次握手后才能连接udp是无连接的,直接发送数据即可
tcp提供可靠传输,无差错,不丢失udp尽最大努力交付,即不保证可靠交付
面向字节流面向报文
点对点连接一对一,一对多,多对一,多对多

2、tcp三次握手四次挥手

三次握手

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手


四次挥手过程

 第一次挥手:客户向服务器发送FIN段(FIN=1),请求释放连接,等待服务器确认
 第二次挥手:服务器向客户发送ACK段(ACK=1)
 第三次挥手:服务器向客户发送FIN段(FIN=1),请求释放连接,等待客户确认

 第四次挥手:客户向服务器发送ACK段,并等待2MSL时间后关闭连接;服务器收到ACK段后马上关闭连接
 
 
 为什么是四次??
 
 因为服务端还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文
 
 为什么客户端在TIME-WAIT阶段要等2MSL?
 
  客户在TIME_WAIT状态之所以要等待2MSL时间才真正释放连接,一方面是为了以防最后一次ACK段丢失,会导致服务器重发FIN,这样在客户端真正释放连接前还可以再次发送ACK段,尽可能确保服务器尽快释放连接;另一方面是为了保证在2MSL期间,该连接的本地端点地址(IP+PORT)不被再次使用,避免可能的较早连接请求到达,被误认为时新连接请求

3、https传输是怎么是安全的?

https相对于http,其实就是在http和tcp之间多加了一层TLS/SSL加密协议
原先是应用层将数据直接给到TCP进行传输,现在改成应用层将数据给到TLS/SSL,将数据加密后,再给到TCP进行传输。现在一般加密套件都是TLS,TLS是SSL的升级版
加密又又对称加密和非对称加密两种

4、nginx状态码499过很多,如何解决?

499 :client has closed connection
499产生的原因“服务端处理时间太长,客户端主动断开”,即服务器upstream处理过慢,导致用户提前关闭连接,可以通过修改nginx配置proxy_ignore_client_abort on;来解决

5、redis cluster集群分片机制是怎么样的?

Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:slot = CRC16(key) & 16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。

6、redis 配置中rdb aof区别?

RDBAOF
RDB很适用于灾难恢复,它只有一个文件AOF持久化会让Redis变得非常耐久,以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync
RDB可以最大化redis性能,生成RDB快照时redis会fock出一个子进程,由子进程处理保存快照工作,父进程无磁盘I/O操作AOF文件有序保存了所有写入操作,可以很轻松的对文件进行分析和导出
RDB恢复速度比AOF快自动缩小:当aof文件大小到达一定程度的时候,后台会自动的去执行aof重写
缺点:在数据量庞大的时候,fork进程会很耗时缺点:性能相对较差
缺点:不能事实保存快照数据,存在数据丢失的风险缺点: 体积相对更大,恢复速度更慢

7、redis缓存过期key优化

为啥设置了expire过期key,内存没有释放

key设置过期时间了,ttl为0后并不会自行删除该key,而是等到下次访问该key发现已过期,才会删除。 解决方法:

  1. 命令keys * 会瞬间释放所有过期key,但是有风险,慎行。
  2. 其实缓存是在释放的,只不过是没有那么快,释放的快慢取决于redis.conf中的hz参数默认为10,意思是每秒执行10次删除过期key。所以在redis过期较多的场景可以适当调大。并观察cpu是否升高, 提高它的值将会占用更多的cpu,固然相应的redis将会更快的处理同时到期的许多key,和更精确的去处理超时 可在命令行执行:config set hz 50

8、简述Kubernetes创建一个Pod的主要流程?

1.客户端提交pod配置信息到apiserver
2.apiserver收到指令后,会通知controll-manager创建资源对象
3.apiserver会讲配置信心存储到etcd数据中心
4.scheduler检测到pdo信息后开始调度预选,会先过滤掉不符合pod资源配置的节点,然后开始调度优选评分,挑选出更适合的pod节点,然后将pod资源配置信息发送到node节点上的kubelet组件上
5.kubelet根据scheduler发来的资源配置运行pod,运行结果返回scheduler,scheduler将运行状况信息存储到etcd数据中心

9、Memcache与Redis的区别都有哪些?

MemcacheRedis
数据不能持久化可持久化数据
只支持简单字符串丰富的数据类型,list set hash
只有1M大小value值大小 string类型最大到512M

10、python 用一行实现对一个列表中元素做平方操作


    * 列表生成式 : newlist =  [a*a for a in list]
    * map 函数:  newlist = map(lambda a:a*a,list)
A1 = [1,2,3,4,5,6]
print(list(map(lambda x:x*2,A1)))
print([a*2 for a in A1])

11、docker网络模式

网络模式说明
host模式容器和宿主机共享网络空间
none模式使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP,只有回环网络,没有网卡
container模式新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享
briage模式默认为该模式,Docker启动时,会创建一个docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,工作在二层网络中,从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中

12、Dockerfile中cmd和entrypoint的区别

CMD(默认方式)ENTRYPOINT
Dockerfile中只能有一条CMD指令,如果有多个CMD 则只有最后一个CMD才会生效如果Dockerfile中有CMD和ENTRYPOINT,那么CMD将作为ENTRYPOINT的参数执行
docker run指定的cmd可以覆盖Dockerfile中定义的CMDdocker run --entrypoint可覆盖Dockerfile定义的ENTRYPOINT

13、docker存储驱动有哪些?

Driver说明特点
overlay2首选存储驱动程序,官方推荐文件级别存储
aufs内核支持文件级别存储
devicemapper以后可能会废弃块级别存储,适合io密集

14、docker数据存储方式?

optionsinformation
volumes首选,基于本地文件系统Volumn管理,通过-v参数,volume中的数据并不会因为容器的删除二消失,实现了数据持久化的目标。但是这种方式的volume需要在Dockerfile中使用VOLUME来预先指定容器中的数据存放路径
bind mounts可以动态的指定容器内文件存放路径和宿主机上的数据库卷目录,通过--mount,

docker run -d -p 80:80 --mount type=bind,source=/Users/u51/Desktop/dockerfile/,target=/usr/share/nginx/html --name web xull_n

15、elastisearch分片机制是怎么分配的?

Elasticsearch6.X及之前的版本默认索引分片数为5、副本数为1,从Elasticsearch7.0开始调整为默认索引分片数为1、副本数为1.
数据的最小单元块,ES默认为一个索引创建1个主分片,并分别为其创建一个副本
建议:(仅参考)
SN(分片数) = IS(索引大小) / 10-40G
   1、每一个分片数据文件小于10-40GB
   2、每一个索引中的一个分片对应一个节点
   3、节点数大于等于分片数

16、nginx工作机制是怎样的?

通常采用1个master+多个worker进程配合异步非阻塞的工作机制。
master进程主要负责管理自身和下属的worker进程,worker负责处理请求。 
master(master进程会先建立好需要listensocket)---fork生成子进程,继承socket(每个进程监控同一ip和端口)---当一个连接进入,产生惊群现象,所有进程都会收到通知,但只有一个进程能够抢到互斥锁,accept这个连接,其他进程则失败。
惊群现象:指一个fd事件被触发后,等候这个fd的所有进程、线程都被唤醒,但是只有一个会去响应。

worker进程工作:
当一个worker在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,一个完整的请求。一个请求,完全由worker进程来处理,而且只在一个worker中处理

为什么Nginx支持高并发?
1个worker进程只有一个主线程,采用异步非阻塞的工作方式实现高并发。即每进来一个请求,会有一个worker去处理,但不是全程处理,处理到可能发生阻塞的地方(比如向后端FPM转发请求,并等待请求返回),这个worker不会这个傻等,它会在发送请求后,注册一个事件:如果有返回了,通知我。于是worker就去休息(继续监听连接),再有请求进来同样处理。一旦FPM返回了,就会触发事件,worker接手,请求才会往下走

worker_processes 工作进程数,一般设置为CPU核心数
worker_connections 单个工作进程可以允许同时建立外部连接的数量 

17、elasticsearch优化

  1. 选择合适的硬件,尽量选择SSD硬盘
  2. es服务配置合适的jvm内存,建议配置为机器的一半内存,不超过32G
  3. 规模较大集群,配置专门主节点、数据节点,避免脑裂情况发生 主节点:node.master:true node.data: false node.ingest:false 数据节点:node.master:false node.data:true node.ingest:true
  4. linux系统调优
  5. 调大refresh_interval间隔

18、CDN加速原理?

19、docker exec的原理?

docker exec 的原理,大致概况一句话是:一个进程可以选择加入到某个进程已有的 Namespace 当中,从而达到“进入”这个进程所在容器的目的。

20、dockfile中 add和copy的区别?

COPY指令和ADD指令的唯一区别在于:是否支持从远程URL获取资源。

COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。

相同需求时,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩

21、elasticsearch 节点配置的最大内存是多少?32G内存

22、nginx中匹配的优先级

23、nginx中重定向的flag标识符有哪些?

  • last:使用 replacement 的地址重新进行 location 匹配
  • break:会停止后面脚本的执行
  • redirect:返回 302 重定向,地址栏显示重定向后的url
  • permanent:返回 301 重定向,地址栏显示重定向后的url

24、nginx中cache-control和expires有什么区别?谁的优先级更高?

设置以分钟为单位的绝对过期时间, 优先级比Cache-Control低, 同时设置Expires和Cache-Control则后者生效. 也就是说要注意一点:  Cache-Control的优先级高于Expires

25、jvm回收机制

26、linux上load是什么意思?

27、ansible中常用到的模块有哪些?

  命令模块:command和shell,command不能执行|管道特殊字符,shell可以执行
  文件模块: file(远程主机上file操作,删除创建属性等)、copy
  yum、usergroup、service、ping

28、Elasticsearch 的实现原理?

    主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。Elasticsearch是如何做到快速索引的?Elasticsearch使用的倒排索引比关系型数据库的B-Tree索引快

29、es 写数据过程

  • 客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)。
  • coordinating node 对 document 进行路由,将请求转发给对应的 node(有 primary shard)。[路由的算法是?]
  • 实际的 node 上的 primary shard 处理请求,然后将数据同步到 replica node。
  • coordinating node 如果发现 primary node 和所有 replica node 都搞定之后,就返回响应结果给客户端。

30、es 读数据过程

  • 可以通过 doc id 来查询,会根据 doc id 进行 hash,判断出来当时把 doc id 分配到了哪个 shard 上面去,从那个 shard 去查询。
  • 客户端发送请求到任意一个 node,成为 coordinate node。
  • coordinate node 对 doc id 进行哈希路由,将请求转发到对应的 node,此时会使用 round-robin随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡。
  • 接收请求的 node 返回 document 给 coordinate node。
  • coordinate node 返回 document 给客户端。 写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。

31、redis高可用方案优缺点

主从模式

优点

  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离;
  • 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务依然必须由Master来完成;
  • Slave同样可以接受其他Slaves的连接和同步请求,这样可以有效地分载Master的同步压力;
  • Master是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求;
  • Slave同样是以阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。

缺点

  • Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复;
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性;
  • 如果多个Slave断线了,需要重启的时候,尽量不要在同一时间段进行重启。因为只要Slave启动,就会发送sync请求和主机全量同步,当多个Slave重启的时候,可能会导致Master IO剧增从而宕机。
  • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂;
  • redis的主节点和从节点中的数据是一样的,降低的内存的可用性
哨兵模式

优点

  • 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
  • 主从可以自动切换,系统更健壮,可用性更高。

缺点

  • 具有主从模式的缺点,每台机器上的数据是一样的,内存的可用性较低。
  • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂

集群模式

优点

  • 采用去中心化思想,数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布;

  • 可扩展性:可线性扩展到 1000 多个节点,节点可动态添加或删除;

  • 高可用性:部分节点不可用时,集群仍可用。通过增加 Slave 做 standby 数据副本,能够实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave 到 Master 的角色提升;

  • 降低运维成本,提高系统的扩展性和可用性。

缺点

  • Redis Cluster是无中心节点的集群架构,依靠Goss协议(谣言传播)协同自动化修复集群的状态

但 GosSIp有消息延时和消息冗余的问题,在集群节点数量过多的时候,节点之间需要不断进行 PING/PANG通讯,不必须要的流量占用了大量的网络资源。虽然Reds4.0对此进行了优化,但这个问题仍然存在。

  • 数据迁移问题

Redis Cluster可以进行节点的动态扩容缩容,这一过程,在目前实现中,还处于半自动状态,需要人工介入。在扩缩容的时候,需要进行数据迁移。

而 Redis为了保证迁移的一致性,迁移所有操作都是同步操作,执行迁移时,两端的 Redis均会进入时长不等的阻塞状态,对于小Key,该时间可以忽略不计,但如果一旦Key的内存使用过大,严重的时候会接触发集群内的故障转移,造成不必要的切换

32、DNS查询方式

image.png 当局部DNS自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询,有2种查询方式

递归查询

局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端

fa1.jpg

迭代查询

局部DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查

a.jpg

持续更新中......