Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tiago Souza Ribeiro

Espelhamento de site

Recommended Posts

Olá, a fins de curiosidade, incremento de conhecimento, e possível uso futuro, estou com uma dúvida:

Suponhamos que eu queira ter o mesmo site hospedado em servidores diferentes, um aqui no Brasil, e outro nos EUA, para garantir rápido acesso a qualquer usuário das duas regiões. Eu faria uma detecção por geoip para saber a origem do acesso, e redirecionaria o usuário ao servidor mais próximo. Porém, os servidores deverão ter o mesmo conteúdo, claro.

 

- Haveria alguma forma de manter uma sincronização entre ambos, preferencialmente, apenas quando houvessem alterações, e na sincronização, apenas o que tem de diferente sendo transferido?

- E o banco de dados (MySQL) pode ser de alguma forma sincronizado, ou seria melhor um terceiro servidor, provavelmente na Europa, para rápido acesso tanto pelo servidor brasileiro quanto o estadunidense?

 

Eu encontrei scripts para mirror de sites pela internet, mas pelo que percebi, ele vai sincronizar apenas html, imagens, etc... nada de php, então seria necessário que os servidores tivessem acesso total aos arquivos entre si provavelmente por FTP, e para ter um nível básico de segurança nisso, todo tráfego seria por VPN's com criptografia entre os mesmos. Há algum problema em fazer isso?

 

Espero não ter postado na área errada, fiquei em dúvida se o certo seria em alguma área de redes e servidores ou aqui na de PHP, já que imagino que a solução para isso envolveria um script ou algum serviço rodando nos servidores.

 

Até mais ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu nunca precisei disso mais eu te faço uma pergunta, será que vale a pena ter um mirror?

 

afinal o site principal terá o conteúdo "original" e quando for redirecionado para o outro server ele vai executar um script qual não esta no seu servidor tomando tempo, talvez esse tempo necessário para carregar o mirror não seria o tempo para acessar o site com o server dos EUA aqui do Brasil ou vice-versa?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas suponhamos que nos servidores também estejam arquivos para download (e também as imagens!), há grande diferença na velocidade de download desses arquivos, assim como acho que ocorre com css e javascript, ao menos no primeiro acesso, já que são "cacheados".

 

Ah, lendo de novo seu post, acho que você entendeu errado, eu acho... não é pra fazer a sincronização quando a pessoa acessar o servidor, a sincronização deve ser feita automaticamente quando detectar alterações em algum dos servidores, mais ou menos como um realtime, um daemon rodando no servidor provavelmente com cURL. Ah, e não há servidor com conteúdo original, em qualquer um deles podem haver modificações no conteúdo pelos usuários, como comentários, atualizações de perfil, upload de arquivos...

E para não consumir muita banda dos servidores (deixando o fornecimento de dados lento), além de ter uma conexão de boa velocidade, claro, o que é normal em qualquer cloud ou dedicado, nada que um bom roteamento não resolva :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu creio ter entendido, mais o que digo é sobre os arquivos do site por que o apesar de 2 servidores o banco de dados é 1 só então independente de que servidor receber alteração vai para DB assim sincronizando já mais pelo que entendi o que quer fazer é colocar os arquivos em 1 servidor e no outro ele pegar esse arquivo através de algum script certo? se for isso pense na minha pergunta e leve em consideração.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, por uma falha na minha memória aqui, esqueci que não preciso da sincronização dos bancos de dados, apenas configurar os dois servidores para usar no site o db do terceiro servidor. Ao invés de melhorar, estava querendo é piorar tudo, kk.

Sobre os arquivos, é assim:

 

Suponhamos que alguém faça upload de um novo arquivo para o servidor dos EUA. Automaticamente o servidor do Brasil faz o download do arquivo e o coloca no mesmo local que estava no outro. O mesmo ocorre inversamente.

 

E no site ocorre praticamente o mesmo, não no conteúdo, já que o mesmo vai estar no db do servidor da Europa, mas caso eu altere algo em algum aquivo .php, crie um arquivo a mais, modifique algum detalhe do layout, css, javascript... Sei que eu poderia apenas fazer upload do arquivo para os outros servidores, mas caso eu seja o dono do site, e apenas eu tenha acesso aos servidores, e algum outro administrador modifique algo já citado anteriormente pelo painel... como faz? Seria melhor a sincronização ou tem alguma forma (alguma função "fopen e assimilares funcionam em arquivos remotos?") de através do próprio painel ser feito o upload ou do arquivo modificado para o outro servidor ou mesmo alterar o arquivo em ambos servidores? E no caso de arquivos .php, como isso seria possível, como poderia editar "remotamente" os scripts?

 

Ah, outra coisa aqui, meio relacionado ao assunto: teria alguma forma de quando alguém acessar o site, todos dados do banco de dados que serão usados serem baixados do servidor remoto para o servidor em uso e mais ou menos "cacheados" para serem usados posteriormente, sem ter que fazer queries para o outro servidor durante a navegação? Ou então automaticamente fazer esse cache quando houver alterações no db, deixando o cache pronto para qualquer usuário. Aí volta mais ou menos para a ideia inicial, mas é a única que tive até agora que mantém a velocidade de acesso aos dados sem problemas, já que podem haver delays entre o servidor EUA ou Brasil, e o servidor do banco de dados na Europa...

Compartilhar este post


Link para o post
Compartilhar em outros sites

se houver uma real demanda para montar espelhamento do FS e mesmo do SGDB, então faça o espelhamento.

o nome técnico para isso é "mirror".

 

 

pesquise por

 

mirroring servers

server mirroring

loadbalance

cluster (banco de dados)

 

obs: não é com php que resolverá isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hm... por isso fiquei em dúvida se postava na área de redes e servidores, kkkk.

Só uma pergunta, não encontrei isso pesquisando (quase tudo relacionado a rsync e inglês, não gosto de pesquisar em en): o rsync faz a sincronização apenas quando há alterações e transfere apenas o que foi modificado, certo?

 

Obs: se algum moderador achar que é mais conveniente que esse tópico seja movido para área de redes e servidores, que o faça ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim a sincronização é dada a partir do momento que existe alteração em arquivos porem a mesma não ocorre com bancos de dados sendo assim deve ser habilitado replicação nos bancos..

 

 

As documentações para isto são em inglês normalmente caso não queira ou goste de pesquisar nesta linguagem pode contratar um consultor para fazer para você

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até que me dou bem com inglês, só não gosto quando encontro artigos apenas nesse idioma, nada em português.

 

 

Sobre banco de dados, para evitar consumos desnecessários, acho que seria melhor deixá-lo apenas no servidor da Europa (como no exemplo), onde pode ser facilmente acessado tanto pelo servidor dos EUA e Brasil (exemplo).

Só que eu estava querendo fazer alguma forma de cache para não ter problemas com delay's durante a navegação, tipo baixar do servidor de banco de dados todos dados que serão exibidos, como artigos, comentários, essas coisas de uma das seguintes formas:

- Sempre que algum usuário acessasse o site esse cache seria feito e usado enquanto o usuário permanecesse navegando.

- Ou no mesmo esquema do rsync, fazer cache do db automaticamente sempre que houver alterações.

Porém eu não estava querendo rodar um servidor mysql em cada dedicado, estava querendo um cache em arquivos ou na memória (caso o dedicado tenha muita), já que só comentários, artigos... virão, nenhuma informação que possa prejudicar caso seja descoberta.

 

Obs, como citei no começo do tópico, não estou implantando isso em lugar algum, é apenas "a fins de curiosidade, incremento de conhecimento, e possível uso futuro". (curiosidade, porque gosto de programação e redes, e fazer algo que os integre seria bem interessante :D)

Compartilhar este post


Link para o post
Compartilhar em outros sites

utilizei isto em sistemas bancarios por isto resolvi tentar te ajudar heheheh

 

Hehe, acho que eu poderia trabalhar nessa área também ^^

Gosto de ficar elaborando estratégias de segurança envolvendo redes e programação *-*

 

Vou ir pesquisando sobre o cache do db...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehe, acho que eu poderia trabalhar nessa área também ^^

Gosto de ficar elaborando estratégias de segurança envolvendo redes e programação *-*

 

Vou ir pesquisando sobre o cache do db...

 

Aqui tem uma estratégia curiosa: http://torrentfreak.com/twitter-uses-bittorrent-for-server-deployment-100210/

 

Sobre caching de DB: A maioria dos SGDB's modernos implementa, no mínimo, uma técnica de post-query-caching. A grosso modo, a última consulta fica em cache e mantém-se uma flag de dados modificados como falsa. Se a mesma query for solicitada enquanto dados modificados for falsa, a resposta é instantânea, independente da quantidade de dados ou relacionamentos que a consulta leve. Obviamente que isso é uma explicação simples e imprecisa. Mais detalhes devem ser observados de acordo com cada SGDB utilizado.

 

Você também pode optar por criar views, prepared-statements ou implementar o seu próprio sistema de query caching. Tudo depende da arquitetura utilizada.

 

Para espelhamento, existem diversas técnicas, da mais simpes à mais robusta.

 

Dentre as alternativas simples, estaria montar um sistema sshfs com links simbólicos físicos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se o que quero fazer é mesmo um cache. É como se fosse uma cópia temporária (ou não) de alguns dados do banco de dados para o próprio servidor, em arquivos ou na memória (se possível), assim quando o usuário fosse acessar um artigo por exemplo, estaria acessando a cópia dele em arquivos no servidor, e não precisaria de fazer queries para o outro servidor, transferir os dados para então mostrar, tendo o risco de ocorrer algum delay na rede e atrasar o carregamento do site.

post-query-caching não seria eficaz, já que seria necessário fazer queries obtendo todos artigos, comentários e etc para manter em cache, já que nunca se sabe o que o usuário vai acessar.

 

Olhei o link pro site da Zend aí, o que estou pretendendo fazer até agora é mais ou menos aquilo lá, só que com outros métodos. Ficou muito bagunçado o resultado deles lá, eu não entendi nada, melhor fazer do meu próprio jeito :) Seria melhor se houvesse uma forma de armazenar na memória do servidor (memória cache do Linux) para o acesso ser mais rápido.

 

Sobre o espelhamento com sshfs: acho que vai piorar tudo, já que o usuário vai estar acessando um servidor, que estará buscando os dados em outro. É delay em dobro '-'

 

----- Edit: sobre o método da Zend, não tinha lido tudo, kkk, nem percebi o unserialize. Parece legal, porém vi falar que serialize é lento '-'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se o que quero fazer é mesmo um cache. É como se fosse uma cópia temporária (ou não) de alguns dados do banco de dados para o próprio servidor, em arquivos ou na memória (se possível), assim quando o usuário fosse acessar um artigo por exemplo, estaria acessando a cópia dele em arquivos no servidor, e não precisaria de fazer queries para o outro servidor, transferir os dados para então mostrar, tendo o risco de ocorrer algum delay na rede e atrasar o carregamento do site.

 

Sim, é um cache.

 

Alternative PHP Cache

APC

 

Memcached

http://memcached.org/

Exemplo:

http://blog.thiagobelem.net/otimizando-consultas-mysql-com-o-memcached/

 

Uma solução adotada por CMS's como WordPress e Magento é a criação da Markup estática, completa do artigo/produto. Quando você acessa determinada página, não há conexão, consulta, acesso, nada ao banco, apenas a resposta de um arquivo HTML servido imediatamente, como as imagens, arquivos JS, CSS e todo o resto.

 

post-query-caching não seria eficaz, já que seria necessário fazer queries obtendo todos artigos, comentários e etc para manter em cache, já que nunca se sabe o que o usuário vai acessar.

 

Não é uma opção, se o SGDB tem essa funcionalidade ele vai fazer. Ponto.

 

Olhei o link pro site da Zend aí, o que estou pretendendo fazer até agora é mais ou menos aquilo lá, só que com outros métodos. Ficou muito bagunçado o resultado deles lá, eu não entendi nada, melhor fazer do meu próprio jeito :) Seria melhor se houvesse uma forma de armazenar na memória do servidor (memória cache do Linux) para o acesso ser mais rápido.

 

Não tenho muita certeza - correções são bem vindas - mas, SO não faz cache, faz swap. O uso de swap na maioria das vezes é o gargalo do DB. Ao invés de melhorar você vai piorar a situação.

 

Sobre o espelhamento com sshfs: acho que vai piorar tudo, já que o usuário vai estar acessando um servidor, que estará buscando os dados em outro. É delay em dobro '-'

 

Apenas para fins de sincronização. Pense comigo, se A faz sshfs com B e B faz sshfs com A, temos uma referência cíclica. É suicídio, haja banda!

 

----- Edit: sobre o método da Zend, não tinha lido tudo, kkk, nem percebi o unserialize. Parece legal, porém vi falar que serialize é lento '-'

 

Depende do ponto de vista. Uma série de fatores que podem tornar uma (des)serialização lenta incluem, mas não se limitam a, tamanho, tipo e origem dos dados, capacidade de processamento, carga de processos, quantidade de memória, versão e configuração na compilação do PHP, por aí vai...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se estamos falando em você alterar arquivos (.php por exemplo) e fazer o upload em um servidor, porque você não usa um sistema de versionamento distribuído (git) e coloca os dois servidores como CLIENT consultando um serviço em cloud (github), fazendo a atualização de tempos em tempos (a cada 10s, por exemplo) via cron?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Sim, é um cache.

 

Memcached

http://memcached.org/

Eu havia lido sobre memcached um tempo atrás mas havia esquecido dele. Por enquanto estou com ele como solução para o cache. Eu li um pouco aqui sobre ele, mas não vi falar sobre ele refazer o cache quando detectar alterações, apenas refazer a cada tempo pré-definido. Teria alguma solução pra isso? Teria como também, ele não refazer todo cache, apenas adicionar o que foi alterado?

 

Uma solução adotada por CMS's como WordPress e Magento é a criação da Markup estática, completa do artigo/produto. Quando você acessa determinada página, não há conexão, consulta, acesso, nada ao banco, apenas a resposta de um arquivo HTML servido imediatamente, como as imagens, arquivos JS, CSS e todo o resto.

Ah, +/- assim: quando se cria uma nova postagem por exemplo, ele cria uma página estática contendo apenas o template e o conteúdo?

 

Não é uma opção, se o SGDB tem essa funcionalidade ele vai fazer. Ponto.

Eu sei, mas o que quis dizer é que isso não é suficiente.

 

Não tenho muita certeza - correções são bem vindas - mas, SO não faz cache, faz swap. O uso de swap na maioria das vezes é o gargalo do DB. Ao invés de melhorar você vai piorar a situação.

Ué. Sempre que uso Linux, há um grande uso da memória RAM para cache (nunca ouve uso sequer de 1mb da swap aqui). Era o mesmo tipo de cache que pretendo fazer, mas parece que é isso mesmo que o memcached faz :D

 

Depende do ponto de vista. Uma série de fatores que podem tornar uma (des)serialização lenta incluem, mas não se limitam a, tamanho, tipo e origem dos dados, capacidade de processamento, carga de processos, quantidade de memória, versão e configuração na compilação do PHP, por aí vai...

Não tenho certeza, mas acho que artigos são grandes o suficiente para causar lentidão do serialize. Mas tanto faz, não pretendo mais usar ele mesmo.

 

Se estamos falando em você alterar arquivos (.php por exemplo) e fazer o upload em um servidor, porque você não usa um sistema de versionamento distribuído (git) e coloca os dois servidores como CLIENT consultando um serviço em cloud (github), fazendo a atualização de tempos em tempos (a cada 10s, por exemplo) via cron?

Mas e o uso de banda? Além disso, acho que nesse caso, vou fazer como disse nos posts anteriores: ao editar algum arquivo pelo painel, automaticamente ele substitui ou altera o arquivo nos outros servidores.

 

Obrigado a todos por responder :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Tiago

Suas respostas podem estar na Cloud Computing (procure por AWS ou Amazon EC2 e seus serviços).

 

@Evandro

Sistema operacionais fazem cache.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.