汇总运维在面试过遇到的问题
1、tcp和udp的区别
| TCP | UDP |
|---|---|
| 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区别?
| RDB | AOF |
|---|---|
| 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发现已过期,才会删除。 解决方法:
- 命令keys * 会瞬间释放所有过期key,但是有风险,慎行。
- 其实缓存是在释放的,只不过是没有那么快,释放的快慢取决于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的区别都有哪些?
| Memcache | Redis |
|---|---|
| 数据不能持久化 | 可持久化数据 |
| 只支持简单字符串 | 丰富的数据类型,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中定义的CMD | docker run --entrypoint可覆盖Dockerfile定义的ENTRYPOINT |
13、docker存储驱动有哪些?
| Driver | 说明 | 特点 |
|---|---|---|
| overlay2 | 首选存储驱动程序,官方推荐 | 文件级别存储 |
| aufs | 内核支持 | 文件级别存储 |
| devicemapper | 以后可能会废弃 | 块级别存储,适合io密集 |
14、docker数据存储方式?
| options | information |
|---|---|
| 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进程会先建立好需要listen的socket)---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优化
- 选择合适的硬件,尽量选择SSD硬盘
- es服务配置合适的jvm内存,建议配置为机器的一半内存,不超过32G
- 规模较大集群,配置专门主节点、数据节点,避免脑裂情况发生
主节点:
node.master:true node.data: false node.ingest:false数据节点:node.master:false node.data:true node.ingest:true - linux系统调优
- 调大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、user、group、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查询方式
当局部
DNS自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询,有2种查询方式
递归查询
局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端
迭代查询
局部DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查
持续更新中......