Sharding-JDBC:垂直拆分怎么做?

9 篇文章 0 订阅
4 篇文章 0 订阅

经过读写分离的优化后,小王可算是轻松了一段时间,读写分离具体的方案请查看这篇文章:
Sharding-JDBC:查询量大如何优化?

可是好景不长,业务发展是在太快了。数据库中的数据量猛增,由于所有表都在一个数据库中,导致服务器本地存储快满了。

数据库表分布

从上图我们可以看的出来,由于表的数量较多,每个表的数据量也较大,但是还没到水平拆分的地步。目前遇到的问题是服务器的存储不够了,短期内还不用水平拆分,那么方案呼之欲出了:垂直拆分。

解释下什么是垂直拆分?

我们都知道,一个数据库它是由N张表构成,每个表存储的数据都不一样,都对应着各自的业务。

所谓的垂直切分其实就是分类存储,大部分都是按业务类型进行分类。相同的类型存储在相同的库上,不同的类型存储在不同的库上,这样也就将数据或者说压力分担到不同的库上面 。

比如我们可以将用户相关的放一起,订单相关的放一起,行为日志相关的放一起,依次来推下去。

  • 优点:

拆分之后业务规划清晰,数据维护简单,分担了数据集中存储的压力。

  • 缺点:

缺点也很明显,多表join查询无法实现,只能通过接口方式解决,提高了系统复杂度等问题。

垂直拆分效果图

做垂直拆分其实跟读写分离是一样的,本质上还是多数据源的问题,本文中先考虑最简单的垂直拆分方式,垂直拆分+读写分离我们下篇文章进行讲解。

垂直拆分步骤

至于怎么整合Sharding-JDBC就不在讲解了,上篇文章有讲解过,直接开始和兴步骤。

假设我们拆分成了2个库,分别是ds_0和ds_1,每个库中的表不同,ds_0中放了user表,SQL脚本如下:

 
  1. CREATE DATABASE `ds_0` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
  2.  
  3. CREATE TABLE `user`(
  4. id bigint(64) not null,
  5. city varchar(20) not null,
  6. name varchar(20) not null,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ds_1中放了loudong表,SQL脚本如下:

 
  1. CREATE DATABASE `ds_1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
  2.  
  3. CREATE TABLE `loudong` (
  4. `id` varchar(20) NOT NULL,
  5. `city` varchar(20) NOT NULL,
  6. `region` varchar(20) NOT NULL,
  7. `name` varchar(20) NOT NULL,
  8. `ld_num` varchar(10) NOT NULL,
  9. `unit_num` varchar(10) NOT NULL,
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

最核心的还是数据源的配置以及绑定:

 
  1. spring.shardingsphere.datasource.names=ds0,ds1
  2.  
  3. # ds0数据源
  4. spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
  5. spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
  6. spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
  7. spring.shardingsphere.datasource.ds0.username=root
  8. spring.shardingsphere.datasource.ds0.password=123456
  9.  
  10. # ds1数据源
  11. spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
  12. spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
  13. spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds_1?characterEncoding=utf-8
  14. spring.shardingsphere.datasource.ds1.username=root
  15. spring.shardingsphere.datasource.ds1.password=123456
  16.  
  17. # 绑定loudong表所在节点
  18. spring.shardingsphere.sharding.tables.loudong.actual-data-nodes=ds1.loudong
  19.  
  20. # 绑定user表所在节点
  21. spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user
  22. # 设置自增ID
  23. spring.shardingsphere.sharding.tables.user.key-generator.column=id
  24. # 设置自增ID算法
  25. spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE

配置完之后该怎么用还是怎么用,完全不用改变一行代码。sharding-jdbc底层会对数据源进行接管。

如果我们不用sharding-jdbc的话,你同样需要配置2个数据源,这个其实差不多,最复杂的就是你在操作数据库的时候需要知道当前的操作是哪个数据源,因为每个数据源中的表都不一样,通过sharding-jdbc框架屏蔽了这些复杂的操作。

垂直拆分下的读写分离步骤

从最开始的单库多表,到读写分离,再到垂直拆分多个库。

循序渐进的为大家讲解高并发,大数据量下的数据库解决方案。并引入开源的Sharding-JDBC来实现具体的方案。

垂直拆分后进一步提升性能的方式就是垂直拆分多库的读写分离,如下图:
垂直拆分主从架构

要实习这个功能,我们只需要在上面的基础上,为每个库增加一个从节点的配置就可以了,然后用master-slave-rules将主从数据源进行绑定,如下:

 
  1. spring.shardingsphere.datasource.names=ds0,ds0slave,ds1,ds1slave
  2.  
  3. # ds0主数据源
  4. spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
  5. spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
  6. spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
  7. spring.shardingsphere.datasource.ds0.username=root
  8. spring.shardingsphere.datasource.ds0.password=123456
  9.  
  10. # ds0从数据源
  11. spring.shardingsphere.datasource.ds0slave.type=com.alibaba.druid.pool.DruidDataSource
  12. spring.shardingsphere.datasource.ds0slave.driver-class-name=com.mysql.jdbc.Driver
  13. spring.shardingsphere.datasource.ds0slave.url=jdbc:mysql://localhost:3306/ds0slave?characterEncoding=utf-8
  14. spring.shardingsphere.datasource.ds0slave.username=root
  15. spring.shardingsphere.datasource.ds0slave.password=123456
  16.  
  17. # ds1主数据源
  18. spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
  19. spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
  20. spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds_1?characterEncoding=utf-8
  21. spring.shardingsphere.datasource.ds1.username=root
  22. spring.shardingsphere.datasource.ds1.password=123456
  23.  
  24. # ds1从数据源
  25. spring.shardingsphere.datasource.ds1slave.type=com.alibaba.druid.pool.DruidDataSource
  26. spring.shardingsphere.datasource.ds1slave.driver-class-name=com.mysql.jdbc.Driver
  27. spring.shardingsphere.datasource.ds1slave.url=jdbc:mysql://localhost:3306/ds1slave?characterEncoding=utf-8
  28. spring.shardingsphere.datasource.ds1slave.username=root
  29. spring.shardingsphere.datasource.ds1slave.password=123456
  30.  
  31. # 绑定loudong表所在节点
  32. spring.shardingsphere.sharding.tables.loudong.actual-data-nodes=ds1.loudong
  33.  
  34. # 绑定user表所在节点
  35. spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user
  36. spring.shardingsphere.sharding.tables.user.key-generator.column=id
  37. spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
  38.  
  39. # 读写分离
  40. spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=ds0
  41. spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=ds0slave
  42.  
  43. spring.shardingsphere.sharding.master-slave-rules.ds1.master-data-source-name=ds1
  44. spring.shardingsphere.sharding.master-slave-rules.ds1.slave-data-source-names=ds1slave

源码参考:https://github.com/yinjihuan/sharding-jdbc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介 随着互联网的发展,软件的规模在逐渐变大,用关系型数据库如何存储和处理大规模的业务数据成为企业面临的挑战, 关系型数据库作为OLTP(联机事务处理过程)系统的首选毋庸置疑,但是关系型数据面对大规模数据的处理有其先天的不足,比如单表存储上千万数据时便会出现不同程度的处理速度缓慢问题,如何解决?分库分表技术就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。本课程将系统的讲解分库分表技术。 课程价值 分库分表技术是为解决关系型数据库存储和处理大规模数据的问题,主要应用于OLTP系统,它与应用于OLAP(联机分析处理)的大数据技术有不同的应用场景,本课程本着从解决生产实际问题出发,讲授分库分表技术的解决方案,包括:垂直分库、垂直分表、水平分库、水平分表、读写分离,涵盖了分库分表的各种方案,并且深入讲解Sharding-JDBC框架的原理及使用方法,通过学习本课程可以快速应用到生产实践中。 课程优势 本课程不仅讲解多种有效的分库分表的解决方案,还深入讲解了Sharding-JDBC框架的原理和使用方法,Sharding-JDBC是一套轻量级的对代码零侵入的框架,在生产中有广泛的使用。本课程从思想原理、技术框架、案例实操三个方面去学习,可以快速的将分库分表技术应用到生产实践中,解决大数据存储与处理的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值