Назад | Перейти на главную страницу

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

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

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

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

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

Спасибо.

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

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

Здесь я вижу два варианта:

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