当前使用版本(必填,否则不予处理)

当前使用版本为3.3.2

该问题是如何引起的?(确定最新版也有问题再提!!!)

1.环境:4台阿里云服务器,操作系统为centos,项目部署方式为docker容器部署,数据库为mysql 2.saas项目,根据不同租户做了分库。项目中有一个专门做数据库读写的服务A,服务A在四台阿里云服务器上都只部署了一个节点(部署时保证了每一个微服务在每台服务器上是单节点部署)。 3.实体id生成策略为IdType.ASSIGN_ID,生成ID类型为long

再一次偶然的情况下,发现了服务A抛出mysql主键重复异常,然后观察了一段时间,发现主键重复仍然会不定时出现

重现步骤(如果有就写完整)

无法重现。不过后续跟踪mybatis-plus 3.3.2版本源码,发现雪花算法需要的workid,datacenterid是根据网卡硬件地址生成,按理四台服务器生成的workid,datacenterid不会重复(以前版本这两个属性可以在配置文件配置,3.3.2已经默认自动生成,不用再配置文件配置),并且追溯源码发现也做了时钟回拨处理。实在想不到还有什么会导致全局id重复,苦思不得其果,望大佬指教

报错信息

mysql主键重复异常

Comment From: miemieYaho

docker容器内读取不到宿主机的硬件地址

Comment From: mloveing

docker容器内读取不到宿主机的硬件地址

请问大佬确定是这个问题么,如果是,在现有docker部署方案不变的情况下怎么解决呢?

Comment From: miemieYaho

胆子大可以换成 https://github.com/imadcn/idworker ,我们有个现成的 ImadcnIdentifierGenerator,只有3.4.0及以上版本有,你可以看看,sb下直接 @Bean 就能把默认id生成切换成这个

Comment From: miemieYaho

胆子不够大那你只能 @bean DefaultIdentifierGenerator 这个,自己控制入参的 long workerId, long dataCenterId 这俩值

Comment From: mloveing

胆子不够大那你只能 @bean DefaultIdentifierGenerator 这个,自己控制入参的 long workerId, long dataCenterId 这俩值

好的,谢谢指导,不过我们使用的是Jenkins自动化一键部署,应该不太能采用 @bean DefaultIdentifierGenerator 自己控制入参的 long workerId, long dataCenterId 的方式,我尝试一下版本升级到3.4.0版本使用ImadcnIdentifierGenerator,或者使用基于zookeeper的id生成器

Comment From: maojx0630

基于zk分配机器id解决重复吧

Comment From: mloveing

问题已解决

Comment From: daaao

问题已解决

怎么解决的呢?

Comment From: mloveing

问题已解决

怎么解决的呢?

基于zookeeper服务生成id,3.4.0版本有个ImadcnIdentifierGenerator类你可以参考一下

Comment From: fengshaochun

问题已解决

怎么解决的呢?

基于zookeeper服务生成id,3.4.0版本有个ImadcnIdentifierGenerator类你可以参考一下

基于zookeeper服务生成id,是需要单独部署zookeeper服务?

Comment From: albertyann

版本升级到3.4.3+ 之后应该就可以解决该问题

Comment From: mapcoding-cn

版本升级到3.4.3+ 之后应该就可以解决该问题

只需要升级版本就可以吗?

Comment From: mapcoding-cn

升级版本不起作用

Comment From: Qinghua-Zheng

不变

请问下,现在这个dokcer容器获取不到地址的问题得到解决了没有

Comment From: freedudu

现在还存在这个获取不到地址的问题吗?我在环境上打印了下是能获取到的啊?为什么还是会偶现id重复呢