系统架构设计理论与原则

一、无共享架构

1、无共享架构

      无共享架构是一种分布式计算架构,这种架构中不存在集中存储的状态,系统中每个节点都是独立自治的,整个系统中没有资源竞争,这种架构具有非常强的扩张性,目前在web应用中被广泛使用。

      无共享架构的一个重要实践指导原则就是避免在互联系统中使用Session,因为实践已经证明,在一个集群分布式计算环境中,若Session状态维护在各个节点服务器上,为了保证状态一致性,节点间Session数据需要互相拷贝同步,严重影响性能,我们需要尽可能的改造现有架构不要使用Session。

 2、对比

shared-nothing、shared-memory、shared-disk是并行系统最常使用的模式。
shared-memory:多个cpu共享同一片内存,cpu之间通过内部通讯机制进行通讯
shared-disk:每一个cpu使用自己的私有内存区域,通过内部通讯机制直接访问所有磁盘系统
和shared-memory、shared-disk相比,shared-nothing优势明显,在针对多用户并行访问的时候,通过横向扩充资源,能够大大减少响应时间,提升整体吞吐量和效率。

3、分片

shared noting需要确立一种分片策略,使得依据不同的分片策略,减少资源竞争。

三种基本的分片策略结构:

(1)功能分片 根据多个功能互相不重叠的特点进行分片,这种方式已经在ebay取得巨大成功。缺点也很明显,即技术人员需要深入理解应用领域,才能更好地分片;

(2)键值分片 在数据中找到一个可以均匀分布到各个分片中的键值。

(3)查表 在集群中有一个节点充当目录角色,用于查询哪个节点拥有用户要访问的数据。缺点在于这个表可能成为整个系统的瓶颈及单点失效点;

二、负载均衡

      负载均衡(Load Balance),顾名思义,是把服务的并发请求均衡地负载到后端多个具有相同能力的服务进行处理分担,以廉价有效透明的方式扩展网络设备或服务的带宽,增加吞吐量,增强服务的整体处理能力,提供服务的灵活性和可用性。

常见的典型的负载均衡应用场景:

(1)、web集群:将大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间。

(2)、MapReduce:单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给⽤户,系统处理能⼒得到大幅度提高。

负载均衡算法

      负载均衡算法是负载均衡设备(包括虚拟设备或相关软件)在执行负载均衡调度,选择具体处理的后端服务的时候使用的调度和分发的逻辑。负载均衡的算法只是规定了调度和分发的逻辑,在不同的负载均衡方案中都可能使用相同和(或)类似的算法,它只是负载均衡方案的一部分。

常见的主流负载均衡算法包括:

(1)轮询算法:Round Robin/Weight Round Robin Scheduling

     轮询算法通过依次轮叫的方式依次将请求调度不同的后端服务器(Real Server)。通常可以分为普通轮询和加权轮询两种方式。算法的优点是简洁且无状态。

     算法简单表示为:i = ( i + 1 ) mod n

(2)Hash算法: 随机数Hash,Sources Hashing Scheduling

     Hash算法,又叫取余算法。一般是对请求报文中的某项数据(key,一般常用客户端来源IP)计算Hash值,然后按机器数量(n)取模。

     算法简单表示为:idx = Hash(key) % n 

     Hash算法中,Key的选择常用实践如下:

     a、请求时间或随机数 特点是简单,具有一定分散性,但不稳定,一般用于要求不高的负载均衡场景。

     b、来源IP

     特点是简单。如果客户的分布比较广,这种方式分散性较好。但如果较多的客户请求来源于同一IP(公司网络通过路由器上网),分散效果较差。

    大多负载均衡设备都支持这种算法,著名的nginx和LVS等软件也支持。

(3)一致性Hash算法:Consistency Hash Scheduling

    一致性Hash算法最常用于分布式缓存(如memcached、redis等)的定位,但同时也可以在系统或程序中用于负载均衡,该算法本来的意义就在于分散负载和快速定位。

(4)最少连接或请求数: (Weight)Least Connection/Request Scheduling

    最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。

    算法主要逻辑是,调度设备或服务记录后端服务器接受请求的计数,每次请求总是发给计数最小的服务器处理。

(5)最大空闲:Most idle First(基于监控CPU,内存,带宽等综合评估) (6)、平均最快响应:平均最快响应 (7)、最少流量:Least Traffic Scheduling

    还有一种常见的就是基于会话的负载实现,但是严格来说Session(一般用于WEB)不能算是算法。Session实现负载均衡的主要过程为:首次请求记录用户的SessionID,然后再通过轮询等算法选择后端服务器,如果用户后续使用同一SessionID发起请求,则无需再选择服务器,直接转发给前面根据SessionID找到的对应的后端服务器。

负载均衡模式

    负载均衡模式主要是指在整体方案中选择从服务网络的哪个层次或哪个产品来实现负载均衡方案。

1、外部模式(RR-DNS)

    RR-DNS,即DNS轮询模式,它的原理是利用DNS服务器支持同一域名配置多个独立IP指向,然后轮询解析指向IP实现多次访问的调度和分发,实现负载均衡。

它的主要特点为:

a、负载均衡实现与后端服务完全没有关系,有DNS在本地解析指向实现轮询调度。这个方面来看性能最佳效率最高。

b、DNS服务无法检测到后端服务器是否正常,在TTL失效前,会一直指向失效的服务器,这就要求在实践生成中,必须解决后端服务器的高可用问题。

c、一般的第三方DNS服务提供商都支持该功能,但如果更新频率高或附带更新逻辑,一般会在系统内自键DNS服务,然后在注册为公共DNS服务。

2、应用层模式

    正向代理:用户通过代理服务访问internet, 把internet返回的数据转发给用户。正向代理对于整个网络请求,它的角色实际是客户端,代理客户对外的访问请求。 反向代理:接受internet上用户的请求,转发给内部的多台服务器处理,完成后转发后端服务器的返回给对应的用户。反向代理对于整个网络请求,它的角色实际是服务器,代理接受(accept)所有用户的请求。

   反向代理应用模式:常见的反向代理应用模式,比如通过 Apache, nginx等Web服务器软件实现WEB应用的负载均衡和高可用。利用反向代理软件实现负载均衡是性价比较高的模式。

三、高可用性系统设计

   系统高可用性的常用设计模式包括三种,包括:

   1、主备(Active-Standby)

工作原理:主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动(热备)或手动(冷备)方式将服务切换到主机上运行。一般需要人工干预才能回复初始状态。

   2、互备(Active-Active)

工作原理:两台主机(A标记为主,B标记为备)同时运行各自的服务工作且相互监测情况,当任一台主机(A)宕机时,另一台主机(B,启用并标记为主)立即接管它的一切工作,保证工作实时可用

  3、集群(Cluster)

工作原理:多台具有相同能力的服务同时对外提供透明服务,所有服务之间都是Active-Active关系,并分担处理服务请求,一般通过总控节点或集群软件(例如zookeeper等)进行高可用的控制。

转载于:https://www.cnblogs.com/moonandstar08/p/5049853.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2010 教程:创建一个 WPF 应用程序 (第一节)

来自:https://msdn.microsoft.com/zh-cn/library/ff629048.aspx [原文发表地址] VS2010 Tutorial: Build a WPF App (Step 1) [原文发表时间] Friday, May 22, 2009 8:00 AM 这篇文章里,我将使用VS2010 Beta 1创建一个WPF 应用程序。并且 我将展示这个产…

js 日期星期 带农历

Weekday代码 //得到当前日期如2009年6月19日 星期五 function getDate(){ var today new Date(); var x new Array("星期日", "星期一", "星期二","星期三","星期四", "星期五","星期六"…

iOS 推送

最近在研究ios的推送问题,遇到了一些问题,最终整理了一下。放在这里和大家分享APNS的推送机制首先我们看一下苹果官方给出的对ios推送机制的解释。如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写…

iOS 加载本地html文件详细操作

webView的加载,如果是纯文本,有内部样式的话,简单的加载请求就可以了。如下: 这种加载简单直接,易操作。 如果需要加载images,css文件 需要把xcode的项目请求路径的位置告诉webView.代码如下: 这样html文件…

[原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)

链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框架,其跨平台的特性让它备受开发公司的欢迎。这里我就不做概念性的解释了,通过这篇文章你就会了解…

JSP EL表达式使用

为什么80%的码农都做不了架构师&#xff1f;>>> ##1.EL全名为Expression Language out.print(str) <%str%> ${str}例子&#xff1a; Hi! <%username%> 和 Hi! ${username}是一样的 只要是支持servlet2.4/jsp2.0的Container就都可以在jsp网页中直接使用e…

eclipse 中 Android sdk 无法更新的问题

诶&#xff0c;真是麻烦&#xff0c;想下个东西都下不了。我也好久没折腾过这个了&#xff0c;在家的电脑是早就下载好了的&#xff0c;然后如今又须要下载一份。下不到。网上搜到了资料&#xff0c;记录下来&#xff1a; 第一种方法:sdk manager - tools - option 选择强制 xx…

iOS10 xcode8 分页请求MJRefresh崩溃问题

MJRefresh出现崩溃现象 解决办法&#xff1a;类库增加判断 if (range.location ! NSNotFound) { language [language substringToIndex:range.location]; }

网络编程学习笔记一:Socket编程

from: http://blog.csdn.net/gneveek/article/details/8699198 “一切皆Socket&#xff01;” 话虽些许夸张&#xff0c;但是事实也是&#xff0c;现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值&#xff0c;那网络中进程之间…

[delphi]修改indy源码后重新编译

http://blog.csdn.net/nerdy/article/details/8702568 虽然indy有一身的毛病&#xff0c;但是一般情况下使用起来还是多方便的。 今天在做一个使用到indy的程序的时候&#xff0c;发现无论你怎么修改idhttp.request.accept-encoding&#xff0c;他都会在其后添加一个值 identit…

xcode8 崩溃问题

【1】、Xcode8代码出现ubsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0 2016-09-14 17:18:…

前端工具--less篇

前端工具–less篇 less 中文网http://www.bootcss.com/p/lesscss/ 常见错误及解决&#xff1a; sublime text 3 安装less2css保存less出现错误 未安装这个 npm install -g less-plugin-clean-css 未安装这个 npm install less -gd less语法 LESS 做为 CSS 的一种形式的扩展&a…

CAS单点登录配置[3]:服务器端配置

在准备工作&#xff0c;证书生成等工作完成后&#xff0c;本篇介绍服务器端的配置。 JDK配置 1我们将生成的cacerts文件分别拷贝到JDK目录下的jre/lib/security目录下及JRE对应的目录中&#xff0c;如果之前存在此文件&#xff0c;请替换&#xff1b; ENDTomcat配置 1Step 1:将…

remind程序

2019独角兽企业重金招聘Python工程师标准>>> 用了两个定时器。一个控制刷新时间&#xff0c;一个控制响铃。 定时器响应函数Timer: int wk; if(nIDEvent1) { CTime tCTime::GetCurrentTime(); wkt.GetDayOfWeek()-1; m_mnt.Format("%Y 年 …

Qt DLL总结-创建及调用QT的 DLL

目录 Qt DLL总结【一】-链接库预备知识 Qt DLL总结【二】-创建及调用QT的 DLL Qt DLL总结【三】-VS2008Qt 使用QPluginLoader访问DLL 开发环境&#xff1a;VS2008Qt4.7.4 最近看了不少Qt的DLL例子&#xff0c;总结一下如何创建和调用QT 动态链接库。 先讲一下对QT动态链接库的…

Unable to install pirate

真机测试的时候&#xff0c;报这个错误&#xff0c;主要原因就是证书的问题 xcode7以上进行的真机测试&#xff0c;可以没有使用证书&#xff0c;xcode可以进行的傻瓜操作帮助我们完成真机测试&#xff0c;但是今天我进行真机测试的时候报这个错误&#xff0c;同时xcode也不进…

memmove 对同一个指针不操作

memmove 对同一个指针不操作&#xff0c;所以调用memmove之前不用比较两个指针是否相同 void CTestDLLDlg::OnBnClickedButton6() {const int size 999999;char* data new char[size];memset(data, 1, size - 1);char* data1 new char[size];memset(data1, a, size - 1);clo…

Hadoop HDFS概念学习系列之HDFS升级和回滚机制(十二)

不多说&#xff0c;直接上干货&#xff01; HDFS升级和回滚机制 作为一个大型的分布式系统&#xff0c;Hadoop内部实现了一套升级机制&#xff0c;当在一个集群上升级Hadoop时&#xff0c;像其他的软件升级一样&#xff0c;可能会有新的bug或一些会影响现有应用的非兼容性变更出…

属性动画基础之ValueAnimator

概述 属性动画是谷歌在android3.0&#xff08;API level 11&#xff09;时候给我们带来了属性动画&#xff0c;真正意义上带来了”动画“&#xff0c;以前的帧动画也就4中效果的组合&#xff08;旋转、淡入淡出、放大缩小、平移&#xff09;&#xff0c;而且只是表面的动画&…