Web分布式系统设计准则

下面以一个上传和查询图片的例子来说明分布式web结构的设计考虑和常用的提高性能的方法。该例子提供上传图片和下载图片两个简单功能,并且有一下假设条件?:

- 可以存储无上限数量的图片,即存储需要scalability

- 下载图片提供低带宽延时,即速度要快

- 如果客户上传了一张图片,图片将永久保存在数据库,除非客户删除。即可靠性

- 系统容易维护

- 整个系统不能花费太高。

首先,这个例子系统提到了如下web系统设计的基本要求,其最简单的设计逻辑结构如下图。

- Availability 可用性, 即每时每刻保证网站可用。

-  Performance 性能, 即用户的响应要迅速。

- Reliability 可靠性, 即可靠的结果,两次相同的请求得到相同的结果,以及数据的一致性。

- Scalability 可扩展性, 即系统在负载加大时容易扩展。

- Manageability 易管理性,即系统是可以并且容易管理的。

- Cost 花费。即系统的花费靠谱。

Services

- 将不同模块的功能分块,每块提供不同的service(SOA, service oriented architecture),这样有利于管理和切分问题

- 另外考虑读写的性能时间消耗,一般读的速度要大于写的速度。因为读操作可以从cache读,且一般IP网络设置上传和下载速度比为1:3,写操作最后都要写到磁盘。即使全部对磁盘数据库操作,读数据库的性能也要好于写数据库,参见:(Pole Position, an open source tool for DB benchmarking, http://polepos.org/ and results http://polepos.sourceforge.net/results/PolePositionClientServer.pdf.).

- 对系统性能和并发连接数有提升(比如,apache默认连接数是500,若上传和下载在一台服务器上,读操作很快,写则需要占用大量时间,从能导致端口被消耗,并发数减少)

分块后结构图:

冗余设计

为保证系统稳定,并且关键模块在出现错误时迅速恢复,必须采用冗余技术,采用冗余后的基本结构如下图:

分块存储

如果数据过大,将导致单一服务器无法存储所有数据,而且所有数据都保存在一台服务器中使数据检索的性能下降。扩展可以分为竖直单机扩展和水平增加服务器扩展。目前业界倾向于后者。数据分块后的书评扩展基本结构为:

在web系统体系机构中,最challenge的问题是数据读取和存储部分,应用程序请求处理部分可通过负载均衡和水平扩展解决,下面将上述系统简化,重点讨论数据获取的相关技术,简化后的系统结构可简单理解为:

一般而言读数据要比写数据频繁,但写数据要写到磁盘,比读数据耗时,接下来从读写两方面来看数据获取方面在体系结构上的设计技巧,想象如下的场景:

如果这种设计,找到想要的数据无疑大海捞针,为了提高查找和读数据性能,我们一般采用如下技术:

Cache(Memcached, )

上面设计的缺点是单个node的cache容量有限,解决见下图:

上图同样有缺点,当利用load balance时,若相同的request被分配到不同的node,很容易导致不同node的cache不命中,同样低效。

上图增加一个中间的统一大cache解决问题,若未命中,由global cache所在机器负责读硬盘,这可能导致cache频繁的换入换出是命中更低效。

上述结构为global的另外一种结构,即未命中有node自己去远程数据库查询。是gloabl的cache不会被换出,更适合于在global cache中存放频繁经常使用的全局数据。

代理(Squid and Varnish

索引

Load Balance

写操作提高性能的技术可采用异步队列机制(RabbitMQActiveMQBeanstalkD,  ZookeeperRedis.)

分布式可扩展web体系结构设计实例分析的更多相关文章

  1. Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词

    http://fuxiaopang.gitbooks.io/learnelasticsearch/content/  (中文) 在Elasticsearch中,文档术语一种类型(type),各种各样的 ...

  2. mvc结合web应用实例分析

    Mvc的web应用实例分析 Login.jsp——视图部分的输入文件success.jsp——视图部分的输出文件failure.jsp——视图部分的输出文件LoginBean.java——模型部分Lo ...

  3. Spring IOC源码分析(二):Bean工厂体系结构设计

    一. 概述 Spring容器通常指的是ApplicationContext的体系结构设计,即整个Spring框架的IOC功能,是通过ApplicationContext接口实现类来提供给应用程序使用的 ...

  4. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

    在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

  5. 可扩展Web架构与分布式系统

    原文:可扩展Web架构与分布式系统 开放源代码已经成为一些大型网站的基本原则.而在这些网站成长的过程中,一些优秀的实践经验和规则也出现在他们的结构中.本文旨在介绍一些在大型网站结构设计的过程中需要注意 ...

  6. Linux系统网络性能实例分析

    由于TCP/IP是使用最普遍的Internet协议,下面只集中讨论TCP/IP 栈和以太网(Ethernet).术语 LinuxTCP/IP栈和 Linux网络栈可互换使用,因为 TCP/IP栈是 L ...

  7. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  8. RPC-原理及RPC实例分析

    还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...

  9. [转]Apache漏洞利用与安全加固实例分析

    1.2 Apache文件解析特性 Apache对于文件名的解析是从后往前解析的,直到遇见一个它认识的文件类型为止.因此,如果web目录下存在以类似webshell.php.test这样格式命名的文件, ...

随机推荐

  1. 深入理解Redis 数据结构—简单动态字符串sds

    Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库.缓存和消息中间件.其中 Redis 键值对中的键都是 string 类型,而键值对中的值也是有 st ...

  2. [ Skill ] 图形化组件在注册 User Trigger 时需要注意的事情

    https://www.cnblogs.com/yeungchie/ 使用 deRegUserTriggers 可以用来配置:当打开一个新窗口时,自动集成自定义的菜单.工具栏等等. 使用格式如下: d ...

  3. SpringSecurity+Jwt遇到的bug

    最近在使用springsecurity整合Jwt的时候,遇到了一Bug,卡住了很久,记录一下. 编写Jwt工具类JwtUtil,编写Jwt认证的核心过滤器JwtAuthenticationFilter ...

  4. 洛谷 P7451 - [THUSCH2017] 杜老师(线性基+根分+结论题)

    题面传送门 看到乘积为平方数我们可以很自然地想到这道题,具体来说,我们对 \(1\sim 10^7\) 中所有质因子标号 \(1,2,\cdots,\pi(10^7)\),对于 \(x\in[l,r] ...

  5. UOJ #11 - 【UTR #1】ydc的大树(换根 dp)

    题面传送门 Emmm--这题似乎做法挺多的,那就提供一个想起来写起来都不太困难的做法吧. 首先不难想到一个时间复杂度 \(\mathcal O(n^2)\) 的做法:对于每个黑点我们以它为根求出离它距 ...

  6. NOIP2021 游记

    不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分释迦牟尼脚绽莲花菩提达摩你真伟大天上天下唯我独尊如来佛祖太上老君耶稣耶稣 ...

  7. react native安装遇到的问题

    最近学习react native 是在为全栈工程师而努力,看网上把react native说的各种好,忍不住学习了一把.总体感觉还可以,特别是可以开发android和ios这点非常厉害,刚开始入门需要 ...

  8. Mysql笔记(3)

    查询总数count(1)查询总和sum(数据名) 查询最大值max(数据名) 查询最小值min(数据名) 查询平均值avg(数据名) 去除重复 通过having来过滤group by字句的结果信息 i ...

  9. java的缓冲流及使用Properties集合存取数据(遍历,store,load)

    缓冲流 概述 字节缓冲流:BufferedInputStream,BufferedOutputStream 字符缓冲流:BufferedReader,BufferedWriter 缓冲流原理 缓冲区是 ...

  10. 判断是否有重复,判断字符串是否有重复汉字【c#】

    string corn = "公司"; int n = 0; if (tbCorporateName.Text.IndexOf(corn) > -1) { string co ...