我计划将我的小型共享托管环境迁移到 Amazon EC2。它需要一个用于存储 Web 内容的中央存储(暂时将数据库等放在一边),以便我可以同时执行以下两项操作:在多个 http 节点之间平衡网站的负载和/或将网站从一个节点移动到另一个节点,而无需实际移动任何数据。
目前,我的存储位于 NFS 服务器上,该服务器通过 pacemaker/heartbeat/drbd 实现高可用性。据我所知,您无法在 EC2 中使用虚拟 IP,因此大多数 HA 解决方案都失败了。剩下的是 GlusterFS(和 Ceph,但他们自己声明不在生产中使用它)。所以我将设置两个 GlusterFS 节点,每个节点位于单独的可用区域中,每个节点都安装多个 EBS 卷(mdadm raid 10 以提高性能和安全性)并相互复制。每个客户端都会知道两个导出器节点,如果其中一个发生故障,存储本身仍将正常运行。
到目前为止一切顺利(或者不好?)。现在问题来了:根据我对 GlusterFS 的理解,访问控制是基于卷的 hosts.allow/.deny 列表。为了减少损坏的 HTTP 节点的影响,我想将每个节点对存储的访问限制在他实际服务的网站的 webroot 上。
让我通过我当前的 NFSv4 + mount-bind 设置示例来澄清这一点:
在 httpnode1 上
这些是他服务的网站
* domain1.tld
* domain5.tld
* domain10.tld
/etc/fstab 中的 nfs 导出
10.0.0.1:/ /srv/web nfs4 rw,..
在 NFS 导出器上
结构
* /srv/storage << here are all websites
* /srv/export/httpnode1/ << webroots for httpnode1
* /srv/export/httpnode1/domain1.tld/ << mount-bind of /srv/storage/domain1.tld/
* /srv/export/httpnode1/domain5.tld/ << mount-bind of /srv/storage/domain5.tld/
* /srv/export/httpnode1/domain10.tld/ << mount-bind of /srv/storage/domain10.tld/
* /srv/export/httpnode2/ << webroots for httpnode2
* /srv/export/httpnode2/domain31.tld/ << mount-bind of /srv/storage/domain3.tld/
* /srv/export/httpnode2/domain5.tld/ << mount-bind of /srv/storage/domain5.tld/
/etc/exports
# httpnode1
/srv/export/httpnode1 10.0.0.123(rw,..,fsid=0,crossmnt)
/srv/export/httpnode1/domain1.tld 10.0.0.123(rw,..)
/srv/export/httpnode1/domain5.tld 10.0.0.123(rw,..)
/srv/export/httpnode1/domain10.tld 10.0.0.123(rw,..)
# httpnode2
/srv/export/httpnode2 10.0.0.192(rw,..,fsid=0,crossmnt)
/srv/export/httpnode2/domain3.tld 10.0.0.192(rw,..)
/srv/export/httpnode1/domain5.tld 10.0.0.123(rw,..)
到目前为止,我能想到的只有一个解决方案,即 EC2 + EBS + GlusterFS 从 GlusterFS 导出多个卷:每个 HTTP 节点一个。
有没有人有这方面的经验(例如几百个导出卷中的资源需求)以及如何查看您的配置?或者更好的是:有没有什么优雅的方法来实现我的目标?
谢谢您的见解!
问候 Joerg
答案1
我在 EC2 上使用 gluster 的经历并不出色。我看到了巨大的性能问题,最终完全放弃了 gluster。简而言之……如果节点之间有 1-2 毫秒的延迟……gluster 将遭受成倍的损失。这是一个相当小的设置,其中只有 2 个节点。我真不想看看你是否有更多的节点或份额。
我的解决方案是切换到 unison 并在实例之间进行复制...但我可以诚实地理解,这对于许多情况来说可能并不理想。
作为替代解决方案,您是否考虑过使用 s3 bucket 和 s3fs?它们可以在节点之间轻松共享。