Postgres расправляет плечи



    С 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. Если у вас есть вопросы к Олегу или ко мне — задавайте их в комментариях.
    Mail.ru Group
    Building the Internet

    Comments 25

      0
      а Postgres-XC и Postgres-XL это сторонние разработки или фичи из коробки?
        0
        Это отдельные форки. На pgconf.ru будет доклад от разработичка.
          0
          Странно, был уверен что пострес умеет кластер из коробки. Пойду чинту
        +1
        Это сторонние разработки. Postgres-XC — предшественник Postgres-XL. Кстати, разработчик Postgres-XL Mason Sharp будет делать доклад на pgconf.ru. Подробности про XL и XC тут www.translattice.com/postgres_compare.shtml
          +4
          Постргрес прекрасен. Видел тыщи мест, куда горе-интеграторы (бабло не пахнет, ага ага) тянут ора-кал за много денег, когда там бесплатный постгрес все прекрасно сделал бы.
            +2
            Самая известная, конечно, Oracle, сегодня это общепризнанная СУБД №1 в мире
            Очень спорное и странное утверждение.
              0
                +2
                Ок, почитайте, по вашей ссылке есть методика этой оценки. Вкратце — Oracle это СУБД которая чаще всего упоминается в Интернете. Самая известная? Да, пожалуй, можно так сказать по этому рейтингу. Признанная? №1? Боюсь тут так просто не оценишь, слишком широка предметная область.
                  +1
                  Понятно, почему в списке нет Caché ;)
                  Вообще-то есть.
                    0
                    Но искать по правильному названию в интернете не выглядит как надежный способ найти все упоминания этой СУБД.
            +2
            pgconf.ru/paper/10 — PCI DSS compliance — оч хороший доклад будет
              +2
              Скажите, пожалуйста, Вы не в курсе, планируется ли запись (с возможностью ее посмотреть или купить для просмотра) или интернет-трансляция мероприятия?
                0
                Трансляция не планируется. Запись будет, но условия ее распространения будут объявлены после мероприятия.
                +3
                Чтобы популяризовать postgres нужно создать сертификацию… Ох уж этот отечественный подход.
                  0
                  Ну, там говорится не про популяризацию, а о доступе на рынок решений для тех потребителей, которым оная сертификация требуется. Такое случается и за «бугром».
                  0
                  Арендовать аудиторию можно на три часа, а можно на 15 минут. Требуется, чтобы лекции не пересекались в пространстве-времени. Для этого unique constraints, естественно, не подходят. Тут помогут exclusive constraints, чтобы можно было гарантировать, что эти два временных интервала в одной аудитории не пересекаются.
                  Бизнес-логика в СУБД? Стоит ли?
                    +4
                    Не бизнес-логика в СУБД, а корректное описание типов в СУБД.
                    Корректность и консистентность данных — это как беременность, либо она есть, либо её нет.

                    Если не описывать «что такое консистентные данные» на уровне схемы базы, то вам придётся описывать это на уровне приложения, и в каждой точке где вы загружаете что-то из базы делать проверки.

                    Вы правда хотите проверять всё-всё вручную? Конечно, есть ситуации, когда проще проверять в приложении — например, когда нужно проверить статус чего-либо во внешней системе, но 99% проверок можно унести на уровень СУБД и рассматривать это как простой и гибкий валидатор ваших данных (и, к тому же, очень быстрый)
                      0
                      На какие ухищрения придется пойти, чтобы поменять местами два занятия в расписании, например?
                        +3
                        Если вы описали непересекаемость занятий в расписании как constraint, и меняете их в одной транзакции — то почти никаких, вот эту штуку только передёрнуть в начале транзакции www.postgresql.org/docs/9.3/static/sql-set-constraints.html
                          +3
                          DEFERRED | IMMEDIATE
                          О, это классная штука, не знал, спасибо.
                      +5
                      Важно, что exclusion constraints берут на себя заботу о конкурентности. Если, например, просто проверять перед вставкой отсутствие противоречий, то будет race condition. Если лочить таблицу целиком – медленно. А делать на уровне приложения реализацию аналогичную exclusion constraints –  муторно.
                        0
                        Да, в таком сценарии это безусловно плюс.
                      0
                      Основатель «Энвижн» инвестировал в российскую команду разработчиков PostgreSQL

                      gov.cnews.ru/top/2015/01/28/osnovatel_envizhn_investiroval_v_rossiyskuyu_komandu_razrabotchikov_postgresql_592089

                      Only users with full accounts can post comments. Log in, please.