Como dimensionar os dados do OpenStreetMap com eficiência


9

Há mais de um ano, eu estou executando um servidor PostGIS interno preenchido com dados OSM, usado para geração de blocos baseada em Mapnik e geocodificação baseada em Nominatim, atualizado com réplicas diárias. Isso funciona muito bem.

No entanto, como o uso está crescendo exponencialmente, eu gostaria de obter melhor confiabilidade e desempenho adicionando servidores PostgreSQL adicionais. E eu estou meio que perdido.

Como o PostgreSQL não parece lidar com a replicação por si só, eu pensaria em usar um punhado de middleware como o PgPool-II para manter os servidores sincronizados. Mas receio que isso não seja necessário para esse uso: taxa de leitura / gravação muito alta, onde todas as gravações são feitas no mesmo horário todos os dias.

Minhas perguntas são simples: o que você faria para manter esses servidores sincronizados? E o que é feito para isso na OpenStreetMap Foundation, MapQuest, Mapbox ou CloudMade?

Obrigado.

Respostas:


13

Em primeiro lugar, o Postgres 9 e versões posteriores têm suporte embutido à replicação e é isso que nós (a equipe de operações do OpenStreetMap) esperamos ver usando agora que estamos (há cerca de 90 minutos) em execução no Postgres 9.1 para o banco de dados principal.

Para responder à sua pergunta sobre o que o OSM faz, até o momento não fazemos nenhum tipo de replicação - existe um grande banco de dados do Postgres atuando como o banco de dados principal por trás do site e mantendo os dados brutos. Existem então bancos de dados secundários do Postgres + Postgis para renderização e geocodificação, os quais são preenchidos usando os dumps e diffs do planeta para atualização.


Não sabia sobre a replicação interna do Postgres. Isso provavelmente fará o trabalho. Obrigado!
314 Pierre

1
Verifique também o REPMGR ( repmgr.org ), que usa os recursos de replicação de streaming do Postgres e estende a funcionalidade para permitir a substituição automática de um escravo de um mestre.
Shyam Sundar CS

4

Eu posso ver duas opções aqui:

  1. Pool de banco de dados - replicação http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling , eu faria o cluster do PG, pois é síncrono e permite o balanceamento de carga. Você também pode usar a arquitetura master - slaves, mas sem o pool de conexões e assíncrono, tudo depende da arquitetura e da velocidade de replicação que você deseja obter. Mais informações sobre o pgpoll-2 aqui - pequenas perguntas frequentes ( http: //www.dalibo .org / _media / pgpool.pdf )
  2. Otimização da Web - para Mapquest e OSF, até onde eu sei, eles usam cache da web no nível do servidor + pool de conexão. Isso significa que ele não solicitaria ao Postgres / Postgis tantas solicitações quanto eu armazenasse alguns dados em cache. Otimizações 3.Postgis - consulta de pregação no nível do banco de dados, indexação e normalização do banco de dados. Eu iria para "PostGis em ação" ( http://manning.com/obe/ ) para aprender mais sobre os tipos de dados postgis e adaptar seu servidor a eles

1
Obrigado. A primeira opção é definitivamente preferida. O segundo é parcialmente realizado, usando uma CDN para entrega e cache Nginx / Memcached local nos servidores frontais.
314 Pierre
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.