美文网首页
2. sharding-jdbc

2. sharding-jdbc

作者: 南园故剑00 | 来源:发表于2020-07-21 10:54 被阅读0次

1. 介绍 增强版的JDBC驱动,兼容JDBC和各种ORM框架

  1. 数据分片、读写分离。通过Sharding-JDBC,应用可以透明使用jdbc访问已经分库分表、读写分离的多个数据源。
    而不用关心数据源的数量以及数据如何分布。

  2. 分片规则:分片键和分片算法

  3. 主键生成策略为 SNOWFLAKE

  4. 流程分析

通过日志分析,Sharding-JDBC在拿到用户要执行的sql之后干了哪些事儿:

(1)解析sql,获取片键值,在本例中是order_id

(2)Sharding-JDBC通过规则配置 t_order_$->{order_id % 2 + 1},知道了当order_id为偶数时,应该往 t_order_1表插数据,为奇数时,往t_order_2插数据。

(3)于是Sharding-JDBC根据order_id的值改写sql语句,改写后的SQL语句是真实所要执行的SQL语句。

(4)执行改写后的真实sql语句 (5)将所有真正执行sql的结果进行汇总合并,返回。

2. 执行原理

  1. 基本概念
  • 逻辑表:水平拆分数据表的总称

  • 真实表:物理表

  • 数据节点:数据分片的最小物理单元。数据源名和数据表组成。

  • 绑定表:分片规则一致的主表和子表。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。

  • 广播表:所有分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。
    适用于数据量不大但需要与海量数据的表进行关联查询的场景。字典表。

  • 分片键:用于分片的数据库字段。

  • 分片算法:

  • 分片策略:分片键+分片算法。 尾数取模、哈希、范围、标签、时间等。

  • 自增主键生成策略:通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。

  1. 解析sql:
  • sql解析

  • 查询优化

  • sql路由:针对逻辑表的数据操作映射到对数据节点操作的过程。

    • 直接路由

    • 标准路由

    • 笛卡尔路由

    • 全库名路由

  • sql改写:工程师面向逻辑表书写的SQL,并不能够直接在真实的数据库中执行,SQL改写用于将逻辑SQL改写为在真实数据 库中可以正确执行的SQL。

  • sql执行:sharding-jdbc采用一套自动化的执行引擎,负责将路由和改写完成之后的真实SQL安全高效地发送到底层数据源执行。

    • 执行引擎的目标是自动化的平和资源控制和执行效率:

      • 内存限制模式:

      • 连接限制模式

  • 结果归并:遍历、排序、分组、分页和聚合:

    • 流式归并:每一次从数据库结果集中获取到的数据,都能够通过游标逐条获取的方式返回正确的单条数据,它与数据库原生的返回结果集的方式最为契合。

    • 内存归并

    • 装饰者归并:对所有的结果集归并进行统一的功能增强

3. 水平分表

  • spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column = order_id
  • spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression = t_order_$->{order_id % 2 + 1}

4. 水平分库

  • 分库策略,以user_id为分片键,分片策略为user_id % 2 + 1,user_id为偶数操作m1数据源,否则操作m2。
  • spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column = user_id
  • spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression = m$->{user_id % 2 + 1}

5. 垂直分库

6. 公共表

可以将这类表在每个数据库都保存一份,所有更新操作都同时发送到所有分库执行。

  • 创建数据库:

7. 读写分离:sharding-jdbc 读写分离则是根据SQL语义的分析,将读操作和写操作分别路由至主库与从库。

  • 它提供透明化读写分离,让使用方尽量像使用一个数据库一样使用主从数据库集群。

  • 提供一主多从的读写分离配置,可独立使用,也可配合分库分表使用,同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库中读取,用于保证数据一致性。

  • 不提供主从数据库的数据同步功能,需要采用其他机制支持。

8. 总结:

  1. 分库分表是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据表组成,
    使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。

  2. 最佳实践:

  • 系统在设计之初,就该对业务数据的耦合松紧进行考量,从而进行垂直分库、垂直分表,是数据库架构清晰明了。

  • 如果缓存使用过之后,数据库的访问量还是非常大,可以考虑数据库读、写分离原则。

  • 若当前数据库压力依然很大,且业务数据持续增长无法估量,最后可以考虑水平分库、分表,单表拆分数据在1000万以内。

相关文章

网友评论

      本文标题:2. sharding-jdbc

      本文链接:https://www.haomeiwen.com/subject/cztikktx.html