MyCat 是基于服务器代理模式的数据库分库的中间件,原理是对 SQL 进行转发,具体的架构图如下:
我们知道,数据的拆分必然会对事物的原子性带来影响,那如果保证在分库的同时,又能保证事务的原子性呢?
如何解决分布式事务
XA 协议
XA协议是一个开源的事务协议。
XA 协议在第二段协议 commit
事提交务后,如果出现了有的机器事务没有提交成功,有的机器已经提交成功,这时已经提交的数据,数据就无法再次回滚,这样就造成了数据不一致的问题。
三段提交协议
具体的协议如下:
相对于 XA 多了一个 Precommit
的过程,在 Do-Commit
的时候也增加了超时操作,避免了 XA 在 commit 无法收到 Ack 时候,出现了阻塞的现象。
业务的规则避免
这个是一个讨巧的方案
,具体的做法是所有的业务表的修改和删除等操作,最终都能路由到一个 MySQL 的节点上面,这样就不存在分布式的事务问题。
如何解决唯一主键(自增)
这个本事是分布式的归一
的一个思想。具体实施的思路有下面四种方式:
- 本地文件方式
- 数据库方式
- 时间戳
- 分布式zookeeper生成ID
如何查询非分片规则的数据
这个问题是一个很纠结的问题,因为没有什么特别好的办法。具体的思路应该有两种:
- 轮询各个节点查询,但是会带来性能的浪费。
- 未分片的字段与分片字段做一个映射,现根据非分片字段查询出分片字段。例如: 我们根据 Id 进行分片,如果我们想根据 userId 查询数据,有什么办法?首先要保证在业务数据的数量级,userid 一定是小于 id 的量级,所以我们可以直接存储 userid-> id1,id2….idn ,然后根据id 的集合查询出对应的数据。
+2