应用程序访问数据库需要与数据库建立连接,每一个访问都需要维持一个连接,每建立一个新的连接都需要开辟一个缓冲区(内存)用来读取以及处理数据,所以数据库能够维持的连接数总是有限的。当用户量爆发增长时,数据库的性能也就出现了瓶颈,怎么处理?
解:
上面的处理引入了新的问题:之前的应用程序与数据库是通过JDBC接口连接的,那么新增加的缓存层该怎么实现数据的访问?
解:将缓存和应用程序放在同一台主机上,缓存直接保存应用程序中的对象。
随着用户量的继续增大,应用程序这台主机也处理不过来,罢工了,怎么办?
解:拆分:web服务器独用一台主机,应用程序N台主机,缓存一台主机,数据库一台主机
上面的所引入的新问题:缓存和应用程序不在同一台主机上,怎样保存数据到缓存?
解:Reids(高效的键值存储数据库),将java对象转成json格式通过jedis客服端保存到redis服务器
随着用户量的继续增大,缓存服务器也扛不住了,怎么办?
解:多增加几台缓存服务器(质量不够,数量来凑)
上面的解引入新的问题:
解:
但是余数算法面对一个新问题时就会导致大量缓存失效:在系统运行时动态的增减缓存服务器,因为服务器的数目变了。
当遇到增加一台服务器时,失效的只有两台服务器之间的缓存数据;
但是这样会导致如果服务器分布不均匀,那么就会出现某些服务器负载过高的情况(key值的映射概率问题)。
解决措施:我们需要足够多的服务器来让服务器更均匀的分布在圆上(当服务器数量越多时,出现大的不均匀的概率越小),但实际上不可能有太多的服务器,并且服务器的数量也不定。所以我们可以抽象出许多虚拟服务器(将一台服务器映射出N台虚拟服务器),再把这些虚拟服务器映射到圆上。
当涉及到集群时,就能够对一个老问题(数据安全问题)有了比较好的解决方案。原理就是当一台服务器挂掉之后,选一台备份服务器顶上。示例如下:将16384个Hash槽由两组服务器管理(当然也可以是多组服务器),每组服务器由一个master节点N个salve节点组成,其中master节点负责处理查询请求,salve节点负责同步数据进行备份。每一个节点都是一台独立的主机,甚至主从节点如果有条件的话应该分布在不同的机房,以应对有可能整个机房全部挂掉的风险(一般是电力风险),当master节点挂掉之后,在备份组里面选一台salve节点顶上。当然这一块实现起来就涉及到Redis集群的通信问题,服务器在运行时的动态增减问题,数据的备份与故障转移等问题。
Nginx是负责处理http请求的web服务器,当访问量达到一定程度时,服务器挂掉怎么办?(也叫单点故障)
解:用两台服务器,一主一从,对外只提供一个IP,当主服务器挂掉后从服务器顶上,具体的实现可以用Keepalived等类似的软件。
tomcat是负责逻辑处理的应用服务器,当处理量达到一定程度时,服务器挂掉怎么办?
解:用多台服务器协同处理,为了保证负载均衡,Nginx需要将请求均匀的转发到tomcat服务器上;
引入的新问题:tomcat是需要保存服务状态的,如果一台服务器在处理用户的过程中挂掉了,那么请求就会转移到其它服务器,但是其它服务器又没有该用户的状态信息,这又该如何处理?
解:
数据库服务器是最重要的,所有用户的数据都能够永久性的在数据库中固化下来,但是在在一个分布式的环境中,保持数据的强一致性是非常难的,稍有不慎就会乱套,特别是金融数据。怎么处理这个问题?
解:数据库有个特点就是统计出来的结果,读数据的次数远远高于写数据的次数。所以可以设计一主多从的架构,一台master数据库主要负责写数据(当然也可以读数据),多台从机负责读数据;
优点:
缺点:
对该缺点的解决措施:再抽象出一个中间层来处理双方产生的矛盾,如mysql proxy(这块后面深挖)
原文:https://www.cnblogs.com/shawn-jia/p/12435913.html