分布式系统介绍
分布式系统介绍
标签(空格分隔): 读书笔记
内容整理来自<大型网站系统与java中间件>
分布式系统介绍
定义:
- 组件分布在网络计算机上
- 组件之间仅仅通过消息传递来通信并协调行动
分布式系统的意义:
- 升级单机处理能力的性价比
根据摩尔定律来说,如果把时间固定下来,所需要的处理器性能越高,付出的成本就越高,性价比就越低。而且单机处理器始终有瓶颈 - 单机处理能力存在瓶颈
单机处理器的瓶颈只能通过多机来解决 - 稳定性和可用性
如果采用单机系统,如果这台机器一切正常,则一切ok,如果这台机器坏了。整个应用就访问不了了。如果要做容灾备份等方案,就需要考虑分布式系统了。
负载均衡
- 硬件负载均衡
如f5等,大多比较昂贵。 - 软件负载均衡
如lvs,nginx等。免费,可控性强
总结:
1:增加网络开销与延迟,不过基本上影响很小,可以不在考虑因素之内
2:负载均衡硬件/软件出现问题,那么整个网络都会受到影响,所以需要考虑代理服务器的双机热备问题。而且在切换过程中,未完成的请求还是会受到影响。总的来说,是一种非常方便及适用的保证高可用的一种方式。
- 采用名称服务的直联方式的请求调用
同样是完成一次请求调用,与上面f5/lvs等最大的区别在于请求发起方与请求处理方不经过代理服务器也没有代理服务器,他们双方是直接连接的,不过外部有一个“名称服务”的角色,它的作用是收集与提供请求处理的服务器的地址信息,起到的是一个地址交换的作用,原来在代理(lvs/f5)上做的工作被拆分到了名称服务和发起请求的机器上了。打个比方,就像以前的114一样,我们不知道A家的电话号码,可以打114查一下就知道了。这个名称服务就是起到了类似的作用。 - 采用规则服务器控制路由的请求调用
与名称服务的方式很像,只是采用了规则服务器替换名称服务。也一样是直联而不用通过代理服务器。这里的区别主要是规则服务器本身不和请求处理的机器进行交互,只负责把规则提供给发起请求的服务器。
总结:
1.假如这个名称服务/规则服务器暂时坏掉了,我们也有不少的办法可以保证请求的正常处理。
2.发起请求方与处理请求方是直连的方式,减少了中间路径及带宽的消耗。
3.代码升级较复杂
分布式系统难点
- 缺乏全局时钟
- 面对故障独立性
单机系统上,如果是机器或者程序的问题,整个程序就不能用了,在分布式环境中,由于分布式系统由多个节点组成,全部坏掉的概率很小很小,但是会经常出现一部分节点/模块有问题,另一部分正常运行。对于这种现象叫做故障独立性,必须要找到解决故障独立性的办法。 - 单点故障
在整个分布式系统中,如果某个功能只有在某台单机在支撑,那么这个节点称为单点,其发生的故障称为单点故障。我们要在分布式系统中尽量避免出现单点,尽量保证所有的功能都是由集群完成的。如果不能把单机实现为集群。那么解决要做好下面两点
- 给单点做好备份,能够在出问题时进行恢复,并且尽量做到自动恢复。降低恢复所有时间
- 降低单点故障影响范围
下面就是一个单点的例子,当交易数据库出现故障时,整个系统就会瘫痪。
所以为了解决这个单点的问题,我们可以添加另外一个数据库,与数据库一保持相同的数据。
4.事务
单机的事务很方便的就能控制,而在分布式环境中,事务是比较重要也比较难解决的一个问题。主要是通过两段提交(2pc)/最终一致/BASE/CAP/Paxos等来实现的。关于这些算法,可以看一下下面的这些连接:
分布式一致性算法:
http://www.hollischuang.com/archives/693
http://www.hollischuang.com/archives/663
两阶段提交协议/三阶段提交协议:http://www.hollischuang.com/archives/681
BASE:http://www.hollischuang.com/archives/672
CAP:http://www.hollischuang.com/archives/666