继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

系统架构升级之道,关注关键服务依赖

2018-06-04 21:26:255964浏览

一凡

2实战 · 485手记 · 29推荐
TA的实战

https://img4.mukewang.com/5b1536fc0001f02203160473.jpg

【数据库】

一个典型的互联网应用,前端服务器可以利用负载均衡服务,组成一个集群,但是只有一个mysql主库,这时候,mysql服务就是系统中依赖的关键服务。

关键服务的性能和波动将成为整个系统的性能瓶颈和主要问题源。


为了减轻只有一个mysql主库的依赖,我们引入了一主多从的架构,让更多从库也来提供查询服务,减轻主库的查询依赖。

这样升级改造后,系统的性能和稳定性还是有明显的提升,但是mysql查询的复杂度和数量增加后,mysql的性能瓶颈依然会很突出。

https://img3.mukewang.com/5b1537db000171a703580460.jpg

【缓存层】

于是,继续升级,引入redis或者memcache,将大量的结果缓存起来,把应用尽量从mysql隔离,减少对数据库的依赖。

这时候,我们会欣喜的发现,应用的性能比之前完全依赖mysql的时候要强好多,稳定性也响应的提高很多。


随着我们的系统越来越复杂,访问量越来越大,缓存层的压力也会越来越大。

一方面是内存不足的问题,另一方面数据更新更复杂,还有就是访问压力以及内网带宽的瓶颈也增加了。

这时候又要开始对缓存层继续升级改造了,于是分布式缓存集群也就出现了。

通过一致性hash算法或者简单的散列方法,都可以很容易的增加redis/memcache服务来构建更大规模的集群。

这样一来,随着服务器增加,单机的内存瓶颈减轻了,访问压力以及带宽压力也降低了,但是数据更新的问题依然存在。

数据更新的问题,就是数据不一致的问题,本质上就是因为一个数据的多次写入,中间出现异常的话,就导致出现不一致了。

关于数据一致性问题,我们后面再来详细分析和讲解。


随着缓存层集群的构建,整个系统架构就变成了多前端服务器,多缓存服务器,一个主库,多个从库。

主库主要承载数据写入的负载,在大部分的互联网应用中,写入的数量相对还是少很多的,所以大部分时候,这样的架构也就可以安枕无忧啦。


【更大规模】

我们的追求不仅是眼前的苟且,还有更强大的系统和更多的用户。

当我们的应用,用户数、访问量过千万之后,以前的架构还是会遇到越来越多的挑战。

这里面,可能数据库还是会第一个出现瓶颈,毕竟一个主库,再强大也是没法做到一秒钟数万次的更新,哪怕只是小小的点击数的增加。


这时候,就要开始考虑对数据库做分拆了,把一个数据库分拆为好几个数据库(分表分库)

而分拆的方式,大家应该能想到的,比如:水平分拆和垂直分拆。

https://img1.mukewang.com/5b15387e00013d2805040465.jpg

【水平分拆】

典型的水平分拆就是对数据做归档,按照日期(每年归档),把旧的数据迁移到归档库里面,访问量少,也不会有写入的压力。

水平分拆对整个系统的改造和变化相对来说是影响比较小的,毕竟数据结构没有变化,只是数据源增加了。

而这种分拆带来的明显效果就是,数据规模减少,数据库的读写性能都会有明显的提升,当然对整个应用的性能和稳定性都会有很大提高。

https://img.mukewang.com/5b153ab80001ee4907500485.jpg

【垂直分拆】

如果只是对数据库做垂直分拆,只是把一部分数据表迁移到其他独立数据库中,比如:把用户相关的信息表迁移到用户库,把商品相关的产品表迁移到商品库,那这个分拆也不算难。

但是,往往伴随着系统规模的变大,应用的复杂度也会不断提高。

所以,这个时候垂直分拆,很可能会同时进行应用的分拆。

比如:把用户的登录注册、信息维护单独部署和维护,把商品信息的管理和维护单独部署。

这时候,应用也就同时进行了垂直分拆,即:把大的应用进行组件化、服务化。

https://img2.mukewang.com/5b153c36000128ec05500353.jpg

【微服务】

到这个阶段,大家应该就开始感觉大一个系统的复杂了吧。

一开始说好的做一个互联网应用,而现在却出来了很多个应用和服务,他们之间又有很多关联,组成一个大型的系统。

这时候,系统中的关键服务依赖已经不仅仅是缓存层、数据库服务,而变成了一个个拆分之后的应用、微服务了。

这时候,系统的性能和稳定性就完全依赖各个微服务的性能和稳定性了。

如果,再把每个微服务按照上面的架构升级路线演练一遍,貌似又不那么困难。

但是,全部组合在一起,新的难点已经是对这些服务的监控、运维、故障排除等治理工作

https://img4.mukewang.com/5b153cf5000109da07490612.jpg

【畅想未来】

那么,系统继续升级的话,我想,可能就是自动化运维的工作会更多了吧。

一两个数据库宕机不用怕,主从自动切换,数据库集群秒级自动恢复。

几个缓存服务器网络不稳定也没关系,有备份的缓存可以先用着。

微服务的一些服务器不稳定,服务自动降级,并且在微服务稳定后自动恢复以及同步数据。

甚至一个机房断网、断电了,其他机房依然正常的提供全面的服务,不影响用户使用。


【总结】

关键服务依赖总是最重要的环节,也是最容易出问题的地方。

系统架构升级,正是对这些关键依赖的瓶颈进行针对性优化升级和改造。

应用从小变大,再分拆变小,从一个应用到很多个微服务,这些都是技术不断变革的过程。

规模化带来了带来了的总体容量和总体性能的提高,同时也带来了关于服务治理的新挑战。


那么,是不是开发系统都要用这么复杂的架构呢?

其实不是,上面的架构升级过程,其实是对线上问题不断发现和解决的过程,也是一个不得已的过程。如果一个系统的用户量、业务量不大,一开始就复用一套庞大的系统架构,那真的就费时费力,累死自己,完全没必要。所以,合适就好


在实战课程 《PHP秒杀系统 高并发高性能的极致挑战》中,也是针对这类高并发的业务场景做了特定的性能优化以及分布式方案,大家可以参考学习。

打开App,阅读手记
8人推荐
发表评论
随时随地看视频慕课网APP

热门评论

学习了,最近在用sping cloud

厉害


查看全部评论