猿问

跨多个服务器的 Golang 文件和文件夹复制/镜像

考虑这种情况。在负载平衡的环境中,我有 3 个独立的 CMS 实例在 3 个不同的物理服务器上运行。这 3 个独立运行的应用程序实例共享同一个数据库。

在每台服务器上,CMS 都有一个 /media 文件夹,所有媒体子文件夹和文件都位于该文件夹中。我的问题是我如何在 Golang 中实现/编码文件复制服务/功能,因此当在其中一台服务器上添加/更改/删除子文件夹或文件时,它将在所有其他服务器上被复制/复制/删除?

我需要查看哪些软件包,或者您是否有一个小代码片段来帮助我入门?那将是真棒。

编辑:这个问题已被标记为“重复”,但事实并非如此。然而,它是设置共享网络文件系统的替代方法。我认为在所有服务器上保留相同文件的副本,同步并保持更新可能比共享它们更好。


杨__羊羊
浏览 266回答 1
1回答

婷婷同学_

你可能不应该这样做。使用分布式文件系统、对象存储(ala S3 或 GCS)或像 btsync 或 syncthing 这样的同步程序。如果你仍然想自己做这件事,那将是具有挑战性的。您基本上是在构建一个分布式数据库,而且很难做到正确。乍一看,您可以检查etcd或raft 之类的东西,但不幸的是,etcd 不能很好地处理大文件。您还可以在上传时使用ssh将文件复制到其他所有服务器。但是当服务器宕机时会发生什么?或者当两个人同时更新同一个文件时会发生什么?也许您可以将其设计为每个文件都有一个唯一的 ID(可能基于其内容的哈希值,以便您可以安全地进行重复数据删除)并且这些文件永远不会被更新或删除,只能添加。这将解决同时更新问题,但您仍然会遇到停机问题。一种方法是让每个服务器在添加文件时维护仅附加版本日志:VERSION | FILE HASH      1 |   abcd123      2 |   efgh456      3 |   ijkl789有了它,您可以从服务器中提取每个文件,并且一个数字就足以知道何时添加文件。(例如,如果您认为服务器 A 使用的是第 5 版,并且您被告知它现在使用的是第 7 版,则您知道需要同步 2 个文件)您可以使用数据库表执行此操作:ID | LOCAL_SERVER_ID | REMOTE_SERVER_ID | VERSION | FILE HASH您可以定期轮询并通过机器之间的 ssh 或 http 进行同步。如果服务器出现故障,您可以重试直到它正常工作。或者,如果您不想为此使用集中式数据库,则可以使用像memberlist这样的库。每个节点的本地元数据可以是它的版本。无论哪种方式,文件上传到单个服务器和所有服务器都可用之间都会有一定的延迟。处理好是困难的,这就是为什么你可能不应该这样做。
随时随地看视频慕课网APP

相关分类

Go
我要回答