第23章 集群
第23章 集群
一、为什么需要集群
- 有许多用户,可能在许多不同的地方
- 是长时间运行的,也就是说,需要“始终运行”
- 每秒处理大量事务
- 用户数量和系统负载可能会增加
- 代表可观的商业价值(比如支付系统是一个很关键的系统,但是类比电子书店的浏览功能就是个很随便的功能,因此为了保证支付的可靠性,很可能需要把常规的业务服务和支付服务分开,保证安全和可靠性)
- 由多人操作和管理
然后是一些概念:
- 节点:每个主机都是一个节点
二、负载均衡
- 负载平衡意味着在集群节点之间分配请求,以优化整个系统的性能。
- 方法一:负载平衡器用来决定为请求选择哪个目标节点的算法可以是系统的或随机的。(优点:负载均衡的效果比较好,不同的机器轮流来处理,一般来说比方法三的效果好;缺点:session需要单独维护,以及没有方法二的优点)
- 方法二:负载平衡器可以尝试监视集群中不同节点上的负载,并选择负载低于其他节点的节点。(优点:相比较上面的多个机器按照顺序轮流来处理用户请求,比如假设有个用户的请求需要的处理时间比较长,夸张点说假如需要处理一分钟,那么负载均衡器在后面接收到别的用户的请求,就不会向刚刚那个正在处理长请求的服务器发送,而会选择空闲或者说是最少链接的机器来处理请求,缺点:session需要单独维护)
- 方法三:ip-hash Web负载平衡器的一个重要特性是会话粘性,这意味着客户端会话中的所有请求都指向同一服务器。(优点:保证了会话的粘制性,只要用户的IP不变,集群中处理用户请求的机器就不会变,缺点:这是三种方法里面负载均衡效果最差的一种,如果hash函数选择的不好的话,最终的结果很可能是导致集群里面的经常是一台机器在处理请求,而另外的几个机器可能没有什么请求被分配;当然还有一个缺点就是如果用户改变了IP,比如上网途中开启了或者关闭了VPN或者代理服务器,导致用户ip改变,这时候session就可能丢失)
三、session维护
由于我们使用负载均衡,第一次可能第一次登录转发给了A服务器,第二次订单可能转发给了B服务器,那我们知道服务器session是存储在内存里面的,B服务器怎么知道A服务器的session?
- 方法一:用ip-hash,保证对于同一个用户的访问,用同一台机器处理。
- 方法二:用一台单独的服务器,例如redis,存储用户的session,这样的话所有的机器只需要在集群里面的redis服务器里面拿就可以找到用户的session。此外,这种方法后端应用服务器重启之后,用户的session不会丢失。
- 方法三(不推荐):不同的后端服务器之间建立通讯,获取session方法。
四、Mysql集群
- 组成:一个类似GateWay的MySQL Router,负责转发请求。
- 数据库组成可能是一个主MySQL服务器,两个从MySQL服务器,主服务器负责读写操作,后面两个从服务器只能读,然后同步主服务器的内容。
- MySQL Router,负责转发请求也会保证负载均衡,对于读的操作均衡分配(当然主服务器可能会少一点)对于写的操作分配给主服务器。