• mycat(2)主键自增之本地自增的方式


    1.简介

    在使用MyCat分库分表之后,如果还是使用MySql中的主键自增的话,已经无法保证这个自增主键在MySql集群中的唯一性了,为了实现全局唯一主键,MyCat提供了好几种方式实现全局唯一主键,分别有:

    本地文件方式
    数据库方式
    时间戳方式
    分布式 ZK ID生成器
    ZK递增ID 生成
    12345
    

    本文将对本地文件方式进行简单的说明,并通过一个示例描述其使用方法。

    2.本地文件方式

    此方式 MyCat 将 sequence 配置到文件中,当使用到 sequence 中的配置后,MyCat会更新sequence_conf.properties 文件中 sequence 当前的值(currentValue)。

    具体步骤如下:

    【a】sequence_conf.properties配置:

    ORDER.HISIDS=
    ORDER.MINID=1001
    ORDER.MAXID=2000
    ORDER.CURID=1000
     
    ORDERDETAIL.HISIDS=
    ORDERDETAIL.MINID=1001
    ORDERDETAIL.MAXID=2000
    ORDERDETAIL.CURID=1000
    123456789
    

    【b】server.xml中执行序列生成方式sequnceHandlerType=0为本地文件方式:

    <property name="sequnceHandlerType">0</property>
    1
    

    【c】server.xml配置逻辑库以及MyCat访问的用户信息:

     <user name="root">
                    <property name="password">123456</property>
                    <property name="schemas">mycat_order</property>
     
                    <!-- 表级 DML 权限设置 -->
                    <!--            
                    <privileges check="false">
                            <schema name="TESTDB" dml="0110" >
                                    <table name="tb01" dml="0000"></table>
                                    <table name="tb02" dml="1111"></table>
                            </schema>
                    </privileges>           
                     -->
            </user>
     
            <user name="user">
                    <property name="password">123456</property>
                    <property name="schemas">mycat_order</property>
                    <property name="readOnly">true</property>
            </user>
    1234567891011121314151617181920
    

    【d】schema.xml配置分片节点、节点主机等信息:

    <schema name="mycat_order" checkSQLschema="false" sqlMaxLimit="100">
                <table name="t_order"  dataNode="dn1,dn2" rule="mod-long">
                        <childTable name="t_order_detail" primaryKey="od_id" joinKey="order_id" parentKey="order_id"></childTable>
                </table>
        </schema>
    
        <dataNode name="dn1" dataHost="host1" database="test_mycat" />
        <dataNode name="dn2" dataHost="host2" database="test_mycat" />
    
        <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="host1" url="192.168.70.128:3306" user="root"
                                   password="123">
                </writeHost>
        </dataHost>
    
        <dataHost name="host2" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="host2" url="192.168.70.130:3306" user="root"
                                   password="123">
                </writeHost>
        </dataHost>
    1234567891011121314151617181920212223242526
    

    【e】rule.xml配置分片规则:

     <tableRule name="mod-long">
                    <rule>
                            <columns>order_id</columns>
                            <algorithm>mod-long</algorithm>
                    </rule>
            </tableRule>
     
     <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                    <!-- how many data nodes -->
                    <property name="count">2</property>
    </function>
    1234567891011
    

    【f】接着启动MyCat进行测试,使用序列插入主键:

    INSERT INTO `t_order`
                (`order_id`,
                 `user_id`,
                 `pay_mode`,
                 `amount`)
    VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,101,1,111.1);
     
    INSERT INTO `t_order`
                (`order_id`,
                 `user_id`,
                 `pay_mode`,
                 `amount`)
    VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,102,5,222.2);
     
    INSERT INTO `t_order`
                (`order_id`,
                 `user_id`,
                 `pay_mode`,
                 `amount`)
    VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,103,7,333.3);
    select * from t_order;
    123456789101112131415161718192021
    

    其中MYCATSEQ_ORDER对应序列名称ORDER,同理,使用order_detail为next value for MYCATSEQ_ORDERDETAIL

    【g】测试结果:
    在这里插入图片描述
    可见,此时order_id已经根据本地配置自动增长:
    在这里插入图片描述
    在这里插入图片描述
    【h】vim sequence_conf.properties : 可以看到ORDER.CURID=1003记录了当前序列已经到了1003,说明本地序列配置生效。

    vim sequence_conf.properties 
    1
    

    在这里插入图片描述
    如果需要详细的实现步骤,可以参考前面的一篇文件,https://blog.csdn.net/BruceLiu_code/article/details/104731096,这个入门示例也是使用的本地文件实现全局序列,保证主键全局唯一。

    3.总结

    在实际项目中,一般也不会采用本地文件方式生成主键,下面是其优缺点:

    优点:本地加载,读取速度较快。
    缺点:当 MyCAT 重新发布后,配置文件中的 sequence 会恢复到初始值。

  • 相关阅读:
    kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器
    解决VS2015 VBCSCompiler.exe 占用CPU100%的问题
    电商网站商品模型之商品详情页设计方案
    大三那年在某宝8块钱买的.NET视频决定了我的职业生涯
    单点登录改进版-使用ajax分发cookie避免重定向轮询
    可跨域的单点登录(SSO)实现方案【附.net代码】
    使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
    js封装的三级联动菜单(使用时只需要一行js代码)
    EF查询之性能优化技巧
    EF使用CodeFirst方式生成数据库&技巧经验
  • 原文地址:https://www.cnblogs.com/idcode/p/14551427.html
Copyright © 2020-2023  润新知