分布式算是软件界发展的一个里程碑,它开辟一个新的软件时代,其他的溢美之词我就不再乱说了。
分布式按照我的观点,应该分为有状态和无状态2种:
- 有状态
- 分布式数据库
- 分布式存储
- 无状态
- 分布式计算
- 分布式web系统
当然分布式尽量做成无状态的分布式,但是存储最终因为最终存储的是有状态的数据,所以不得不变的有状态。当然web系统也可以是有状态的,但是最好做成无状态的,因为无状态可扩展性更强,而有状态必须维护和确定状态和机器的对应关系,无谓增加了很多复杂性。例如:
无状态的集群,我随意增加或减少一台机器,对原有机器无任何影响。有状态的,我就需要知道新增或减少的机器,应该分配哪些数据哪些数据。
我们先从简单的无状态分布式系统说起,分布式计算我就不再展开了,针对web系统如何架构为无状态讲解一下其中的关键:
- web系统有状态的原因是什么?如果用户都不需要登录,系统本身就是无状态的,所有人的看到都是一致的。但是用户登录之后,你要一直显示这个登录用户的相关数据,导致了系统变为有状态。
- 如何解决这种有状态呢?如果这种状态可以作为数据每次通信时传递给web系统,那web系统就可以变为无状态。这也是常见的有状态变为无状态系统的解决方案,例如web系统将有状态的数据存储在db。解决方案很简单,就是cookie记录用户id。有人说用户登录之后有好多数据,我cookie存不下,而且有安全问题,那就加一个无状态的cache集群,存储所有的用户数据。cookie的id来了之后就去cache拿一下所需的数据,针对这个有个专业的名词叫做 share nothing architecture,sna架构。
- 有了无状态的web系统,如果请求量增加,很easy,加机器就可以了。另外有些同学说加的机器怎样感知到,如果有机器宕机,又是如何感知到的,这个是负载均衡干的事情,后面会单独再讲。
无状态的讲完了,那再讲讲有状态的分布式,这个可能需要的篇幅比较多了,让我再单开一章吧。
刚才查了一下,果真有人已经提出了有状态和无状态,呵呵,看来还是有人更专业。