组件学习数据库linux

分库分表之sharding-jdbc

2018-12-18  本文已影响370人  AKyS佐毅

项目背景

垂直分表是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。

另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能。

库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决。

水平切分后同一张表会出现在多个数据库/表中,每个库/表的内容不同。几种典型的数据分片规则为:

优点

缺点

优点

缺点

同时分库分表带来了下列问题

下边用 Sharding-JDBC ,这种方式,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式。可靠性还是很好的。

下边的id主键,我这里没有处理,大家在实际工程中一定要生成唯一的id.

工程地址:Sharing-jdbc

1、数据库准备

CREATE TABLE `user_x` (
  `user_id` bigint(20) DEFAULT NULL,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `gender` int(11) DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2、pom.xml配置

<dependencies>
        <!-- web支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- mySql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <!-- mybatis sprongBoot支持 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- druid数据支持 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>
        <!-- sharding-jdbc 分库分表 -->
        <dependency>
            <groupId>io.shardingjdbc</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>2.0.0.M3</version>
        </dependency>

        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.52</version>
        </dependency>


        <!-- lombok注解 , 简化代码 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- test支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

3、application.properties配置

logging.level.com.wangpu.mysql.shardingjdbc=debug

# 所有数据源列表
sharding.jdbc.datasource.names=ds_master,ds_slave_0

# 主数据源
sharding.jdbc.datasource.ds_master.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_master.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_master.url=jdbc:mysql://localhost:3306/test_write?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
sharding.jdbc.datasource.ds_master.username=root
sharding.jdbc.datasource.ds_master.password=xxxxx

# 从数据源
sharding.jdbc.datasource.ds_slave_0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_slave_0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_slave_0.url=jdbc:mysql://localhost:3306/test_read?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
sharding.jdbc.datasource.ds_slave_0.username=root
sharding.jdbc.datasource.ds_slave_0.password=xxxxx

# 读写分离设置
sharding.jdbc.config.sharding.master-slave-rules.ds_0.master-data-source-name=ds_master
sharding.jdbc.config.sharding.master-slave-rules.ds_0.slave-data-source-names=ds_slave_0


# 分表配置
#actual-data-nodes:真实数据节点,由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持inline表达式
sharding.jdbc.config.sharding.tables.user.actual-data-nodes=ds_0.user_${0..1}

#table-strategy.inline.sharding-column:分表的字段配置
sharding.jdbc.config.sharding.tables.user.table-strategy.inline.sharding-column=user_id
#table-strategy.inline.algorithm-expression:分表的算法表达式(取模 , HASH , 分块等)
sharding.jdbc.config.sharding.tables.user.table-strategy.inline.algorithm-expression=user_${user_id.longValue() % 2}

#自定义分表算法
#sharding.jdbc.config.sharding.tables.user.tableStrategy.standard.sharding-column=name
#sharding.jdbc.config.sharding.tables.user.tableStrategy.standard.preciseAlgorithmClassName=HashPreciseShardingAlgorithm

# MyBatis配置
mybatis.type-aliases-package=com.wangpu.mysql.shardingjdbc.entity
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.cache-enabled=false

3、接口调用

4、数据库表现

270天以来,Java架构更新了 656个主题,已经有130+位同学加入。微信扫码关注java架构,获取Java面试题和架构师相关题目和视频。上述相关面试题答案,尽在Java架构中。

详情介绍:

更新主题详情

WechatIMG136.jpeg
上一篇下一篇

猜你喜欢

热点阅读