针对大型应用构建可伸缩系统-分布式java应用(林昊)
针对大型应用构建可伸缩系统-分布式java应用(林昊)
memristor 发表于3年前
针对大型应用构建可伸缩系统-分布式java应用(林昊)
  • 发表于 3年前
  • 阅读 83
  • 收藏 3
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 构建可伸缩系统

如何支持大型应用?

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

水平伸缩:通过增加机器数量来支撑访问量与数据增长量。没有瓶颈,但是对技术要求更高。占用更多空间能源,提高了运营成本。机器数量大规模增加后,机器硬件出现故障的概率也大大增加(每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应用 基础与实践》林昊 

共有 人打赏支持
粉丝 44
博文 195
码字总数 170156
×
memristor
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: