我不是任何网络或 devops 人员,但我必须为我的公司做这件事,因为我的公司负担不起,所以请原谅我的错误。
我有一个Web 应用程序主办谷歌云和我使用负载均衡器由 Google Cloud 提供,位于后端我有 2 个实例对于 Web 应用程序。问题是我使用的是文件缓存,而两个服务器的缓存是分开的。它不是 HTTP 缓存或其他东西,而是来自 Web 应用程序的后端缓存,而不是 nginx。
我的服务器正在运行 Ubuntu 16.04 LTS。
我如何保留一个通用的文件缓存服务器?我想保留第三个服务器用于文件缓存,以便缓存对两个实例都是通用的,为此我考虑使用 NFS,使用 NFS 进行文件缓存是个好主意吗?
我在互联网上进行了大量研究并了解到 NFS。
答案1
为所有实例使用一个公共文件服务器是一个有问题的想法,因为它可能成为瓶颈和单点故障。这样一来,它最终可能会违背使用负载平衡器的初衷。
为了推荐解决方案,您需要对您的系统架构有更多了解。我可以提供一些建议,这些建议可能有效,也可能无效,具体取决于您的架构。
- 确保即使缓存虚拟机没有响应,您的实例也可以响应所有请求。如果缓存只是为了提高性能,那么实例可能无需依赖缓存即可响应 - 只是效率不高。
- 对缓存进行分片。如果您可以计算被缓存资源的身份哈希值,并使用该哈希值在多个缓存虚拟机之间进行选择,那么您的设计将更具可扩展性。并且通过使用相同的哈希值,您仍然可以从 LB 后端访问其他实例缓存的结果中受益。
- 也在 LB 后端缓存。即使您有共享缓存,在 LB 后端缓存也是一个好主意。它可以防止缓存虚拟机出现热点,并在其中一个缓存虚拟机不可用时使您的服务更具弹性。
您选择的协议应取决于您能否满足上述要求。我不认为 NFS 是最佳选择,因为当其中一个 NFS 服务器没有响应时,应用层很难实现超时。而且,一个 NFS 服务器没有响应可能会导致多个 LB 后端出现故障,这是我宁愿避免的风险。
客户端(在 LB 后端上运行)以用户模式实现的协议可能是更好的选择,因为任何因缓存服务器无响应而导致的线程卡住都更有可能被遏制。当以用户模式实现时,在访问缓存虚拟机时实现超时会更简单。