当前位置: 首页 > 科技观察

浅谈分布式集群的负载均衡——口水

时间:2023-03-21 20:13:39 科技观察

1什么是分布式集群?为了理解分布式集群的概念,我们先来说说“集群”和“分布式”这两个概念。艺术源于生活,计算机科学亦然。我们先用一个例子来理解现实生活中的“集群”和“分布式”。从开餐厅开始:你开餐厅,自己负责厨房(也就是做饭)。随着生意越来越好,我发现自己太忙了。所以你请了两个厨师,你们三个是一个“集群”。主要职责是:洗菜、配菜、做饭。你们的关系是这样的:随着生意越来越好,提高后厨生产力的途径有两种:(1)继续增加厨师——相当于扩大集群;(2)引入流水线机制,细化分工。找人分担洗碗、上菜等厨师的工作。类似于下图。事实上,流水线体现了分而治之的思想。即把一个大任务分解成多个小任务,提高小任务的生产率,从而提高整体的生产率。而“分布式”的解题思路:就是将一个大任务拆分成多个小任务,通过跨区域分布吸收来解决大问题的思路。从解决问题的角度来说一下分布式和集群的区别:分布式是通过缩短单个任务的执行时间来提高效率;集群就是通过增加单位时间内执行的任务数来提高效率。从软件部署的角度来说一下分布式和集群的关系:分布式就是把不同的服务分布在不同的地方;集群是指将几台服务器聚集在一起,实现相同的业务;每个分布式节点都可以集群;集群不一定是分布式的。总结一下,一个理想的分布式集群应该是这样的:一个分布式系统由多个节点组成,每个节点都是集群,每个集群都是分布式的。2什么是负载均衡?服务器的处理能力主要受限于服务器本身可扩展的硬件能力。因此,当需要处理大量的用户请求时,通常会引入负载均衡器,由多个普通服务器组成一个系统来完成高并发的请求处理任务。说到负载均衡,你会想到什么?DNS、LVS、nginx、HAProxy、反向代理,还是大名鼎鼎的F5?下面对这些负载均衡技术进行分类和总结。实际上,上述解决方案通常是针对InternetWeb访问解决方案的负载均衡。web服务方式是:通过一个简单易记的域名,屏蔽内网真实服务的IP,从而保证内网服务器的安全可靠。基于这种服务方式,服务商可以在两个地方进行负载均衡:1.DNS解析(查询式),当域名服务器根据用户的特点,从域名到服务IP进行反向解析时,网络接入(电信、网通等),返回最近的服务IP列表给用户。鹅厂GSLB是这方面的佼佼者,有兴趣的可以自行去km。2.转发型,通过上面的DNS就近访问,当用户请求就近服务的IP时。通常的做法是引入转发节点(一般是lvs或nginx),通过均衡策略将数据发送到多个RS(RealServers)。介绍完web负载均衡技术后,大家有没有这样的疑问呢?分布式系统中节点间的集群是如何进行负载均衡的?Web负载均衡是否适用于分布式节点?等等。实际上,不同的技术用于解决不同场景下的问题。下图列出了常见的负载均衡使用场景。上图通过三种颜色的部分(包括图标和线条)说明了不同场景下的负载均衡。蓝色部分:用户通过DNS查询获取最近访问服务(GSLB)。绿色部分:通过集中转发用户请求的方式完成了服务接入层的负载均衡。(LVS)红色部分:说明典型分布式系统中节点间的负载均衡。其中蓝色部分和绿色部分就是上面介绍的web负载均衡部分。在下一章中,我们将重点分析如何考虑分布式节点之间的负载均衡。3分布式集群的负载均衡如果要在节点间做分布式集群的负载均衡,可以参考web负载均衡的方式,即查询转发。但是通常在后台发育的皮皮虾基本不会这样做。根本原因在于,在不同的场景下,考虑的侧重点不同,导致平衡的方式有很大差异。让我们从Web服务的两个基石开始:简单性和安全性。简单性:使用域名的Web服务允许用户用简单易记的域名代替IP地址,所以“简单”应该说是用户的诉求。安全:“安全”是服务商的诉求。对外服务时,最大程度的屏蔽内部服务器的IP地址和网络部署,保证内部服务的安全。鉴于以上两点,在提供Web服务时需要部署相应的节点支持。如DNS解析、LVS转发、ngnix反向代理等。这些节点在保证服务简单性和安全性的同时,也引入了系统服务的关键路径,增加了系统服务的复杂性。那么想一想:我们需要引入这么多节点来解决分布式系统之间的负载均衡问题吗?皮皮虾的回答一定是:不用?。引入更多的节点意味着更难保证系统的稳定性和可靠性。你为什么这么说?首先,与中心化系统相比,分布式系统通过节点间传递消息来协调工作。节点间通信的不可靠和不稳定是分布式系统的常态。这就导致在设计和开发系统时,需要针对每一种通信异常都有自己的重试和恢复方案。因此,引入更多的节点意味着更复杂的重试、容灾、恢复等成本。朋友们,你们有没有完成任务就快死了的感觉?我的天啊。没有考虑负载均衡,但是分布式系统的稳定性和可靠性已经很头疼了?所以发行的皮皮虾是苦涩的、孤独的、高贵的。(请珍惜身边的每一只皮皮虾?)皮皮虾不想瘦,大司马出题了。大司马:如果敌方打野不在小地图视野范围内,那么分布式系统的负载均衡怎么做?EmpressPi”,我是这么看这个问题的。我:节点更少,通信方式更简单可靠,可以更好的完成负载均衡。大司马:同学,你好有灵性。(不懂笑话,看黑体字?)如何做好负载均衡?总结上面的笑话就是一句话:简单就是美。业务本身。原则是:少而足。简单可靠的通信方式:这里介绍一种简单的通信方式,udp请求发送+udp服务确认。这种方式可以减少tcp链路管理带来的服务器资源消耗。如果系统本身还是很复杂的,其实是有迹可循的,我梳理一下,考虑一下负载均衡的要点,大家想了很多,根据自己的业务特点选择,最终会实现负载均衡效果好。还有一个重点需要强调。小伙伴们首先要搞清楚系统中的平衡点是什么?这里我先说一下:请求余额和数据余额(上图右下角)。请求均衡的理想效果是每个RS服务处理的请求是相似的。数据均衡的理想效果是:每个RS服务处理/存储的数据量是相似的。公司还有l5/cmlb(km自产)等不错的平衡算法组件,可以更好的支持UDP请求平衡。使用此组件也有一些限制,请确认它是否适合您的系统。***,让我们回顾一下负载均衡的本质。朋友们,不要为了负载均衡而去均衡:作用:单个服务器的容量是有限的。在处理大量用户请求时,需要多台服务器组成一个系统来完成高并发请求处理。描述:N个客户端访问M个服务器的问题。(通常:M>1,N>>M)难点:将N的请求/数据“平均”分配给多个M个运算单元执行,关键是“平均”。同学们,下课了!原文链接:https://cloud.tencent.com/community/article/999792作者:于洋【本文为专栏作者《腾讯云技术社区》原创稿件,转载请联系原作者获得授权】点此查看作者更多好文