snowflake生成的id规则是41位的时间前缀+10位的节点标识+12位的sequence
单机上面为了防止NTP可以不停重试保障直至生成新的id。
但是在分布式环境下现在比如说有1master,2slave做back,假如master挂了,我们用zk选择了新的master,虽然说我们有dataCenterID能保证数据不重复,但是啊如果新旧master机器有时间差(比如说新master时间<旧master)那不就可能出现了新master生成的id比旧master在挂了之前生成的最后一个id要小吗?
我们怎么去规避这个问题?
1、尽量保持机器的时间一致。
2、在1无法保障的前提下该怎么做?是无法规避就是这样子的没关系?还是怎么操作,将每次生成的新的id放到zk然而新老master切换的时候新master继承老master的最后的id,这样做我感觉不合理,IO消耗太大了。
求大神指导。如果理解有问题也请尽情批判。
La synchronisation de l'horloge aura une certaine erreur. Par exemple, l'horloge GPS utilisée par Google/F1 a une erreur d'environ 10 ms.
L'erreur NTP est d'environ 200 à 300 ms.
Vérifiez si votre entreprise peut accepter cette erreur.
Sinon, votre entreprise ne peut pas utiliser l'heure locale pour déterminer l'ordre des événements.
Vous pouvez vous référer à l'article « L'horloge logique de Lamport » pour résoudre les problèmes de synchronisation dans les systèmes distribués. Ou une horloge logique mixte