问题:什么是分布式?
- 理解分布式需要区分三种系统架构:
- 单机部署:单台机器(服务器)上部署了所有的服务
- 缺点:处理能力有限,服务器一崩,服务就无法提供。
- 优点:容易部署,适合小网站(流量少,不严谨)
- 集群部署:同一个服务部署在多台服务器上(水平扩展),用一个负载均衡调度器进行请求调度。
- 缺点:业务代码扩展困难,代码耦合度大,系统逐渐庞大后维护困难。
- 优点:系统节点扩展非常容易
- 分布式部署:服务细分,按照业务功能,拆分成一个个独立的子系统,它们之间通过RPC或HTTP方式通信。
- 缺点:子系统整合困难,运维难度大幅上升,系统异常问题追溯难度上升。
- 优点:系统之间的耦合度大大降低,系统业务更易于扩展,服务的复用性更高。
问题:为什么需要分布式?
- 随着系统的规模(用户量、业务量)不断变大,为了系统的稳定性,系统的架构就需要不断的升级,从单机(小流量服务)到集群(流量大但业务量或业务改动量少的服务)再到分布式(流量大、业务量大的服务)。其中单机到集群的扩展难度不大,但是发展到分布式就需要对原来的业务进行拆分。
问题:分布式会产生哪些问题?
分布式系统有四个关键的问题:
- 一致性:针对分布式节点读取到的状态,总是读到的是最新的数据或者是一个错误。
- 与数据库一致性的区别:数据库是事务前后的状态一致性
- 解决思路:
- 所有节点暂停服务,知道数据同步完成。
- 暂时不允许用户在数据尚未更新的节点读取数据。
- 可用性:强调所有的请求都收到一个非系统错误的返回
- 一致性与可用性兼顾思路:
- 单机。
- 只允许读写其中一部分
- 分区容错:网络分区,北京与广州的网络专线断开,导致一个集群变两个集群时就导致网络分区问题
- 解决思路:
- 牺牲一致性,实现可用性与分区容错性,两个区域独立运作,相互不干扰(北京用户看不到广州的数据)
- 牺牲可用性,实现一致性与分区容错性,舍弃其中一个断开的区域,转移数据到另一个区域(广州的用户全部都去北京下单)
- 子系统之间的协作关系:分布式系统中的进程、线程的协作工作
- 唯一解决思路:分布式共识(paxos算法)
- 典型案例:redis的哨兵机制Raft是paxos的一个简化版本