DRDS是阿里云提供的分布式数据库服务,他通过引入一个代理(
Proxy
)服务
对应用程序屏蔽了各种复杂的底层DB拓扑结构
DRDS试图提供比单机数据库更好的弹性伸缩能力的同时,还能为开发者提供单机数据库一样的使用体验。
然而,很多在开发时看似和单机数据库一样的体验,在运行时却可能带来非常大的问题
- 分布式事务就是最常见的一个例子:
- DRDS提供了分布式事务这个功能,可以让开发者在写代码时处理跨库的事务和之前处理单库事务一样的简单
- 但这在运行时却可能带来严重的性能问题。
DRDS简介
DRDS
作为一个分布式数据库,其分库分表的能力可以把上亿条数据的大表拆分成若干个百万条数据的小表
- 以避免单表数据量过大导致请求耗时增加
同时还提供了平滑扩容的弹性伸缩的能力。
另外,
DRDS
还尽可能为开发者提供单机数据库一样的使用体验
- 然而,从我们的使用来看这一点离做到对开发者完全透明还很远
- 一些特性如果不理解其内部实现,在享受其带来的透明的好处的同时,也可能踩坑。
DRDS分布式事务
分布式事务通常使用二阶段提交来保证事务的原子性(
Atomicity
)和一致性(Consistency
)。二阶段事务会将事务分为以下两个阶段:
- 准备(
PREPARE
)阶段:
- 在PREPARE阶段,数据节点会准备好所有事务提交所需的资源(例如加锁、写日志等)。
- 提交(
COMMIT
) 阶段:
- 在
COMMIT
阶段,各个数据节点才会真正提交事务。当提交一个分布式事务时,
PolarDB-X 1.0
服务器会作为事务管理器的角色:
- 等待所有数据节点(MySQL服务器)
PREPARE
成功,之后再向各个数据节点发送COMMIT
请求。
跨库事务必然涉及到一个事务在多个分库上进行事务分支的执行和状态同步
相比单机事务,分布式跨库事务的吞吐量和延迟会大大增加。
- 而事务涉及的分库越多,事务边界越大,事务的延迟也会相应增加。