Sharding-JDBC

Sharding-Jdbc概念与使用技巧

一曲冷凌霜 提交于 2019-11-28 05:17:54
1. Sharding-Jdbc概念与使用技巧 此讲解版本为 4.0.0-RC1 ,目前最新的版本 2019年5月21日发布 1.1. 绑定表 指 分片规则一致 的主表和子表。例如: t_order 表和 t_order_item 表,均按照 order_id 分片,则此两张表 互为绑定表 关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。举例说明,如果SQL为: SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); 在不配置绑定表关系时,假设分片键 order_id 将数值10路由至第0片,将数值11路由至第1片,那么路由后的SQL应该为4条,它们呈现为笛卡尔积: SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); SELECT i.* FROM t_order_0 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); SELECT i.* FROM

Sharding-Jdbc源码探究-读写分离

笑着哭i 提交于 2019-11-28 03:04:16
1. Sharding-Jdbc源码探究-读写分离 1.1. 主入口 找到源码入口 这一个类围绕了springboot配置属性的加载,加载了 spring.shardingsphere.datasource.names 配置的数据源,遍历存储到了Map容器 可以看到它还有个 @ConditionalOnProperty(prefix = "spring.shardingsphere", name = "enabled", havingValue = "true", matchIfMissing = true) 属性,说明只要引用了sharing-jdbc的pom,默认就会直接初始化加载 此类总共负责加载4个属性类 //分片属性配置 private final SpringBootShardingRuleConfigurationProperties shardingProperties; //主从属性配置 private final SpringBootMasterSlaveRuleConfigurationProperties masterSlaveProperties; //加密属性配置 private final SpringBootEncryptRuleConfigurationProperties encryptProperties; //额外属性配置(比如sql是否打印

聊聊sharding-jdbc的ShardingTransactionManager

给你一囗甜甜゛ 提交于 2019-11-27 01:35:12
序 本文主要研究一下sharding-jdbc的ShardingTransactionManager ShardingTransactionManager incubator-shardingsphere-4.0.0-RC1/sharding-transaction/sharding-transaction-core/src/main/java/org/apache/shardingsphere/transaction/spi/ShardingTransactionManager.java public interface ShardingTransactionManager extends AutoCloseable { /** * Initialize sharding transaction manager. * * @param databaseType database type * @param resourceDataSources resource data sources */ void init(DatabaseType databaseType, Collection<ResourceDataSource> resourceDataSources); /** * Get transaction type. * * @return transaction

为什么要分库分表

时间秒杀一切 提交于 2019-11-26 22:35:18
为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?) 说白了,分库分表是两回事儿,大家可别搞混了,可能是光分库不分表,也可能是光分表不分库,都有可能。 我先给大家抛出来一个场景。 假如我们现在是一个小创业公司(或者是一个 BAT 公司刚兴起的一个新部门),现在注册用户就 20 万,每天活跃用户就 1 万,每天单表数据量就 1000,然后高峰期每秒钟并发请求最多就 10。天,就这种系统,随便找一个有几年工作经验的,然后带几个刚培训出来的,随便干干都可以。 结果没想到我们运气居然这么好,碰上个 CEO 带着我们走上了康庄大道,业务发展迅猛,过了几个月,注册用户数达到了 2000 万!每天活跃用户数 100 万!每天单表数据量 10 万条!高峰期每秒最大请求达到 1000!同时公司还顺带着融资了两轮,进账了几个亿人民币啊!公司估值达到了惊人的几亿美金!这是小独角兽的节奏! 好吧,没事,现在大家感觉压力已经有点大了,为啥呢?因为每天多 10 万条数据,一个月就多 300 万条数据,现在咱们单表已经几百万数据了,马上就破千万了。但是勉强还能撑着。高峰期请求现在是 1000,咱们线上部署了几台机器,负载均衡搞了一下,数据库撑 1000QPS 也还凑合。但是大家现在开始感觉有点担心了,接下来咋整呢...... 再接下来几个月,我的天,CEO 太牛逼了,公司用户数已经达到 1 亿

为什么要分库分表?

坚强是说给别人听的谎言 提交于 2019-11-26 22:35:01
1 、面试题 为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分或水平拆分的? 2 、面试官心里分析 其实这块肯定是扯到高并发了,因为分库分表一定是为了支撑高并发、数据量大两个问题的。而且现在说实话,尤其是互联网类的公司面试,基本上都会来这么一下,分库分表如此普遍的技术问题,不问实在是不行,而如果你不知道那也实在是说不过去! 3 、面试题剖析 ( 1 )为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?) 说白了,分库分表是两回事儿,大家可别搞混了,可能是光分库不分表,也可能是光分表不分库,都有可能。我先给大家抛出来一个场景。 假如我们现在是一个小创业公司(或者是一个 BAT 公司刚兴起的一个新部门),现在注册用户就 20 万,每天活跃用户就 1 万,每天单表数据量就 1000 ,然后高峰期每秒钟并发请求最多就 10 。。。天,就这种系统,随便找一个有几年工作经验的,然后带几个刚培训出来的,随便干干都可以。 结果没想到我们运气居然这么好,碰上个 CEO 带着我们走上了康庄大道,业务发展迅猛,过了几个月,注册用户数达到了 2000 万!每天活跃用户数 100 万!每天单表数据量 10 万条!高峰期每秒最大请求达到 1000 !同时公司还顺带着融资了两轮

sharding-jdbc事务解读

 ̄綄美尐妖づ 提交于 2019-11-26 16:45:59
序言 sharding-jdbc在分库分表方面提供了很大的便利性,在使用DB的时候,通常都会涉及到事务这个概念,而在分库分表的环境上再加上事务,就会使事情变得复杂起来。本章试图剖析sharding-jdbc在事务方面的解决思路。 传统事务回顾 传统的事务模型如下: Connection conn = getConnection(); try{ Statement stmt1 = conn.parpareStatement(sql1); stmt1.executeUpdate(); Statement stmt2 = conn.parpareStatement(sql2); stmt2.executeUpdate(); conn.commit(); }catch(Exception e){ conn.rollback(); } 对于同一个连接,可以执行多条sql语句,任何一条语句出现错误的时候,整个操作流程都可以回滚,从而达到事务的原子操作。 再来看最基本的spring事务操作: class ServiceA(){ public void updateA(){...} } class ServiceB(){ public void updateB(){...} } @Transactional class ServiceC(){ public void updateC(){

聊聊sharding-jdbc的SQLExecutionHook

北城以北 提交于 2019-11-26 15:46:55
序 本文主要研究一下sharding-jdbc的SQLExecutionHook SQLExecutionHook incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/hook/SQLExecutionHook.java public interface SQLExecutionHook { /** * Handle when SQL execution started. * * @param routeUnit route unit to be executed * @param dataSourceMetaData data source meta data * @param isTrunkThread is execution in trunk thread * @param shardingExecuteDataMap sharding execute data map */ void start(RouteUnit routeUnit, DataSourceMetaData dataSourceMetaData, boolean isTrunkThread, Map<String

pxc集群与haproxy负载以及使用keepalived实现高可用And使用shardingJdbc搭配druid实现分区分表遇到的坑

六眼飞鱼酱① 提交于 2019-11-26 14:30:08
搭建pxc集群: 1,安装pxc镜像:docker pull percona/percona-xtradb-cluster 2,创建虚拟网段:docker network create --subnet=172.18.0.0/24 net1 查看:docker network inspect net1 删除:docker network rm net1 3,创建docker卷(直接映射宿主机路径会导致pxc闪退):docker volume create --name v1 查看:docker volume inspect v1 删除:docker volume rm v1 4,创建pxc容器: db1: docker run -d -p 3307:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=adc123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc db2: docker run -d -p 3308:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_JOIN

sharding-jdbc分库分表

可紊 提交于 2019-11-25 21:18:41
1、读写分离 server.port=8084 mybatis.config-location=classpath:META-INF/mybatis-config.xml #数据源名称集合,对应下面数据源配置的名称 spring.shardingsphere.datasource.names=master,slave # 主数据源 spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8 spring.shardingsphere.datasource.master.username=root spring.shardingsphere.datasource.master.password=1234 # 从数据源 spring.shardingsphere.datasource.slave.type=com