0

我正在构建一个涉及多个服务器的应用程序。(4台服务器,每台都有一个数据库和一个网络服务器。1个主数据库和3个从属服务器+一个负载均衡器)

有几种方法可以启用缓存。现在它相当简单而且根本没有效率。所有缓存都在所有服务器之间的 NFS 分区共享上完成。NFS 是架构中的瓶颈。

  1. 我有几个想法实现缓存。它可以在服务器级别(本地文件系统)上完成,但问题是当所有服务器上的内容已更新时使缓存文件无效:它可以通过具有小的缓存寿命来完成(效率不高,因为缓存将尽快刷新,应该是大部分时间)
  2. 它也可以通过消息传递系统(例如 XMPP)来完成,其中每个服务器相互通信。负责缓存失效的服务器向所有其他服务器发送请求,让他们知道缓存已失效。延迟可能更大(每个人都需要更多时间才能知道缓存已失效),但我的应用程序不需要原子缓存失效。
  3. 第三种方法是使用云系统来存储缓存(如 CouchDB),但我不知道这个的性能。它比使用 SQL 数据库更快吗?

我计划使用 Zend Framework,但我认为它并不相关(除了其他框架中可能存在一些包来处理 XMPP、CouchDB)

要求:持久缓存(如果服务器重新启动,缓存不应丢失,以避免在重新创建缓存时关闭服务器)

4

3 回答 3

5

http://www.danga.com/memcached/

Memcached 涵盖了您提出的大部分需求——基于消息的读取、提交和失效。高可用性和高速度,但原子可靠性非常低(牺牲性能)。

(此外,memcached 为 YouTube、Wikipedia、Facebook 之类的东西提供支持,所以我认为,有时间、金钱和才能认真评估许多分布式缓存选项的组织可以选择 memcached!)

编辑(回应评论) 缓存的想法是与您的后备存储相比,它是相对短暂的。如果您需要长期保留缓存数据,我建议您查看 (a) 非规范化数据层以获得更高的性能,或者 (b) 添加一个中间层数据库服务器,以直接键存储大量数据 -值对表,或与之接近的东西。

于 2009-01-28T02:47:34.820 回答
2

为了保护 memcached 作为缓存存储,如果您想要高性能且服务器重启影响低,为什么不只拥有 4 个 memcached 服务器呢?还是8?每次“重新启动”对数据库服务器的影响都会相应减少。

于 2009-07-24T11:50:10.600 回答
1

我想我找到了一个比较好的解决方案。

我使用 Zend_Cache 在本地存储每个缓存文件。我创建了一个基于 nanoserver 的小型守护进程,它也在本地管理缓存文件。当一台服务器在本地创建/修改/删除缓存文件时,它会通过执行相同操作的守护进程向所有服务器发送相同的操作。

这意味着我同时拥有本地缓存​​文件和远程操作。可能并不完美,但现在应该可以工作。CouchDB 太慢,NFS 不够可靠。

于 2009-02-05T10:40:05.090 回答