baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.42k stars 4.31k forks source link

雪花算法在集群服务器出现ID重复 #6055

Closed HuangWenTao-H closed 6 months ago

HuangWenTao-H commented 7 months ago

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

版本:3.4.0

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

集群服务器通过雪花算法同时创建ID出现重复

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

在centos服务器中,Sequence.getDatacenterId();方法中的“InetAddress ip = InetAddress.getLocalHost();”获取的是lo回环网卡的信息,改网卡的ip地址是127.0.0.1,并没有MAC地址,导致所有服务器返回的都是0,同一时间创建id就出现了重复,是否可以过滤127.0.0.1的ip

报错信息

nieqiurong commented 7 months ago

这种建议可以考虑一下,但是还是不太建议直接通过使用本机网卡的方式,因为获取网卡这个方式,多网卡的时候都不一定正确。

目前的话支持spring.cloud.inetutils来配置网卡选择,非SpringCloud的话看是引入spring-cloud-commons这个组件使用还是自定义主键生成器来弄这个.

nieqiurong commented 7 months ago

可以试试 3.5.7-SNAPSHOT 修改了默认网卡查找方式 ,提供了基于网段和网卡的 配置优先查找

HuangWenTao-H commented 7 months ago

这种建议可以考虑一下,但是还是不太建议直接通过使用本机网卡的方式,因为获取网卡这个方式,多网卡的时候都不一定正确。

目前的话支持spring.cloud.inetutils来配置网卡选择,非SpringCloud的话看是引入spring-cloud-commons这个组件使用还是自定义主键生成器来弄这个.

spring: cloud: inetutils: ignored-interfaces:

HuangWenTao-H commented 7 months ago

问题已解决,修改host文件:<主机名> <内网IP>,即可根据设置的内网IP获取对应的MAC地址来计算雪花ID

nieqiurong commented 7 months ago

这种建议可以考虑一下,但是还是不太建议直接通过使用本机网卡的方式,因为获取网卡这个方式,多网卡的时候都不一定正确。 目前的话支持spring.cloud.inetutils来配置网卡选择,非SpringCloud的话看是引入spring-cloud-commons这个组件使用还是自定义主键生成器来弄这个.

spring: cloud: inetutils: ignored-interfaces: - lo 是这样配置吗,忽略lo网卡,但是感觉没生效。。求大佬解惑

这个要引入spring-cloud-commons组件, 3.5.7-SNAPSHOT 可以直接使用 mybatis-plus.global-config.sequence.ignored-interfaces