Мы продолжаем знакомить вас с самыми интересными новостями PostgreSQL. Этот выпуск получился с некоторым уклоном в средства диагностики. Нет, не только. Например:
Хардверные ускорители: FPGA
В небольшом сообщении Энди Эликотта (Andy Ellicott) в блоге Swarm64 3 hardware acceleration options Postgres users should know in 2020 рассказывается о трёх аппаратных ускорителях, не GPU, а FRGA, и все они в облаках. У автора свой интерес: у Swarm64 есть собственное решение на FPGA-ускорителе. Значимым сигналом он считает объявление Amazon об FPGA-ускорителе кэша (FPGA-powered caching layer) в Redshift AQUA (Advanced Query Accelerator) в Amazon, который убыстряет запросы на порядок. А вообще уже почти все облака (во всяком случае Amazon, Alibaba, и Azure) используют сейчас FPGA-ускорители, просвещает нас Энди.
Итак:
Swarm64 Data Accelerator (DA)
это расширение, которое умеет переписывать обычные SQL-запросы, чтобы распараллеливать вычисления на всех этапах их исполнения, а сотни читающих или пишущих процессов будут работать параллельно на FPGA. Кроме того, там реализованы индексы columnstore, как в MS SQL Server. Есть техническое описание в PDF, но именно про FPGA в нём ничего нет. Зато есть демонстрационное видео, показывающее, как можно легко и быстро развернуть Postgres на инстансе Amazon EC2 F1 с FPGA. Ещё есть результаты тестов TPC-H (а позиционируется эта комбинация с FPGA прежде всего как ускоритель для гибридных транзакционно-аналитических нагрузок — HTAP), и там показывает выигрыш в 50 раз по скорости.
Другой вариант, который предлагает Энди: Intel Arria 10 GX FPGA в связке с NVM-памятью Intel Optane DC, SSD и PostgreSQL 11 с тем же расширением Swarm64 DA. Всё это собрано в демо, которое вбрасывает в PostgreSQL потоки биржевых котировок со скоростью 200 тыс инсертов в секунду, и дальше работает с ними с обычным SQL.
Третий вариант — с Samsung SmartSSD, в которой внутри FPGA-чип от Xilinx. Испытания (с тем же свормовским расширением, как можно догадаться) дали выигрыш в 40 раз на TPC-H и в 10-15 раз на JOIN-ах.
С маркетинговой точки зрения эти усилия нацелены прежде всего против хардверных решений для WH вроде Netezza или Teradata.
Обещано, что будет и сравнение эффективности FPGA vs. GPU (в т. ч. и в контексте проекта PGStrom).
(спасибо Александру Смолину за наводку в FB-группе PostgreSQL в России)
Конференции
были:
PGConf.online
Теперь выложены все видео и презентации — доступ через расписание.
FOSDEM 21
Поток PostgreSQL devroom тёк два дня 6-7 февраля с 10 утра до 6 вечера. Материалов конференции очень много. Вот имеется однобокая, зато систематизированная выборка — доклады от Postgres Professional (глаголы будущего времени там надо поменять в уме на глаголы прошедшего).
будет:
Highload++
Объявлено, что состоится офлайн 17 -18 мая 2021 в Крокус-Экспо, Москва. Есть Расписание. Я бы обратил особое внимание на потоки
СУБД и системы хранения, тестирование в Зале 3, например:
Микросервисы с нуля, Семен Катаев (Авито);
«Прокрустово ложе» или «испанский сапог» — мифы и реальность СУБД в Облаках, Александр Зайцев (Altinity)
и на
Архитектуры, масштабируемость, безопасность в Зал 4 (главном), например:
Архитектура процессора Эльбрус 2000, Дмитрий Завалишин (Digital Zone);
SQL/JSON в PostgreSQL: настоящее и будущее, Олег Бартунов (Postgres Professional);
Распространённые ошибки изменения схемы базы данных PostgreSQL, Николай Самохвалов (Postgres.ai).
Вебинары и митапы
RuPostgres-вторник s02e13 Андрей Зубков (PostgresPro) — pg_profile, pgpro_pwr
Вторник, посвященный pg_profile / PWR, так заинтересовал устроителей, что с большой вероятностью в ближайшее время можно ожидать продолжения: разобрались не во всех тонкостях работы этого весьма практичного инструмента, ну а расширения pgpro_stats, которое используется в PWR, коснулись по касательной.
После это был ещё вторник с Александром Кукушкиным (Zalando). Тема — риски апгрейда мажорных версий с фокусом на PG12 и PG13, а пособник апгрейда — Spilo: как выяснилось, бесшовный апгрейд в контексте Patroni задача слишком амбициозная, а вот Spilo, то есть Docker-образ с PostgreSQL и Patroni, с задачей справляется. Но опасностей и нюансов при апгрейде остаётся немало. Говорилось о сюрпризах от VACUUM, ANALYZE, о параллелизме по умолчанию, о CTE и материализации, о JIT.
Database Delivery: The Big Problem
Это была презентация от Ростелеком-ИТ, которую провёл Роман Гордеев (в видео глюки, надо прокрутить первые 11 минут). Его пригласили на один из стримов Tver.io — сообщества тверских айтишников (но мне удобней было смотреть этот же ролик на на youtube). Речь шла об инкрементальной стратегии миграции. Роман рассказывал о вещах, применимых к разным СУБД и средам разработки, но для примера был выбран переход с базы PostgreSQL на H2 в графическом DataGrip. Соответственно в реальном времени наблюдались и решались проблемы с постгресовым типом
text
и с последовательностями.В качестве механизма, который контролирует миграцию, был взят плагин liquibase для среды gradle. О настройках для такой работы можно почитать на страничке liquibase gradle на гитхабе Гордеева. Кстати, «Ростелеком Информационные Технологии» — компания с населением под 2 тыс. человек. На официальной странице есть информация об опенсорсной СУБД in-memory Reindexer собственной разработки. Больше о базах там ничего пока найти не удалось.
Обучение
Выложены в общий доступ видео:
- Разработка серверной части приложений PostgreSQL 12. Базовый курс.
- Разработка серверной части приложений PostgreSQL 12. Расширенный курс
Оба эти курса появились в конце прошлого года, но теперь комплект полный: презентации и видео.
Тем, кто интересуется более пристально, советую прослушать доклад о курсах Егора Рогова на PGConf.online 2021.
Мониторинг
Monitoring PostgreSQL with Nagios and Checkmk
Пишет опять Хамид Ахтар (Hamid Akhtar, китайская компания High Go), на этот раз пишет о средствах мониторинга Nagios (рекурсивный акроним Nagios Ain't Gonna Insist On Sainthood — Nagios не собирается настаивать на святости, в отличие от его предшественника NetSaint) и Checkmk. Публикация без претензий: как установить и настроить, не претендуя даже в этом на полноту.
Explaining Your Postgres Query Performance
Идём от простого к сложному. Пока URL подсказывает возможный подзаголовок статьи: Get Started with EXPLAIN ANALYZE. Кэт Бэтьюйгас (Kat Batuigas, Crunchy Data) действительно знакомит с самыми азами EXPLAIN, даже без опций. Жанр For dummies, и наглядно: показывает, как с помощью EXPLAIN ANALYZE можно наблюдать решения планировщика об (не)использовании индексов, и вообще что там происходит. Иллюстрируется это всё на базе Geonames.
Предыдущая её статья была о Query Optimization in Postgres with
pg_stat_statements
.Вот ещё одна её статья: Three Easy Things To Remember About Postgres Indexes. В ней не только напоминания о том, что индекс занимает место на диске, но и, например, такие соображения:
«Важен и тип запроса. Например, если в запросе есть знаки подстановки (wildcards)
wildcards, e.g. … WHERE name LIKE 'Ma%'
,то планировщик задействует по умолчанию индекс B-tree, но вам, возможно, стоит указать класс оператора, чтобы был выбран эффективный индекс.»
Can auto_explain (with timing) Have Low Overhead?
Майкл Христофидес (Michael Christofides) показывает работу расширения auto_explain с включённым и отключённым таймингом. Выводы:
Если задать ощутимый промежуток времени
min_duration
, издержки от auto_explain на небольшой транзакционной нагрузке )была меньше 1% с отключённым таймингом и ~2% с включённым. Семплинга не было, поэтому детали прослеживались для каждого запроса, но попадали в лог для медленных. А когда min_duration=0ms
, и логировалось всё, издержки оказались больше 25%, даже без тайминга и ANALYZE. Видимо, издержки auto_explain связаны в основном с логированием.Интерес у Михаэля не невинный — он разработчик утилиты pgMustard, которая визуализирует планы. Она также расписывает, сколько тратится времени и сколько строк возвращает каждая операция (в т.ч. циклы; дочерние узлы планов — subplans; CTE). Мало того, pgMustard умеет подсказывать. Например:
- (не)эффективность индексов;
- плохая оценка числа строк;
- неэффективность кэша;
- угроза распухания индекса (bloat);
- CTE-скан использовался только 1 раз.
How to create a system information function in PostgreSQL
Давид Ян (David Zhang, старший системный архитектор в той же High Go) делится опытом написания собственных информационных функций. Ему мало тех, что можно найти на вот этой странице. Например, его не устраивает, что
txid_current()
возвращает ему тот же идентификатор транзакции, что и было до SAVEPOINT.Ссылаясь на страничку Исходные данные системных каталогов, Давид показывает, как выбрать
OID
для новой функции, чтобы он не конфликтовал с существующими. Потом приводит код своей функции, определяющей xtid после SAVEPOINT. Называется она txid_current_snapshot
и написана на C. И тестирует её. Теперь идентификатор транзакции показывается корректно.How The PostgreSQL Optimizer Works
Ханс-Юрген Шёниг (Hans-Jurgen Schonig, Crunchy Data) написал не то, чтобы концептуальную, но большую по объёму статью, в которой есть примеры, демонстрирующие:
обработку констант: почему
WHERE x = 7 + 1
для оптимизатора не то же, что
WHERE x - 1 = 7
встраивание функций (function inlining): умение оптимизатора встраивать функции зависит от языка, в SQL он как дома, но не в PL-ях.
как обрабатываются функции, если они VOLATILE/STABLE/IMMUTABLE. Например:
WHERE x = clock_timestamp()
против
WHERE x = now()
что способен понять PostgreSQL, задумавшись о том, что чему равно:
понять, что если x = y AND y = 4, то x = 4, а значит можно использовать индекс по x — это он может.
что такое view inlining и subselect flattening:
как представление превращается во вложенные SELECT-ы, а они — в обычный, «плоский» SELECT.
Ну и, конечно, центральный вопрос — как оптимизатор расправляется с JOIN. Тут Ханс-Юрген рассказывает об очерёдности джойнов, о явных и неявных; об OUTER JOIN; автоматическом исключении (pruning) ненужных; об EXIST и анти-джойнах.
Случайности:
Они не случайны
Кирилл Боровиков ака kilor выступил в роли волшебника: он угадывает случайные числа! Он придумал волшебную функцию и даже назвал её
magic()
. В качестве аргумента она берёт только что сгенерённое функцией random()
число и предсказывает следующее:SELECT r random, magic(r) random_next FROM random() r;
random | random_next
--------------------+--------------------
0.3921143477755571 | 0.6377947747296489
tst=# SELECT r random, magic(r) random_next FROM random() r;
random | random_next
--------------------+--------------------
0.6377947747296489 | 0.5727554063674667
Чтобы исследовать содержание внутренностей волшебной функции, автор предлагает разобраться в линейном конгруэнтном алгоритме, который используется в
random()
, залезает в код функции setseed()
в файле float.c и там находит источник вдохновения для создания своей волшебной функции.Итого, случайные числа
random()
не слишком случайны, о криптографии и речи не может быть. Но кое-какие альтернативы имеются: более безопасны функции в расширении pgcrypto.Восстановление
Speeding up recovery & VACUUM in Postgres 14
Статья на сайте Citus, но речь не о Citus, а о патче в основную ветку PostgreSQL. Написана статья (и патч) Дэвидом Роули (David Rowley), работавшим над этим уже внутри Microsoft. Он переписал внутреннюю функцию
compactify_tuples
, которая используется, когда PostgreSQL стартует после внештатного (нечистого) шатдауна (crash recovery), и когда идёт восстановление standby-сервера проигрыванием WAL по их прибытии с primary-сервера; VACUUM.Эти случаи Дэвид и расписывает, поясняя схемами. Новая версия функции избавляет от ненужной внутренней сортировки кортежей в
heap
, поэтому и работает быстрее. На pgbench выигрыш в 2.4 раза на восстановлении и на 25% при вакууме.Соревнования
Performance differences between Postgres and MySQL
В сообществе Arctype очень интересуются сравнительной производительностью PostgreSQL и MySQL. Эта сумбурная статья с приятными выводами — продолжение вот этой, где преимущества той и другой СУБД оценивали качественно, и пришли в том числе к выводам о преимуществах PostgreSQL. Он лучше когда:
- надо работать со сложно устроенными или объёмистыми данными;
- аналитические нагрузки;
- нужна транзакционная база общего назначения;
- требуется работа с геоданными.
А на этот раз решили померить, причём с уклоном в JSON, поскольку эта тема интересует в сообществе очень многих и очень сильно. Вот что было сделано:
создан проект, в котором использовались PostgreSQL и MySQL;
создали объект JSON для тестирования чтения и записи, размер объекта около14 МБ, около 200–210 записей в базе данных.
И опять приятный вывод:
JSON-запросы быстрей в Postgres!
Кроме этого автор по касательной упоминает индексы по выражениям и прочие, особенности репликации, принципиальные отличия MVCC в InnoDB MySQL и в PostgreSQL.
PostGIS
Traveling Salesman Problem With PostGIS And pgRouting
У Флориана Надлера (Florian Nadler, Cybertec) проблемный коммивояжер странствует по окрестностям Гамбурга. Это продолжение статьи 'Catchment Areas' With PostgreSQL And PostGIS. Там собрали множества городов, ближайших к крупным аэропортам, разбросав их по диаграммам Вороного.
Теперь, надо решить, как лучше эти города обойти, для чего кроме PostGIS Флориан использует функции расширения pgRouting. Чтобы превратить множество точек в граф, он выбирает утилиту osm2po.
Дальше
pgr_createverticestable
— функция из pgRouting — превратит граф в таблицу. Эта таблица-граф накладывается как слой поверх слоёв OpenStreetMap. После этого Флориан, используя функцию pgr_dijkstraCostMatrix
из pgRouting, решает эту знаменитую задачу оптимизации с помощью замысловатого запроса с CTE, учитывая стоимости/веса, присвоенные ещё osm2po.Performance Improvements in GEOS
GEOS — важнейшая для геовычислений библиотека (алгоритмы портированы на C из Java Topology Suite или JTS). Crunchy Data вкладывают в её развитие не меньше сил, чем в саму PostGIS.
Пол Рамси ( Paul Ramsey) рассказывает не просто о тестах производительности GEOS (довольно специфических), а взглядом историка GEOS иллюстрирует ими хронологию улучшений в этой библиотеке — от релиза 3.6 к свежайшему — 3.9. Вообще-то, о GEOS 3.9 Пол говорил и раньше — в начале декабря в блоге Crunchy Data — Waiting for PostGIS 3.1: GEOS 3.9 и в собственном. Там тоже есть роскошные иллюстрации, но нет графиков производительности.
А вот заметку Пола Рамси — Dumping a ByteA with psql — можно увидеть только в его блоге. Она короткая, но может оказаться полезной тем, кто:
- хранит двоичные файлы в столбцах базы, например изображения-ярлычки (thumbnails);
- хочет сформировать на выходе двоичный файл изображения, песни, protobuf или LIDAR-файл;
- использует двоичный формат для транзита двух разных типов.
Хранить в двоичном виде картинку можно, а вот посмотреть нельзя — нужен файл. Вот скриптик, который берёт из базы ярлычок в типе bytea, через psql двоичное значение обертывается функцией
encode
и выгружается как обычное текстовое. Вывод psql перенаправляется в утилиту xxd, которая декодирует входной поток (ключ -r
) обратно в двоичный вид и записывает в файл .png
:echo "SELECT encode(thumbnail, 'hex') FROM persons WHERE id = 12345" | psql --quiet --tuples-only -d dbname | xxd -r -p > thumbnail.png
Такой способ будет работать для любого поля bytea.
Активная жизнь в коммьюнити
How many engineers does it take to make subscripting work?
Дмитрий Долгов (Zalando) пишет в своём личном блоге в смешанном жанре: о довольно сложных и специальных технических проблемах самого патча, но и извлекает из истории их решения этакую мораль для писателей патчей. Таких, чтобы сообщество PostgreSQL было в состоянии принять их за время меньше бесконечности.
Патч добавляет subscripting в синтаксис функций JSONB — то есть как у массивов, например:
SET jsonb_column['key'] = '"value"';
вместо
SET jsonb_column = jsonb_set(jsonb_column, '{"key"}', '"value"');
Началась история этого патча в 2015 году с беседы Дмитрия с Олегом Бартуновым и последовавшего простенького патча Долгова. Сообщество отнеслось к патчу сочувственно, но предложило переписать его в более универсальной манере, чтобы подобную функциональность можно было бы использовать и для других типов данных. Соответствующий патч Дмитрия был непрост, и ревюеры не торопились его разобрать и оценить. Ещё в истории этого патча фигурируют Том Лейн (Tom Lane), закоммитивший финальный патч Александр Коротков, Павел Стехуле (Pavel Stehule) и Никита Глухов.
Затрагиваются темы универсальности и, пожалуй, «лучшее враг хорошего». Патч продвигался настолько вяло, что Дмитрий в отчаянии даже написал в комментарии к патчу: если вы дочитали до этой фразы и напишете рьвю, я выставлю бутылку пива на следующей PGConfEU (о судьбе бутылки из статьи мы не узнали).
В финале статьи 8 советов. Вот некоторые из них в моём вольном переводе, начиная с последнего — Last but not least:
Сделать ревю патча требует существенных усилий, поэтому не стесняйтесь тратить усилия, делая ревю патчей ваших коллег.
Лучше получить фидбек как можно скорее. Это не всегда возможно, но помогает выявить архитектурные проблемы на ранней стадии.
Разбейте патч на несколько частей — это всегда облегчает работу ревьюеров.
Вы удивитесь, но не так уж много людей готовы внимательно следить за деталями вашего треда в переписке и за актуальным состоянием дел, особенно когда дискуссия длится годы. Чтобы помочь менеджеру коммитфеста и всем, кто хочет вклиниться в тред, пишите время от времени саммари.
Облака и контейнеры
Running Postgres In Docker — Why And How?
Каарел Моппел (Kaarel Moppel, Cybertec) задаёт себе вопрос «можно и нужно ли использовать PostgreSQL в Docker в качестве продакшн, будет ли он вообще там работать?» и отвечает: «да, работать будет, если сильно постараться, и если для фана или для тестирования».
В статье несколько разделов, но начнём с предпоследнего — «Капли дёгтя в бочку мёда».
Докер-имиджи да и вся концепция контейнеров оптимизированы под моментальное разворачивание в стиле стартапов . По умолчанию там даже данные не разведены как следует по томам (persistent units). Если этого не сделать, затея может закончится катастрофой.
От использования контейнеров не ждите автоматических или каких-то волшебных средств высокой доступности.
У вас будет относительно лёгкая жизнь только в том случае, если вы используете такой всеобъемлющий фреймворк, как Kubernetes плюс выбираете оператор (скорее всего от Zalando или Crunchy).
Поведение
The PostgreSQL Community Code of Conduct Committee Annual Report for 2020
Этот документ сообщества переводили на русский Анастасия Лубенникова, Александр Лахин и Анастасия Распопина (все из Postgres Professional), также участвовали Виктор Егоров и Валерия Каплан. Ещё он переведён с английского на японский и иврит.
Число жалоб увеличилось в 2020: 18 против 12 в прошлом году. Мужчины жалуются чаще: 15/3. Обычно от страны по жалобе. По 2 только от РФ, Аргентины, UK и US.
mentin
Я попытался разобраться в использовании FPGA для PostgreSQL, интересная тема. Несколько дополнений, чего я не понял из статьи (возможно это всем понятно, просто я не в теме), но нашел потом: