构建可伸缩系统:垂直伸缩、水平伸缩、应用无状态、一致性哈希、分布式文件系统、分布式计算框架、应用垂直拆分、数据库读写分离-《分布式Java应用》读书笔记

前言

通过垂直伸缩和水平伸缩方式构建可伸缩系统。
在这里插入图片描述
垂直伸缩:
在这里插入图片描述
水平伸缩:
在这里插入图片描述
本文为《分布式Java应用》读书笔记

构建可伸缩的系统

垂直伸缩和水平伸缩

通常将通过升级或增加单台机器的硬件来支撑访问量及数据量增长的方式称为垂直伸缩,垂直伸缩的好处是技术难度相对较低,对于小型应用而言是一种不错的选择。其缺点是机器的硬件是无法不断升级和增加的,很容易达到瓶颈,而如果想升级为更高级别的机器时通常带来的成本是指数级的,因此对于大型应用而言,垂直伸缩不是一种好的选择。

通常将通过增加机器来支撑访问量及数据量增长的方式称为水平伸缩,水平伸缩从理论上来说并没有瓶颈,其缺点是对技术上有较高的要求,另外在增加机器时,要考虑机器的增加对于空间、能源的占用。空间的占用要求机柜要足够充足,能源的占用则意味着电力、网络带宽的消耗,这些都会给应用的运营带来更高的成本。除此之外,当机器数量大幅度增加后,机器硬件出现故障的几率也将大幅度上升),此时软件上的容错、机器的管理和维护就显得至关重要了。

垂直伸缩

支撑高访问量Web应用随着访问量的增长,通常其瓶颈会出现在CPU或内存上,网络IO或磁盘IO出现瓶颈的几率较低,在此仅分析当增加CPU或内存时,应用如何做到线性地增长。

垂直伸缩支持高访问量

增加CPU后

增加CPU后要做到增加CPU后系统的服务能力线性地增长,要求系统能够随着CPU的增加,响应速度提升或同时可用于处理请求的线程增加,主要有以下三种情况会造成增加CPU后系统的服务能力无法线性增长。

  • 锁竞争激烈锁竞争激烈时造成很多线程都在等待锁,此时即使增加CPU,却无法让线程得到更快的处理,也无法开启更多的线程来处理请求,应对的策略是尽可能地降低系统中锁竞争的现象。具体的方法可参见性能调优中降低锁竞争的部分,在降低了锁竞争现象后,一方面是响应速度的提升,另一方面则可开启更多的线程来支撑高访问量。
  • 用于支撑并发请求的线程数是固定的在Java应用中,依靠启动多个线程来支撑高并发量,如启动的线程数是固定的,那么即使CPU增加了,系统的服务能力也不会得到提升,因此最佳的方法是根据CPU数(Runtime.getRuntime().availableProcessors())计算一个合理的线程数。例如Sun JDK的并行GC线程数就是根据CPU数计算得到的,这样当CPU增加后,GC的速度就可提升。
  • 单线程任务对于单线程的任务,增加CPU不会带来任何的提升。此时可以考虑按照CPU数对任务进行合理地划分,以能够通过启动多个线程来并行地将任务分解成多个任务完成,在Sun JDK 7中提供了Fork/Join来实现。

在解决了上述三个问题后,通常只要增加CPU就可提升系统所能支撑的访问量。

增加内存后

要做到增加内存后系统的服务能力线性增长,要求系统能够随着内存的增加,响应速度提升,主要有以下两种情况会造成增加内存后系统的服务能力无法线性增长。

  • cache的集合大小是固定的系统中通常会借助cache来提升性能,而为了避免内存资源消耗过多,会限制用于cache的集合的大小,如这个大小是固定的,那么即使增加了内存,能放入cache的数据也不会增多。解决这种问题的方法是根据可用的内存计算出一个比例来控制cache的数据的大小。
  • JVM堆内存是固定的JVM堆通常是在启动参数中设置的,因此有些时候可能会出现增加了内存,但JVM堆大小没有调整。因此在增加了内存后要相应地对JVM堆内存的大小进行调整,操作系统位数对可设置的大小有限制,对于要使用超过2GB内存的JVM堆而言,操作系统升级到64位是很有必要的,在调整了JVM堆内存大小后,值得注意的是要避免GC造成CPU出现瓶颈。

解决了上面两个问题后,通常只需要增加内存就可提升系统的响

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值