项目发展阶段系统如何扩容?

随着系统的发展,用户越来越多,流量也相应的增加,最终原有系统无法处理那么大的流量,这个时候就需要考虑进行扩容。

那么扩容的方法有哪些呢?下面就来简单地介绍一下。

一、单体应用垂直扩容。

其实简单来讲,就是通过提升硬件配置来解决性能问题。

  1. 将CPU从原来的16核提升到32核。
  2. 将内存由原来的32G增加到64G。
  3. 将磁盘更换为读写性能更好的SSD。
  4. 将网卡更换为千兆网卡或万兆网卡。
  5. 。。。

不过不管怎样,单机的瓶颈总会来得很快,所以我们最终还是要考虑分布式技术。

二、单体应用的水平扩容。

水平扩容目前更多的是指部署额外的镜像服务来实现的。

  1. 前端接入层瓶颈,那么可以部署更多的前端机,通过上层的负载均衡器来分配流量到不同机器。
  2. 数据库读遇到瓶颈,那么可以部署更多的从库来提供读服务。
  3. 数据库写遇到瓶颈,那么可以将业务数据拆分到多个表,分散写IO。
  4. 。。。

当业务发展得越来越庞大时,水平扩容也无法解决性能瓶颈,这时候就需要对应用进行拆分了。

三、应用拆分

将之前的单体大应用拆分成多个小应用,即把大系统划分为一个个小系统,每个小系统都有自己独立的物理属性,这样整个系统的承载量就会提升很多。

另外,拆分后的系统需要考虑如何把它们建立联系,比如SOA化,或者近几年比较火的微服务化。

拆分可以根据业务进行拆分,也可以根据功能进行拆分,越细粒度的拆分,整个系统的承载量会很高,而且可以针对高流量的服务单独扩容,不过相应的维护成本也会很高,需要做好服务管理,依赖管理等等。

业务拆分:

  1. 用户系统
  2. 订单系统
  3. 支付系统
  4. 。。。

功能拆分:

  1. 缓存集群
  2. CDN服务
  3. 图片服务
  4. 存储服务
  5. 。。。

四、数据库拆分

流量继续增加,这时候数据库开始有了压力,可以根据业务纬度对数据库进行垂直拆分,一个是解决IO问题,再一个可以提升整体存储容量。

不过拆分也会遇到很多问题,比如联表查询不再很方便地处理。这时就需要考虑使用全局表,或者使用其它组件:如Solr或ES。

读写拆分上面在单体应用的时候就已经讲过了。

另外还有就是分库分表,可以按照时间(比如按天),用户(比如用户ID散列)等进行拆分。

另外,还可以考虑使用NoSQL。比如:MongoDB,Cassandra,HBase等等。

有些不是特别重要的数据还可以考虑存储在Redis中,读写性能比较高。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注