为何不具备关系型数据库的ACID特性能提升非关系型数据库性能?
为什么放松ACID特性能提升分布式集群数据库的性能与扩展性
传统单机关系型数据库实现完整ACID特性,只需要依赖本地锁、事务日志、内存缓冲就能完成,几乎没有跨节点通信开销。但当数据库部署到多服务器集群时,数据拆分存储在不同节点、事务需要跨多节点执行的场景下,完整ACID的强保证需要极高的跨节点协调成本,这恰恰是性能和扩展能力的核心瓶颈。放松ACID特性本质上是砍掉不必要的同步开销,来换取更高的吞吐和更大的集群规模:
1. 放松*原子性(Atomicity)*要求
- 要保证分布式事务的完全原子性,必须引入两阶段提交(2PC)、三阶段提交(3PC)这类协调协议,整个事务的提交延迟取决于最慢的节点响应,还需要至少两次跨节点网络往返,一旦某个节点超时,整个事务就要全部回滚。集群节点越多,事务失败概率越高,吞吐量越低。
- 放弃完全原子性,改用最终一致性、幂等写入、事务补偿这类机制,就能完全砍掉2PC的多轮同步开销,单节点写入不需要等其他节点确认,吞吐量可以线性提升,新增节点也不需要额外的事务协调成本,扩展能力大幅增强。
2. 放松*一致性(Consistency)*要求
- 强一致性要求所有节点的数据视图在任何时刻完全一致,每次写入必须同步到所有副本之后才返回成功,读取也必须访问最新副本,哪怕是跨机房部署也必须同步完成才算写入成功,延迟会非常高,而且副本数量越多写入性能越差。
- 改成最终一致性、会话一致性这类弱一致性模型,写入只需要同步1个或少数几个副本就返回,剩下的副本后台异步同步,写入延迟能降到和单机数据库接近的水平,副本数量扩展也不会影响写入性能,集群规模可以做到几千上万个节点。
3. 放松*隔离性(Isolation)*要求
- 最高的可串行化隔离级别需要在分布式场景下加全局锁、维护分布式快照,读写请求会被大量阻塞,并发度上不去,集群节点越多,锁冲突的概率越高,整体性能会雪崩式下降。
- 降低隔离级别到读已提交甚至读未提交,或者改用乐观锁、轻量级MVCC的弱隔离实现,不需要维护全局锁状态,读写冲突概率大大降低,并发吞吐量可以提升几十上百倍,集群扩容时也没有额外的全局状态同步成本,扩展更加顺畅。
4. 放松*持久性(Durability)*要求
- 强持久性要求每次写入必须落到所有副本的磁盘上才返回成功,磁盘IO本身就是性能瓶颈,跨节点多副本刷盘的开销会把写入吞吐量压到非常低的水平。
- 放弃强持久性,改成写内存缓存就返回,后台异步刷盘、异步同步到其他副本,写入性能可以提升几个数量级,只要做好幂等和重试机制,多数业务场景下的异常丢数据概率完全可以接受。
实际生产中很少有数据库完全放弃所有ACID特性,大多是根据业务场景选择性放松某几个特性,比如文档数据库默认写主节点成功就返回,放松了多副本一致性和持久性,消息队列则放松了事务原子性和隔离性,来满足高吞吐、高扩展的需求。
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

