利用中间件MyCat 客户端sharding-jdbc
优点:
- 解决了单库大数据,高并发的性能瓶颈
- 拆分规则封装好,对应用端几乎透明,开发人员无需关系拆分细节
- 提高了系统的稳定性和负载能力
缺点:
- 拆分规则很难抽象
- 分片事务一致性难以解决
- 二次扩展时,数据迁移,维护难度大,比如: 开始我们按照用户id对2求模,但是随着业务的增长,2台数据库难以支撑,还是继续拆分为4个数据库,那么这时就需要做数据的迁移了
总结:
世界上的万物没有完美的,有利就有弊,就像数据切分一样,无论是垂直切分,还是水平切分,它们解决了海量数据的存储和访问性能问题,但也随之而来的带来了很多新问题,它们的共同缺点有:
- 分布式的事务问题;
- 跨库join问题
- 多数据源的管理问题
针对多数据源的管理问题,主要有两种思路:
1.客户端模式,在每个应用模块内,配置自己需要的数据源,直接访问数据库,在各个模块内完成数据的整合
2.中间代理模式,中间代理统一管理所有的数据源,数据库层对开发人员完全透明,开发人员无需关注拆分的细节
MyCat:
MyCat是一个开源的分布式数据库系统,前端的用户可以把它看成是个数据库代理,用MySql客户端和命令行工具都可以访问,而其后端则是用MySQL原生的协议与多个MySQL服务之前进行通信.MyCat的核心功能是分库分表,即将一个大表水平切分成N个小表,然后存放在后端的MySQL数据库中.
使用场景:
- 单纯的读写分离,此时配置最为简单,支持读写分离,蛀虫切换
- 分库分表,对于超过1000W的表进行分片,最大支持1000亿的数据
- 多租户应用,每个应用一个数据库,应用只连接MyCat,程序本身不需要改造;
- 代理Hbase,分析大数据
分布式事务解决方案:
分布式事务解决方案:
一:
1.XA协议的两阶段提交
XA是由X/Open组织提出的分布式事务的规范
由一个事务管理器(TM)和多个资源管理器(RM)组成
提交分为两个阶段:prepare和commit
MySQL5.7及以上均支持XA协议
MySQL Connector/J 5.0以上 支持XA协议
Java系统中,数据源采用Atomikos
2.Atomikos分布式事务(Spring)
二:
3.事务补偿机制
什么是事务补偿机制?
针对每个操作,都要注册一个与其对应的补偿(撤销)操作
在执行失败时,调用补偿操作,撤销之前的操作
优点: 逻辑清晰,流程简单
缺点: 数据一致性比XA还要差,可能出错的点比较多
TCC属于应用层的一种补偿方式,程序员需要写大量代码
三:
4.基于本地消息表
采用BASE原理,保证事务最终一致
在一致性方面,允许一段时间内的不一致,但最终会一致
在实际的系统当中,要根据具体情况,判断是否采用
优点: 避免了分布式事务,实现了最终一致性
缺点: 要注意重试时幂等性操作
四:
基于MQ的最终一致方案
原理.流程与本地消息表类似
不同点: 本地消息表改为MQ
定时任务改为MQ的消费者
优点:
不依赖定时任务,基于MQ更高校,更可靠
适合与公司内的系统
不同公司之前无法基于MQ,本地消息表更合适