常见问题:
- 什么是CAP原理?什么是BASE理论?
- zookeeper是什么?zk的性能瓶颈怎么克服?
理论
- CAP
- C 一致性
- A 可用性
- P 分区容错性
- BASE
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的缩写。
- 基本可用(Basically Available)
指分布式系统在出现不可预知故障的时候,允许损失部分可用性。
- 软状态( Soft State)
指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性。
- 最终一致( Eventual Consistency)
2PC与3PC
- 2PC和3PC的区别?有什么缺点?什么是脑裂? https://blog.51cto.com/11821908/2058651
- 2PC
阶段1:准备阶段
1. #协调者#向#所有参与者#发送事务内容,询问是否可以提交事务。
2. #各参与者#执行事务操作,将Undo和Redo日志写入事务中。如果执行成功,反馈#协调者#YES,如果执行失败,反馈#协调者#NO
阶段2:提交阶段
1. 如果#All参与者#返回YES,则提交事务。#All参与者#在Commit事务之后,反馈ACK。
2. 如果#Any一个参与者#返回NO,则中断事务。
缺点:
1. 同步阻塞:所有参与事务的逻辑处于阻塞状态。
2. 单点:协调者如果DOWN,则所有参与者都处于锁定状态;
3. 脑裂:在阶段2中,如果只有部分参与者Commit,则会导致数据不一致;
3PC是2PC的改进版本。
阶段1:CAN COMMIT
阶段2:PRE COMMIT
阶段3:DO COMMIT
缺点?
1.并没有解决2PC的数据不一致问题。原因:在Phase2时,#参与者#接收到PreCommit之后等待doCommit。如果此时#协调者#发出Abort请求之后Down机,导致部分#参与者#没有接收到并在超时之后执行Commit而产生数据不一致。
优点?
1.3PC主要解决同步阻塞问题。降低的是#参与者#的阻塞范围。
2.3PC新增了参与者超时机制
3 没有解决数据不一致
总结:<br />1. 2PC和3PC都无法彻底解决分布式系统一致性问题。<br />2. 解决一致性问题,只有Paxos.
什么是脑裂?<br /> 如何解决脑裂?-- 过半机制。为什么是大于,而不是大于等于? https://www.toutiao.com/i6717931175530201604/
常见协议
没有一种方案是完美的 | 协议 | 典型案例 | 优点 | 缺点 | 可参考博客 | | —- | —- | —- | —- | —- | | Paxos |
|
|
|
| | Zab | Zookeeper |
|
|
| | Raft | Etcd |
|
|
| | Gossip | Cassandra\Consul |
1. 可扩展性
1. 容错
1. 去中心化
1. 传播速度达logN
1. 简单
|
1. 消息延迟
1. 消息冗余
|
1. P2P 网络核心技术:Gossip 协议
| | Chubby | Google BigTable ||
|
|
Paxos
Paxos基于2PC扩展
- 定义3个角色
- Proposer
- Acceptor
- Learner
- 推导过程
此处为语雀加密文本卡片,点击链接查看:https://www.yuque.com/yulongsun/java/pkm9f7#EznmC
ZAB协议
- ZAB中节点的三种状态?
- following
- leading
- looking 处于选举状态。
- ZAB模式
- 崩溃恢复
- 消息广播
- ZAB和Paxos的区别?https://www.cnblogs.com/sunddenly/articles/4073157.html
- 设计目的
- 流程上的区别
- 为什么要设计ZAB?
- 因为Paxos满足不了ZK对数据一致性的要求。
- ZAB协议保证了数据有序性。
- ZAB如何保证?
- 保证同一Leader发起的事务要被#顺序#执行,同时需要保证旧Leader的所有事务都被执行之后,新Leader才能发起事务。
- 一些已经被Skip的消息,需要仍然被Skip。— 通过zxid=epoch+counter实现
分布式消息队列
- 讲了下kafka,怎么保证数据不丢失?确保消息不会重复消费?消息送达确认是怎么实现的?
- 重复消费怎么解决?
- 幂等机制
- 如何保证消息的可靠性传输?
- RabbitMQ为例
- 生产者弄丢了数据
- 事务机制
- confirm机制
- 事务机制和confirm机制最大的区别在于:事务机制是同步的,但是confirm机制是异步的。
- RabbitMQ弄丢了数据
- 持久化机制:
- 创建Queue时设置持久化机制;
- 发送消息的时候,将消息设置为持久化;
- 持久化机制:
- 消费者弄丢了数据
- autoAck机制。
- 生产者弄丢了数据
- Kafka为例
- RabbitMQ为例
- 顺序消费
- 让每个消费者
- MQ消息积压了几百万条数据怎么办?
- 重复消费怎么解决?
分布式限流
1. 常见限流方式
- 限制总并发(数据库连接池、线程池)
- 限制瞬时并发(Nginx#limit_conn模块)
- 限制窗口时间的平均速率(Guava#RateLimiter、Nginx#limit_req)
- 限制MQ的消费速率
-
2. 限流算法
|
| 漏桶算法 | 令牌桶算法 | | —- | —- | —- | | 特点 | 漏桶的出口速率固定(出速率固定)
强制限定数据传输速率 | 按照固定速率添加令牌(入速率固定) | | 优点 || 允许某种程度的突发 | | 实践案例 |
| Guava#Ratelimiter |
分布式事务需要注意的问题
- 如何处理并发控制?
- (如何异常控制?) TCC下最常见的三种异常:空回滚、幂等、悬挂