Как эффективно масштабировать данные OpenStreetMap


9

Уже более года я работаю на собственном сервере PostGIS, заполненном данными OSM, используемыми как для генерации тайлов на основе Mapnik, так и для геокодирования на основе Nominatim, обновляемых с помощью ежедневных копий. Это работает довольно хорошо.

Однако, поскольку использование растет в геометрической прогрессии, я хотел бы добиться большей надежности и производительности, добавив дополнительные серверы PostgreSQL. И я отчасти потерян.

Поскольку PostgreSQL, похоже, не обрабатывает репликацию сам по себе, я бы подумал об использовании набора промежуточного программного обеспечения, такого как PgPool-II, для синхронизации серверов. Но я боюсь, что это было бы просто необходимым для этого использования: очень высокое отношение чтения-записи, когда все записи выполняются в одно и то же точное время каждый день.

Мои вопросы просты: что бы вы сделали, чтобы синхронизировать эти серверы? И что для этого делается в OpenStreetMap Foundation, MapQuest, Mapbox или CloudMade?

Спасибо.

Ответы:


13

Во-первых, Postgres 9 и более поздние версии имеют встроенную поддержку репликации, и это то, что мы (рабочая группа OpenStreetMap) ожидаем использовать сейчас, когда мы (примерно 90 минут назад) работаем на Postgres 9.1 для основной базы данных.

Чтобы ответить на ваш вопрос о том, что делает OSM, на сегодняшний день мы не делаем никакой репликации - есть одна большая база данных Postgres, выступающая в качестве основной базы данных позади веб-сайта и содержащая необработанные данные. Затем существуют вторичные базы данных Postgres + Postgis для рендеринга и геокодирования, которые заполняются с использованием дампов планет и различий для обновления.


Не знал о встроенной репликации Postgres. Это очень вероятно сделает работу. Спасибо!
Пьер

1
Также проверьте REPMGR ( repmgr.org ), который использует возможности потоковой репликации Postgres и расширяет функциональность, позволяя автоматически переходить от ведомого устройства к ведущему .
Shyam Sundar CS

4

Я вижу два варианта здесь:

  1. Объединение баз данных - репликация http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling , я бы использовал кластер PG, поскольку он является синхронным и разрешает распределение нагрузки. Вы также можете использовать архитектуру master - slave, но без пулов соединений и асинхронности, все зависит от архитектуры и скорости репликации, которую вы хотите достичь. Больше информации о pgpoll-2 здесь - небольшой FAQ ( http: //www.dalibo) .org / _media / pgpool.pdf )
  2. WebOptimisation - для Mapquest и OSF, насколько я знаю, они используют веб-кэширование на уровне сервера + пул соединений. Это означает, что он не будет запрашивать у Postgres / Postgis столько запросов, сколько я кеширую. 3.Постгис оптимизации - проповедь запросов на уровне БД, индексация и нормализация базы данных. Я хотел бы перейти на «PostGis в действии» ( http://manning.com/obe/ ), чтобы узнать больше о типах данных postgis и адаптировать ваш сервер к ним

1
Спасибо. Первый вариант определенно предпочтителен. Второе частично выполняется с использованием CDN для доставки и локального кэша Nginx / Memcached на фронтальных серверах.
Пьер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.