JavaEE:Sharding-Jdbc/MyCat的分布式全局ID

一、Sharding-Jdbc生成全局ID:

1.UUID方式全局ID:

(1)application.yml:

spring:
  shardingsphere:
    sharding:
      tables:
        t_order:
          ... #省略其他配置
          table-strategy:   #表分片策略
            standard:  #标准
              shardingColumn: id           #表分片健,id为t_order表中的id字段
              preciseAlgorithmClassName: com.yyh.mybatis.UUIDShard  #自定义分片规则类
          #主键生成器
          key-generator:
            column: id     #自增主键字段
            type: UUID     #类别:UUID方式,id列为字符串类型

(2)自定义分片规则类:

public class UUIDShard implements PreciseShardingAlgorithm<String> {
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {
        String id = preciseShardingValue.getValue();
        int mode = Math.abs(id.hashCode() % collection.size());
        String[] arr = collection.toArray(new String[0]);
        return arr[mode];
    }
}

2.雪花算法方式全局ID(1毫秒最大并发4096个):
算法规则:
0  41位时间戳    5位机房   5位机器   12位序列号

(1)application.yml:

spring:
  shardingsphere:
    sharding:
      tables:
        t_order:
          ... #省略其他配置
          table-strategy:   #表分片策略
            standard:  #标准
              shardingColumn: id           #表分片健,id为t_order表中的id字段
              preciseAlgorithmClassName: com.yyh.mybatis.SnowflakeShard  #自定义分片规则类
          #主键生成器
          key-generator:
            column: id       #自增主键字段,自动生成
            type: SNOWFLAKE  #类别:雪花算法方式,id列为bigint类型
            props:
              worker:
                id: 1    #值任意
                max:
                  tolerate:
                    time:
                      difference:
                        milliseconds: 10   #单位为毫秒

(2)自定义分片规则类:

public class SnowflakeShard implements PreciseShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {
        long id = preciseShardingValue.getValue();
        int mode = (int) Math.abs(id % collection.size());
        String[] arr = collection.toArray(new String[0]);
        return arr[mode];
    }
}

二、MyCat的ID序列生成器:

1.本地文件方式全局ID:

 (1)配置全局ID为本地文件方式(cd /usr/local/mycat/conf,vi server.xml):

<mycat:server ...>
   <system>
      <property name="sequnceHandlerType">0</property> <!-- 0为配置本地文件方式 -->
   </system>
</mycat:server>

(2)配置主键自增(cd /usr/local/mycat/conf,vi schema.xml):

<mycat:schema ...>
   <schema ... checkSQLschema="false"> <!-- 关闭SQL检查 -->
      <table ... autoIncrement="true" primaryKey="id" /> <!-- autoIncrement为自增id,primaryKey指定主键列(此处为id) -->
   </schema>
   ...
</mycat:schema>

(3)配置id最小值最大值(cd /usr/local/mycat/conf,vi sequence_conf.properties):

表名.HISIDS=
表名.MINID=id最小值
表名.MAXID=id最大值
表名.CURID=id当前值

(4)插入数据测试(会自动生成全局ID):

INSERT INTO 表名(字段1) values(next value FOR mycatseq_表名,值1)

2.数据库方式全局ID:

 (1)配置全局ID为数据库方式(cd /usr/local/mycat/conf,vi server.xml):

<mycat:server ...>
   <system>
      <property name="sequnceHandlerType">1</property> <!-- 1为配置数据库方式 -->
   </system>
</mycat:server>

(2)配置主键自增(cd /usr/local/mycat/conf,vi schema.xml):

<mycat:schema ...>
   <schema ... checkSQLschema="false"> <!-- 关闭SQL检查 -->
      <table ... autoIncrement="true" primaryKey="id" /> <!-- 配置主键自增,autoIncrement为自增id,primaryKey指定主键列(此处为id) -->
   </schema>
   ...
</mycat:schema>

(3)下载mycat中的dbseq.sql(cd /usr/local/mycat/conf):

sz dbseq.sql

(4)使用Navicat工具执行dbseq.sql;

(5)打开MYCAT_SEQUENCE表,插入需要使用全局id的表:

name     current_value   increment
GLOBAL        1              1
表名1      当前id值       自增值
表名2      当前id值       自增值

(6)配置使用全局id的表(cd /usr/local/mycat/conf,vi sequence_db_conf.properties):

GLOBAL=dn1       #默认
COMPANY=dn1      #默认
CUSTOMER=dn1     #默认
表名1=节点名      #新增需要使用全局id的表

3.雪花算法方式全局ID(1毫秒最大并发4096个):

算法规则:
0  41位时间戳    5位机房   5位机器   12位序列号

(1)配置id生成方式与主键自增(cd /usr/local/mycat/conf,vi server.xml):

<mycat:server ...>
   <system>
      <property name="sequnceHandlerType">2</property> <!-- 2为配置雪花算法方式 -->
   </system>
</mycat:server>

(2)配置分片规则(cd /usr/local/mycat/conf,vi schema.xml):

<mycat:schema ...>
   <schema ...>
      <table ... rule="mod-long" /> <!-- 使用mod-long(%2取模)分片规则 -->
   </schema>
   ...
</mycat:schema>

(3)进入mycat管理端口命令行刷新配置:

mysql> reload @@config;

(4)插入数据查看效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值