| 知乎专栏 |
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '854658443787632640' for key 'PRIMARY'
# 指定 工作机器数量 最大是2的10次方 , 即小于 1024 就可以 spring.shardingsphere.sharding.tables.shard.key-generator.props.worker.id=1000 max-vibration-offset # 最大容忍的时钟回拨毫秒数, 雪花算法依据时间戳来生成的,一旦时间戳回拨就会造成 id 重复的可能 spring.shardingsphere.sharding.tables.shard.key-generator.max.tolerate.time.difference.milliseconds=5
随机指定 worker.id,这样在kubernetes集群环境,每次启动pod,worker.id 都会自动变化。
spring.shardingsphere.sharding.tables.test.key-generator.props.worker.id=${random.int[1,1024]}
查看当前 worker.id
package cn.netkiller.controller.test;//package cn.netkiller.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope
@RestController
public class TestRestController {
@Value("${spring.shardingsphere.sharding.tables.test.key-generator.props.worker.id}")
public String workerId;
public TestRestController() {
}
@GetMapping("/workerId")
public String snow() {
return this.workerId;
}
}
package cn.netkiller.config;
import org.springframework.context.annotation.Configuration;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 动态指定sharding jdbc 的 work.id 雪花算法中的属性,然后通过 System.setProperty() 设置环境变量
* workId 可以用主机名、IP地址、Mac地址,最大值 1L << 100,就是1024,即 0<= workId < 1024
* {@link SnowflakeShardingKeyGenerator#getWorkerId()}
*/
@Configuration
public class SnowFlakeWordIdConfiguration {
static {
try {
InetAddress ip4 = Inet4Address.getLocalHost();
String addressIp = ip4.getHostAddress();
System.setProperty("workerId", (Math.abs(addressIp.hashCode()) % 1024) + "");
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
}
配置文件添加 key-generator.props.worker.id 设置 ${workerId} 变量
key-generator:
column: id
props:
worker:
id: ${workerId}
type: SNOWFLAKE