一、什么是分布式
分布式的概念:一群计算机通过网络协同工作,共同完成一件事情。
在java的分布式开发过程中,应用都是运行在jvm上面的,jvm是可以看做是虚拟层面的计算机。例如在电商项目中,不项目拆封成 订单、商品、会员等多个模块,每个模块都单独部署在一个服务器上,通过网络协同共同完成电商的逻辑,这就是分布式软件系统。这样就很明显了,分布式软件系统重要的两点就是-任务拆解和节点通讯。
二 、分布式系统特点
- 分布性:多个节点、分开部署。
- 并发性:程序运行过程中,并发性操作是很常见的。比如同一个分布式系统中的多个节点,同时访问一个共享资源。数据库、分布式存储。
- 无序性:进程之间的消息通信,会出现顺序不一致问题
三、分布式系统有什么问题
- 网络通讯:网络本身的不可靠性,因此会随时遇到一些网络通信问题。
- 网络分区:当网络发生异常导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式架构的所有节点,只有部分节点能够正常通信,这种现行也称为脑裂。
- 二态变三态:在分布式架构里面,除了成功、失败、超时。
- 分布式事务:对于单体ACID(原子性、一致性、隔离性、持久性)很容易实现,对于分布式、涉及到多个节点的的事务怎么解决,这是分布式一个绕不开的问题。
- 中心化和去中心化:分布式节点增多、系统复杂性也随着增加这样系统的可靠性就会降低、可能一个节点宕机了就会导致整个系统挂掉,所以要考虑中心化和去中心化的问题,提升系统的可用性也是绕不开的话题。
四、CAP理论
根据分布式系统的特点就诞生的CAP理论,先看看大名鼎鼎的CAP是什么吧。
- C-(一致性 Consistency)所有节点上的数据,时刻保持一致。
- A- (可用性(Availability)每个请求都能够收到一个响应,无论响应成功或者失败
- P- (分区容错 (Partition-tolerance))表示系统出现脑裂以后,可能导致某些节点与集群中的其他机器失去联系。
由于网络是不可靠的所以P(分区容错是一定存在的),这是后就要对C、A之间进行取舍了,如果要保证数据一致性,就需要在出现网络分区的时候放弃一些节点,导致部分节点不可用。如果要保证可用性,需要在出现网络分区的时候网络通讯不可用,导致数据一致性不能保证。所以在实际当中只能保证CP或AP。
五、BASE理论
基于CAP理论,CAP理论并不适用于数据库事务(因为更新一些错误的数据而导致数据出现紊乱,无论什么样的数据库高可用方案都是徒劳),虽然XA事务可以保证数据库在分布式系统下的ACID特性,但是会带来性能方面的影响(仍然存在数据一致性);
eBay尝试了一种完全不同的套路,放宽了对事务ACID的要求。提出了BASE理论。
- Basically available : 数据库采用分片模式, 把100W的用户数据分布在5个实例上。如果破坏了其中一个实例,仍然可以保证 80%的用户可用
- soft-state:在基于client-server模式的系统中,server端是否有状态,决定了系统是否具备良好的水平扩展、负载均衡、故障恢复等特性。Server端承诺会维护client端状态数据,这个状态仅仅维持一小段时间, 这段时间以后,server端就会丢弃这个状态,恢复正常状态
- Eventually consistent:数据的最终一致性
看到这里大伙可能都已经明白了,BASE理论就是基本可以、数据最终一致性。
六、总结
现在分布式架构中的组件(zookeeper、redis、nginx、double、kafka、rabbitmq、ElasticSearch)和一些通讯协议的出现都是用来解决分布式系统中遇到的问题的,重点是这些组件在什么位置,解决了项目问题。
在随后的我会介绍这些组件在分布式架构中的位置、解决了什么问题、有什么不足之处、分布式事务解决方案、高并发、高可用的解决思路,尽量通俗的介绍,网友们有什么建议都可以在评论区提出来。