- 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间过消息传递进行通信和协调的系统
Tip:分布式和集群的区别
集群:多个人在一起做同样的事
分布式:多个人在一起做不同的事
分布式系统的特点
分布性、对等性、并发性、缺乏全局时钟、故障总会发生
分布式系统的演变
- 阶段一:单应用架构
把所有软件和应用都部署在一台机器上,这样就完成一个简单系统的搭建,这个时候讲究的是效率。
- 阶段二:应用服务器与数据库分离
增加机器的主要目的是将web服务器和数据库服务器拆分,这样不仅提高了单机的负载能力,也提高了容灾能力。
- 阶段三:应用服务器集群
通过应用服务器集群将用户请求分流到各个服务器中,从而继续增加负载能力。此时多台应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提供服务。
- 阶段四:应用服务器负载均衡
解决了请求的
负载均衡
问题,可以采用Nginx进行轮询或 ip_hash或设置权重进行请求。 - 阶段五:数据库读写分离
数据库请求分别负载到两台数据库服务器上,那么一定会造成数据库不统一的问题,所以我们一般优先考虑
读写分离
的方式。 - 阶段六:添加索引和搜索引擎缓解读库压力
使用
搜索引擎
能够大大提高我们的查询速度,但是同时也会带来一些附加的问题,比如维护索引的构建 - 阶段七:添加缓存机制缓解数据库的压力
对于一些热点数据,没必要每次都从数据库读取,我们可以使用
缓存技术
,比如memcache、redis来作为我们应用层的缓存 - 阶段八:数据库水平/垂直拆分
水平拆分:把数据库中不同业务数据拆分到不同的数据库(秒杀业务有自己的一套数据表,普通业务有自己的数据表)
垂直拆分:把同一个表中的数据拆分到两个甚至多个的数据库中,水平拆分的原因是某些业务数据量已经达到了单个数据库
的瓶颈,这时可以采取将表拆分到多个数据库中。 - 阶段九:应用拆分
将应用拆分,按照领域模型将用户、商品、交易拆分成
多个子系统
。(可能会有一些相同代码,如用户操作) - 阶段十:服务化
相同的操作一定是要抽象出来,通过走
服务化
路线的方式来解决。
分布式系统的问题
- 通信异常:分布式系统无法顺利进行一次网络通信
- 网络分区:分布式系统出现局部小集群
- 节点故障:组成分布式的服务器节点出现宕机或“僵死”现象,每个节点都有可能发生
- 三态:分布式系统每一次请求与响应存在特有的“三态”概念,即成功、失败和超时。
分布式理论
一致性
分布式一致性,指的是数据在多份副本中存储时,各副本的数据是一致的。因为同步的过程会有延迟。
一致性分类:
- 强一致性(系统写入什么,读出来的也会是什么,用户体验好,单强一致性很难实现)
- 弱一致性(系统写入成功后,不承诺可以读到写入的值,也不承诺多久数据能达到一致)
- 读写一致性:用户读取自己写入的结果的一致性,保证用户永远能够第一时间看到自己更新的内容。比如:我们发朋友圈,朋友圈内容是不是被朋友看见不重要,但一定要显示在自己的列表上。
- 单调读一致性:本次读到的数据不能比上次读到的旧。(使用Hash算法同一用户永远映射到同一机器上)
- 因果一致性:如果节点A在更新数据后通知节点B,节点B之后对该数据的访问和修改都基于A更新后的值,同时,和A节点无因果关系的节点C的数据访问没有这样的限制。
- 最终一致性:不考虑所有中间状态的影响,只保证当没有新的更新之后,经过一段时间后,系统内所所有数据是正确的。最长车高度上保证系统并发能力。
CAP定理
CAP定理
2000 年7月的时候,加州大学伯克利分校的Eric Brewer 教授提出了 CAP 猜想,2年后,被 来自于麻省理工的Seth Gilbert 和 Nancy Lynch 从理论上证明了猜想的可能性,从此,CAP 定理正式在学术上成为了分布式计算领域的公认定理。并深深的影响了分布式计算的发展。
这三个基本需求,最多只能同时满足其中2个
选项 | 描述 |
---|---|
C一致性 (Consistency) |
分布式系统当中的一致性指的是所有节点的数据一致,或者说是所有副本的数据一致 |
A可用性 (Availability) |
Reads and writes always succeed. 也就是说系统一直可用,而且服务一直保持正常 |
P分区容错性 (Partition tolerance) |
系统在遇到一些节点或者网络分区故障的时候,仍然能够提供满足一致性和可用性的服务 |