一、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)插入数据查看效果。