不知道从什么时候开始,咱们的面试问题清单里,就明明白白写了,如何处理大流量高并发问题,如何实现高可用?所以,我也经常会去考虑这些问题(哈哈,当然不是为了面试)。
大流量,高并发问题,好像已经成了教科书类的问题,无非就是集群,分布式,缓存,读写分离,分库分表,主备,活动预热……
如果自己仅停留在这些教科书式的回答,那就显得太肤浅或者不屑回答这种问题了,不管怎么样,我还是没明白其中的好多问题。所以我也经常会问自己。。。
- 集群怎么做?有什么问题?
首先,集群的概念,个人感觉和负载均衡是一致的,就是让一个服务背后有n个服务器在提供服务,使外部请求能够分担到多个机器,主要目的在于减轻单机压力。那么,该怎么做呢?如果是自己搭服务器,那么,入门级nginx这种工具是一目了然的产品,网上一搜都是这么干的,一个nginx可以支持几千甚至上万的请求,所以应对一时的压力自是没有问题了。如果不是自建呢,比如用阿里云,这里面提供的服务就比较全了,slb提供天然的集群能力,点点按钮就搞定,你要做的就是把n台服务器部署成完全一致的样子,让负载均衡器能够调用过来就行。所以,简单的集群已经不是问题了,解决初步的流量增长,妥妥的。但是,集群有什么问题吗?或者说是注意的点?主要注意集群和单机的不同,单机做session之类的东西是没有问题的,但是集群就不能简单这样干了,应尽量脱离会话保持这种架构,虽然类似slb这样服务都会提供会话保持功能,但是都是以牺牲性能为代价的。日志的打印,线上服务的日志是一个重要的排查依据,但是随着集群的部署,打在本机的日志就会不全,导致你查某个问题时,无法很好收集到需要的日志。当然解决方案是有的,你可以通过拉取所有机器上日志,一台台搜索就可以得到想要的了(太low),salt搜索(高级),日志中心(高级)……
- 分布式是什么?怎么做?
分布式和集群是比较容易搞混的,到少我以前是这么觉得。分布式表现也是多个服务器同时提供一个功能,不同的是分布式应该是使用不同的应用提供不同的服务,最终被聚合到一处对外表现出一个功能。分布式分应用分布式和数据分布式。应用分布式,其实转为当下流行的词就叫,微服务,拆分现有的功能为一个个小功能,使其各司一小领域,减小复杂度提高可用性。数据分布式主要是将数据分布在不同的地方,从而减轻放在一处带来的在存储压力,通过某种关系关联起来提供完整服务。
- 缓存这么重要吗?
是的,缓存很重要。所有的服务都不敢保证不怕压力的,功夫再高也怕菜刀。减少不必要的访问压力是对自己的一种保护更是一种提升能力的方式。梳理用户的访问路径,逐级缓存应用,到最后基本压力就没了。比如,大名鼎鼎的dns服务就是这样,全世界那么多的访问都通过dns进行解析,随随便便同时访问上亿,想想都觉得这个压力可怕吧,但是通过逐级缓存,使所有的dns服务器都压力小了很多。可见缓存的重要性。同样,在应用层面也可以做到逐级缓存,cdn,预加载,应用1..n级服务器缓存,数据缓存。具体到技术层面有,前端localstorage,本地缓存,cdn就近内容缓存,上级应用缓存下级应用数据,redis,memcache,mongo,本地缓存,热点数据缓存,数据库设置查询缓存策略。如此,把真正最重要的数据落到最后的压力上,应对压力就没问题了!
- 问题:如果单机应用是单点,负载均衡器不也是单点吗?
是的,负载均衡其实也只是用一个单点去代替了另一个单点,但是这个代价是值得的。因为负载均衡器无需处理业务逻辑,只是负载请求转发,所以能够承受的压力自然大得多,所以此时的单点就先不要再去考虑了。同理,如果再在负载均衡器上面再加一层lvs之类的,其原理也只是用一个单点代替了另一个单点罢了。重点在于,新的单点是否优于原有单点。起点也是终点,最终的压力都可以仍至dns去解决。
- 数据库分库分表怎么样?
这个技术的根本目的在于减轻单表数据量变大的压力,意义还是比较大的。但是真正到单表压力特别大的时候,可能也是公司需要寻找新的数据存储解决方案的时候了。说回分库分表,分库分表后,就基本做不到关联查询了,数据库提供的许多高级工具可能会因此而失效,因此,在做分库分表时,一定会面临一场浩浩荡荡的技术改造过程。当然还有人在项目初期就已经考虑进去了,那就没啥问题了。
- 读写分离怎么样?
读写分离还是很棒的,有比较大的业务都是读占主要部分,做了读写分离后,数据库就可以做主从集群了,压力就会分摊。但是,一个重要的问题就是,如何保证读到数据是准确的?另外,写数据库压力依然没变,对写场景没有一点好处。
- 数据库成为单点了怎么办?
随着集群功能的便捷易用,服务器扩展已经不是问题,外部压力大,只要加机器就可以,但是到了数据库呢?经常担心这些问题,其实也是多虑了。都说了做到多级缓存,到数据库时压力也不大了。把分布式应用的数据库分散到多个数据服务器上,天然的集群。归档无用的数据,减轻单表压力。数据库的单点还是存在的,那么就把数据库服务器配置搞好点呗。mycat做路由做分布式数据库。
- 虽然咱们会面临这么多问题,但是不要担心单点问题
单点问题永远是存在的,只要没有达到你的预警值,就不要太操心。比如,我们往往担心集群后,数据库是单点,感觉很麻烦,然后就想分库分表,读写分享,其实还是没必要的,看具体数据再说话。遇到问题了,总能解决。
9. 技术预加载,预热……