分布式架构的演进过程( 二 )


过多时会造成内核占用比较多的 CPU 。
2. 文件 IO,比如频繁的日志写入,磁盘本身的处理速度较慢、都会造成 IO 性能问题
3. 网络 IO,带宽不够
4. 内存,包括内存溢出、内存泄漏、内存不足
实际上不管是应用层的调优也好,还是硬件的升级也好 。其实无非就是这几个因素的调整 。
应用服务器复杂告警,如何让应用服务器走向集群
假如说这个时候应用服务器的压力变大了,根据对应用的检测结果,可以针对性的对性能压力大的地方进行优化 。我们这里考虑通过水平扩容来进行优化,把单机变为集群

分布式架构的演进过程

文章插图
 
应用服务器从一台变为两台,这两个应用服务器之间没有直接的交互,他们都依赖数据
库对外提供服务,那么这个时候会抛出两个问题
1. 最终用户对应两个应用服务器访问的选择对于这个问题,可以采用 DNS 解决,也可以通过负载均衡设备来解决
2. session 的问题?
水平和垂直扩容
对于大型的分布式架构而言,我们一直在追求一种简单、优雅的方式来应对访问量和数据量的增长 。而这种方式通常指的是不需要改动软件程序,仅仅通过硬件升级或者增加机器就可以解决 。而这种就是分布式架构下的伸缩设计
伸缩分为垂直伸缩和水平伸缩两种
垂直伸缩:表示通过升级或者增加单台机器的硬件来支撑访问量以及数据量增长的方式,垂直伸缩的好处在于技术难度比较低,运营和改动成本也相对较低 。但是缺点是机器性能是有瓶颈的,同时升级高性能的小型机或者大型机,成本是非常大的 。这也是阿里去 IOE 的一个原因之一
增加 CPU 核心数:增加 CPU 后系统的服务能力能够得到大的增长,比如响应速度、同时可以处理的线程数 。但是引入 CPU 后也会带来一些显著的问题
1. 锁竞争加剧;多个线程同时运行访问某个共享数据,那么就涉及到锁竞争,锁竞争激烈时
会导致很多线程都在等待锁,所以即时增加 CPU 也无法让线程得到更快的处理 。当然这里是有调优手段的,可以通过调优手段来降低锁竞争
2. 支撑并发请求的线程数是固定的,那么即时增加 CPU,系统的服务能力也不会得到提升3. 对于单线程任务,多核心 CPU 是没有太大的作用的
增加内存:增加内存可以直接提成系统的响应速度,当然,也有可能达不到效果,就是如果JVM 堆内存是固定的 。
水平伸缩:通过增加机器来支撑访问量及数据量增长的方式,成为水平伸缩,水平伸缩理论上来说没有瓶颈,但是缺点是技术要求比较高,同时给运维带来了更大的挑战
垂直伸缩和水平伸缩都有各自的有点,我们在实际使用过程中都会对两者做结合,一方面要考虑硬件升级的成本,一方面要考虑软件改造的成本 。
引入负载均衡设备
服务路由,基于负载均衡设备来实现
分布式架构的演进过程

文章插图
引入负载均衡器以后,会带来 session 相 关的问题
负载均衡算法
轮询(Round Robin)法
将请求按顺序轮流分配到后台服务器上,均衡的对待每一台服务器,而不关心服务器实际的连接数和当前的系统负载
缺点:当集群中服务器硬件配置不同、性能差别大时,无法区别对待
随机法
通过系统随机函数,根据后台服务器列表的大小值来随机选取其中一台进行访问 。随着调用量的增大,其实际效果越来越接近于平均分配流量到后台的每一台服务器,也就是轮询法的效果
优点:简单使用,不需要额外的配置和算法 。
缺点:随机数的特点是在数据量大到一定量时才能保证均衡,所以如果请求量有限的话,可能会达不到均衡负载的要求 。
源地址哈希法
根据服务消费者请求客户端的 IP 地址,通过哈希函数计算得到一个哈希值,将这个哈希值和服务器列表的大小进行取模运算,得到的结果便是要访问的服务器地址的序号 。采用源地址哈希法进行负载均衡,相同的 IP 客户端,如果服务器列表不变,将映射到同一个后台服务器进行访问 。
加权轮询(Weight Round Robin)法
不同的后台服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不一样 。跟配置高、负载低的机器分配更高的权重,使其能处理更多的请求,而配置低、负载高的机器,则给其分配较低的权重,降低其系统负载,加权轮询很好的处理了这一问题,并将请求按照顺序且根据权重分配给后端


推荐阅读