当前位置: 首页 > 编程日记 > 正文

负载均衡层次分析

什么是负载均衡

负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。

常见的负载均衡方案

常见互联网分布式架构如上,分为客户端层、反向代理nginx层、站点层、服务层、数据层。可以看到,每一个下游都有多个上游调用,只需要做到,每一个上游都均匀访问每一个下游,就能实现“将请求/数据【均匀】分摊到多个操作单元上执行”。

【客户端层->反向代理层】的负载均衡

【客户端层】到【反向代理层】的负载均衡,是通过“DNS轮询”实现的:DNS-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问DNS-server,会轮询返回这些ip,保证每个ip的解析概率是相同的。这些ip就是nginx的外网ip,以做到每台nginx的请求分配也是均衡的。

【反向代理层->站点层】的负载均衡

【反向代理层】到【站点层】的负载均衡,是通过“nginx”实现的。通过修改nginx.conf,可以实现多种负载均衡策略:

1)请求轮询:和DNS轮询类似,请求依次路由到各个web-server

2)最少连接路由:哪个web-server的连接少,路由到哪个web-server

3)ip哈希:按照访问用户的ip哈希值来路由web-server,只要用户的ip分布是均匀的,请求理论上也是均匀的,ip哈希均衡方法可以做到,同一个用户的请求固定落到同一台web-server上,此策略适合有状态服务,例如session(58沈剑备注:可以这么做,但强烈不建议这么做,站点层无状态是分布式架构设计的基本原则之一,session最好放到数据层存储)

4)…

常用的有nginx+tomcat、Apache+tomcat等

【站点层->服务层】的负载均衡

【站点层】到【服务层】的负载均衡,是通过“服务连接池”实现的。

上游连接池会建立与下游服务多个连接,每次请求会“随机”选取连接来访问下游服务。

上一篇文章《RPC-client实现细节》中有详细的负载均衡、故障转移、超时处理的细节描述,欢迎点击link查阅,此处不再展开。

常用的有rmi、http、webservice、hessian、rpc、jms等

【数据层】的负载均衡

在数据量很大的情况下,由于数据层(db,cache)涉及数据的水平切分,所以数据层的负载均衡更为复杂一些,它分为“数据的均衡”,与“请求的均衡”。

数据的均衡是指:水平切分后的每个服务(db,cache),数据量是差不多的。

请求的均衡是指:水平切分后的每个服务(db,cache),请求量是差不多的。

业内常见的水平切分方式有这么几种:

一、按照range水平切分

每一个数据服务,存储一定范围的数据,上图为例:

user0服务,存储uid范围1-1kw

user1服务,存储uid范围1kw-2kw

这个方案的好处是:

(1)规则简单,service只需判断一下uid范围就能路由到对应的存储服务

(2)数据均衡性较好

(3)比较容易扩展,可以随时加一个uid[2kw,3kw]的数据服务

不足是:

(1)请求的负载不一定均衡,一般来说,新注册的用户会比老用户更活跃,大range的服务请求压力会更大

二、按照id哈希水平切分

每一个数据服务,存储某个key值hash后的部分数据,上图为例:

user0服务,存储偶数uid数据

user1服务,存储奇数uid数据

这个方案的好处是:

(1)规则简单,service只需对uid进行hash能路由到对应的存储服务

(2)数据均衡性较好

(3)请求均匀性较好

不足是:

(1)不容易扩展,扩展一个数据服务,hash方法改变时候,可能需要进行数据迁移

总结

负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。

(1)【客户端层】到【反向代理层】的负载均衡,是通过“DNS轮询”实现的

(2)【反向代理层】到【站点层】的负载均衡,是通过“nginx”实现的

(3)【站点层】到【服务层】的负载均衡,是通过“服务连接池”实现的

(4)【数据层】的负载均衡,要考虑“数据的均衡”与“请求的均衡”两个点,常见的方式有“按照范围水平切分”与“hash水平切分”

【编辑推荐】

  1. App架构设计经验谈:接口的设计
  2. 浅谈12306核心模型设计思路和架构设计
  3. 九又VR技术负责人官山山:九又VR平台架构设计的深层思考
  4. 滴滴出行分而治之的架构设计之道
  5. 一文读懂Hadoop、HBase、Hive、Spark分布式系统架构

相关文章:

Python基础01-Python环境搭建与HelloWorld

目录 从今天开始学习Python Python环境搭建 安装gcc Python源码包安装 开始Python第一个代码HelloWorld! 从今天开始学习Python 为啥选择Python,可能是跟随潮流吧。我现在不知道为什么学习Python,但是可能一年到一年半以后,…

oracle与mysql创建表时的区别

oracle创建表时,不支持在建表时同时增加字段注释。故采用以下方式: #创建表 CREATE TABLE predict_data as (id integer NOT NULL, uid varchar2(80),mid varchar2(80),time date ,conten…

在Linux上安装Memcached服务

下载并安装Memcache服务器端 服务器端主要是安装memcache服务器端. 下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz 另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最…

图形化编程 html,用GoJS实现图形化交互编程界面示例

JavaScript语言:JaveScriptBabelCoffeeScript确定function init() {var $ go.GraphObject.make; //for conciseness in defining node templatesmyDiagram $(go.Diagram, "myDiagramDiv", //Diagram refers to its DIV HTML element by id{"undoMan…

枚举位移计算操作

如&#xff1a; typedef NS_ENUM(NSInteger, Test) { // 十进制 二进制 TestA 1 << 0, // 1 00001 TestB 1 << 1, // 2 …

Python基础02-Python基础

脚本的第一行 Python脚本的第一行&#xff0c;写Python解释器的路径。这样就可以直接执行Python脚本。 脚本编码 Python2需要指定脚本的编码&#xff0c;Python3不需要指定。 # -*- coding:utf8 -*- 使用input做简单的交互 username input(请输入用户名密码:) password …

SpringBoot上传文件大小限制

SpringBoot默认上传文件大小不能超过1MB&#xff0c;超过之后会报以下异常&#xff1a; org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.at org.apache.tomcat.…

html实时显示log,websocketd 实现浏览器查看服务器实时日志

操作系统CentOS7下载 websocketd安装 nc 命令yum install nmap-ncat创建监听脚本cat > cmd.sh <#!/bin/bashpkill -x ncwhile :; donc -nkl 10088sleep 1done创建 log.htmlbody{background-color: #0e1012;color: #ffffff;}*{margin: 0; padding: 0;}#msg{overflow:auto;…

git 合并两个分支的某个文件

软件开发基本都是多个feature分支并行开发&#xff0c;而在上线前有可能某个分支的开发或测试还没有完成&#xff0c;又或者是产品调整&#xff0c;取消了该分支功能的上线计划&#xff0c;我们在release前不合并该分支即可&#xff0c;然而如果该分支中的某些小调整却需要上线…

lattice diamond 3.7安装破解

第一步安装&#xff1a;执行.EXE文件&#xff0c;一直下一步&#xff0c;最后license选择没有USB什么的那个&#xff08;具体记不清了&#xff09;。 第二步破解&#xff1a;安装完成后在环境变量中将license路径指定到license文件即可&#xff08;LM_LICENSE_FILE d:\lscc…

Python基础03-运算符

运算符 算数运算符 算数运算符符号运算数字用法举例字符串用法举例加a 2 3 print(a) # 5s1 "hello" s2 "world" s s1 s2 print(s) # helloworld-减a 12 - 3 print(a) # 9*乘a 12 * 3 print(a) # 36s1 "hello" s2 "world" s…

shell下的作业管理(转)

作业管理 举例来说&#xff0c;我们在登陆 bash 后&#xff0c; 想要一边复制文件、一边进行数据搜寻、一边进行编译&#xff0c;还可以一边进行 vi 程序撰写&#xff01; 当然我们可以重复登陆那六个文字介面的终端机环境中&#xff0c;不过&#xff0c;能不能在一个 bash 内达…

合并模拟器和真机的静态库动态库aggregate

创建Aggregate的target 在Build Phases 添加Run Script,内容为 scriptFile${SRCROOT}/universalA.shsh ${scriptFile} universalA.sh放在工程根目录&#xff0c;内容为&#xff1a; if [ "${ACTION}" "build" ]then echo "合并模拟器真机库" ta…

html表格联动,html前端基础:table和select操作

html前端基础&#xff1a;table和select操作发布时间&#xff1a;2020-05-13 09:58:10来源&#xff1a;亿速云阅读&#xff1a;196作者&#xff1a;Leah这篇文章主要为大家详细介绍html前端基础中有关table和select的操作&#xff0c;配合代码阅读理解效果更佳&#xff0c;非常…

Python基础04-数据类型:数字、布尔、字符串

目录 数字 布尔 字符串 字符串的常用函数 字符串的内存分析 字符串练习题 数字 判断是数字类型还是字符串类型。 # <class str> 123 a "123" print(type(a), a)# <class int> 123 b int(a) print(type(b), b) 十进制、二进制、八进制、十六进…

一起学Hadoop——实现两张表之间的连接操作

---恢复内容开始--- 之前我们都是学习使用MapReduce处理一张表的数据&#xff08;一个文件可视为一张表&#xff0c;hive和关系型数据库Mysql、Oracle等都是将数据存储在文件中&#xff09;。但是我们经常会遇到处理多张表的场景&#xff0c;不同的数据存储在不同的文件中&…

scala学习笔记-过程、lazy值和异常(6)

过程 在Scala中&#xff0c;定义函数时&#xff0c;如果函数体直接包裹在了花括号里面&#xff0c;而没有使用连接&#xff0c;则函数的返回值类型就是Unit。这样的函数就被称之为过程。过程通常用于不需要返回值的函数。 过程还有一种写法&#xff0c;就是将函数的返回值类型定…

为计算机编程序英语作文,计算机编程员英文简历范文

以下是无忧考网为大家整理的关于计算机编程员英文简历范文的文章&#xff0c;希望大家能够喜欢&#xff01;Basic information:Name: Yjb ys Gender: MaleAge: 21 Nationality: ChineseResidence: Guangdong - Huizhou height and weight: 178cm 60KGMarital status: Single Ed…

android常用命令

创建模拟器&#xff1a; 进入sdk下tool文件夹&#xff1a; cd ...../tools 检查target ID: ./android list targets 创建名为hello的AVD: ./android create avd -n hello -t 1 创建的模拟器默认在~/.android/avc/ 启动模拟器&#xff1a; ./emulator -avc hello 安装apk: 进入p…

Python基础05-数据类型:列表list

目录 列表 列表的一般用法 列表的方法 列表 列表的一般用法 列表用[]括起来&#xff0c;用逗号分隔元素。元素可以是任意的类型。 可以用len获取列表的长度&#xff0c;也就是元素的个数。 # 列表是个大杂烩&#xff0c;什么类型都可以往里面装 li [2019, 12, "存储…

h5打开App的方法。

在浏览器中&#xff1a;法1&#xff1a;location.href ${scheme};//location跳转App是几乎所以情况都支持的。法2&#xff1a;var ifr document.createElement(iframe);//iframe跳转有的地方不支持// ifr.src ${scheme};// ifr.style.display none;// document.body.append…

html作业三,3.15作业

html>科比简介div{width: 480px;height:230px;background-image:url(images/kobe.jpg);background-color:#567854;background-size:500px 250px;padding:10px;box-shaow:10px 10px 10px #666;}.text{color:#556644;text-indent: 3em;line-height: 1.4em;}科比布莱恩特 (美国…

HTML4 和 HTML5 的10个关键区别

http://www.oschina.net/news/22219/html4-html5-differences/转载于:https://www.cnblogs.com/antis/p/6708303.html

smartgit 授权文件 Free Trial License to Non-Commercial

Windows&#xff1a; %APPDATA%/syntevo/SmartGit/ OS X&#xff1a; ~/Library/Preferences/SmartGit/ Unix/Linux&#xff1a; ~/.smartgit/ and remove the file settings.xml 例如windows: 开始 运行 %APPDATA%/syntevo/SmartGit/ 就会自动找到路径删除settings.xml…

Python基础06-数据类型:元组tuple

目录 元组 元组的一般用法 元组的方法 元组 元组的一般用法 元组用()括起来&#xff0c;用逗号分隔元素&#xff0c;元素类型是任意的。因为函数、方法的调用也是用()括起来&#xff0c;为了避免混淆&#xff0c;写元组的时候&#xff0c;在最后一个元素后面多写一个逗号。…

html无规律卡片布局,如何实现同等间隙的卡片布局

在列表展示中&#xff0c;经常会使用卡片的内容展示形式&#xff0c;为了美观&#xff0c;常常要求各卡片间的间隙是一致的。卡片内容不一样可能高度不等&#xff0c;但一般来说为了整体的一致性&#xff0c;会限制每个卡片的宽高都相等。本文就基于宽高一致的多个卡片&#xf…

关于tail, head ,less ,more ,cat 之小介------Linux命令

前言&#xff1a;Linux命令在项目中是经常用&#xff0c;查看日志信息是一个不可缺少的指令。一般都是用Less&#xff0c;more,tail,head&#xff0c;cat 这些命令 目前是足够的。很久不用就会忘记。现在简单写一写。①tail 用于显示指定文件末尾内容&#xff0c;不指定文件时…

Python基础07-数据类型:字典dict

目录 字典 字典的一般用法 字典的方法 字典 字典的一般用法 字典是一组用{}括起来的键值对&#xff0c;每个键值对用逗号分隔。 # 字典 info {"Robin": "Baidu","Jack": ["Alibaba",20,{"B2C": "taobao.com&quo…

cordova 环境配制和创建插件

环境配制 英文网站&#xff1a;http://cordova.apache.org/ 中文网站&#xff1a;http://cordova.axuer.com/ 安装Cordova Cordova的命令行运行在Node.js 上面并且可以通过NPM安装。 根据 平台具体指导 安装相应平台的依赖。打开命令提示符或终端&#xff0c;然后键入npm insta…

HTML动画 request animation frame

在网页中&#xff0c;实现动画无外乎两种方式。1. CSS3 方式&#xff0c;也就是利用浏览器对CSS3 的原生支持实现动画&#xff1b;2. 脚本方式&#xff0c;通过间隔一段时间用JavaScript 来修改页面元素样式来实现动画。接下来我们就分别介绍这两种方式的原理&#xff0c;让大家…