【发布时间】:2023-04-06 22:47:01
【问题描述】:
我正在开发用户需要上传照片和图像的应用程序(使用 Go 或可能使用 PHP)。
我已经在不同的位置设置了几个 ZFS(镜像)存储服务器,但我对如何让用户最好地上传文件感到怀疑。 ZFS 处理配额和预留。
我在所有服务器上运行一个复制的 Galera 数据库,这既是为了安全,也是为了方便地从每台服务器访问用户帐户。换句话说,每台服务器始终拥有数据库的本地副本。所有用户都是仅限的虚拟用户。
到目前为止,我已经测试了以下设置选项:
解决方案 1
在具有虚拟用户的存储服务器上运行 SFTP(带模块的 ProFTPD)或 FTPS(带 TLS 的纯 FTP)。
这使人们可以使用 Filezilla 等客户端直接访问存储服务器。同时,用户还可以使用我们的 Web GUI 从我们的主网络服务器上传。
此设置的一个优点是 FTP 服务器可以处理虚拟用户。我们的 Web 应用程序还将通过 SFTP 或 FTPS 发送文件。
一个缺点是 FTP 很简单,对防火墙很烦。我也更喜欢 FTP over SSH (SFTP),而不是 FTP over TLS (FTPS)。但是,只有 ProFTPD 有 SSH 模块,但与 PureFTPd 相比,使用起来确实很痛苦(许多问题与非工作配置选项和文件权限错误),但 PureFTPd 仅支持 TLS。
使用真实的 SSH/SCP 帐户运行并使用 PAM 不是一种选择。
解决方案 2
使用 NFS 或 CIFS 在 Web 服务器上本地安装存储服务器(Samba 非常适合自动恢复,以防机器出现故障)。
在此设置中,用户可以仅通过我们的主网络服务器上传。 Web 服务器应用程序以及在存储服务器上运行的应用程序需要支持可恢复上传。我一直在研究使用 tus 协议。
上述两种设置的一个缺点是需要以某种方式管理存储容量。当存储服务器 1 达到其最大用户数时,应用程序需要知道这一点,然后才为存储服务器 2、3 等创建虚拟用户。
我已经计算出每个存储服务器可以容纳多少用户,然后让 Web 应用程序使用虚拟用户检查数据库,以查看何时需要将新创建的用户移动到下一个存储服务器。
这是相当古老的学校,但它确实有效。
解决方案 3
与解决方案 2 相同(无 FTP),但克隆我们的 Web 应用程序将内容上传到每个存储服务器,然后重定向用户(或为他们提供存储服务器的物理链接,s1.example.com,s2.example。 com等)
这种设置的可能优势是用户可以直接上传到他们分配到的存储服务器,而不是通过我们的主网络服务器(防止它成为可能的瓶颈)。
解决方案 4
在存储服务器上使用 GlusterFS,构建易于扩展的集群。我已经对 GlusterFS 进行了测试,它非常适合此目的。
这种设置的优点是我不需要关心文件在哪些存储服务器上的物理位置,而且我可以通过向集群添加更多服务器来轻松扩展存储。
但是,这里的缺点是我们的主 Web 服务器可能会成为瓶颈。
我也考虑过添加一个负载均衡器,然后使用多个 Web 服务器,以防我们的主 Web 服务器成为上传文件的瓶颈。
无论如何,我更喜欢保持简单!我不喜欢添加东西。从长远来看,我希望它易于维护。
我们将不胜感激任何想法、建议和意见。
你是怎么做到的?
【问题讨论】:
-
我能做些什么来改善我的答案吗?
标签: php go data-storage zfs