前言:
没有完美的架构,只有满足了业务需求的架构才是好架构。
分布式系统是相对于单台应用来说的,建站初期考虑到资金,用户,技术等各方面原因,搭建了一套简单的系统,所有的服务都部署到一台机器,包含负载均衡,反向代理,应用服务器,数据库等,后期由于系统的复杂性的提升和用户的增加,需要采用集群和拆分服务的方式,并且各个服务分别部署到不同的机器上,这里所说的分布式系统应该包含两种:
1 大系统下不同的服务的分布式部署 2 同一个服务的集群部署
1 分布式框架的选择
如何让部署到不同服务器之间的服务通信,需要选择一个合适的分布式框架,目前主流的dubbo,spring cloud以及各个大厂自研的框架都能很好的满足分布式的日常开发需求,当然对于框架的选择,需要结合业务,以及通信的协议,具体是七层协议HTTP还是四层的rpc,tcp,socket需要综合衡量。
2 分布式锁
传统的锁以及jvm层面的锁,在单jvm实例下能够很好的工作,但是在分布式环境下,就需要借助于中间库来实现,常用的分布式锁中间价有:redis ,zookeeper ,memcache ,mysql等
3 分布式事务
传统的事务单机的,当涉及到多个服务或者多服务器的时候,需要考虑使用2PC,3PC , 基于MQ的事务控制,TCC等,根据业务类型进行选择,是强一致性还是最终一致性。
4 分布式id算法
单业务的id算法,对于效率要求没那么高,分布式id算法主要关注几点:全局唯一,趋势递增,业务隔离,高效 ,常用的算法有:UUID,数据库自增,redis,雪花算法-Snowflake,百度-UidGenerator,美团Leaf等
5 分布式日志的处理
传统的日志都在一台机器或者几台机器中方便查阅,但是在分布式环境下,由于海量的日志导致排查日志异常困难,此时常规的做法是:集中化处理 ,常用的方案有ELK,Flume等,基本思路就是先收集,再分类,最后查看。
6 分布式消息处理
单机应用我们依赖于一些常用的容器,例如各种queue或者容器,分布式系统中,不仅需要考虑消息的传递,还需要考虑可达性,并且还有其他复杂的场景,例如发布订阅,ACK等,此时可以采用RabbitMQ,ZeroMQ等消息中间件来实现。
7 其他分布式需要考虑技术场景
分布式缓存,分布式搜索系统,一致性hash算法,分布式服务框架,分布式任务调度,上传,分布式会话,分布式存储,监控,分布式配置中心等
CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼,只能至多满足其中2个。
1. C(Consistency). 一致性
状态和数据的一致性,例如在分布式事务操作中,某一个操作的状态没有及时的同步到其他节点上,从而带来一定的不一致现象,这种成为时延一致性,这种随着时间的推移最终会达到一致性,所以大多数系统尽可能的缩短这种时延一致性,或者采用补偿的机制,达成最终一致性。
2. A(Availability), 可用性,
在特定的时间内,请求正常的返回,抛开时间粒度,说可用性没有意义,对于和用户交互的事务,30s返回对于用户是不可用的,258时间原则可以作为用户体验的参考。
3. P(Partition tolerance).分区容错性
在节点间通信失败时保证系统不受影响. 对容错的要求提高会降低对可用性或一致性, 要么停止系统用于错误恢复, 要么继续服务但是降低一致性,例如系统部署到两个不同的机房AB ,网络的因素导致AB无法互通,导致AB成为两个独立的个体,所以p必然存在,即所谓的”脑裂“。故分布式设计的时候我们需要考虑CP或者AP ,我们需要在AC做出平衡。
BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性),BASE理论是对CAP中AP的一个扩展,除非特定的事务类型,大多数的系统都是AP系统,满足用户的可用性和服务的可用性,C只需达到最终一致性即可。
1. Basically Available(基本可用)
指分布式系统在出现故障的时候,保证核心可用和主要功能可用,允许损失部分可用性,大多数系统会采用熔断,降级,兜底的方案。
2. Soft state(软状态)
事务存在的中间状态,我们成为软状态,例如文件上传过程中,开始长传,上传中,上传完成,所有的软状态都满足时延一致性。
3. Eventually consistent (最终一致性)
最终一致性是软状态的最终状态,为了达到数据在各个系统的显示一致,并且保证各个数据副本也最终一致,满足时延一致性的随着时间会自动同步,异常的我们可以采用补偿机制,达到最终一致性。
备注:CAP和BASE原理是ACID事务在分布式系统的理论基础和延申,后续会讲下具体说下ACID原理。