专栏首页猿天地Sharding-JDBC:垂直拆分怎么做?

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

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

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

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

解释下什么是垂直拆分?

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

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

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

  • 优点:

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

  • 缺点:

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

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

垂直拆分步骤

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

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

CREATE DATABASE `ds_0` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE TABLE `user`(
    id bigint(64) not null,
    city varchar(20) not null,
    name varchar(20) not null,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

CREATE DATABASE `ds_1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE TABLE `loudong` (
 `id` varchar(20) NOT NULL,
 `city` varchar(20) NOT NULL,
 `region` varchar(20) NOT NULL,
 `name` varchar(20) NOT NULL,
 `ld_num` varchar(10) NOT NULL,
 `unit_num` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

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

spring.shardingsphere.datasource.names=ds0,ds1
# ds0数据源
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=123456
# ds1数据源
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds_1?characterEncoding=utf-8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=123456
# 绑定loudong表所在节点
spring.shardingsphere.sharding.tables.loudong.actual-data-nodes=ds1.loudong
# 绑定user表所在节点
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user
# 设置自增ID
spring.shardingsphere.sharding.tables.user.key-generator.column=id
# 设置自增ID算法
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE

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

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

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

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

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

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

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

spring.shardingsphere.datasource.names=ds0,ds0slave,ds1,ds1slave
# ds0主数据源
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=123456
# ds0从数据源
spring.shardingsphere.datasource.ds0slave.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0slave.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0slave.url=jdbc:mysql://localhost:3306/ds0slave?characterEncoding=utf-8
spring.shardingsphere.datasource.ds0slave.username=root
spring.shardingsphere.datasource.ds0slave.password=123456
# ds1主数据源
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds_1?characterEncoding=utf-8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=123456
# ds1从数据源
spring.shardingsphere.datasource.ds1slave.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1slave.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1slave.url=jdbc:mysql://localhost:3306/ds1slave?characterEncoding=utf-8
spring.shardingsphere.datasource.ds1slave.username=root
spring.shardingsphere.datasource.ds1slave.password=123456
# 绑定loudong表所在节点
spring.shardingsphere.sharding.tables.loudong.actual-data-nodes=ds1.loudong
# 绑定user表所在节点
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
# 读写分离
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=ds0
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=ds0slave
spring.shardingsphere.sharding.master-slave-rules.ds1.master-data-source-name=ds1
spring.shardingsphere.sharding.master-slave-rules.ds1.slave-data-source-names=ds1slave

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

觉得不错的记得关注下哦,给个Star吧!

本文分享自微信公众号 - 猿天地(cxytiandi)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用PHP的PDO_Mysql扩展有效避免sql注入

    首先,什么是sql注入? 用大白话说就是:当一个人在访问你的应用时,需要输入,他的输入是一些特殊的字符,你没有对输入进行过滤处理导致他的输入改变了你的sql语...

    luxixing
  • 学术大讲堂 |(四)浅谈人工智能在公安大数据的应用探索

    大家好,我们来共同分享创新智能应用研究中心的人工智能技术在公安大数据方面的应用探索。作为集团公司的研发引擎,我们的技术研发需要面向市场需求,面向实际业务场景。新...

    灯塔大数据
  • PHP-5.3向更高版本迁移之变更

    上面的变更主要是函数参数和php.ini配置指令在php5.4,php5.5中的变化 其中一些变更 和新增特性,不兼容部分有交叉

    luxixing
  • mongodb

    晴天Online
  • Redis(2)——通用命令

    set key value xx key存在才设置,不存在不设置,也就是update 更新操作

    羊羽shine
  • iOS持续集成(CI)——OCLint静态代码分析

    通过 -e 选项来忽略Cocoapods 来pod文件,通过--来分割 oclint-json-compilation-database 的参数与 oclint...

    羊羽shine
  • openfire部署

    http://igniterealtime.org/downloads/index.jsp

    晴天Online
  • Elasticsearch(二)——Rest API

    RESTful 接口 URL 的格式是: http://cluster的地址: 9200/<index>I<type>I [<id>] 其中,index, ...

    羊羽shine
  • PHP-5.3向更高版本迁移之不兼容

    luxixing
  • MySQL Group Replication 入坑指北

    MGR(MySQL Group Replication)是MySQL官方推出的一个全新的高可用与高扩展的解决方案,提供高可用、高扩展、高可靠(强一致性)的MyS...

    用户1278550

扫码关注云+社区

领取腾讯云代金券