这一节开始负载均衡
首先是思维导图
学习负载均衡需要一些前置知识,这里进行前置知识的学习
负载均衡是一种计算机的技术,用来在多个计算机集群、网络连接、CPU、磁碟驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个伺服器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。
通俗的解释就是将一台服务器,变成多台服务器,进行流量的分发。
对于分布式系统而言,当一台服务器出现故障,其他服务器可以得到通知,并对这台服务器进行容错处理,防着整个集群的塌陷。
因特网在传送信息过程中,需要一台信息传送到目的地,中间经历的过程称为路由,对服务的客户端和服务端进行路由化处理,为以后的负载均衡做准备,这里称为服务路由。
通过每隔一段时间,对后方的服务器发起访问请求,此称为健康检查。如出现挂掉的问题,直接抛出。
这里对应于计算机的知识体系,首先对应于网络的基础知识。
OSI七层模型分为,物理层,数据链路层,网络层,传输层,会话层,表达层,应用层。
这里传输数据的时候,传输的顺序为应用层,表达层,会话层,传输层,网络层,数据链路层,物理层,物理层,数据链路层,网络层,传输层,会话层,表达层,应用层。
这里体现在路由上,通过配置路由器,实现一台路由接入多个WLAN。即利用多个网络设备通道均衡分担流量
上图为通过路由器实现负载均衡。
Nginx,分为四层负载均衡,通过,四层负载均衡,即Nginx Proxy 实现负载均衡的处理。
通过F5硬件设备,实现VIP,通过VIP实现动态的负载均衡。
流程如下:
1.客户发出服务请求到VIP
2.BIGIP接收到请求,将数据包中目的IP地址改为选中的后台服务器IP地址,然后将数据包发出到后台选定的服务器
3.后台服务器收到后,将应答包按照其路由发回到BIGIP
4.BIGIP收到应答包后将其中的源地址改回成VIP的地址,发回客户端,由此就完成了一个标准的服务器负载平衡的流程。
负载均衡为高可用架构的核心组件,用来提高性能,和高可用性,通过负载均衡流量分发到多台服务器,多台服务器消除单点故障。
对于单体网站架构如图所示
在这个例子里面,用户直接通过XXXXX.com连接Web Server,如果这一个Web Server挂了那么整个系统都无法使用,也就是我们常说的系统中的单点故障,同样如果大量的用户同时访问这一台服务器,那么这些用户很可能会遇到加载时间缓慢或者根本无法连接的问题。
这部分的单点故障可以通过引入负载均衡器和至少另一个Web Server来缓解。一般来说所有后端服务器会提供相同的内容,以便用户无论访问哪个服务器都会收到一致的内容。同时由于有多台服务器同时提供服务,也加大了系统的负载能力提高了性能。
负载均衡算法用于确定流量应该被分发到哪一个健康的服务器上,常见的几个算法如下:
Round Robin — 轮转(Round Robin)意味着服务器会被按顺序地选择,比如负载均衡器会将第一个请求分配给第一个服务器,然后下一个请求分配给第二个服务器,这样分配下去分配完一轮之后回到开头分配给第一个服务器(操作系统调度算法复习一下)。这种方式比较适合各服务器处理能力相同而且每个业务处理量差不多的时候。
Least Connections — 最少连接(Least Connections)这个算法意味着负载均衡器会选择当前连接最少的服务器。
IP hash — 在这个算法下,负载均衡器根据请求源的IP来决定分发给哪个服务器。这个方法保证了一个特定的用户会一直访问相同的服务器。
其他还有一些不算太常见的算法,比如Url hash、Random等。
负债均衡器本身就是一个隐患,使用双机热备的方式进行解决。提高其冗余性。
例如上图中的Gif,采用VIP + 双机热备的方式实现负载均衡器。
这里讲解XML配置方式,YML配置,注解配置以及dubbo-admin配置。
上一篇,HelloWorld已经创建一个服务端,和客户端。使用的是yml配置。这里三种都说明一下。
这里配置统统以轮询为例。
<dubbo:service interface="..." loadbalance="roundrobin" />
dubbo:
provider:
loadbalance: roundrobin
@Service(version = "${product.service.version}",loadbalance="roundrobin")
public class ProductServiceImpl implements ProductService {
@Override
public String helloDubbo() {
return "hello,spring-boot dubbo";
}
}
这里进行客户端的配置
<dubbo:reference interface="..." loadbalance="roundrobin" />
dubbo:
consumer:
loadbalance: roundrobin
@RestController
public class ProductController {
@Reference(version = "${product.service.version}",loadbalance="roundrobin")
private ProductService productService;
@RequestMapping(value = "test")
public String test() {
return productService.helloDubbo();
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。