---
title: 面试题
taxonomy:
    category: docs
---

#### No.17：LVS 如何做到高性能？

要实现高性能的 LVS，可以采取以下措施：

1. 运行在内核态：LVS 运行在内核态，避免了用户态到内核态的上下文切换导致的内存读写开销。这样可以大幅提升大流量下的数据处理能力。
2. 修改目的 IP 地址：LVS 只需要对数据包的目的 IP 地址进行修改，然后利用二层网络做基础的数据转发。这个策略让 LVS 承担了最少的计算和流量转发工作，增加了 CPU 和内存的资源利用率，从而大幅提升了单机性能。
3. 分布式调度：LVS 可以轻松地组成一个逻辑集群，可以进行分布式调度。通过利用多台物理机的资源，可以打造出一个行为一致的负载均衡集群。这样可以实现负载均衡的高可用性和高性能。

#### No.18：负载均衡器是怎样修改数据包的？

负载均衡器通过修改数据包的源地址、目标地址、端口号等信息来实现请求的转发和负载均衡。具体的修改方式取决于负载均衡器的实现方式和工作层级。

在网络层（第三层）的负载均衡中，如LVS（Linux Virtual Server），数据包修改通常是通过网络地址转换（NAT）技术实现的。具体步骤如下：

1. 通过配置负载均衡器，将其设置为对外公开的入口，即公网 IP 地址。
2. 当客户端发送请求时，请求首先到达负载均衡器。
3. 负载均衡器根据设定的负载均衡算法选择一个后端服务器。
4. 负载均衡器将客户端请求中的目标 IP 地址和端口号修改为所选择的后端服务器的 IP 地址和端口号，并将修改后的数据包转发给该后端服务器。
5. 后端服务器接收到转发的数据包后，处理请求并将响应返回给负载均衡器。
6. 负载均衡器再将响应中的源 IP 地址和端口号修改为负载均衡器自身的 IP 地址和端口号，并将响应转发给客户端。

在传输层（第四层）的负载均衡中，如四层负载均衡器，数据包修改一般是通过代理方式实现的。具体步骤如下：

1. 客户端发送请求到负载均衡器。
2. 负载均衡器接收到请求后，建立一个与客户端的连接，并同时建立一个与后端服务器的连接。
3. 负载均衡器将客户端请求中的数据包直接转发给后端服务器。
4. 后端服务器处理请求并将响应返回给负载均衡器。
5. 负载均衡器将响应中的数据包直接转发给客户端。

#### No.19：Keepalived 高可用的运行原理？

Keepalived 是一个基于 VRRP（Virtual Router Redundancy Protocol，虚拟路由冗余协议）的高可用解决方案。其运行原理如下：

1. **虚拟路由冗余协议（VRRP）**：VRRP 是一种网络协议，允许多个路由设备组成一个逻辑组，并模拟为一个虚拟路由器，提供共享的虚拟 IP 地址。在 Keepalived 中，VRRP 用于将虚拟 IP 地址关联到一个活跃的服务器节点上，其他服务器节点充当备份节点。VRRP 协议周期性地发送 VRRP 消息（包含优先级、状态信息等），通过选择优先级最高的活跃节点来分配虚拟 IP 地址。

2. **主备切换**：在 Keepalived 集群中，一个服务器被指定为主服务器（Master），另外一台或多台服务器作为备份服务器（Backup）。主服务器负责处理所有请求并接收来自路由器的数据包，备份服务器则处于待命状态。如果主服务器发生故障，备份服务器中的 VRRP 进程会探测到主服务器不可达的情况，并通过 VRRP 协议选举过程将备份服务器切换为活跃节点，接管主服务器的责任。

3. **健康检查**：Keepalived 还提供了健康检查机制，用于监测每个服务器的状态。通过定期发送心跳包或检查特定端口的连通性，Keepalived 可以判断服务器是否正常运行。如果某个服务器无法检测到其他服务器的心跳或检测到服务器故障，它将触发 VRRP 切换过程，将备份服务器切换为活跃服务器。

4. **负载均衡**：除了故障转移功能，Keepalived 还可以实现负载均衡。通过配置虚拟 IP 地址关联到多个服务器上，来平衡流量分布。当请求到达负载均衡器时，它会根据一定的算法（如轮询、加权轮询等）将请求转发到不同的服务器节点，以实现负载均衡和提高性能。

#### No.20：如何实现负载均衡的高可用？

在系统架构中，负载均衡作为最明显的单点，其高可用能力至关重要。因此，通常需要对系统的负载均衡进行集群和高可用架构的设计。对于负载均衡来说，集群化相对简单，而实现高可用性则需要借助诸如 Keepalived 等工具来实现。具体来说主要有以下手段：

1. 多节点部署：在负载均衡环境中，运行多个负载均衡器节点。这些节点可以是物理设备、虚拟机或容器等。多节点部署可以提供冗余和故障转移能力。
2. 心跳检测：每个负载均衡器节点都应该定期发送心跳信号来检测其自身和其他节点的状态。可以使用专门的心跳检测工具或实现机制来实现这一功能。如果某个节点无法接收到其他节点的心跳信号，就会判定为故障节点。
3. 故障检测和故障转移：当某个节点被检测出故障后，需要有一个自动化机制将其从活跃节点列表中移除，并将其请求转发给其他正常运行的节点。这种故障检测和故障转移的机制可以通过负载均衡器软件或专用软件（如 Keepalived）来实现。
4. VIP（Virtual IP）漂移：为了实现高可用性，通常会使用虚拟 IP（VIP）来代表负载均衡服务。当一个节点故障时，VIP 应该漂移到一个健康的节点，以确保负载均衡服务的连续性。VIP  漂移可以通过使用虚拟路由冗余协议（VRRP）或其他技术来实现。
5. 数据同步：如果负载均衡器节点之间需要共享会话数据、连接状态等信息，则需要确保这些数据在节点之间进行同步。可以使用共享存储、数据库复制等技术来实现数据的实时同步，以保持高可用性和一致性。
6. 监控和报警：建立有效的监控系统来监测负载均衡器的运行状态和性能。及时发现故障和性能下降，并触发相应的报警机制，以便及时采取措施进行故障排查和修复。
