1、什么是负载均衡?什么是负载均衡?在服务器上部署网站需要Nginx。Nginx是一个服务组件,用于反向代理、负载均衡和HTTP缓存等,那么这里的负载均衡指的是什么呢?负载均衡(LB,LoadBalance)是一种技术解决方案。它用于在多个资源(通常是服务器)之间分配负载以优化资源使用并避免过载。资源相当于每个服务实例的执行操作单元。负载均衡是将大量的数据处理操作分布到多个运算单元去执行,用于解决互联网分布式系统的大流量、高并发、高可用等问题。那么什么是高可用呢?二、什么是高可用?首先了解什么是高可用?这就是CAP定理,分布式系统的基础,分布式系统的三个指标:一致性(consistency)可用性(availability)分区容错(partitionfaulttolerance),什么是HighAvailability?高可用性,简称HA,是系统的一个特性或指标。它通常是指提供某种性能的服务运行时间,高于平均正常时间段。.反之,消除系统服务不可用的时间。衡量系统是否满足高可用,是指当一台或多台服务器宕机时,整个系统和服务仍然可以正常使用。例如,一些知名网站保证4个9以上的可用性,即99.99%以上的可用性。这0.01%就是所谓的停机时间百分比。比如电商网站有好评,服务不可用就会造成商家和用户的损失。然后在提高可用性的基础上,对系统宕机和服务不可用进行补偿。比如排序服务,可以使用多个带有负载均衡的排序服务实例来代替单个排序服务实例,即使用冗余来提高可靠性。总而言之,负载均衡是分布式系统架构设计中必须考虑的因素之一。一般采用同服务实例的负载均衡和冗余来解决分布式系统的大流量、高并发和高可用问题。负载均衡的核心关键在于是否均匀分布。3.常见的负载均衡案例场景一:在微服务架构中,网关路由到具体的服务实例hello:两个相同的服务实例hello服务,一个8000端口,一个8082端口通过Kong的负载均衡LB功能,让请求均匀分发给两个hello服务实例。Kong有很多负载均衡策略算法:默认的weighted-round-robin算法,consumer:consumerid作为hash算法的输入值等。场景2:在微服务架构中,A服务调用B的集群服务。通过了Ribbon客户端负载均衡组件:负载均衡策略算法不高级,最简单的就是随机选择和轮询4.互联网分布式系统解决方案常见的互联网分布式系统架构分为几层,一般如下:Clients端层:如用户浏览器、APP端反向代理层:技术选择如Nignx或F5Web层:在前后端分离的场景下,Web端可以使用NodeJS、RN、Vue业务服务层:使用Java,go,一般互联网公司,技术方案选择是SC或者SpringBoot+Dubbo服务数据存储层:DB选择MySQL,Cache选择Redis,search选择ES等。一个请求从第一层到第四层,layerby层访问需要负载均衡。即每个上游调用多个下游业务方时,需要均匀调用。这样一来,整个系统就相当于第一层负载均衡:客户端层->反向代理层负载均衡客户端层->反向代理层负载均衡如何实现?答案是:DNS循环。DNS可以通过A(Address,返回域名指向的IP地址)设置多个IP地址。比如这里访问bysocket.com的DNS配置了ip1和ip2。为了反向代理层的高可用,至少要有两条A记录。两个冗余ip对应的nginx服务实例防止单点故障。每次请求bysocket.com域名,通过DNS轮询返回对应的ip地址,每个ip对应反向代理层的服务实例,即nginx的外网ip。这样各个反向代理层实例获得的请求分布是均衡的。Layer2:Reverseproxylayer->Weblayerloadbalancing反向代理层->Web层负载均衡如何实现呢?由反向代理层的负载均衡模块处理。比如nginx有多种平衡方式:1、请求轮询。请求按时间顺序一个一个分配给web层服务,然后重复。如果web层服务关闭,上游web-server{serverip3;serverip4;}iphash会自动删除。根据ip的hash值,确定到对应web层的路由。只要用户的ip是统一的,对web层的请求也是统一的。2.还有一个好处就是来自同一个ip的请求会被分发到同一个web层服务。这样每个用户定时访问一个web层服务,就可以解决会话问题。upstreamweb-server{ip_hash;serverip3;serverip4;}weightweight,fair,url_hash等第三层:Web层->业务服务层负载均衡Web层->业务服务层负载均衡如何实现?比如Dubbo是一个服务治理解决方案,包括服务注册、服务降级、访问控制、路由规则动态配置、权重调整、负载均衡等。其中一个特点是智能负载均衡:内置多种负载均衡策略,智能感知下游节点的健康状态,显着降低调用延迟,提高系统吞吐量。为了避免单点故障,支持服务水平扩展,一个服务通常会部署多个实例,即Dubbo集群部署。多个服务实例会成为一个服务提供者,然后根据配置的随机负载均衡策略,随机选择20个Provider中的一个进行调用,假设随机选择第7个Provider。LoadBalance组件从提供者地址列表中选择一个提供者进行调用,使用平衡策略,如果调用失败,则选择另一个进行调用。Dubbo内置了4种负载均衡策略:RandomLoadBalance:随机负载均衡。随机选择一个。是Dubbo默认的负载均衡策略。RoundRobinLoadBalance:循环负载均衡。轮询选择一个。LeastActiveLoadBalance:最少的活跃调用数,随机有相同的活跃调用数。主动计数是指调用前后的计数差值。让慢的Provider接收到更少的请求,因为越慢的Provider,调用前后的计数差异越大。ConsistentHashLoadBalance:一致性哈希负载均衡。具有相同参数的请求总是落在同一台机器上。同样,因为业务需要,也可以实现自己的负载均衡策略第4层:业务服务层->数据存储层负载均衡数据存储层的负载均衡一般是通过DBProxy来实现的。比如MySQL分库分表。当单个数据库或表的访问量太大,数据量太大时,需要垂直拆分和水平拆分两个维度。比如横向切分规则:Range,timehashmodulo,ordersbasedonstoreID等。但是这个block的负载会出现以下问题,需要解决:分布式事务跨库join等。分库分表的产品解决方案有很多:当当网的sharding-jdbc、阿里的Cobar等。5.总结从外部看,负载均衡是一个系统或软件的整体。从内部来看,有层层上下游调用。只要有调用,就需要考虑负载均衡。因此,负载均衡是分布式系统架构设计中必须考虑的因素之一。主要考虑的是如何将接收到的请求均匀分布到下游:第一层:客户端层->反向代理层的负载均衡。通过DNS循环的第2层:反向代理层->Web层的负载平衡。通过Nginx的负载均衡模块第3层:Web层->业务服务层负载均衡。第4层通过服务治理框架的负载均衡模块:业务服务层->数据存储层的负载均衡。通过数据的横向分布,数据统一,理论上请求也会统一。例如,按买家ID分片是类似的
