雪花算法ID冲突

雪花算法ID冲突问题排查思路

    • 问题发现
    • 问题分析
      • 解剖id组成部分 时间
      • IP是否重复
      • 分析IDservice代码
        • 第一步 看获取ID是否加锁,结果没毛病
        • 第二步 看到关键点 获取IP `InetAddress.getLocalHost().getHostAddress()`
    • 问题原因
    • 解决办法

 	很多公司的分布ID都采用了雪花算法;雪花算法网上有很详细的解释;本次记录公司用的雪花算法取出的ID报id冲突。其司雪花算法:workerId是用的服务器IP来做的;当然这种做法有弊端也有优点。
	弊端:同一个实例中不能部署相同业务的的服务。(通俗点:同实例微服务不能操作取id)

问题发现

		近期被安排接了一个公司的项目,接手后当然要了解了解。发现日志中大量报Duplicate entry '444939476461039620' for key 'PRIMARY'错误。通过代码发现,是调用公司的IDService 取的id。然后问题上报,结果都说IDService 没有问题;我能怎么办,就是报的这个错,只有老实的分析了。

问题分析

解剖id组成部分 时间

	先分析时间,直接查看几个节点的当前时间是否是有问题;然都Ok

IP是否重复

	查看IP是否在同一网段,末位点后的IP是否一样;然后都没问题;

分析IDservice代码

第一步 看获取ID是否加锁,结果没毛病

第二步 看到关键点 获取IP InetAddress.getLocalHost().getHostAddress()

	   通过代码查看获取IP是通过hostname取的IP,怀疑有问题后,直接在服务器上写一个java类打印出`InetAddress.getLocalHost().getHostAddress()`的。发现几台服务的打印出来的都一样,在查看hostname全都一样,我R问题找到了。

问题原因

	其一:运维同事给的理由是当初复制服务器镜像时,忘记改了导致的。
	其二:获取ip本不应该通过这种方式来取。应轮询网卡,找到合适ip。

解决办法

	1、运维改hostname		
	2、idservice sdk升级改为轮询网卡,找到合适ip。

你可能感兴趣的:(线上问题解决)