我有几个应用程序一起工作,需要沟通。
这些应用程序可以安装在不同的主机上,这些主机可以位于不同的本地networking中,而是通过全球networking连接在一起。
主机可以是Linux(CenOS,Debian,Ubuntu)或Windows(7/10)。
现在,我需要确定哪个主机正在运行一个应用程序。
要求是: – 在同一主机上运行的每个应用程序具有相同的“主机ID” – 每个“主机ID”在所有主机中是唯一的
由于主机可以是物理机,虚拟机甚至docker实例,我不认为我可以使用主机名作为“全球唯一ID”。
由于主机可以在不同的本地networking,我不认为我可以使用本地IP地址作为“全球唯一ID”。
那么,我可以使用哪些数据? 也许networking适配器的MAC地址? 它是否保证是唯一的,即使在同一个docker的多个实例之间?
谢谢。
在现代/最近的Linux发行版中,linux在第一次创建系统时为您在/etc/machine-id
文件中生成一个唯一的ID。 某些分布式服务(如etcd
依靠此文件来识别群集中的计算机。
没有什么能够阻止你在磁盘上创建和保存类似uuid的东西。 你可以在Linux上使用uuidgen
命令。
你可以说MAC地址是唯一的。 但是,如果您担心安全问题,请不要使用MAC地址。 MAC地址很容易被欺骗。
要为机器生成一个唯一的ID,可以使用许多项目的组合,例如MAC地址,IP地址,主机名等,随机输入一个盐,并对其进行sha256散列。 由于主机可以在很多操作系统上运行,所以我建议不要使用任何特定于操作系统的参数。
没有太多的细节,在沙256中发现碰撞的可能性是不大可能的。
你可以在这里看到不同文本的SHA256。 http://www.xorbin.com/tools/sha256-hash-calculator
现在几乎所有的编程语言都有一个用于创建SHA256哈希的函数/ API。
看起来像/var/lib/dbus/machine-id
包含你所需要的。
在这里阅读更多: http : //man7.org/linux/man-pages/man5/machine-id.5.html