Pergunta

Estou construindo uma aplicação com vários servidores envolvidos. (4 servidores em que cada um tem uma base de dados e um servidor da web. Uma base de dados mestre e 3 escravos + um equilibrador de carga)

Há vários abordagem para habilitar o cache. Agora é bastante simples e não é eficiente em tudo. Todo o cache é feito em um compartilhamento NFS partição entre todos os servidores. NFS é o gargalo na arquitetura.

  1. Eu tenho implementar várias idéias caching. Isso pode ser feito em um servidor nível (sistema de arquivos local), mas o problema é invalidar um cache arquivo quando o conteúdo foi atualização em todos os servidores: Pode ser feito por ter um pequeno esconderijo tempo de vida (não eficiente porque o cache será atualização mais cedo que deve ser na maioria das vezes)
  2. Pode também ser feito por um messaging SYTEM (XMPP por exemplo), onde cada servidor se comunicam uns com os outros. O servidor responsável pela invalidação do cache de enviar um pedido a todos os outros para que eles sabe que o cache tem sido invalidados. Latência é provavelmente maior (levar mais tempo para todos saber que o cache tem sido invalidado), mas minha aplicação não necessita de cache atômica invalidação.
  3. Third abordagem é usar uma nuvem sistema para armazenar o cache (como CouchDB), mas não tenho idéia do desempenho para este. É isso mais rápido do que usando um banco de dados SQL?

Eu planejava usar Zend Framework, mas eu não acho que é realmente relevante (exceto que algum pacote provavelmente existe em outro quadro para lidar com XMPP, CouchDB)

Requisitos de cache persistente (se a reinicialização do servidor, o cache não deve ser perdida para evitar derrubar o servidor enquanto re-criar o cache)

Foi útil?

Solução 2

Acho que encontrei um relativamente boa solução.

Eu uso Zend_Cache para armazenar localmente cada arquivo cache. Eu criei um pequeno daemon baseado em nanoserver que gerenciar arquivos de cache localmente também. Quando um servidor criar / modificar / excluir um arquivo de cache localmente, ele enviar a mesma ação para todos os servidores através do daemon que fazer a mesma ação.

Isso significa que eu tenho arquivos de cache locais e ações remotas ao mesmo tempo. Provavelmente não é perfeito, mas deve funcionar para agora. CouchDB foi muito lento e NFS não é suficiente confiável.

Outras dicas

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

tampas Memcached a maioria das exigências que você colocar para fora - leia baseada em mensagens, cometer e invalidação. Alta disponibilidade e alta velocidade, mas a confiabilidade muito pouco atômica (sacrificado por desempenho).

(Além disso, poderes memcached coisas como YouTube, Wikipedia, Facebook, então eu acho que pode ser bastante bem estabelecido que as organizações com o tempo, dinheiro e talento a sério avaliar muitas opções de cache distribuídos resolver com memcached!)

Editar (em resposta ao comentário) A idéia de um cache é para que seja relativamente transitória em relação ao seu armazenamento de backup. Se você precisa para manter o cache de dados a longo prazo, eu recomendo a olhar para qualquer um (a) desnormalizar sua camada de dados para obter mais desempenho, ou (b) adição de um servidor de banco de dados de camada intermediária que armazena dados high-volume na chave- reta mesas valor de par, ou algo que se aproxima muito disso.

Em defesa do memcached como um armazenamento de cache, se você quiser alta peformance com baixo impacto de uma reinicialização do servidor, porque não basta ter 4 servidores memcached? Ou 8? Cada 'reinicialização' teria correspondentemente menos efeito no servidor de banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top