«Люди рядом» миллиардного уровня, открывающие канал «спецслужбы»

Java Spring

В этой статье postgis используется для реализации функций XX рядом с сотнями миллионов активных пользователей. Например, встряхнуть. Для получения дополнительных функций обратите внимание на публичный аккаунт WeChat Miss Sister Taste: xjjdog.

Если животные также используют GPS, вдруг однажды самец белого медведя в Арктике немного импульсивен и хочет проверить, есть ли поблизости медведица. Чем ближе расстояние, тем лучше, ни тот, что в австралийском зоопарке, ни группа тупых пингвинов в неволе в Гренландии, если есть общее увлечение, то было бы лучше. Как решить этот сценарий приложения?

Социальное приложение или приложение электронной коммерции на основе LBS содержит более или менее географическую информацию, такую ​​как широта и долгота (широта, долгота). Как отвечать на запросы пользователей в течение заданного срока и как хранить эти данные с минимальными затратами — наиболее важные проблемы в LBS-приложениях. Давайте возьмем кого-нибудь поблизости в качестве примера, чтобы увидеть, как сделать приложение производственного уровня.

план

Возможно, вы уже знаете, что существует множество способов реализации таких функций, таких как solr, es, mongodb, redis и другие базы данных без схем, а некоторые используют mysql+geohash для реализации этих функций.

Почему бы не использовать геохеш для обобщения проблемы?

Потому что этот подход не может точно рассчитать расстояние, а масштабируемость и обслуживание являются проблемами.

Почему бы не использовать solr, es, mysql, sphinx?

Поскольку все это кастрированные версии библиотеки функций gis, будут проблемы с многомерными запросами, а оптимизация затруднительна.

почему бы не использовать монгодб

Поскольку mongodb будет резко снижать производительность запроса географического местоположения по мере увеличения объема данных, в то время как pg является линейным.

Почему бы не использовать Redis Geo?

Все данные Redis размещаются в памяти и сортировка не поддерживается. Кто-нибудь использовал его в производстве, пожалуйста, дайте мне знать...

В этой статье используется схема postgis.По сравнению с другими схемами разработчики лучше знакомы с SQL. С точки зрения выбора технологии, если вы выберете лучшую, вы сэкономите время и деньги.Жизнь слишком коротка.Как пользователь, нет необходимости тратить время на какие-то полуфабрикаты. Postgresql сама по себе является лучшей СУБД с открытым исходным кодом, а postgis — наиболее функциональной и зрелой базой данных с открытым исходным кодом. Для ГИС он поддерживает:

1. Типы пространственных данных, в том числе: точка (POINT), линия (LINESTRING), полигон (POLYGON), мультиточка (MULTIPOINT), мультилиния (MULTILINESTRING), мультиполигон (MULTIPOLYGON) и совокупность объектов (GEOMETRYCOLLECTION).

2. Функции пространственного анализа, в том числе: площадь, длина и расстояние

3. Метаданные и функции, в том числе: GEOMETRY_COLUMNS и SPATIAL_REF_SYS.

4. Бинарные предикаты, в том числе: «Содержит», «Внутри», «Перекрывается» и «Прикосновения».

5. Пространственные операторы, в том числе: Union и Difference

Внедрение / автономный

Давайте сначала посмотрим на людей поблизости в автономной версии: Сначала установите его. Возьмем, к примеру, Centos7.

echo 'exclude=postgresql*' >> /etc/yum.repos.d/CentOS-Base.repo
cat /etc/readhat-release
sudo rpm -ivh http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm
yum install postgresql95 postgresql95-server postgresql95-libs postgresql95-contrib postgresql95-devel
 
 service postgresql-9.5 initdb
 chkconfig postgresql-9.5 on
 service postgresql-9.5 restart

У Postgis много зависимостей, а так как CentOS по умолчанию имеет исходный код pg, необходимо сначала исключить его и установить выделенный исходный код. Базовая структура данных выглядит следующим образом:

CREATE EXTENSION postgis;

drop table if exists nearby_user;
create table nearby_user(
userid varchar,
sex varchar,
age int,
loc geometry,
updateTime timestamp
); 

CREATE INDEX geom_loc_index ON nearby_user USING GIST(loc);
CREATE INDEX geom_time_index ON nearby_user USING BTREE(updateTime);
CREATE UNIQUE INDEX userid_index ON nearby_user  USING BTREE(userid);

Есть еще три важных момента

1. Создайте плагин postgis с помощью оператора create extension, каждая библиотека может быть создана только один раз.

2. Создайте поле типа ГИС, поддерживающее типы данных POINT, POLYGON и др. Это поле мы будем использовать для последующей сортировки и расчетов

3. Создайте пространственный индекс (индекс GIST) для поля loc, который можно сортировать, вычислять расстояние и т. д.

Как показано на рисунке, мы хотим запросить людей рядом с пользователем за последние N дней, отсортировать их по расстоянию и запросить первую страницу с 25 записями на странице.

1. Используйте систему координат плоских градусов 4326 для расчета расстояния между двумя точками (Point(x,y))

2. Преобразуйте результат запроса в расстояние, представленное системой координат 26986 метров, которая является общепринятой единицей измерения. Зачем выполнять этот шаг отдельно как вложенный запрос? Поскольку ST_Transform не использует индекс, сортировка по расстоянию требует полного сканирования таблицы, что слишком дорого.

3. ST_X, ST_Y и т. д., преобразуйте координаты в удобочитаемую широту и долготу вместо астрономических чисел, таких как 0101000020E61000005C5E792FA2075D4026BC259C750C4440.

Как показано на рисунке, проверьте план выполнения, используйте индекс geom_loc_index для сортировки, фильтрации и соответствия другим условиям. С одной таблицей из 300 Вт+ данных и 2000+ запросов в секунду выполнение заняло всего 7 мс (24 ядра, 32 ГБ, SATA), что довольно удивительно.

реализация/кластер

Первый закон распределенных вычислений: не делайте систему распределенной, если она вам действительно не нужна. Однако по мере расширения бизнеса DAU продолжает расти и постепенно достигает более миллиона, поэтому мы должны учитывать доступность и масштабируемость. Мы обсудим, как обеспечить масштабируемую высокую доступность около XX, исходя из следующих аспектов.

необходимость

  • Требует высокой производительности в реальном времени, не кэширует и часто читает и записывает (1w+ TPS/s).
  • Возможность сортировки по расстоянию запроса и разбивке на страницы
  • Поддержка фильтрации по другим критериям, кроме местоположения (таким как возраст, пол, пользовательские теги и т. д.)
  • Поддержка других расширенных функций ГИС, таких как трехмерный блок, содержащий запрос
  • Требуется, чтобы большинство запросов могли быть возвращены в течение 100 мс, а некоторые длинные запросы не превышали 1 с.
  • Требуется для поддержки основных функций аварийного переключения и SLB кластерной среды.

анализировать

Требования системы к реальному времени относительно высоки, поэтому кеширование результатов не может быть выполнено с помощью компромиссного решения. Каждый запрос от пользователя требует реальных вычислений, которым суждено стать главным предметом разногласий для системы. Из-за особенностей СУБД, в среде с ограниченной памятью IO также станет узким местом, рекомендуется как можно больше монтировать жесткие диски SSD.

Поскольку приложения ГИС будут иметь горячие проблемы и различные проблемы с корректировкой данных, традиционные технологии сегментирования (мод, хэш, случайный) не работают должным образом, и нам необходимо настроить таблицу маршрутизации. При этом распределенные решения типа Greenplum или Postgresql-XL (GTM будет узким местом) не рассматриваются, что позволяет избежать дополнительных технических и стоимостных ловушек.

Таблица маршрутизации может быть разбита на части с использованием геохэша или отображена на основе фактического кода города. Использование кодов городов для сегментирования даст лучшие результаты, потому что географические границы, как правило, находятся в нечувствительных областях, таких как горы, реки и другие данные, но этот метод требует наличия обратного географического сервиса (запрос кодов городов на основе широты и долготы). Стоимость строительства относительно высока.

Geohash намного проще, но будут некоторые недостатки данных. Предположим, мы используем кодировку geohash (пожалуйста, решите проблему geohash самостоятельно. Короче говоря, это преобразование блока площади на земле в фиксированный код в одном измерении. , а затем разделить землю на такую ​​группу региональных блоков). Таким образом, горячие точки могут быть разделены.Возможная карта данных выглядит следующим образом:

В каждой группе машин есть мастер, а N ведомых реплицируются через журнал WAL. Каждый блок геохэша принадлежит одной или нескольким группам машин и имеет идентификатор, указывающий на вес и доступность узла.

Затем мы делим геохэш на более чем дюжину групп, например 12, тогда необходимое количество экземпляров pg составляет 12*(masterNum+slavesNum) = 36. По мере роста числа экземпляров требуется метод управления кластером, чтобы избежать пробуждения из-за аварийного сигнала паралича службы.

Архитектура

Можно использовать следующую схему:

- Служба определения местоположения предоставляет службу определения местоположения пользователя, которую можно сохранить с помощью простой базы данных KV, чтобы информацию о местоположении пользователя можно было просмотреть в любое время.

  • Обновление местоположения пользователя, лучше всего поставить очередь на буферизацию. Эта модель имеет много преимуществ, например, вы можете подписаться на часть данных для службы траектории пользователя.
  • PgRouter преобразует широту и долготу в геохэш, находит группу узлов в кластере pg в соответствии с информацией таблицы маршрутизации и выполняет расчет запроса.
  • Отношения узлов «старт-стоп», «ведущий-ведомый» управляются repmgr. Сбой главного устройства Ведомое устройство может автоматически повышать привилегии
  • PgMonitor — это набор скриптов, которые могут отслеживать статус выживания и отношения master-slave узлов, а затем обновлять информацию о выживании в Zookeeper или Etcd, конечно, он также может быть консулом.
  • PgRouter отслеживает изменения узлов, перестраивает информацию таблицы маршрутизации памяти и изолирует неисправные узлы.

проблема решена

Далее разберем, как решить эти проблемы.

Как решать горячие вопросы и как бороться с внезапным трафиком?

Точка доступа зависит от степени детализации вашего подразделения геохеширования.Вы можете смонтировать несколько подчиненных библиотек или разделить группу кластеров.

Как решить эффективность и согласованность репликации?

База данных реплицируется с использованием резервного журнала WAL, который работает быстро и имеет низкую задержку. Если ведомых слишком много, можно использовать каскадную репликацию (ведомый из ведомых). Поскольку используется один мастер, проблема непротиворечивости может быть гарантирована. Единственная проблема заключается в том, что основной процесс переключения во время простоя приведет к сбою записи, поэтому для очереди сообщений необходимо принять стратегию повторных попыток в случае сбоя. В этом случае pg действует как узел хранения и вычислительный узел. Если требования к согласованности данных вашего приложения не так высоки, вы можете установить уровень изоляции транзакций на «чтение неподтвержденных».

На каком уровне выполняется балансировка нагрузки?

Я рассматривал возможность использования HA, LVS или kubernetes, чтобы сделать pg микросервисом. Но ничего не меняется.Эти цветочные кулаки и вышитые ноги внесут дополнительную сложность,что гораздо менее удобно и быстрее,чем простая кастомная маршрутизация.Смысл введения весов нод в этом.Например некоторые ноды могут тормозить из-за IO и других операций , Уменьшите его вес, чтобы решить.

Итеративный процесс должен изменить схему, как postgis динамически добавляет поле?

Его можно добавить напрямую, не влияя на службу, но следует отметить, что операция удаления может иметь большее влияние.

Как динамически добавлять и удалять индексы?

Делать это не рекомендуется, а при наличии такой потребности рекомендуется выполнять данную операцию во время низких пиковых нагрузок.

Как реализовать фильтрацию пользовательских тегов в QQ? Например, чтобы запросить группу людей с тегом «забавный»

Еще одна причина, по которой мы используем pg, заключается в том, что его типы данных очень богаты, что особенно лаконично и удобно в использовании. pg — это база данных с сильной академической школой, которая может опробовать некоторые передовые функции. Например, теги могут быть реализованы с использованием типов данных hstore или jsonb. поддержки pg достаточно для обозримого жизненного цикла проекта

Как сделать мониторинг?

Напишите свой собственный плагин zabbix, или подключитесь к nagios, или подключитесь к grafana, в зависимости от используемой вами платформы мониторинга. Есть также такие инструменты, как pgcluu.

Как контролировать онлайн и оффлайн ноды?

Это относительно просто: вы можете использовать обнаружение чередования скриптов или использовать активную функцию уведомления repmgr для создания событий и записи их в центр конфигурации.

Вот простой пример скрипта:

END

Чтобы усложнить ситуацию, если PostGIS не может удовлетворить ваши требования к производительности, возможно, вы уже являетесь гигантом в отрасли.Вы можете рассмотреть возможность использования PostGIS в качестве источника хранения данных, а также использования Solr/ES для обеспечения поиска и т. д. Но пока что и белый медведь нашел своего маленького друга, как он счастлив.

Ссылка на ссылку: почта:www.postgis.net/ postgresql: Woohoo.PostgreSQL.org/docs/9.5/body… repmgr: GitHub.com/2-й квадрант…

Больше отличных статей.

«Микросервисы — это не все, а лишь подмножество определенного домена».

«Подбиблиотека и подтаблица»? Отбор и процесс должны быть осторожными, иначе все выйдет из-под контроля».

С таким количеством компонентов мониторинга всегда найдется подходящий для вас

«Наиболее часто используемый набор навыков «vim» в производственной среде Linux.

«С Нетти, что мы разрабатываем? 》

Линукс из пяти частей и тому подобное.

«Остальная часть необитаемого острова» Linux (1) Подготовка»

«Linux« Остальная часть необитаемого острова »(2) Глава CPU»

«Остальная часть необитаемого острова» Linux (3) Глава памяти »

«Linux« Остальная часть необитаемого острова »(4) глава ввода-вывода»

«Сетевая глава Linux« Оставшаяся жизнь на необитаемом острове »(5)»

Больше, пожалуйста, следуйте. Конечно, вы также можете подписаться на публичный аккаунт.