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

一分钟全面了解负载均衡

时间:2023-03-11 21:22:35 科技观察

什么是负载均衡?负载均衡(LoadBalance)是分布式系统架构设计中必须考虑的因素之一。在运算单元上执行,负载均衡的关键是【均匀性】。常见的负载均衡方案常见的互联网分布式架构如上,分为客户端层、反向代理nginx层、站点层、服务层、数据层。可以看出,每个下游都有多个上游调用。它只需要确保每个上游均匀地访问每个下游,然后“将请求/数据[均匀]分发给多个操作单元执行”。【客户端层->反向代理层】的负载均衡从【客户端层】到【反向代理层】的负载均衡是通过“DNS轮询”实现的:DNS-server配置多个来解析ip,每次一个DNS解析请求是访问DNS-server,会轮询返回这些ip,保证每个ip的解析概率相同。这些ip都是nginx的外网ip,这样各个nginx的请求分布也是均衡的。【反向代理层->站点层】负载均衡【反向代理层】到【站点层】的负载均衡是通过“nginx”实现的。通过修改nginx.conf,可以实现多种负载均衡策略:1)请求轮询:类似于DNS轮询,请求依次路由到各个web-server2)最少连接路由:哪个web-server的连接数少,whichroutetoweb-server3)iphash:web-server根据来访用户的iphash值进行路由。只要用户的ip分布均匀,理论上请求也是均匀的,ip哈希均衡的方法就可以实现。同一个用户请求总是发送到同一个网络服务器。这种策略适用于有状态的服务,比如session(58沉健注:可以这样做,但是强烈不推荐。site层的无状态是分布式架构设计的基本原则一、session***存储在数据层)4)...[站点层->服务层]负载均衡[站点层]到[服务层]的负载均衡是通过“服务连接池”实现的。上游连接池会与下游服务建立多个连接,每个请求都会“随机”选择一个连接访问下游服务。之前的文章《RPC-client实现细节》有详细的负载均衡、故障转移、超时处理的说明。请点击链接查看,这里就不展开了。【数据层】负载均衡在数据量较大的情况下,由于数据层(db、cache)涉及到数据的水平切分,所以数据层的负载均衡比较复杂,分为“数据均衡”,带有“要求的余额”。数据的均衡是指水平切分后的每个服务(db,cache)的数据量都差不多。请求均衡是指水平切分后的各个服务(db、cache)的请求量几乎相同。业界常见的横向切分方式有几种:1.将每个数据业务按照范围进行横向切分,存储一定范围内的数据。上图是一个例子:user0服务,存储uid范围1-1kwuser1服务,存储uid范围1kw-2kw方案的优点是:(1)规则简单,可以将服务路由到对应的存储服务仅通过判断uid范围(2)数据均衡性较好(3)相对容易扩展,随时可以添加一个uid[2kw,3kw]数据服务不足的是:(1)request负载不一定是平衡的。一般来说,新注册用户会比老用户更活跃,大范围的服务请求压力会更大。2.根据idhash对每条数据业务进行水平切分,存储一定的keyvaluehash后的部分数据。上图是一个例子:user0服务存储偶数uid数据user1服务存储奇数uid数据。这种方案的优点是:(1)规则简单,服务只需要对uid进行hash就可以路由到对应的存储服务(2)数据均衡性更好(3)请求均匀性更好。缺点是:(1)不易扩展。在扩展数据服务时,当哈希方法发生变化时,可能需要进行数据迁移。总结负载均衡(LoadBalance)是分布式系统架构设计中必须考虑的因素之一。通常是指将请求/数据[均匀]分配给多个运行单元执行,负载均衡的关键是[均匀性]。(1)[clientlayer]到[reverseproxylayer]的负载均衡是通过“DNS轮询”实现的(2)[reverseproxylayer]到[sitelayer]的负载均衡是通过“nginx”实现的负载均衡(3)【站点层】到【服务层】是通过“服务连接池”实现的(4)【数据层】的负载均衡要考虑“数据均衡”和“请求均衡”两点,常见的方式有“根据范围水平切分”和“水平散列切分”