文章目录
- 一、数据存储
- 1. 一致性哈希算法解决节点扩缩容的原理?
- 2. 分库分表策略(水平拆分/垂直拆分)及分片键选择?
- 3. 主从复制与多主复制的优缺点对比?
- 4. 分布式数据库(如TiDB、Cassandra)与关系型数据库的核心差异?
- 5. 数据副本同步机制(同步复制/异步复制)?
- 6. 分布式事务与本地事务的差异?
- 7. 分布式锁的实现方案对比(Redis/Zookeeper/数据库)?
- 8. 分布式系统如何解决数据倾斜问题?
- 9. 数据冷热分离的设计策略?
- 10. 分布式文件系统(如HDFS、Ceph)的核心设计思想?
- 11. 缓存与数据库双写一致性问题解决方案?
- 12. 布隆过滤器的原理及在分布式系统中的应用?
- 13. 分布式存储系统的数据分片策略(Range/Hash)?
- 14. 分布式系统如何实现数据压缩与编码优化?
- 15. 分布式KV存储(如Redis Cluster)的槽位分配机制?
- 16. 时序数据库(如InfluxDB)的存储优化策略?
- 17. 分布式系统如何实现数据版本控制?
- 18. 数据迁移方案设计(全量+增量)?
- 19. 分布式系统如何实现数据去重?
- 20. 分布式事务中的最终一致性实现方案?
- 21. 分布式消息队列(如Kafka、RocketMQ)的存储设计?
- 22. 分布式搜索引擎(如Elasticsearch)的分片与副本机制?
- 23. 分布式系统如何实现数据备份与恢复?
- 24. 分布式数据库的MVCC实现原理?
- 二、分布式事务
- 1. 二阶段提交(2PC)流程及单点故障风险?
- 2. 三阶段提交(3PC)如何优化2PC的阻塞问题?
- 3. TCC补偿机制的执行流程(Try/Confirm/Cancel)?
- 4. 基于消息队列的最终一致性方案(本地消息表/事务消息)?
- 5. Saga事务模式的长事务处理策略?
- 6. 最大努力通知型事务的实现原理?
- 7. XA协议与柔性事务的对比?
- 8. 分布式事务中的幂等性保障方案?
- 9. 分布式事务超时与重试机制设计?
- 10. Seata框架的AT模式实现原理?
- 11. 分布式事务中的悬挂问题与空回滚问题解决方案?
- 12. 业务侵入型事务与非侵入型事务的对比?
- 13. 分布式事务如何实现资源预留?
- 14. 分布式事务的全局锁设计策略?
- 15. 分布式事务中的协调者高可用方案?
- 16. 分布式事务与业务校验的协同设计?
- 17. 分布式事务如何实现跨服务的数据一致性?
- 18. 事务消息的可靠投递机制(如RocketMQ事务消息)?
- 19. 分布式事务性能优化策略(如异步提交)?
一、数据存储
1. 一致性哈希算法解决节点扩缩容的原理?
一致性哈希通过环形呼吸空间将节点和数据映射到同一虚拟换,采用一下机制实现高效扩缩容。
节点动态伸缩:新增节点时仅需迁移相邻节点部分数据,删除节点时数据自动迁移到下一个相邻节点,平均仅需迁移K/n数据量。
虚拟机节点技术:通过多个物理节点创建多个虚拟机节点,均匀分散数据负载,避免节点增减时因哈希环分布不均导致的数据倾斜问题
2. 分库分表策略(水平拆分/垂直拆分)及分片键选择?
垂直拆分:
分库:按业务模块拆分(如用户库、订单库),降低耦合性
分表:将大表按照字段拆分(高频字段与低频字段分离),减少单行数据量,提升查询效率
水平拆分:
分表:按分片规则(如哈希、范围)将数据分散到多表,解决单标数据量过大的性能瓶颈
3. 主从复制与多主复制的优缺点对比?
维度 | 主从复制 | 多主复制 |
---|---|---|
写入节点 | 单主节点写入 | 多节点同时写入 |
一致性 | 强一致性 (同步复制) |
最终一致性 (异步居多) |
可用性 | 主节点单故障需切换(较高延迟) | 多节点冗余(高可用) |
冲突处理 | 无冲突风险 | 需额外机制解决写入冲突 |
4. 分布式数据库(如TiDB、Cassandra)与关系型数据库的核心差异?
特性 | 分布式数据库(如TiDB) | 关系型数据库(MySQL) |
---|---|---|
扩展性 | 水平扩展(无上限) | 垂直扩展(硬件限制) |
事务模型 | 支持分布式事务(Percolator模型) | 仅本地事务(ACID) |
一致性 | 灵活选择(强一致/最终一致) | 强一致性 |
架构复杂度 | 高(需管理多节点协同) | 低(单机或主从架构) |
5. 数据副本同步机制(同步复制/异步复制)?
同步复制:数据写入需所有副本确认,保证强一致性,但延迟高,可用性低(节点故障导致阻塞)
异步复制:数据写入主节点后立即返回,副本异步同步,延迟低且可用性高,但存在数据丢失风险
6. 分布式事务与本地事务的差异?
类型 | 事务范围 | 性能 | 一致性保障 |
---|---|---|---|
本地事务 | 单数据库内操作 | 高 | ACID(强一致性) |
分布式事务 | 跨多个数据库/服务 | 低 | 基于协议(如2PC/TCC) |
7. 分布式锁的实现方案对比(Redis/Zookeeper/数据库)?
方案 | 实现原理 | 优点 | 缺点 |
---|---|---|---|
Redis | SETNX+过期时间 | 高性能、低延迟 | 非强一致性(异步复制漏洞) |
Zookeeper | 临时顺序节点监听 | 强一致性、可靠性高 | 性能较低(频繁节点操作) |
数据库 | 唯一索引/乐观锁 | 实现简单 | 性能差、锁表风险高 |
8. 分布式系统如何解决数据倾斜问题?
虚拟节点技术:一致性哈希中物理节点分配多个虚拟节点,分散热点数据
动态分片技术:分局负载自动迁移分片(如Cassandra的副本策略)
分片键优化:选择离散型更高的字段,避免哈希倾斜
9. 数据冷热分离的设计策略?
存储分层:热数据存储于SSD/内存,冷数据迁移至HDD/归档存储
访问分离:高频查询走热表(如近期订单),低频查询走冷表(如历史日志)
自动化策略:基于时间或访问频率规则自动迁移数据(Elasticsearch声明周期管理)
10. 分布式文件系统(如HDFS、Ceph)的核心设计思想?
分块存储:文件切分为固定大小快,分散存储于多借点
冗余备份:每个数据块存多副本(如HDFS默认3副本),保障容灾能力
元数据备份:中心化(如HDFS nameNode)或去中心化(如Ceph CRUSH算法)管理文件位置
11. 缓存与数据库双写一致性问题解决方案?
更新顺序策略:
先更新数据库再删除缓存:避免并发读写导致缓存旧数据,但需确保缓存删除成功(失败时引入重试机制或消息队列)。
延迟双删:在数据库更新后延迟二次删除缓存,减少主从同步延迟导致的脏数据。
异步补偿机制:
基于binlog监听(如Canal):捕获数据库变更日志,异步更新或删除缓存,实现最终一致性。
消息队列重试:缓存删除失败时,通过消息队列异步重试,确保操作最终成功。
强一致性方案:
加分布式锁:在更新数据库和缓存时加锁,防止并发冲突,但牺牲性能
12. 布隆过滤器的原理及在分布式系统中的应用?
原理:使用伪数组和多个哈希函数,将元素映射到位数组的多个位置,判断元素是否存在
应用场景:
缓存穿透防护:拦截不存在的数据请求,避免大量无效查询穿透到数据库
分布式去重:判断你数据是否已处理,如消息队列中重复消息过滤
13. 分布式存储系统的数据分片策略(Range/Hash)?
Range分片:
按范围划分(如按时间、ID区间),适合范围查询,但可能因数据分布不均导致热点。
Hash分片:
哈希取模或一致性哈希:数据均匀分布,离散性好,但范围查询效率低。
组合策略:
Hash+Range混合:如Cassandra支持按分区键Hash分片,再按聚簇键Range排序。
14. 分布式系统如何实现数据压缩与编码优化?
列式存储压缩:同一列数据重复性高,适合使用RLE、字典编码等压缩算法。
时序数据优化:
Delta编码:存储时间戳差值而非绝对值。
Gorilla压缩:针对浮点数的高效压缩
15. 分布式KV存储(如Redis Cluster)的槽位分配机制?
虚拟槽分区:将数据划分为16384个槽,节点负责部分槽位,扩缩容近千亿受影响槽数据
Gossip协议:节点间通过P2P通信槽位分配信息,实现去中心化管理
16. 时序数据库(如InfluxDB)的存储优化策略?
时间分区:按时间窗口划分数据,提升时间范围查询效率
数据降采样:对历史数据按低精度聚合存储,减少存储量和查询开销
17. 分布式系统如何实现数据版本控制?
向量时钟:记录多个节点的版本时序,解决冲突时合并版本
MVCC多版本并发控制:为每条数据维护多个版本,读操作访问特定版本,写操作生成新版本。
18. 数据迁移方案设计(全量+增量)?
全量迁移:
初始阶段通过快照同步存量数据,期间暂停写入保证一致性。
增量迁移:
基于binlog或CDC工具(如Debezium)实时同步增量数据。
19. 分布式系统如何实现数据去重?
哈希指纹:对数据生成唯一哈希值,通过比对哈希值判断重复
布隆过滤器:快速判断数据是否存在,适用于海量数据去重(允许少量误判)
20. 分布式事务中的最终一致性实现方案?
异步通知:基于消息机制(如RocketMQ事务消息,保证个服务最终执行 成功)
补偿机制:TCC模式,TRY预留资源,Confirm提交,Cancel回滚,通过重试保证最终一致
21. 分布式消息队列(如Kafka、RocketMQ)的存储设计?
分区存储:数据按Topic分区,每个分区顺序追加写入,支持高吞吐量
分段日志:将数据拆分为多个Segment文件,过期数据自动清理
22. 分布式搜索引擎(如Elasticsearch)的分片与副本机制?
分片策略:索引数据分为多个分片,支持水平扩展
副本机制:每个分片有多个副本,保障高可用与负载均衡
23. 分布式系统如何实现数据备份与恢复?
多副本存储:数据写入多个节点(如HDFS 3副本),单点故障时自动切换
快照备份:定期生成全量快照,结合增量日志实现快速回复
24. 分布式数据库的MVCC实现原理?
版本链管理:每条数据维护多个版本,通过事务ID判断可见性
垃圾回收:定期清理无活跃事务引用的旧版本数据
二、分布式事务
1. 二阶段提交(2PC)流程及单点故障风险?
执行流程:
准备阶段:协调者向所有参与者发送事务预处理请求,参与者执行本地事务并记录Undo/Redo日志,反馈Yes/No响应
提交阶段:若所有参与者均返回Yes,协调者发送Commit指令;否则发送Rollback指令,参与者根据指令提交或回滚事务
单点故障风险:
协调者宕机:若协调者在提交件阶段故障,参与者将永久阻塞,等待指令超时,导致资源所无法释放
数据不一致:网络分区时部分参与者可能提交成功,另一部分未收到Commit指令,导致状态分裂
2. 三阶段提交(3PC)如何优化2PC的阻塞问题?
流程改进:
CanCommit阶段:协调者询问参与者是否具备执行条件,避免资源浪费
PreCommit阶段:参与者预提交事务并锁定资源,但未持久化结果
DoCommit阶段:协调者最终决策,参与者超时未收到指令则自动提交
优化效果:
超时机制:参与者在PreCommit阶段后若超时未收到指令,默认提交事务,降低阻塞概率
3. TCC补偿机制的执行流程(Try/Confirm/Cancel)?
Try阶段:资源预留(如冻结库存),生成中间态数据)。
Confirm阶段:Try成功时执行最终提交(如扣减库存)。
Cancel阶段:Try失败时回滚预留资源(如释放库存)。
4. 基于消息队列的最终一致性方案(本地消息表/事务消息)?
本地消息表:业务与消息记录在同一本地事务中,通过定时任务重试投递消息之MQ,确保最终一致。
事务消息:消息暂存MQ服务器,业务执行成功后确认投递(如RocketMQ两阶段提交)。
5. Saga事务模式的长事务处理策略?
事务拆分:将长事务拆分为多个子事务,每个子事务定义对应的补偿操作(正向服务+逆向回回滚)
执行方式:
协同式:由协调器同一调度子事务执行与补偿
编排式:通过时间驱动链式触发子事务,失败时反向触发补偿
6. 最大努力通知型事务的实现原理?
异步通知:业务执行后通过MQ异步通知下游,失败时按策略重试
对账机制:定期核对数据状态,修复不一致记录
7. XA协议与柔性事务的对比?
维度 | XA协议(强一致性) | 柔性事务(如TCC) |
---|---|---|
一致性 | 强一致性(基于2PC实现) | 最终一致性 |
性能 | 低(同步阻塞、资源锁) | 高(异步、无锁) |
适用场景 | 短事务、低并发 | 高并发、长事务 |
8. 分布式事务中的幂等性保障方案?
唯一标识:为每个操作分配全局唯一ID,通过去重表或Redis校验重复请求
状态机:业务操作设计为状态流转,仅允许状态合法变更(如订单状态:已支付-已完成)
9. 分布式事务超时与重试机制设计?
超时控制:协调者与参与者设置事务超时阈值,超时后自动触发回滚
重试策略:
指数蜕变:失败后延迟时间逐步增加(如1s-2s-4s),避免雪崩
10. Seata框架的AT模式实现原理?
阶段一(提交前):
执行业务SQL生成行锁,记录SQL执行前后镜像数据到UndoLog
阶段二(提交/回滚)
提交:异步删除Undo Log,释放锁
回滚:根据Undo Log反向补偿数据,保证原子性
11. 分布式事务中的悬挂问题与空回滚问题解决方案?
空回滚问题
定义:未执行Try阶段的情况下直接触发Cancle回滚操作
解决方案:
幂等性检查:Cancle阶段校验Try是否回滚(如通过事务状态控制表),未执行则跳过回滚逻辑
全局事务状态标记:记录事务执行阶段(INIT/CONFIRMED/ROLLBACKED),仅在Try成功时允许Cancle操作
悬挂问题:
定义:Try请求晚于Cancel到达参与者,导致资源预留后无法提交或回滚
解决方案:
时序控制:为每个事务绑定唯一ID,在Try阶段教育是否已存在Cancel几率,若存在则拒绝执行
事务状态预判:通过全局事务日志判断分支事务是否已终止,避免执行已回滚的Try操作
12. 业务侵入型事务与非侵入型事务的对比?
维度 | 业务侵入型(如TCC/Saga) | 非侵入性(如Seata AT/XA) |
---|---|---|
代码耦合度 | 需显式编写Try/Confirm/Cancel逻辑 | 框架自动代理SQL,业务无感知 |
适用场景 | 复杂业务补偿逻辑(如库存扣减) | 简单事务场景(如数据库原生事务) |
性能 | 高(资源预留异步化) | 低(依赖全局锁同步阻塞) |
13. 分布式事务如何实现资源预留?
TCC模式:
Try阶段:冻结资源(如账户金额),生成中间态数据并记录事务日志
Saga模式:
正向子事务:直接提交资源操作,失败时触发逆向补偿操作
本地消息表:
业务与消息记录在同一个本地事务中,保证消息投递与资源操作原子性
14. 分布式事务的全局锁设计策略?
Seata AT模式:通过全局锁(行锁)隔离事务,避免脏写
XA协议:基于两阶段锁(2PL),在Prepare阶段锁定资源直至提交或回滚
乐观锁:使用版本号或时间戳校验数据变更,冲突时回滚重试
15. 分布式事务中的协调者高可用方案?
集群部署:协调者(如Seata TC)采用多节点集群,通过负载均衡分散请求
RAFT共识算法:协调者状态同步采用RAFT协议,保证故障时快速切换主节点
数据持久化:全局事务日志存储于高可用数据库(如MySQL集群)
16. 分布式事务与业务校验的协同设计?
校验前置:在Try阶段完成业务规则校验(如库存充足性,避免Confirm阶段失败)
补偿兼容性:逆向操作需兼容正向操作的中间状态(如冻结金额需支持多次回滚)
17. 分布式事务如何实现跨服务的数据一致性?
TCC模式:通过Try预留资源、Confirm提交资源、Cancel释放资源实现跨服务原子性
Saga模式:链式调用子事务,失败时反向执行补偿操作
事务消息:基于MQ的最终一致性(如RocketMQ事务消息)确保上下游数据同步
18. 事务消息的可靠投递机制(如RocketMQ事务消息)?
半消息机制:消息暂存MQ服务器,业务执行成功再投递给消费者
事务状态会差:MQ定期查询生产者本地事务状态,超时未确认则回滚消息
本地事务绑定:业务操作与消息记录在同一个本地事务中,保证原子性
19. 分布式事务性能优化策略(如异步提交)?
异步提交:Confirm/Cancel阶段异步执行,减少事务链路耗时(如Seata TCC异步化)
资源预留精简:仅锁定关键资源(如库存行级锁),避免全表锁竞争
批量处理:合并多个事务操作(如批量扣减库存),减少网络开销
锁粒度优化:使用细粒度所(如行锁代替表锁),提升并发处理能力