系统架构设计理论与原则

一、无共享架构

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("星期日", "星期一", "星期二","星期三","星期四", "星期五","星期六"…

FMDB的使用

// // FMDBmanager.h // database // // Created by PRL on 16/10/13. // Copyright © 2016年PRL. All rights reserved. // #import <Foundation/Foundation.h> interface FMDBmanager : NSObject{ FMDatabase * _db; } (FMDBmanager *)sharedManager; //获取…

深入浅出WPF之Binding的使用(一)

from: http://www.cnblogs.com/akwwl/p/3421005.html 在WPF中Binding可以比作数据的桥梁&#xff0c;桥梁的两端分别是Binding的源&#xff08;Source&#xff09;和目标&#xff08;Target&#xff09;。 一般情况下&#xff0c;Binding源是逻辑层对象&#xff0c;Binding目…

arm处理器中a5 a8 a9,v6 v7,arm7 arm9 arm11都是依据什么来分类的【转】

转自&#xff1a;http://blog.csdn.net/maochengtao/article/details/9951131ARM处理器发展这么多年&#xff0c;有很多架构&#xff0c;很多不同的内核 架构有armv1 v2 v3 v4 v5 v6 v7 内核太多了&#xff0c;比如armv1对应的是arm1&#xff0c;armv5对应的arm9&#xff0c;ar…

前端开发一些很有用的工具

apiview.com 接口规范管理平台 restClient 谷歌浏览器接口测试工具 postman 接口测试工具 SSH Secure Shell Client 抓包工具 SSH SecureFile Transfer Client wireshark 抓包分析工具 Xshell linux远程工具 Balsamiq Mockups 原型图 visio 流程图 xmind top图 SourceCounter、…

所有的iPhone设备cell的宽度都是320,解决办法是?

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.frameCGRectMake(0, 0, SW, 44); } return self; } 自己重设一下宽度就行了

深入浅出WPF之Binding的使用(二)

from: http://www.cnblogs.com/akwwl/p/3421250.html 在上一篇中介绍了Binding的基本绑定方法&#xff0c;这一篇中我们在深入的介绍Binding的其他用法。 Binding的源也就是数据的源头&#xff0c;在日常的工作中&#xff0c;除了使用像上一篇中的Student对象作为数据源外&a…

iOS 推送

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

Bash判断文件夹(目录)是否存在

1 #!/bin/bash 2 if [ -d DirName ]; then 3 echo Dir exist 4 else 5 echo Dir not exist 6 fi 转载于:https://www.cnblogs.com/imzye/p/5059031.html

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

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

HDU 5573 Binary Tree 构造

Binary Tree题目连接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid5573 Description The Old Frog King lives on the root of an infinite tree. According to the law, each node should connect to exactly two nodes on the next level, forming a full binary…

志邦橱柜坑爹,志邦橱柜大忽悠,志邦橱柜欺骗

本人实实在在经历的&#xff0c;志邦橱柜就是个大忽悠,志邦橱柜没诚信!! 志邦橱柜先骗客户下订单,在预算时低开,到真正签合同时&#xff0c;不仅仅尺寸坑你,一大堆增项都会出来,原本1.5w预算到最后签合同总价到2.2w,签合同增项高开最后志邦橱柜总价超预算非常非常离谱&#xff…

多线程的那点儿事(之读写锁)

在编写多线程的时候&#xff0c;有一种情况是十分常见的。那就是&#xff0c;有些公共数据修改的机会比较少。相比较改写&#xff0c;它们读的机会反而高的多。通常而言&#xff0c;在读的过程中&#xff0c;往往伴随着查找的操作&#xff0c;中间耗时很长。给这种代码段加锁&a…

iOS获取设备IP

获取iOS设备IP wifi和流量环境下 在网上找的比较好的获取ip的代码 #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> #define IOS_CELLULAR "pdp_ip0" #define IOS_WIFI "en0" #define IOS_VPN …

一些不错的网站

http://www.huxiu.com/虎嗅网&#xff0c;一个关注最新创业信息的网站http://36kr.com/创业天花板https://www.zhihu.com/与世界分享你的经验http://www.mafengwo.cn/世界那么大&#xff0c;想去哪就去那http://www.mt-bbs.com/找到属于自己的设计本http://www.guokr.com/科技有…

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

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

互斥锁和读写锁的区别

原文地址&#xff1a;http://blog.csdn.NET/u012884354/article/details/46691761 相交进程之间的关系主要有两种&#xff0c;同步与互斥。 所谓互斥&#xff0c;是指散布在不同进程之间的若干程序片断&#xff0c;当某个进程运行其中一个程序片段时&#xff0c;其它进程就不能…

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…