集群高性能:负载均衡

这是我架构设计专栏的第4篇文章。

我的架构设计专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybvLm

我的八股知识专栏:https://www.nowcoder.com/creation/manager/columnDetail/j8ZZk0

我的苍穹外卖话术:https://www.nowcoder.com/discuss/634840490742972416?sourceSSR=users

觉得有用的欢迎订阅专栏和关注我!

1. 前言

单服务器无论如何优化,无论采用多好的硬件,总会有一个性能天花板,当单服务器的性能无法满足业务需求时,就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质很简单,通过增加更多的服务器来提升系统整体的计算能力。

由于计算本身存在一个特点:同样的输入数据和逻辑,无论在哪台服务器上执行,都应该得到相同的输出。因此高性能集群设计的复杂度主要体现在任务分配这部分,需要设计合理的任务分配策略,将计算任务分配到多台服务器上执行。

高性能集群的复杂性主要体现在需要增加一个任务分配器,以及为任务选择一个合适的任务分配算法。对于任务分配器,现在更流行的通用叫法是“负载均衡器”。但这个名称有一定的误导性,会让人潜意识里认为任务分配的目的是要保持各个计算单元的负载达到均衡状态。而实际上任务分配并不只是考虑计算单元的负载均衡,不同的任务分配算法目标是不一样的,有的基于负载考虑,有的基于性能(吞吐量、响应时间)考虑,有的基于业务考虑。考虑到“负载均衡”已经成为了事实上的标准术语,这里我也用“负载均衡”来代替“任务分配”,但请你时刻记住,负载均衡不只是为了计算单元的负载达到均衡状态。

2. 负载均衡分类

常见的负载均衡系统包括 3 种:DNS 负载均衡、硬件负载均衡和软件负载均衡。

1. DNS负载均衡

DNS 是最简单也是最常见的负载均衡方式,一般用来实现地理级别的均衡。例如,北方的用户访问北京的机房,南方的用户访问深圳的机房。DNS 负载均衡的本质是 DNS 解析同一个域名可以返回不同的 IP 地址。例如,同样是 www.baidu.com,北方用户解析后获取的地址是 61.135.165.224(这是北京机房的 IP),南方用户解析后获取的地址是 14.215.177.38(这是深圳机房的 IP)

DNS 负载均衡实现简单、成本低,但也存在粒度太粗、负载均衡算法少等缺点。仔细分析一下优缺点,

​ ● 其优点有:

​ ○ 简单、成本低:负载均衡工作交给 DNS 服务器处理,无须自己开发或者维护负载均衡设备。

​ ○ 就近访问,提升访问速度:DNS 解析时可以根据请求来源 IP,解析成距离用户最近的服务器地址,可 以加快访问速度,改善性能。

​ ● 缺点有:

​ ○ 更新不及时:DNS 缓存的时间比较长,修改 DNS 配置后,由于缓存的原因,还是有很多用户会继续访问修改前的 IP,这样的访问会失败,达不到负载均衡的目的,并且也影响用户正常使用业务。

​ ○ 扩展性差:DNS 负载均衡的控制权在域名商那里,无法根据业务特点针对其做更多的定制化功能和扩展特性。

​ ○ 分配策略比较简单:DNS 负载均衡支持的算法少;不能区分服务器的差异(不能根据系统与服务的状态来判断负载);也无法感知后端服务器的状态。

针对 DNS 负载均衡的一些缺点,对于时延和故障敏感的业务,有一些公司自己实现了 HTTP-DNS 的功能,即使用 HTTP 协议实现一个私有的 DNS 系统。这样的方案和通用的 DNS 优缺点正好相反。

2. 硬件负载均衡

硬件负载均衡是通过单独的硬件设备来实现负载均衡功能,这类设备和路由器、交换机类似,可以理解为一个用于负载均衡的基础网络设备。目前业界典型的硬件负载均衡设备有两款:F5 和 A10。这类设备性能强劲、功能强大,但价格都不便宜,一般只有“土豪”公司才会考虑使用此类设备。普通业务量级的公司一是负担不起,二是业务量没那么大,用这些设备也是浪费。

● 硬件负载均衡的优点是:

​ ○ 功能强大:全面支持各层级的负载均衡,支持全面的负载均衡算法,支持全局负载均衡。

​ ○ 性能强大:对比一下,软件负载均衡支持到 10 万级并发已经很厉害了,硬件负载均衡可以支持 100 万以上的并发。

​ ○ 稳定性高:商用硬件负载均衡,经过了良好的严格测试,经过大规模使用,稳定性高。

​ ○ 支持安全防护:硬件均衡设备除具备负载均衡功能外,还具备防火墙、防 DDoS 攻击等安全功能。

● 硬件负载均衡的缺点是:

​ ○ 价格昂贵:最普通的一台 F5 就是一台“马 6”,好一点的就是“Q7”了。

​ ○ 扩展能力差:硬件设备,可以根据业务进行配置,但无法进行扩展和定制。

3. 软件负载均衡

软件负载均衡通过负载均衡软件来实现负载均衡功能,常见的有 Nginx , Nginx 是软件的 7 层负载均衡。

  • 软件负载均衡的优点:简单:无论是部署还是维护都比较简单。便宜:只要买个 Linux 服务器,装上软件即可。灵活:4 层和 7 层负载均衡可以根据业务进行选择;也可以根据业务进行比较方便的扩展,例如,可以通过 Nginx 的插件来实现业务的定制化功能。
  • 其实下面的缺点都是和硬件

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

架构设计学习专栏 文章被收录于专栏

不想当架构师的后端开发工程师不是好码农! 此专栏用于存放我的架构设计学习笔记,内容一部分源于网上资料,一部分源于gpt和我自己的理解。建议喜欢本专栏的盆友尽早订阅。欢迎给本专栏的文章点赞、评论!

全部评论
觉得有用的可以给文章点赞评论几句
点赞 回复 分享
发布于 07-06 19:07 湖北

相关推荐

09-12 21:23
中南大学 Java
1、短链接创建之后是先写数据库还是先写入缓存我答的先写数据库再写缓存,面试官问写缓存这个过程失败了导致请求都落到数据库中怎么办?解决思路:①先写缓存再写数据库(我答的这个,面试官说这个) ②写缓存失败,可以用重试机制(基于消息队列的方案,基于canal的方案)2、HashMap什么时候红黑树转链表红黑树大小减到6转链表3、我看你限流用的阿里的sentinel组件,阿里的一些组件也有bug,如果只给你redis,你怎么实现限流呢答:还是使用滑动窗口算法,使用redis的有序集合来存放每个小窗口内的请求数,score存时间戳面试官说你的方案数据存储和计算都在redis里面,有没有更快一点的他说可以数据存redis,计算时把数据加载到本地内存算,会快一些4、线程池设置的这个存活时间,这个时间过了之后,线程会销毁吗核心线程不会销毁,只有非核心线程才会被销毁反问核心线程也可以设置超时时间,你知道吗,不知道~查了下是allowCoreThreadTimeOut(true),核心线程在超出 keepAliveTime 后可以被销毁,5、线程池怎么销毁核心线程setcorepoolsize方法动态调整核心线程数、关闭线程池、设置allowCoreThreadTimeOut(true)6、为什么Java已经有synchronized,还要Lock接口Lock接口有更多的功能,可设置为公平锁,可中断,可设置超时时间,支持多条件变量
点赞 评论 收藏
分享
2 8 评论
分享
牛客网
牛客企业服务