分布式理解之二:分布式、集群、负载均衡、弹性、云计算、失效迁移
1、一个系统不同的业务通过位于不同位置的服务器解决,跨域网络并且相互调用,这一个系统称为分布式系统。
2、服务器1相当于整个系统的“门面”,如果服务器1挂掉了,发生了单点故障,此时整个系统将无法访问,解决办法是对于服务器1创建集群(解决单点故障),集群上每一台机器都是系统A的实例,对外提供同样的服务。
3、创建集群后,如何将前端发来的请求均衡的分发到每一台服务器上呢?使用负载均衡器,很明显,这个负载均衡的工作最好独立出来, 放到独立的服务器上 (例如Ngnix)
当然,为防止负载均衡器发生单点故障,也需要对负载均衡器创建集群。
但负载均衡的集群具有以下特点:(为什么需要这样?)
- 这个新的集群中虽然有两个机器,但我们可以用某种办法,让这个集群对外只提供一个IP地址, 也就是说用户看到的好像只有一个机器。
- 同一时刻,我们只让一个负载均衡的机器工作, 另外一个原地待命。 如果工作的那个挂掉了,待命的那个就顶上去。
4、如果对于双11大流量大应用的场景,可以多增加几台机器实现。但平时没有如此高的请求,新增的几台机器就成了摆设。这就要求系统有一定弹性,如何解决呢?
云计算:在云端可以轻松的创建、删除虚拟的服务器, 那样就可以轻松地随着用户的请求动态的增减服务器了。 双11来了就创建虚拟服务器,等到双11过去了就把不用的关掉, 省得浪费钱。
5、如果小明在集群中某一台机器上,登录并创建了购物车,结果这台服务器宕机了,小明之后的请求会被发送到其他的服务器上,而此时服务器并没有保存小明之前的状态信息,怎么解决呢?
还有更严重的,假设用户是在服务器1.1上登录的, 用户登录过的信息保存到了该服务器的session中, 现在这个服务器挂掉了, 用户的session自然也不见了,当用户被失效转移到其他服务器上的时候,其他服务器发现用户没有登录, 就把用户踢到了登录界面, 让用户再次登录!
必须考虑集群之间的状态同步,即失效迁移问题,当某一台服务器宕机之后,其他服务器必须能获得该服务器上保存的数据状态。
解决办法:
1、状态信息在集群的各个服务器之间复制,让集群的各个服务器达成一致, 谁来干这个事情? 只能是像Websphere, Weblogic这样的应用服务器了。
2、将状态几种存储在一个地方,让所有的服务器都能访问到。redis