Skip to content

CAP,BASE

C(一致性),a(可用性),p(分区容错性) 在分布式系统中,网络无法100%可靠,分区其实是一个必然现象 BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)三个短语的缩写。是对CAP中AP的一个扩展

基本可用:分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用。 软状态:允许系统中存在中间状态,这个状态不影响系统可用性,这里指的是CAP中的不一致。 最终一致:最终一致是指经过一段时间后,所有节点数据都将会达到一致。

BASE解决了CAP中理论没有网络延迟,在BASE中用软状态和最终一致,保证了延迟后的一致性。BASE和 ACID 是相反的,它完全不同于ACID的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态

分布式事务怎么处理

raft 原理(三色算法)

分布式 id 的几种实现和优缺点

降级 限流 熔断实现原理

lvs 原理,如何保证高可用

一致性 hash 原理,怎么解决节点少数据倾斜的问题

微服务 服务注册的过程是怎么样的?

负载均衡、一致性、容错性

负载均衡就是把一个分布式系统中的流量均匀的分布到多个服务器上面来,避免其中单个节点受到过大的这个流量的冲击。

一致性(Consistency):在负载均衡系统中,一致性指的是在请求分发过程中,保持对后端服务器的负载分配是相对均衡的状态。也就是说,每台后端服务器都应该承担大致相同的负载,而不是某些服务器负载过重而其他服务器负载过轻。通过实现负载均衡算法和动态调整的机制,可以实现一致性,确保请求分发在各个服务器之间相对平衡。

容错性(Fault Tolerance):容错性是指负载均衡系统在面对后端服务器故障或异常情况时能够继续正常运行和提供服务的能力。负载均衡系统应该具备检测后端服务器健康状态的机制,当某个服务器出现故障或无法响应时,能够自动将请求转发到其他可用的服务器上,以保证系统的可用性和稳定性。容错性还可以通过配置多个负载均衡节点或采用集群方式来提高系统的可靠性。

浏览器的请求到我们最终的服务器,这整个中间过程当中哪些地方是可以做负载均衡的?

DNS层:DNS可以配置为返回多个IP地址,浏览器或客户端可以选择其中一个进行连接。这是一种简单的负载均衡方式。

CDN(内容分发网络):CDN可以根据用户的地理位置和网络情况,将用户请求分发到最近或最佳的节点,从而达到负载均衡的目的。

反向代理服务器:例如使用Nginx或Apache的反向代理功能,可以将来自客户端的请求均匀地分配到后端的多个服务器上。

Internet Gateway(互联网网关)也可以作为负载均衡的位置。互联网网关是连接本地网络与互联网之间的设备,负责转发流量。在某些情况下,互联网网关可以配置为进行负载均衡,将传入的请求分发到多个后端服务器上,以平衡流量负载

负载均衡器:物理设备(如F5)或软件解决方案(如HAProxy, AWS ELB, Google Cloud Load Balancer等)可以在网络层面进行负载均衡。

应用服务器:在服务器集群中,如Tomcat、Jetty等应用服务器也可以通过负载均衡来分发请求。

数据库:数据库也可以实现负载均衡,例如使用数据库的主从复制、读写分离等技术。

负载均衡调度算法(nginx)

1.轮询(Round Robin):适用于后端服务器性能相近,没有特殊需求的情况。 2.加权轮询(Weighted Round Robin)(weight):适用于后端服务器性能不均衡的情况,可以根据服务器的性能设置不同的权重值,以实现负载均衡。 3.随机:适用于简单的负载均衡需求,对后端服务器没有特别的要求。 4.按响应时长(Least Response Time)(fair,第三方插件):适用于需要将请求发送到响应时间最短的服务器,以提高系统性能和响应速度。 5.url_hash(第三方,需要插件) :(按服务来划分?)适用于需要将同一URL的请求发送到同一台服务器,常用于缓存或会话保持等场景。 6.ip_hash(IP Hash) :(按地区划分?)适用于需要将同一客户端IP地址的请求发送到同一台服务器,以保持会话或其他需要依赖客户端IP的需求。 7.最少连接数(Least Connections)(less_conn):(哪个连击小用那个,减缓压力)适用于需要将请求发送到当前连接数最少的服务器,以实现负载均衡和避免某些服务器过载的情况。

那就比如说有 3 个节点,那我们不停的去轮询,我这次请求第一台,第二次就请求第二台,这样轮询有什么问题?(轮询的缺点)

在使用轮询算法进行负载均衡时,每个请求依次发送到每个节点,确保请求均匀地分布。然而,轮询算法可能会面临以下问题:

节点性能差异:如果节点之间的性能差异很大,轮询算法无法考虑节点的实际负载情况。这可能导致某些节点负载过高,而其他节点负载较低。

长连接问题:如果存在长连接的情况,例如客户端与服务器之间的持久连接,轮询算法可能导致某些节点负载过高,因为长连接会使得请求在某个节点上持续积累。

无法应对节点故障:轮询算法无法检测和应对节点的故障情况。如果某个节点发生故障,轮询算法仍会将请求发送到该节点,导致请求失败或超时。

为了解决这些问题,可以使用其他调度算法或结合多种算法。例如,加权轮询算法可以考虑节点的性能差异,使得性能较高的节点获得更多的请求。同时,可以配合健康检查机制,定期检测节点的可用性,从而排除故障节点。另外,基于响应时间或最少连接数的算法可以更精确地选择节点,以提高系统的性能和可靠性。

横向扩容(Scale Out)跟纵向扩容(Scale Up)这两个概念有什么不一样?

横向扩容(Scale Out):

指向系统中添加更多的服务器实例,将负载分布到多个服务器上。 横向扩容通常通过增加服务器节点来实现,可以是物理服务器、虚拟机或容器实例。 横向扩容可以提高系统的整体处理能力和容量,并且具有更好的横向扩展性,适用于处理大量并发请求和水平扩展的场景。 通过负载均衡器将请求分发到不同的服务器,以实现负载均衡和高可用性。

纵向扩容(Scale Up):

指对单个服务器进行升级或增强,以提高其处理能力。 纵向扩容通常通过升级服务器的硬件配置,如增加处理器核心数、内存容量或存储容量来实现。 纵向扩容可以提高单个服务器的性能和处理能力,适用于处理计算密集型任务或提升单个服务器性能的场景。

纵向扩容的局限性在于单个服务器的资源有限,随着需求的增加,可能会遇到硬件限制。 综上所述,横向扩容通过增加服务器实例来提高系统的整体处理能力和容量,适用于水平扩展和高可用性的场景。而纵向扩容则通过升级单个服务器的硬件配置来提升其性能,适用于处理计算密集型任务或提升单个服务器性能的场景。

集群的一个无状态?

大概就是说在接受一个请求的时候,他不需要关心他之前的状态是什么,只用根据那个请求就可以返回对应的结果,而不需要他之前的一些用户的状态。

分布式,集群,微服务概念有什么区别?

分布式系统就是指一个系统里面有分布,有物理上分开的节点,然后通过网络连接起来提供服务。这个是分布式的定义。集群的话就是指一群服务器用一个统一的功能好把它们连接在一起,为了那个功能让它更能够承上,承受更高的流量,并且有更高的容错性,这是集群的概念。

API网关集群如何设计?

如何统计一个API接口的流量大小?