分布式系统架构知识点梳理

分布式分为分布式缓存(Redis)、分布式锁(Redis 或 Zookeeper)、分布式服务(Dubbo 或 SpringCloud)、分布式服务协调(Zookeeper)、分布式消息队列(Kafka 、RabbitMq)、分布式 Session 、分布式事务、分布式搜索(Elasticsearch)等。不可能所有分布式内容都熟悉,一定要在某个领域有所专长。

分布式理论

问:分布式有哪些理论?

CAP 、BASE。分布式 CAP 理论,任何一个分布式系统都无法同时满足 Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性) 这三个基本需求。最多只能满足其中两项。而 Partition tolerance(分区容错性) 是必须的,因此一般是 CP ,或者 AP。

问:你怎么理解分布式一致性?

数据一致性通常指关联数据之间的逻辑关系是否正确和完整。在分布式系统中,数据一致性往往指的是由于数据的复制,不同数据节点中的数据内容是否完整并且相同。

一致性还分为强一致性,弱一致性,还有最终一致性。强一致性就是马上就保持一致。 最终一致性是指经过一段时间后,可以保持一致。

分布式事务

问:你怎么理解分布式事务?分布式事务的协议有哪些?

分布式事务是指会涉及到操作多个数据库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务类型:二阶段提交 2PC ,三阶段提交 3PC。

  • 2PC :第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)。

  • 3PC :三个阶段:CanCommit 、PreCommit 、DoCommit。

问:分布式事务的解决方案有哪些?

分布式事务解决方案:补偿机制 TCC 、XA 、消息队列 MQ。

问:讲一下 TCC。

T(Try)锁资源:锁定某个资源,设置一个预备类的状态,冻结部分数据。

  • 比如,订单的支付状态,先把状态修改为"支付中(PAYING)"。

  • 比如,本来库存数量是 100 ,现在卖出了 2 个,不要直接扣减这个库存。在一个单独的冻结库存的字段,比如 prepare _ remove _ stock 字段,设置一个 2。也就是说,有 2 个库存是给冻结了。

  • 积分服务的也是同理,别直接给用户增加会员积分。你可以先在积分表里的一个预增加积分字段加入积分。

  • 比如:用户积分原本是 1190 ,现在要增加 10 个积分,别直接 1190 + 10 = 1200 个积分啊!你可以保持积分为 1190 不变,在一个预增加字段里,比如说 prepare _ add _ credit 字段,设置一个 10 ,表示有 10 个积分准备增加。

C(Confirm):在各个服务里引入了一个 TCC 分布式事务的框架,事务管理器可以感知到各个服务的 Try 操作是否都成功了。假如都成功了, TCC 分布式事务框架会控制进入 TCC 下一个阶段,第一个 C 阶段,也就是 Confirm 阶段。此时,需要把 Try 阶段锁住的资源进行处理。

  • 比如,把订单的状态设置为“已支付(Payed)”。

  • 比如,扣除掉相应的库存。

  • 比如,增加用户积分。

C(Cancel):在 Try 阶段,假如某个服务执行出错,比如积分服务执行出错了,那么服务内的 TCC 事务框架是可以感知到的,然后它会决定对整个 TCC 分布式事务进行回滚。

TCC 分布式事务框架只要感知到了任何一个服务的 Try 逻辑失败了,就会跟各个服务内的 TCC 分布式事务框架进行通信,然后调用各个服务的 Cancel 逻辑。也就是说,会执行各个服务的第二个 C 阶段, Cancel 阶段。

  • 比如,订单的支付状态,先把状态修改为" closed "状态。

  • 比如,冻结库存的字段, prepare _ remove _ stock 字段,将冻结的库存 2 清零。

  • 比如,预增加积分的字段, prepare _ add _ credit 字段,将准备增加的积分 10 清零。

问:事务管理器宕掉了,怎么办?

做冗余,设置多个事务管理器,一个宕掉了,其他的还可以用。

问:怎么保证分布式系统的幂等性?

状态机制。版本号机制。

Redis

问:Redis 有哪些优势?

  1. 速度快,因为数据存在内存中。

  2. 支持丰富数据类型,支持 string、list、set 、sorted set、hash。

  3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。

  4. 丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删除。

  5. 单线程,单进程,采用 IO 多路复用技术。

问:Redis 的存储结构是怎样的?

key-value 键值对。

问:Redis 支持哪些数据结构?

string(字符串), hash(哈希), list(队列), set(集合)及 zset(sorted set 有序集合)。

问:Redis 的数据结构,有哪些应用场景?

  • string:简单地 get / set 缓存。

  • hash:可以缓存用户资料。比如命令:hmset user1 name "lin" sex "male" age "25" ,缓存用户 user1 的资料,姓名为 lin ,性别为男,年龄 25。

  • list:可以做队列。往 list 队列里面 push 数据,然后再 pop 出来。

  • zset:可以用来做排行榜。

问:Redis 的数据结构,底层分别是由什么实现的?

  • Redis 字符串,却不是 C 语言中的字符串(即以空字符 ’\0’ 结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dynamic string , SDS)的抽象类型,并将 SDS 作为 Redis 的默认字符串表示。

  • Redi List ,底层是 ZipList ,不满足 ZipList 就使用双向链表。ZipList 是为了节约内存而开发的。和各种语言的数组类似,它是由连续的内存块组成的,这样一来,由于内存是连续的,就减少了很多内存碎片和指针的内存占用,进而节约了内存。

问:Redis 怎么保证可靠性?Redis 的持久化方式有哪些?有哪些优缺点?

一个可靠安全的系统,肯定要考虑数据的可靠性,尤其对于内存为主的 Redis ,就要考虑一旦服务器挂掉,启动之后,如何恢复数据的问题,也就是说数据如何持久化的问题。 AOF 就是备份操作记录。AOF 由于是备份操作命令,备份快、恢复慢。 AOF 的优点:AOF 更好保证数据不会被丢失,最多只丢失一秒内的数据。另外重写操作保证了数据的有效性,即使日志文件过大也会进行重写。AOF 的日志文件的记录可读性非常的高。 AOF 的缺点:对于相同数量的数据集而言, AOF 文件通常要大于 RDB 文件。 RDB 就是备份所有数据,使用了快照。RDB 恢复数据比较快。

问:AOF 文件过大,怎么处理?

会进行 AOF 文件重写。

  • 随着 AOF 文件越来越大,里面会有大部分是重复命令或者可以合并的命令。

  • 重写的好处:减少 AOF 日志尺寸,减少内存占用,加快数据库恢复时间。

执行一个 AOF 文件重写操作,重写会创建一个当前 AOF 文件的体积优化版本。

问:讲一下 Redis 的事务。

先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令。如果想放弃这个事务,可以使用 DISCARD 命令。

问:Redi

你可能感兴趣的:(分布式,java,数据库)