什么是集群
计算机集群(以下简称集群)在维基百科上被定义为一组相互连接的计算机,紧密的工作在一起,以至于在很多方面看来,它们都像是一台机器。
集群的好处
集群可能能给我们带来很多好处,其中负载均衡(loadbalance)和故障恢复(failover)一般是最常用的。负载均衡是将系统的负载分派到集群内不同的计算机上,让每个节点都不至于太忙或太闲,通过增加集群中计算机的数量,可以提升整体的负载能力。故障恢复是指在集群中某个节点发生故障时,其它的节点代替它们继续工作,这样整个系统依旧能对外提供服务。
web服务器集群的特点
对于web服务器来说,集群就是让一组计算机对外像一台web服务器一样运行。web服务器的特点是它通过http协议与客户端交互,而http协议的工作机制是请求响应模式的。web服务器的集群要能把客户端的http请求发送到集群内各个节点上,实现loadbalance,并能探测到各节点的工作情况,在某个节点失效的时候,不再把http请求发送到该节点上。
有状态与无状态
web程序本身是否有状态对实现集群的方法和难以度有很大的影响。如果web程序和客户端交互的记录下了一些状态信息,并在处理之后的请求时需要知道这样的信息,那么这个程序就是有状态的。比如,登录功能,当用户正确登录后,web程序会记录下用户的登录状态,当用户访问其它的页面时,web程序会参照用户的登录信息做不同的处理。在实现集群的时候,有状态的程序要复杂些,因为必须保证处理请求的节点上能有该用户的状态信息。对于无状态的程序,则没有这个问题,请求被分发到任何节点都是一样的,没有额外的维护状态的工作。
为了保证处理请求的节点上能有状态信息,要么在多个节点上复制程序的状态,要么采用否种策略保证将请求正确的发送到具有相应状态的节点上。如上面的例子,要么把用户登录的信息复制到集群的所有节点上,以保证无论之后请求发送到哪个节点上,都能够找得到登录信息,要么每次都把这个用户的请求发送到同一个节点上,就像mod_jk的sticky_session那样。
多线程与多进程
php,ruby,python等脚本语言往往采用无状态的结构,而java往往采用有状态的结构。并非语言决定了它们的工作方式,更多的是一种习惯。
java web服务在运行时是一个常驻内存的进程,用不同的线程处理用户请求。当处理一个http请求的线程结束后,保留在该进程内的信息并没有消失,因为进程还在。因此,可以很方便的把一些交互信息放到java进程的内存中,在多个线程间共享。在加上又有好用的HttpSession类,这样在java ee里把用户信息保存到session中,是一件非常容易的事,程序员们也自然的就采用的,导致了java web程序成了有状态的。如果完全不用session等,java web程序也能做到无状态。
和java的单进程,多线程工作方式不同,php等脚本语言采用了多进程的工作方式。当有一个http请求到来时,web服务器开启一个新的进程,这个进程调用脚本语言的解释器来运行脚本处理请求,处理结束后进程退出。如果要在多个进程间共享信息,就得采用外部的介质,DB就成了最好的选择。
本质上来说,只要需要记录会话的状态,就肯定有状态,差别只是把状态放到什么地方。java ee里往往把它放到应用程序的内存里,而php等则往往放到db里。
不错,学习了。
复制节点需要耗费大量的资源,集群10个,有1000个用户登陆,就需要在10个节点上复制1000个状态,太耗内存了,想办法搞个专门的服务器来集群节点。
哥们,好久不见了,最近怎么样啊?