如何生成主机唯一标识?

7
我有几个需要协同工作且需要相互通信的应用程序。
这些应用程序可以安装在不同的主机上,这些主机可以在不同的本地网络中,但所有主机都通过全局网络连接在一起。
主机可以是Linux(CenOS、Debian、Ubuntu)或Windows(7/10)。
现在,我需要确定哪个主机正在运行应用程序。
要求如下: - 在同一台主机上运行的每个应用程序具有相同的“主机ID” - 每个“主机ID”在所有主机中均为唯一
由于主机可以是物理机器、虚拟机甚至是docker实例,因此我不认为我可以使用主机名作为“全局唯一ID”。
由于主机可以处于不同的本地网络中,因此我不认为我可以使用本地IP地址作为“全局唯一ID”。
那么我该使用哪些数据?也许是网络适配器MAC地址?即使在同一docker的多个实例之间,它是否保证是唯一的?
谢谢。

Docker容器ID是UUID。听起来你需要一种将UUID分配为VM主机名和硬件节点主机名的方法? - Sergei Rodionov
每个带有网络接口的主机必须具有唯一的MAC地址。包括Docker实例。如果由于任何原因,两个Docker主机具有相同的MAC地址,则可以使用docker run --lxc-conf="lxc.network.hwaddr=92:20:de:b0:6b:61" my_image ifconfig命令修改MAC地址。 - abkrim
@abkrim...如果两个主机位于不同的网络段(由两个路由器分隔,而不仅仅是一个路由器或交换机),重复的MAC地址对网络流量不会造成任何问题。物理设备可能不会出现这种情况,但我可以看到在大规模虚拟化环境中发生这种情况(每个主机或数据中心使用相同配置的副本来管理一组内部MAC地址和私有IP地址)。 - david
4个回答

5

在现代/最新的Linux发行版中,当系统第一次创建时,Linux会在/etc/machine-id文件中为您生成一个唯一的ID。一些分布式服务(如etcd)依赖于此文件来识别集群中的机器。

您可以创建并将类似于uuid的内容持久化到磁盘上,没有任何限制。您可以在Linux上使用uuidgen命令来完成这个操作。


这不正确,到目前为止我使用过的多个发行版中都没有找到任何这样的文件。 - heemayl
1
在 Fedora 24 上,它位于 /etc/machine-id。在 Ubuntu 14.04 上,它位于 /var/lib/dbus/machine-id。你使用的是哪个发行版,heemayl? - Christophe Schmitz

4
您可以说MAC地址是唯一的。但是,如果您关心安全,请不要使用MAC地址。MAC地址很容易被欺骗。
为了生成机器的唯一ID,您可以使用许多项目的组合,例如MAC地址、IP地址、主机名等,加入一个随机盐并将它们的sha256哈希值取出。由于主机可以在许多操作系统上运行,我建议不要使用任何特定于操作系统的参数。
不详细地解释,找到sha256中的冲突的可能性是不可思议的。
您可以在此处查看不同文本的SHA256。 http://www.xorbin.com/tools/sha256-hash-calculator 几乎每种编程语言都有用于创建SHA256哈希的函数/API。

我对安全性不太关心(在项目的这个部分不需要...),我只需要一个主机唯一标识。使用多个数据的SHA256(MAC + IP + HostName)是一个好主意。我无法真正使用随机数,因为在同一台主机上运行的所有应用程序都需要具有相同的“主机ID”。 - Aurelien
所以像 (ip addr show scope global | grep -v lft; hostname --fqdn; hostid) | sha256sum | cut -f1 -d" " 这样的东西似乎是这种情况下的不错解决方案。 - Matija Nalis

2

0

在Linux上,我通过更改/var/lib/dbus/machine-id文件的内容来解决了我的问题。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接