分库分表
分库后问题
- 跨库跨表join问题
- 全局表,基础数据配置数据所有库都拷贝一份
- 字段冗余
- 系统层组装,业务层分别查询,然后组装,逻辑较复杂。
ShardingSphere
- Sharding-JDBC, 轻量级java框架,java的jdbc 层提供额外的服务
- Sharding-Proxy
- Sharding-SideCar
Sharding-JDBC
主要功能
- 数据库分片
- 分布式事务
- 数据库治理
初始化流程
- 根据配置信息生成Configuration对象
- 通过Factory 会将 Configuration对象转为Rule对象
- 通过Factory会将 Rule对象与 DataSource对象封装
- Sharding-JDBC使用DataSource进行分库分表和读写分离操作
数据分片概念
- 真实表,数据库中真实存在的表 b_order_1,b_order_2
- 逻辑表,分片之后同一类表结构的名称, b_order
- 数据节点, 数据源和数据表组成,ds0.b_order_1
- 绑定表, 分片规则一致的关系表,b_order,b_order_item ,都按照order_id分片,两表互为绑定。b_order_1,b_order_item_1关联,b_order_0,b_order_item_0 关联。
- 广播表,在不同的数据节点进行存储,存储表结构和数据完全相同。例如字典表,数据量不大,没必要做分片。
分片流程
- SQL解析
- 查询优化
- SQL路由
- sql改写
- sql执行
- 结果归并
inline表达式
{[u1,u2,u3]} 枚举值
{1..3} 表示子表达式笛卡尔积
读写分离
主从架构:读写分离,目的是高可用,读写扩展。主库和从库内容相同,根据SQL语义进行路由
分库分表架构: 数据分片,目的是读写扩展,存储扩容。库和表内容不同,根据分片配置进行路由
MyCat
数据库代理
配置参数
/Schema.xml/
dataHost标签
balance参数(控制读):
- 0 : 所有读操作都发送到当前可用的writeHost
- 1 :所有读操作都随机发送到readHost和stand by writeHost(备用主节点)
- 2 :所有读操作都随机发送到writeHost和readHost
- 3 :所有读操作都随机发送到writeHost对应的readHost上,但是writeHost不负担读压力
writeType参数:
- 0 : 所有写操作都发送到可用的writeHost
- 1 :所有写操作都随机发送到readHost
- 2 :所有写操作都随机发送到writeHost,readHost
switchType参数:
- -1: 表示不自动切换
- 1 :表示自动切换
- 2 :基于MySQL主从同步状态决定是否切换
- 3 :基于MySQL cluster集群切换机制