文档章节

针对大型应用构建可伸缩系统-分布式java应用(林昊)

memristor
 memristor
发布于 2014/08/06 18:58
字数 1672
阅读 97
收藏 4
点赞 0
评论 0

如何支持大型应用?

垂直伸缩:增加单台机器的硬件来支撑访问量与数据量的增长。适合小型应用,容易达到瓶颈,成本高

水平伸缩:通过增加机器数量来支撑访问量与数据增长量。没有瓶颈,但是对技术要求更高。占用更多空间能源,提高了运营成本。机器数量大规模增加后,机器硬件出现故障的概率也大大增加(每10000台机器中每天报废一台)

通常在应用中可以混合采用垂直伸缩和水平伸缩。


垂直伸缩

访问量

web应用随着访问量的增长,瓶颈通常在cpu和内存上。

CPU

1、锁竞争激烈:很多线程都在等锁,增加cpu也无法充分利用。要尽可能降低系统中的锁

2、用于支撑并发请求的线程数是固定的

3、单线程任务

内存

1、cache的集合大小是固定的。通常系统借助cache提升性能,为了避免内存资源消耗过多会限制cache大小。如果cache大小固定增加内存也不会提升性能。

2、JVM堆内存是固定的。

大数据量

分表

按主键ID、时间或业务等进行数据表的拆分,单张表数据量减少,读写速度可以得到进一步提升,但开发会复杂。


水平伸缩

技术要求高,无限扩展。

缓存

对于水平伸缩,最佳的情况是无状态。业界通常采用一种称为SNA(share nothing architecture)的体系知道如何构建无状态的应用。SNA架构将有状态的部分集中放入缓存或者数据库中。数据库通常采用集中存储。那么缓存怎样支持水平伸缩呢?

对于用户登录的信息通常采用缓存。进行水平伸缩如何保证各台机器上缓存消息一致呢?

1、广播同步

广播同步通常基于Multicast实现。用户登录访问到NODE A,  NODE A验证过用户身份后将用户已登录的信息进行广播,NODE B与NODE C也会受到信息。

java用于实现广播同步的开源软件主要为JGroups。 Jetty和Tomcat的HTTPSession信息的同步就是基于JGroups实现。

缺点:有延时,适用于缓存少以及节点少的机器。

2、分布式缓存

多台机器构成一个巨大的缓存池,每台机器缓存一部分数据。

用户登录访问Node A。 NodeA验证用户信息,将用户信息放入分布式缓存集群中的某台机器上。用户登录访问其他功能进入Node B, Node B从分布式缓存集群的某台机器寻找用户的登录信息。怎么确定NodeA与NodeB在同一台机器上(都在CacheA上)操作用户信息呢?最简单的方法是对用户Id进行哈希。

缺点:机器发生增减会出现大量缓存失效的现象

一致性hash算法

1)、将节点机器进行hash求得hash值落在2…^32圆环上

2)、key存储前首先计算key的hash值,落在圆环上。从此位置沿着顺时针寻找圆环的第一台节点机器。增加节点时影响的是落在节点逆时针方向一小段方位的key,减少一个节点影响的也是其逆时针方向一小段方位的key

开源界分布式缓存使用最广的是memcached,memcached server采用c实现提供了多种语言版本的客户端

文件

1、直连式存储(DAS:Direct-Attached Storage)

各系统直接与一个集中的存储设备相连

缺点:容量有限,文件多性能下降明显,成本高

2、网络存储(Fabric-Attached Storage)

分为NAS(Network-Attached Storage)与SAN(Storage Area Network)

NAS:存储节点是单独的,不能看成一个统一的存储区,不过硬件成本和使用成本低

SAN:采用光纤连接磁盘阵列和服务器主机,实现将多个磁盘阵列构成一个对外统一的存储区。

3、分布式文件系统

采用众多普通pc server构成巨大存储持。典型的有GFS,HDFS,TFS

GFS工作原理

NODE A 要上传文件

1)、NODE A将文件按照固定大小划分,向主服务器(一个单点机器)提交文件名和索引信息

2)、主服务器根据个存储机器的状态来决定需要存储到的目标机器

3)、Node A将数据存储到目标机器上,主服务器记录文件和块的命名空间,文件到块的映射以及每个块副本的位置

应用

系统建设的初期会采用将各种业务放在同一个系统的方式。这会导致系统日渐庞大,所需资源(cpu,内存,数据库连接)越来越多。

可以将应用拆分,将在同一个系统中的功能拆分到不同的业务系统中。

数据库

1、缓存

为了降低数据库访问量,使用缓存

2、分库

在系统发展初期通常将不同的数据放在同一个数据库中。随着规模的增加数据库连接是非常稀有的资源。

分库通常按照业务领域将原来存储在同一个数据库的数据拆分成多个数据库。

带来的问题:原来的联合查询需要多次查询,写入要引入事务,系统可能需要修改

3、异步数据库访问

同步:每进行一次数据库操作就占用一个数据库连接,并且要等到数据库执行完毕才会将连接释放。

异步:将传统的阻塞IO访问数据库方式转变为非阻塞或异步IO。     

4、DAL

DAL:数据库连接都在DAL中进行统一控制,可以透明化分库分表

5、读写分离

多数数据库均提供了机制用于实现读写分离

对称复制:有延时,每个slave都保存了master中的全部数据

非对称复制:提升了数据的响应速度,但是每个slave数据不同,业务服务器在访问时较为复杂,出现了故障需要去master中读

comes from:《分布式java应用 基础与实践》林昊 

© 著作权归作者所有

共有 人打赏支持
memristor
粉丝 44
博文 199
码字总数 174582
作品 0
长沙
程序员
阿里,百度,腾讯等一线互联网公司中,Java开发的招聘标准

金三银四的跳槽热潮即将过去,在这两个月的跳槽的旺季中,作为互联网行业的三大巨头,百度、阿里巴巴、腾讯对于互联网人才有很大的吸引力,他们的员工也是众多互联网同行觊觎的资深工程师、管...

javaxuexi123 ⋅ 04/20 ⋅ 0

Java开发学习之三版本简介 java编程

  Java编程语言,在更迭迅速的互联网领域多年屹立不倒,足以得见Java这门语言旺盛的生命力,因此,会有很多想要进入互联网领域的朋友,想要学Java来转行开发。但是,所谓“隔行如隔山”,j...

老男孩Linux培训 ⋅ 06/05 ⋅ 0

架构书籍推荐:Java中高级、架构师值得一读!

上周我们免费送出了6本关于Python的重量级技术书籍,推出后反响特别强烈,有一个和最后一名仅差了一个赞,不过我们还是额外加送了一本送给这位朋友,以资鼓励,从另一面也可以看出Java程序猿...

Java技术栈 ⋅ 04/14 ⋅ 0

Java就业变难了?你需要对自己有点信心

伴随着IT的火热,越来越多的人进入了IT领域,这在进一步推动着IT发展的同时也极大增加了就业压力。伴随着激烈的岗位竞争,越来越多的人开始感叹工作难找,越火的行业越是如此,Java自是首当其...

糖宝_d864 ⋅ 06/08 ⋅ 0

“Spring三剑客”,助你快速从月入过万的程序员到年薪百万的架构师

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 Spring作为Java开发的事实开发框架,一直以来都被开发者誉为杀手级...

异步社区 ⋅ 05/10 ⋅ 0

为什么Scala能进入TIOBE发布的5月编程语言榜单中?

     首先简单介绍一下Scala语言。Scala创建于2003年,专门用来解决Java程序员所遇到的一系列问题的,比如代码冗长,性能差。它能够进入到TIOBE刚刚发布的编程语言榜单的原因是它的优势和...

张旭乾 ⋅ 05/07 ⋅ 0

Grails 框架的作者最新力作 —— Micronaut 正式开源

来自官网的最新消息 —— Micronaut在5月23日正式宣布开源。 Micronaut是Grails团队的新坑,在Grails框架的基础之上吸取大量经验,针对微服务应用场景打造的全新框架。 这套框架依旧基于JVM...

Feng_Yu ⋅ 05/24 ⋅ 0

ZooKeeper学习笔记八 ZooKeeper典型应用场景——命名服务

《从Paxos到ZooKeeper分布式一致性原理与实践》 电子工业出版社 命名服务是分布式系统中比较常见的一类场景。命名服务是分布式系统最基本的公共服务之一。在分布式系统中,被命名的实体通常可...

xundh ⋅ 05/02 ⋅ 0

【J2EE】之常用的接口和协议

前言 初接触J2EE,会遇到很多之前没有遇到过的术语,下面我们来简单地汇总一下这些接口和协议吧。 各大接口和协议详解 JDBC 1.定义:Java数据库连接 2.地位:用于Java应用程序连接数据库的标...

m18633778874 ⋅ 04/26 ⋅ 0

阿里、百度等多家公司Java面试记录与总结

算算自己大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面试经验。 我现在主要的方向是Java服务端开发,把遇到的问题和大家分享一下,也谈谈关于技术人员如何有方向...

⋅ 02/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

Spring JDBC使用方法

普通实现: 1、创建数据表customer。 可以使用任何数据库实现,在项目中要引入相应数据库驱动包并配置相应数据库连接。 2、创建Customer pojo。 Customer类的属性对应数据库的属性,除了为每...

霍淇滨 ⋅ 今天 ⋅ 0

Contos 7 安装Jenkins

Jenkins是一款能提高效率的软件,它能帮你把软件开发过程形成工作流,典型的工作流包括以下几个步骤 开发 提交 编译 测试 发布 有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动...

欧虞山 ⋅ 今天 ⋅ 0

revel

revel install go get github.com/revel/revelgo get github.com/revel/cmd create new app revel new git.oschina.net/zdglf/myapp run app revel run git.oschina.net/zdglf/myapp ot......

zdglf ⋅ 今天 ⋅ 0

49. Group Anagrams - LeetCode

Question 49. Group Anagrams Solution 思路:维护一个map,key是输入数组中的字符串(根据字符排好序) Java实现: public List<List<String>> groupAnagrams(String[] strs) { Map<Strin......

yysue ⋅ 今天 ⋅ 0

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 今天 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 今天 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部