垂直伸缩
支撑高的访问量
随着CPU增加,响应速度提升或同时可用于处理请求的线程增加(服务能力线程增长), 需要解决的三个情况:
锁竞争。
用于支撑的并发请求数线程数,根据CPU数来调整。
单线程任务,能够启动多个线程并发地将任务分解成多个任务完成。
随着内存增加,响应速度提升(服务能力线程增长), 需要解决的三个情况:
cache的集合大小可根据内存计算出一个比例。
JVM堆的大小进行调整。
支撑大的数据量
分表: 具体分表策略根据业务而定, 需要应用做一定处理。
分表带来的好处是单张表的数据量减少, 因此其读写速度可以得到一定的提升。 带来的问题是, 一方面开发的复杂, 通常须借助DAL来解决, 另一方面是分页查询会比较难处理跨表查询的需求。
提升计算能力
增加计算的线程或拆分计算的步骤采用并行的方式提升计算能力。
水平伸缩
支撑高的访问量
缓存状态的水平伸缩方法
广播同步,通常基于Multicast,简单且不会带来机器成本的增加,会有一定的延时。
分布式缓存,由多台机器来构成巨大的缓存池,每台机器缓存一部分数据,其本身是水平伸缩的,需要解决的问题是机器增减时,出现大量缓存失效现象, 可用一致性hash来解决。大量请求到缓存失效数据可能会引发后端被穿透问题, 可在前端加mutex。
JVM集群框架:Terracotta
cookie、local storage、web sql database:做适当的缓存。
文件的水平伸缩方法
直连式存储(DAS:Direct-Attached Storage),程序无须改造。带来的问题是,存储设备在水平伸缩上支持得不好,会导致存储的文件容量是有限的,并且随着存储的文件增加及访问存储节点的增加,性能明显下降。
网络存储(Fabric-Attached Storage)
NAS(Network-Attached Storage),采用文件共享协议,但并发访问同一数据时文件的读写速度会大幅度下降。
SAN(Storage Area Network),采用光纤方式连接磁盘阵列和服务器主机,一方面这可以提升存储空间的利用率,另一方面也具有较好的可伸缩性。
分布式文件系统
和分布式缓存一样, 采用主服务器的单点机器解决上述问题。典型的分布式系统有GFS、HDFS。
应用的水平伸缩方法
拆分应用通常按照业务领域来划分,即将原在同一系统中处理的功能拆分到各个不同的业务系统中。
水平伸缩后,对于数据库而言,通常会带来的一个问题是如数据库连接池的增加, 而由于大多数数据库对水平伸缩支持不是很好,有三种方法:
缓存(cache),通常在系统中采用多种缓存尽可能地避免访问数据库。
页面静态化
页面片段缓存
数据缓存
分库
通常按照业务领域将原来的存储在同一数据库的数据拆分到多个数据库中。通常会带来以下几个问题:
修改已有系统,访问相应的库
有些要跨数据库的业务而言, 就变得较为复杂了, 通常从原来的联合查询转变为多次查询,而写入类的如要保证事物则可能引入分布式事务。
异步数据库的访问
将传统的通过阻塞IO访问数据库的方式转变为非阻塞或异步IO的方式来访问。
DAL(Data Access Layer)
指系统直接提交给数据库的操作转变为通过DAL来进行,在这种情况下,可借助DAL来降低数据库连接的使用。
在采用这种方式后, 无论业务服务器如何水平伸缩, 数据库连接都可在DAL上统一控制(jar, 或中间层),都有机会根据分库分表规则改变业务请求的sql及要连接的目标数据库(透明化分库、分表)。
支撑大数据量
读写分离(master-slave),适用于读多写少,并允许有一定延时的业务中
采用的方法为当写数据库时在一个数据库上写入, 而读取时则中多个数据库中读取。例如mysql replication、oracle standby等,mysql replication支持对称复制与非对称复制两种方式。
多master
为了提升数据写的速度, 通常可采用建立多个master。
一种在建立多个master时最理想的状态是多个master没有关联,也就是多个master的数据并不相同, 操作所对应的master机器即可。
另一种多master的状况为每个master的数据要保持一致,需要解决的问题:数据一致性(采用复制、两阶段提交、三阶段提交或google paxos)、自增长ID的问题(采用程序生成ID的方式)。