分库分表:
- 提升数据库访问速度
- 缓解数据压力
- 容量
垂直拆分的问题:
跨库的关联查询:
(1)冗余
(2)数据同步 系统之间: http、etl
(3)全局表(广播表)、字典表、基础数据、行名行号表,全局表即多个节点中都有相同的多份数据,更新在多个节点也都会更新
(4)绑定表(E-R表)
oder_info order_id=1001
order_detail order_id=1001 order_detail_id=80001
(5)数据组装 中间件如:mycat的/*catlet data dn1 dn2
分布式事务
ACID
(1)两阶段提交 XA
TCC-Fescar-seata
LCN
Atomikos
水平拆分的问题
分页、排序
全局ID auto_increment
(1)redis原子递增
(2)雪花算法snowflake
(3)UUID
(4)table +1 for update
(5)ZK
多数据源
(1)编码层(AbstractDataSource)
(2)框架层ORM 插件-Interceptor-动态代理
(3)驱动层(Sharding-JDBC)前身为当当网框架、现在为apache开源组件
(4)代理层 proxy mycat
(5)服务层 一些特殊的sql版本
划分数据的规则
user_id % 3 =1 -> dn1
user_id %3 =2 -> dn2
user_id % 3 =0 ->dn0
分片算法:
Hash、取模、范围(0-1000w、1000w-2000w)、时间段(按周、按月分布)、复合、一致性哈希(基于哈希环,java中可以用TreeMap实现哈希环)
实践:基于Sharding-JDBC的实现