С 6 по 7 февраля в бизнес-центре Digital October в Москве пройдёт конференция PGCONF.RUSSIA 2015, одним из организаторов которой я являюсь. PostgreSQL — одна из наиболее перспективных современных свободно распространяемых СУБД, активно развивающаяся и во многих случаях уже не уступающая флагману коммерческих СУБД Oracle, а в чем-то и превосходящая его. При этом что Postgres распространяется по очень свободной лицензии, близкой к BSD и MIT-лицензиям, позволяющих делать с ним что угодно — даже продавать от своего имени. Поэтому нет препятствий в создании на базе постгреса коммерческих СУБД и прикладных систем, и этим многие пользуются. Это, в свою очередь, дает возможность участвовать в разработке большему количеству людей, и активнее подпитываться новыми идеями. На страницах данного поста мы расскажем о том, как возникла и развивалась эта СУБД, каковы её сильные и слабые стороны, в том числе с точки зрения широкого распространения.
Что такое Postgres
В мире существует очень много систем управления базами данных. Самая известная, конечно, Oracle, сегодня это общепризнанная СУБД №1 в мире. Из свободно распространяемых СУБД наиболее известна и популярна MySQL. Однако в последние годы все больший интерес в мире вызывает PostgreSQL, свободно распространяемая объектно-реляционная система управления базами данных (ORDBMS), наиболее развитая из открытых СУБД. Рост запросов на миграцию с проприетарных систем на PostgreSQL доказывает, что он является реальной альтернативой коммерческим СУБД.
В чем причина роста популярности Postgres? Прежде всего, он очень тщательно продуман, гибок и за счет этого имеет ряд преимуществ.
Postgres был создан в 1986 профессором университета Калифорнии в Беркли Майклом Стоунбрейкером, как следующая ступень после СУБД Ingres. Основы его устройства и механизмы для обеспечения расширяемости были заложены уже тогда. Интересно, что в то время использование языка SQL еще не считалось обязательным для реляционных баз данных. И когда в 1996 году Postgres, уже научившийся языку SQL, стал свободно распространяемым продуктом, он стал назывался замысловатым словом PostgreSQL («постгр ́есквел»), но для удобства произношения старое название «постгрес» тоже сохранилось и используется.
В последние годы в PostgreSQL испытывает бурный расцвет, связанный с его проникновением на рынки промышленных решений. Поэтому в него целенаправленно добавляются возможности, необходимые для использования его в серьёзных проектах – репликация, средства для хранения неструктурированных данных, row level security. Производительность с каждой новой версией возрастает.
За рубежом к PostgreSQL проявляют большой интерес. Многие компании оказывают коммерческие услуги по поддержке и кастомизации — в частности, этим занимаются американская компания EnterpriseDB, британская The Second Quandrant и французская Dalibo. К слову, директор последней Жан-Поль Аргудо в своем докладе на PGCONF.RUSSIA 2015 поделится опытом оказания коммерческих услуг в отношении свободного распространяемого продукта и поддержки правительственных учреждений Франции в миграции с Oracle на Рostgres. Также на PGCONF.RUSSIA 2015 будут выступать довольно известные разработчики PostgreSQL из Японии и Китая, которые расскажут о причинах высокой его популярности в этих странах.
Важнейшие ТТХ PostgreSQL
- Надежность и устойчивость. Надежность PostgreSQL является известным фактом, доказанным на примере многих проектов, в которых PostgreSQL работает без сбоев под высокими нагрузками на протяжении нескольких лет.
- Превосходная поддержка. Сообщество PostgreSQL предоставляет квалифицированную и быструю помощь. Коммерческие компании предлагают свои услуги по всему миру.
- Конкурентная работа при большой нагрузке. PostgreSQL использует многоверсионность (MVCC) для обеспечения надежной и быстрой работы в конкурентных условиях под высокой нагрузкой.
- Масштабируемость. PostgreSQL отлично использует современную архитектуру многоядерных процессоров — его производительность растет линейно вплоть до 64-х ядер. Кластерные решения на основе Postgres-XC, Postgres-XL помогают с горизонтальной масштабируемостью.
- Кроссплатформенность. PostgreSQL работает под всеми видами UNIX-подобных систем, включая Linux, FreeBSD, Solaris, HP/UX, Mac OS X, а также под MS Windows.
- Расширяемость. Доступны исходные коды PostgreSQL, что делает возможным добавление новой функциональности для вашего проекта без дополнительных проблем. Расширяемость PostgreSQL позволяет создавать новые типы данных и методы доступа.
- Доступность. PostgreSQL распространяется под лицензией, близкой к BSD, которая не накладывает никаких ограничений на коммерческое использование и не требует лицензионных выплат.
Технические детали PostgreSQL
- Высокий уровень соответствия ANSI SQL 92, ANSI SQL 99 и ANSI SQL 2003, 2011.
- Интерфейсы для Tcl, Perl, C, C++, PHP, JSON, ODBC, JDBC, Embedded SQL in C, Python, Ruby, Java и других.
- Интеграция защиты данных с операционной системой (SE-Linux).
- Представления, последовательности, наследование, outer joins, подзапросы, ссылочная целостность, оконные функции, CTE (рекурсивные запросы).
- Пользовательские функции, хранимые процедуры, триггеры.
- Процедурные языки PL/PgSQL, PL/Perl, PL/Python, PL/Java и другие.
- Расширяемый набор типов данных с поддержкой индексов (GiST, GIN, SP-GiST).
- Встроенная система полнотекстового поиска с поддержкой всех европейских языков.
- Встроенная поддержка слабоструктурированных данных (xml, json, jsonb) с поддержкой индексов.
- Горячее резервирование и репликация (синхронная, асинхронная, каскадная), PITR, двунаправленная (BDR).
- Полная поддержка ACID, уровни изоляции, эффективная сериализация транзакций.
- Функциональные и частичные индексы.
- Интернационализация, поддержка Unicode и locale.
- Загружаемые расширения, например, PostGIS, hstore.
- Поддержка SSL и Kerberos-аутентификации.
- Foreign Data Wrappers (writable), поддержка всех основных баз данных.
Postgres в России
На волне сегодняшней тенденции к импортозамещению на Postgres стали обращать внимание многие государственные и окологосударственные структуры, которые сегодня пользуются СУБД Oracle и другими проприетарными системами. Конкретные шаги по миграции предпринимаются рядом министерств и госкорпораций. Кстати, в Европе такая же картина, как у нас: там тоже хотят, как ни странно, «слезать» с проприетарных решений. Причем хотят очень давно. Но многие свободно распространяемые решения еще только подходят к такому уровню качества, чтобы на них можно было переходить. РostgreSQL — одна из наиболее серьезных систем.
Российские разработчики вносят серьезный вклад в развитие Рostgres. Вероятно, это одна из причин, почему Postgres так серьезно в последнее время стали рассматривать в различных министерствах. Не обошли его вниманием и силовые структуры, включая военных. Ведь, поскольку это система с открытым кодом, есть возможность проверить ее код на наличие различных шпионских и диверсионных закладок.
Благодаря индексной поддержке работы с пространственными данными PostgreSQL очень широко используется в геоинформационных системах. В частности, на нем сделаны такие известные проекты, как OpenStreetMap и российский 2ГИС. Кстати, Postgres лежит и в основе площадки объявлений Avito.
К сожалению, во многих случаях открытость системы и отсутствие явной компании-разработчика мешает активному распространению. Ведь, несмотря на свою бесплатность, как и любая другая сложная система, Postgres имеет ненулевую стоимость владения, требуя определенных затрат на разработку и обслуживание. Нужны квалифицированные и компетентные специалисты. И, если в случае с той же Oracle или Microsoft есть формальная система сертификации, то у Рostgres такой системы нет. Поэтому организации и государственные структуры, которые привыкли или вынуждены работать строго формально, не понимают, кого им брать на работу. Ну хорошо, поставят они Рostgres. А где они возьмут сертифицированных инженеров? В России их формально нет. Поэтому сейчас в воздухе витает идея, что российскому сообществу разработчиков необходимо приобрести или создать некую формальную структуру, которая будет заниматься сертификацией, обучением и продвижением Рostgres в России. Конечно, есть частные фирмы, занимающиеся обучением работе с Postgres. Но для того, чтобы государство признавало выдаваемые ими сертификаты, требуется поддержка на достаточно высоком уровне. Нужна мощная поддержка со стороны потенциальных клиентов, нужна политическая воля, пиар. Возможно, в будущем это будет реализовано.
Кому можно порекомендовать Postgres
Для любого нового бизнеса Postgres заманчив по сравнению с проприетарными СУБД отсутствием стартовых вложений — вам не требуется покупать лицензию. Однако в этих случаях часто выбирают более популярную MySQL. Достоинства Postgres становятся более заметными и даже определяющими, когда требуется база данных более-менее сложной структуры с внутренней логикой, репликацией, взаимодействием с другими базами, то есть когда речь идет не о веб-сайте из нескольких страниц, а об информационной системе для бизнеса, крупном интернет-портале, системе электронной коммерции.
Postgres можно порекомендовать для тех проектов, где важна высокая надежность работы, возможность без остановки системы обновлять конфигурацию самой базы, хранимых процедур. В новых версиях Рostgres можно будет (пока с помощью хитроумного DBA) даже обновлять версию самого постгреса без остановки сервиса.
По сравнению с другими свободно распространяемыми реляционными СУБД Рostgres выигрывает технологически. В него изначально были заложены очень грамотные технические решения, опередившие время. Postgres обладает высочайшей степенью гибкости и расширяемости: можно создавать свои типы данных, свои типы индексов, писать встроенные функции на огромном количестве языков, чего нигде больше нет. К примеру, доминирующая позиция Postgres в ГИСах является прямым следствием его гибкости и расширяемости.
Зачем мы организуем PGCONF.RUSSIA 2015
Мы надеемся, что проводимая нами конференция позволит сообществу организоваться, найти какие-то формы взаимодействия, создать новые структуры. Еще мы надеемся продемонстрировать крупным отечественным заказчикам и государству зрелость самого PostgreSQL и сообщества, а членам сообщества продемонстрировать широту задач, открытых для них.
Мы хотим способствовать формированию сообщества и рынка, собрать вместе разные заинтересованные стороны. Тех, кто разрабатывает сам Рostgres, кто разрабатывает на нем, кто использует его. Ведь если будет развиваться рынок услуг, связанных с Рostgres, то будет развиваться и сам Рostgres.
Вообще, такие конференции — одна из форм самоорганизации мирового сообщества разработчиков и пользователей. Есть серия международных конференций, которые проходят в Канаде; в США проводятся американские конференции; в различных городах Европы — ежегодные общеевропейские. В Китае и Японии тоже проводят свои национальные конференции по Postgres. Европейские конференции собирают обычно по 200-300 человек. Первая крупная российская конференция была организована энтузиастами прошлым летом в Санкт-Петербурге, ее посетили около 250 человек. Примерно столько же мы ожидаем и на PGCONF.RUSSIA 2015.
В России, в отличие от многих других стран, есть свои члены международной команды разработки ядра PostgresQL, то есть ключевые, фундаментальные разработчики Рostgres. Один из них, Федор Сигаев, работает у нас в Mail.Ru Group. В свое время он создал важные инструменты для Рostgres, которые позволили работать с массивами и неструктурированными данными. Вместе с Олегом Бартуновым — другим российским разработчиком ядра — он создавал модуль полнотекстового поиска.
Федор будет также выступать на нашей конференции (всего заявлено более 40 докладчиков в трех параллельных секциях). В качестве расширенного анонса мы хотим немного рассказать о содержании его доклада.
Расширяемость PostgreSQL — проблемы и перспективы
Исторически Postgres создавался как база данных, которая не имеет жестко зашитого набора правил, жестко зашитых типов. Она позволяет добавлять свои типы, создавать свои функции и т.д. Конечно, не все удавалось сделать сразу, многие заложенные идеи все еще развиваются. Скажем, только в середине 2000-х Postgres наконец избавился от «знания» семантического значения знаков операций. Затем это знание было обобщено, и теперь есть возможность объяснять ядру Postgres, как именно с помощью индекса ускорять поиск по выражениям с любыми знаками операций. Это дало возможность с помощью индексов специального типа ускорить поиск по вхождению элемента в множество (массив), по пересечению множеств, и затем — полнотекстовый поиск.
В свое время полнотекстовый поиск зарождался как модуль, состоящий из подключаемых типов и подключаемых индексов. Таких расширений существует достаточно много. Можно упомянуть LTree — это модуль и тип, который позволяет хранить в базе данных деревья и достаточно эффективно с ними работать.
Итак, Postgres позволяет создавать свои типы и функции. В докладе Федор расскажет о том, как это лучше всего делать. Проще всего создать новый тип: для этого достаточно написать две функции, которые превращают простую текстовую строку во внутреннее представление и обратно, и запустить эти функции в жизнь специальной SQL-командой. С этим Postgres уже может жить и реплицироваться. Но, чтобы получить какой-то толк от созданного типа данных, вам потребуется определить над ними какие-то функции и операции. Если нужна индексная поддержка поиска по какой-то операции — тоже потребуется написать несколько функций.
Существуют операции над типами данных, которые являются не слишком тривиальными, такие как близость (похожесть) двух строк. Например, задача поиска — чтобы по фразе «черная дыра» в базе нашлась и «дыра черная». На самом деле, не так просто устранить чередование терминов без потери смысла, и при этом находить нужные строчки (а ведь еще бывают опечатки!). Здесь не вводятся новые типы; вместо этого сравниваются две строки, учитывая меру похожести Левенштейна. Те, кто пробовал с ней работать, знают, что поиск по ней работает только полным перебором. Поэтому в свое время был создан модуль pg_trgm, который представляет строку в виде множества триграмм, индексировать эти множества и искать достаточно эффективно.
Также в докладе будет рассказано о возможности использования этого модуля для индексного поиска по некоторым подмножествам регулярных выражений — о том, как можно сделать что-то совершенно необычное со строками, используя уже существующие возможности Postgres. Отдельно будет упомянуто о foreign data wrappers (fdw), обертках над источниками данных, которые не являются самим Postgres. Сейчас этот функционал развился настолько, что поддерживаются даже транзакции.
Ахиллесова пята Postgres — это, как ни странно, подключение новых типов индексов. Операция эта довольно редкая, но заложенная в ней гибкость реализована еще не полностью. В целом, Postgres и без того богат индексами: в нем есть BTree, Rtree, обратный индекс (GIN), обобщенный индекс (GIST), пространственный обобщенный индекс (SP-GIST). Однако иногда возникают задачи, которые не ложатся в традиционную базу данных, например, Блумовские фильтры. На первый взгляд, достаточно создать новый тип индекса и вставить в системный каталог в несколько табличек.
Проблема в том, что такие подключаемые индексы не имеют доступа к WAL (write ahead log), который лежит в основе восстановления после сбоев и репликации. В результате этот индекс не реплицируется вообще, потому что репликация идет через WAL. Для того чтобы новый индекс писался в WAL, необходимо патчить ядро системы, одними расширениями тут не обойтись. Но мы ожидаем, что в версии 9.6 будет реализована возможность подключения индексов с использованием WAL.
Также в своем докладе Федор коснется темы exclusive constraints. Все знают о unique constraints, использующихся, если какое-то поле должно быть уникальным в таблице. Но, например, представьте себе расписание, в котором для каждой лекции указана аудитория, время и длительность. Арендовать аудиторию можно на три часа, а можно на 15 минут. Требуется, чтобы лекции не пересекались в пространстве-времени. Для этого unique constraints, естественно, не подходят. Тут помогут exclusive constraints, чтобы можно было гарантировать, что эти два временных интервала в одной аудитории не пересекаются.
Планы на будущее
В одной из ближайших статей Олег Царёв, другой PGCONF.RUSSIA 2015 из Mail.Ru Group, расскажет о некоторых принципиальных различиях между MySQL и Postgres и даст несколько советов по миграции с одного на другой. Этот материал будет полезен всем тем, кого уже не устраивают возможности и особенности MySQL, а также тем, кто делает первые шаги в Postgres. Если у вас есть вопросы к Олегу или ко мне — задавайте их в комментариях.
Автор: x-wao