为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨__羊羊 2021-10-04 17:36:51
考虑这种情况。在负载平衡的环境中,我有 3 个独立的 CMS 实例在 3 个不同的物理服务器上运行。这 3 个独立运行的应用程序实例共享同一个数据库。在每台服务器上,CMS 都有一个 /media 文件夹,所有媒体子文件夹和文件都位于该文件夹中。我的问题是我如何在 Golang 中实现/编码文件复制服务/功能,因此当在其中一台服务器上添加/更改/删除子文件夹或文件时,它将在所有其他服务器上被复制/复制/删除?我需要查看哪些软件包,或者您是否有一个小代码片段来帮助我入门?那将是真棒。编辑:这个问题已被标记为“重复”,但事实并非如此。然而,它是设置共享网络文件系统的替代方法。我认为在所有服务器上保留相同文件的副本,同步并保持更新可能比共享它们更好。
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

你可能不应该这样做。使用分布式文件系统、对象存储(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这样的库。每个节点的本地元数据可以是它的版本。


无论哪种方式,文件上传到单个服务器和所有服务器都可用之间都会有一定的延迟。处理好是困难的,这就是为什么你可能不应该这样做。


查看完整回答
反对 回复 2021-10-04
  • 1 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信