基于当当开源shardingjdbc的分库分表的配置-单主键分库分表策略配置

数据库 专栏收录该内容
1 篇文章 0 订阅

由于最近在做公司各种中间件的替换方案调研,其中就有调研到当当已经开源的shardingjdbc。

今天搞了一天,从一头雾水到慢慢的拨开了迷雾。


最搞的是,分库分表规则的配置,结合我们自己的实际使用场景,分库分表规则采用的是单一主键,并不是gitgub上提供的demo,采用userid分库,orderid分表的策略。

着实被搞了一天。


官网的配置如下。

<bean id="dbtbl_0" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/dbtbl_0"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
    </bean>

    <bean id="dbtbl_1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/dbtbl_1"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
    </bean>

    <rdb:strategy id="databaseStrategy" sharding-columns="user_id" algorithm-class="com.dangdang.ddframe.rdb.sharding.spring.algorithm.SingleKeyModuloDatabaseShardingAlgorithm"/>
    <rdb:strategy id="tableStrategy" sharding-columns="order_id" algorithm-class="com.dangdang.ddframe.rdb.sharding.spring.algorithm.SingleKeyModuloTableShardingAlgorithm"/>

    <rdb:data-source id="shardingDataSource">
        <rdb:sharding-rule data-sources="dbtbl_0,dbtbl_1" default-data-source="dbtbl_0">
            <rdb:table-rules>
                <rdb:table-rule logic-table="t_order" actual-tables="t_order_${0..3}" table-strategy="tableStrategy"/>
                <rdb:table-rule logic-table="t_order_item" actual-tables="t_order_item_${0..3}" database-strategy="databaseStrategy" table-strategy="tableStrategy"/>
            </rdb:table-rules>
            <rdb:binding-table-rules>
                <rdb:binding-table-rule logic-tables="t_order, t_order_item"/>
            </rdb:binding-table-rules>
            <rdb:default-database-strategy sharding-columns="none" algorithm-class="com.dangdang.ddframe.rdb.sharding.api.strategy.database.NoneDatabaseShardingAlgorithm"/>
        </rdb:sharding-rule>
        <rdb:props>
            <prop key="metrics.enable">true</prop>
        </rdb:props>

根据我们自己的实际场景,

我的分表键只有id,所以简单的按照这种配置是无法完成的,跑各种测试,数据的分散均达不到想要的效果。


目标:测试环境分2库4表后的物理视图如下:

db_0

|---order_0

|---order_1


db_1

|---order_2

|---order_3


两个不同的物理库,但是order表的物理库的后缀需要从0开始递增,这样才能满足现行环境的替换,否则还要重新命名,做路由。




尝试一:根据官网提供的demo尝试分库分表,具体配置如下:



这样库表的物理视图如下:

db_0

|---order_0

|---order_1

|---order_2

|---order_3


db_1

|---order_0

|---order_1

|---order_2

|---order_3

各种跑测试用例,均不能实现。期间还遇到了各种各样的错误。且数据也无法均匀的散落的每个库里。


偶然情况下,灵机一动,调整一下分库的策略。

这里注意一下,如果是2库4表的话,

algorithm-expression="dbtbl_${(id.longValue() / 2).longValue() % 2}"。这个表达式里的第一个2的含义是每个库里表表数。第二个代表的是库数。


如果分成2库6表,则每个库里有三个表,则配置成

algorithm-expression="dbtbl_${(id.longValue() / 3).longValue() % 2}"

<!-- 自定义规则  -->
<rdb:strategy id="databaseStrategy" sharding-columns="id"
              algorithm-expression="dbtbl_${(id.longValue() / 2).longValue() % 2}"/>

<!--  分表规则  -->

<rdb:strategy id="orderTableStrategy" sharding-columns="id" algorithm-expression="b_order_${id.longValue() % 4}"/>

如上配置:在分库的时候,根据分片主键id,先除以2, 然后取模2,这样就可以了。

测试了一万条数据,4个表里,每个表的数据都是2500条,即完美实现了数据的散落。


以上仅是个人的使用经验,也希望对后来的同学有所帮助。如果错误,也可以联系我进行纠正。




  • 2
    点赞
  • 2
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

<p style="font-size:14px;color:#333333;"> <span style="font-size:16px;"><strong><span style="color:#000000;">课程简介</span></strong></span><span style="color:#000000;"><br /> </span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">随着互联网的发展,软件的规模在逐渐变大,用关系型数据库如何存储和处理大规模的业务数据成为企业面临的挑战, 关系型数据库作为OLTP(联机事务处理过程)系统的首选毋庸置疑,但是关系型数据面对大规模数据的处理有其先天的不足,比如表存储上千万数据时便会出现不同程度的处理速度缓慢问题,如何解决?分库分表技术就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得一数据库、一数据表的数据量变小,从而达到提升数据库性能的目的。本课程将系统的讲解分库分表技术。</span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;"><br /> </span> </p> <p style="font-size:14px;color:#333333;"> <span style="font-size:16px;"><strong><span style="color:#000000;">课程价值</span></strong></span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">分库分表技术是为解决关系型数据库存储和处理大规模数据的问题,主要应用于OLTP系统,它与应用于OLAP(联机分析处理)的大数据技术有不同的应用场景,本课程本着从解决生产实际问题出发,讲授分库分表技术的解决方案,包括:垂直分库、垂直分表、水平分库、水平分表、读写分离,涵盖了分库分表的各种方案,并且深入讲解Sharding-JDBC框架的原理及使用方法,通过学习本课程可以快速应用到生产实践中。</span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;"><br /> </span> </p> <p style="font-size:14px;color:#333333;"> <span style="font-size:16px;"><strong><span style="color:#000000;">课程优势</span></strong></span> </p> <p style="font-size:14px;color:#333333;"> <span style="color:#000000;">本课程不仅讲解多种有效的分库分表的解决方案,还深入讲解了Sharding-JDBC框架的原理和使用方法,Sharding-JDBC是一套轻量级的对代码零侵入的框架,在生产中有广泛的使用。本课程从思想原理、技术框架、案例实操三个方面去学习,可以快速的将分库分表技术应用到生产实践中,解决大数据存储与处理的问题。</span> </p> <div> <br /> </div>
评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

C-D

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值