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这样的库。每个节点的本地元数据可以是它的版本。
无论哪种方式,文件上传到单个服务器和所有服务器都可用之间都会有一定的延迟。处理好是困难的,这就是为什么你可能不应该这样做。
- 1 回答
- 0 关注
- 265 浏览
添加回答
举报