zoukankan      html  css  js  c++  java
  • sharding-jdbc源码学习(一)简介

    背景

    对于大型的互联网应用来说,数据库单表的记录行数可能达到千万级甚至是亿级,并且数据库面临着极高的并发访问。采用Master-Slave复制模式的MySQL架构,只能够对数据库的读进行扩展,而对数据库的写入操作还是集中在Master上,并且单个Master挂载的Slave也不可能无限制多,Slave的数量受到Master能力和负载的限制。因此,需要对数据库的吞吐能力进行进一步的扩展,以满足高并发访问与海量数据存储的需要!

    分表

    对于访问极为频繁且数据量巨大的单表来说,我们首先要做的就是减少单表的记录条数,以便减少数据查询所需要的时间,提高数据库的吞吐,这就是所谓的分表!

    分表又分为垂直分表水平分表
    垂直分表:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
    水平分表:表的记录很多,严重影响了查询速度。这时需要把一张表拆分成多张字段相同的表,将记录分摊到各个表中,以减少单表的记录数

    分库

    分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,从而提高数据库写入能力,这就是所谓的分库!

    分库+分表

    有时数据库可能既面临着高并发访问的压力,又需要面对海量数据的存储问题,这时需要对数据库既采用分表策略,又采用分库策略,以便同时扩展系统的并发处理能力,以及提升单表的查询性能,这就是所谓的分库分表。

    常见的分库分表中间件

    1. proxy sharding,目前由cobar,mycat,drds,atlas修改,这几个产品的起源一般是mysqlproxy 或 ameoba,特点是mysql协议基本兼容,业务不需要做太多修改,缺点是分库分表的算法很烂,业务要自己做大堆配置
    2. jdbc中间件sharding,这个和协议差不多,就是把服务实现为了一个中间件,好处是协议损失时间可以补回来,坏处是只有java可以使用,开源的有当当的 sharding-jdbc
    3.mysql的ndbcluster和fabric,这是mysql 引擎层面做的sharding,直接用mysql的协议层和计划生成,这个做的好处是原生的协议层都是百分百支持,事务用mysql xa支持也算马马虎虎,坏处是单机引擎,不能支持大数据的sql

    详细 https://www.cnblogs.com/wangzhongqiu/p/7100332.html

    项目简介

    sharding-jdbc是当当的一个开源的项目,属于轻量级Java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其他依赖。

    github地址:https://github.com/shardingjdbc/sharding-jdbc

    文档:http://shardingjdbc.io/docs/00-overview

    官网提供的功能列表  :)

    1. 分库分表
    SQL解析功能完善,支持聚合,分组,排序,LIMIT,TOP等查询,并且支持级联表以及笛卡尔积的表查询
    支持内、外连接查询
    分片策略灵活,可支持=,BETWEEN,IN等多维度分片,也可支持多分片键共用,以及自定义分片策略
    基于Hint的强制分库分表路由
    2. 读写分离
    独立使用读写分离支持SQL透传
    一主多从的读写分离配置,可配合分库分表使用
    基于Hint的强制主库路由
    3. 柔性事务
    最大努力送达型事务
    TCC型事务(TBD)
    4. 分布式主键
    统一的分布式基于时间序列的ID生成器
    5. 兼容性
    可适用于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC
    可基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid等
    理论上可支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL
    6. 灵活多样的配置
    Java
    YAML
    Inline表达式
    Spring命名空间
    Spring boot starter
    7. 分布式治理能力 (2.0新功能)
    配置集中化与动态化,可支持数据源、表与分片策略的动态切换(2.0.0.M1)
    客户端的数据库治理,数据源失效自动切换(2.0.0.M2)
    基于Open Tracing协议的APM信息输出(2.0.0.M3)

    整体架构图

  • 相关阅读:
    第四十一篇-android studio 关闭自动保存功能
    《深入理解mybatis原理》 Mybatis初始化机制详解
    Java多线程系列--“基础篇”10之 线程优先级和守护线程
    Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
    Java多线程系列--“基础篇”08之 join()
    Java多线程系列--“基础篇”07之 线程休眠
    Java多线程系列--“基础篇”06之 线程让步
    Java多线程系列--“基础篇”05之 线程等待与唤醒
    【深入Java虚拟机】之八:Java垃圾收集机制
    【深入Java虚拟机】之七:Javac编译与JIT编译
  • 原文地址:https://www.cnblogs.com/zhangyaxiao/p/8430206.html
Copyright © 2011-2022 走看看