软件架构课 Day2

55 阅读1分钟

因为 Session 存储在服务器的内存中,那么当服务器水平拓展成多节点时,我们在设计时就必须在以下三种方案中选择其一: 要么就牺牲集群的一致性(Consistency),让均衡器采用亲和式的负载均衡算法。比如根据用户 IP 或者 Session 来分配节点,每一个特定用户发出的所有请求,都一直被分配到其中某一个节点来提供服务,每个节点都不重复地保存着一部分用户的状态,如果这个节点崩溃了,里面的用户状态便完全丢失。 要么就牺牲集群的可用性(Availability),让各个节点之间采用复制式的 Session,每一个节点中的 Session 变动,都会发送到组播地址的其他服务器上,这样即使某个节点崩溃了,也不会中断某个用户的服务。但 Session 之间组播复制的同步代价比较高昂,节点越多时,同步成本就越高。 要么就牺牲集群的分区容错性(Partition Tolerance),让普通的服务节点中不再保留状态,将上下文集中放在一个所有服务节点都能访问到的数据节点中进行存储。此时的矛盾是数据节点就成为了单点,一旦数据节点损坏或出现网络分区,整个集群都不能再提供服务。