【网站架构】服务器弹性伸缩不能全自动,实际如何追加服务器

大家好,欢迎来到停止重构的频道。

本期,我们讨论大型网站的伸缩性

伸缩性指的是通过自动增减服务器数量以适应用户量或压力。

这些年,微服务、ServerLess、K8S等技术,都让人有一种服务器自动伸缩很容易实现的错觉

其实,想要实现服务器完全自动伸缩是一件十分困难的事情

我们按这样的顺序讨论:

1、自动伸缩服务器的难点在哪

2、数据服务软件为什么扩展服务器非常困难

3、如何处理数据服务软件扩展困难的问题 

自动伸缩服务器的难点在哪

在前面《部署架构》里说过,一个网站系统是由4部分组成的,分别是前端部分、后端部分、数据部分、云计算部分

前端部分由于可以接入CDN 所以基本不会出现性能问题。

 后端部分采用微服务且解决好共享session的话,服务器扩展也是十分简单的。

云计算部分的话,如果采用一些分布式框架,如我们研发的Hive框架,云计算服务器扩展也是十分简单的。

但是数据部分的扩展确实是一件特别麻烦的事情,数据部分包含MySQL等数据库、Redis等非关系型数据库、RabbitMQ等消息队列等等。

所以网站系统伸缩服务器的难点在于数据服务软件上

数据服务软件为什么扩展服务器非常困难

当然,数据服务软件一般都有集群方案,感兴趣的小伙伴可以翻看之前介绍。

那为什么说数据服务软件的扩展特别困难呢?不是都有集群方案吗,加一台服务器到集群应该不麻烦吧。

数据服务软件的集群方案一般有2种 :

一种是所有服务器镜像存储数据,数据库主从读写分离也是这种模式。

每次更新数据时需要做多服务器的数据同步。

如果需要新增一台服务器的话,新服务器需要同步所有数据,而同步数据是需要时间的,数据量大的话所需时间会特别长(十分不现实)。

另一种是分片存储,集群中的每个服务器只负责处理一部分数据,这是MySQL等关系型数据库常见的集群模式。

这种集群方式虽然说扩展服务器不需要同步数据,但是新扩展的服务器其实并不能缓解压力,因为数据压力仍然集中在旧服务器上。

 除了以上的问题,还有请求均衡的问题,一般需要额外增加中间件实现请求均衡。

另外,一些数据服务软件集群只能手动添加服务器(需要手工配置重启)。

所以数据服务软件的服务器扩展特别麻烦,而且扩展服务器也不一定能提升性能。

如何处理数据服务软件扩展困难的问题 

那如何处理数据服务软件扩展困难的问题呢?

一般是预先扩展,我们的做法是让数据服务软件都拥有目标性能的两倍当突发情况发生时,就可以通过快速扩展后端服务实现2倍性能扩展

如果是有大型活动,则提前扩展好数据服务软件的服务器。

另外,一个网站系统最好不要采用单数据软件实例的做法,最好根据业务模块分离多数据软件实例。

这样,一开始压力不大时可以多实例部署在一台服务器上,压力上来了,可以立马分离服务器并实现集群

但是,正如前面性能那一期所言,数据服务软件的性能是有极限的,不可能通过增加服务器以扩展无限性能。

所以,终究还是需要跳出 “扩展服务器就能扩展性能的误区”。

在性能要求特别高时,需要考虑编程方案以突破性能瓶颈。

比如,对于点击量观看量这些频繁更新的数据,可以先在Redis中增加,然后再定期写入数据库。

对于大量统计信息,可以先放到KafKa,然后再慢慢处理。

​对于一些修改概率特别低的数据,可以考虑静态化,这样就可以利用CDN缓解性能压力。

总结

网站系统的伸缩性,虽然理论上是可以做到自适应用户量的,但是现实其实很难做到,至少现在还比较困难。

最后,作为工程师,我们不要过分依赖某个软件或框架,比这更重要的是清楚软件系统的核心问题,并根据实际情况调整解决方案。

猜你喜欢

转载自blog.csdn.net/Daniel_Leung/article/details/127963979