分表分库与分区的区别及拆分策略

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-01-29 07:42 被阅读0次

    上一篇 <<<MyCat实现读写分离与动态数据源切换
    下一篇 >>>MyCat的分片查询原理


    分表分库与分区的区别
    相同目的:解决并发能力、I/O 性能提升、将一张大表分成若干小表,业务同时访问多个表。
    (物理)分表:一张表分成N多个小表
    (物理/逻辑)分区:把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。
    分区并不是生成新的数据表,而是将表的数据均衡分摊到不同的硬盘,系统或是不同服务器存储介子中,实际上还是一张表。

    1.分表分库存在的问题

    1、自增ID问题
    2、数据关联查询问题
    3、数据同步问题

    2.自增ID问题解决办法

    a、设置数据库的步长
    缺点:步长确定后,无法扩展新的mysql,不然生成步长的规则可能会发生变化。

    查询自增的步长
    SHOW VARIABLES LIKE 'auto_inc%'
    修改自增的步长
    SET @@auto_increment_increment=10;
    修改起始值
    SET @@auto_increment_offset=5;
    假设有两台mysql数据库服务器
    节点①自增  1 3 5 7 9 11 ….
    节点②自增  2 4 6 8 10 12 ….
    

    b、UUID形式,缺点是不能排序
    c、使用雪花算法或redis解决

    3.数据库分表分库策略

    3.1垂直拆分

    垂直拆分就是根据不同的业务,分为不同的数据库,比如会员数据库、订单数据库、支付数据库等,垂直拆分在大型电商系统中用的非常常见。
    优点:拆分后业务清晰,拆分规则明确,系统之间整合或扩展容易。
    缺点:
    a、部分业务表无法join,只能通过接口方式解决,提高了系统复杂度
    b、存在分布式事务问题。

    3.2水平拆分

    水平拆分是按照某个字段的某种规则,把同一个表分散到不同的数据库中,每个表中包含一部分数据
    优点:该方式提高了系统的稳定性跟负载能力
    缺点:跨库join性能较差

    3.3水平拆分策略

    3.3.1 求模算法

    根据id进行十进制求摸运算,运算结果为分区索引
    注意:数据库节点分片数量无法更改,和ES集群非常相似的。

    <mycat:rule xmlns:mycat="http://io.mycat/">
       <tableRule name="role1">
            <rule>
                <columns>id</columns>
                <algorithm>mod-long</algorithm>
            </rule>
        </tableRule>
        <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
            <!--指定分片数量,不可以被更改-->
            <property name="count">3</property>
    </function> 
    </mycat:rule>
    
    create table user(id bigint not null auto_increment primary key,name varchar(100));
    
    INSERT INTO `user`(`id`,`name`) 
    VALUES 
    (1,'dd'),
    (2,'tt'),
    (3,'cc'),
    (4,'ww'),
    (5,'kk');
    
    select * from `user`;
    

    3.3.2 分片枚举

    根据不同的枚举常量,进行分类存储

    1.案例步骤:
    创建数据库userdb_1 、 userdb_2、userdb_3 
    2.修改partition-hash-int.txt 规则
    wuhan=0
    shanghai=1
    suzhou=2
    规则:
    <mycat:rule xmlns:mycat="http://io.mycat/">
        <tableRule name="role2">
                 <rule>
                    <!--将要分片的表字段-->
                    <columns>name</columns>
                    <!--分片函数-->
                    <algorithm>hash-int</algorithm>
                    </rule>
        </tableRule>
        <function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
            <!--标识配置文件名称-->
            <property name="mapFile">partition-hash-int.txt</property>
            <!--type默认值为0,0表示Integer,非零表示String-->
            <property name="type">1</property>
            <!--所有的节点配置都是从0开始,即0代表节点1
            defaultNode 设置默认节点:小于0表示不设置默认节点,大于等于0表示设置默认节点
            如果碰到不识别的枚举值,就让它路由到默认节点
            若默认节点未配置则报错: like this:can't find datanode for sharding column:column_name val:ffffffff
            -->
            <property name="defaultNode">1</property>
        </function>
    </mycat:rule>
    

    3.3.3、范围约定--此分片适用于提前规划好分片字段某个范围属于哪个分片

    3.3.4、日期指定--按日期(天)分片

    3.3.5、固定分片hash算法---类似于Hashmap,缺点是数据分布不均匀

    3.3.6、通配取模

    3.3.7、ASCII码求模通配

    3.3.8、编程指定

    3.3.9、字符串拆分hash解析

    tips:
    配置好之后,mycat链接的控制平台无法直接打开表,但可以用sql语句进行查询和执行操作。
    原因:每次查询表的时候都会携带逻辑库的名字


    推荐阅读:
    <<<MySQL自带主从复制原理
    <<<MyCat实现读写分离与动态数据源切换
    <<<MyCat的分片查询原理
    <<<Sharding-Jdbc实现读写分离
    <<<Sharding-Jdbc的分片算法及分表分库
    <<<Sharding-Jdbc与MyCat区别

    相关文章

      网友评论

        本文标题:分表分库与分区的区别及拆分策略

        本文链接:https://www.haomeiwen.com/subject/ajueoktx.html