PG BootCamp Russia
2.76K subscribers
134 photos
18 videos
111 links
PG BootCamp Russia - бесплатные мероприятия российского сообщества PostgreSQL с подтвержденным международным официальным статусом.

Подробнее: https://clck.ru/3RoEJY
Download Telegram
До розыгрыша «Кабанчика» осталось 3…2…1…

Друзья! Состоялся розыгрыш книги «Высоконагруженные приложения. Программирование, масштабирование, поддержка» за авторством Мартина Клеппмана (в простонародии – «кабанчик») с автографами спикеров PG BootCamp Russia 2026 Moscow.

Победителем стал Vitaly (@Vtitaly)!

Поздравляем. Организаторы свяжутся с вами для уточнения деталей доставки.
🔥25🎉20👍9😢2
PG BootCamp Russia 2026 Moscow: как это было

19 марта в Москве прошла пятая, юбилейная конференция PG BootCamp Russia. 563 участника офлайн и более 1300 онлайн — сообщество растет и укрепляется. О том, как это было – читайте на Хабре в репортаже одного из непосредственных участников события..

P.S. Записи всех докладов, а также фотографии с мероприятия появятся в ближайшие недели.
Когда выложим - обязательно сообщим, оставайтесь на связи!

Читать репортаж на Хабре
👍16🔥6❤‍🔥2
Презентации спикеров PG BootCamp Russia 2026 Moscow

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

📑 Скачать презентации (GitHub)
🔥18👍12
Ответы на вопросы спикерам из чата онлайн-трансляции


🔹Вопросы к докладу Станислава Выщепана «Очереди и кэш на Postgres — без Redis, RabbitMQ и Kafka»

Вопрос по типам данных. Есть ли инструменты для работы с целыми числами больше 64 разрядов. Т.е. int, который больше, чем 2^64 (ограничение из-за разрядности архитектуры процессора). Речь об индексируемых данных.
Ответ: тип numeric позволяет хранить и индексировать числа со 131 072 десятичными цифрами до точки. Для больших чисел придется отыскать или сделать расширение.


Сравнение ограничено только RabbitMQ и Kafka. Рассматривали ли Вы позиционирование PgSQL как замену инфраструктуры данными с ESB-решениями? Да/нет, почему, какие преимущества?
Ответ: ESB — это зачастую сервер приложений, API которого может подстраиваться под целевые системы и преобразовывать данные между форматами разных систем. Реализация такого в Postgres видится не вполне целесообразной.


🔹Вопрос к докладу Константина Ващенкова «Опыт эксплуатации, проблемы и производительность PostgreSQL на Эльбрус, Baikal-S, Loongson/Иртыш, Repka Pi, x86»

Учитывает ли планировщик запросов PostgreSQL какие-то особенности архитектуры "Эльбрус" (например, очень большой набор регистров), или он работает в "эмуляции" x86, и мы теряем потенциал производительности?
Ответ: вся инсталляция нативна, без бинарной транасляция, то есть чистый e2k. Потенциал производительности – да, теряем, но для этого существуют доработанные, т.е. не ванильные, версии PostgreSQL.


🔹Вопрос к докладу Кирилла Боровикова «Highload «из ниоткуда»: когда проблема не в СУБД, а в клиентской архитектуре»

В каком приложении ведется логирование процесса разбора проблемы? Чтобы можно было передать ссылку разработчику, который столкнулся с подобной ситуацией.
Ответ: Процесс разбора обнаруженной ошибки или инцидента производительности ведется внутри нашего же продукта Saby, который сочетает функции как трекера, так и системы внутреннего документооборота.
4🔥3
🔹Вопросы к докладу Алексея Копытова «Разделение Compute и Storage: архитектурный прорыв для PostgreSQL в облаке»

Вопрос к слайдам 21/22. Зачем нужно было реализовывать fsync(), если на слайде 21 упоминается, что PolarFS работает в O_DIRECT режиме? Возможно, поэтому fsync() и был no-op?
Ответ: Tantor Polar, как и PostgreSQL, для обеспечения долговечности данных вызывает сброс буферов на диск через аналог fsync() — в API PolarFS это pfsd_fsync() (и соответствующий вызов в libpfs). Без реальной реализации этого вызова нельзя гарантировать, что после сбоя питания или падения узла записанные данные действительно окажутся на постоянном носителе.

В оригинальной открытой реализации PolarFS вызовы pfsd_fsync() и pfs_fsync() были пустыми операциями (noop): они ничего не делали. Причины в коде не задокументированы. Возможные объяснения - в облачной версии PolarFS поверх PolarStore запись могла считаться «автоматически устойчивой» (например, семантика вроде O_SYNC на уровне хранилища). Для блочного устройства (бэкенд PFS_DEV_DISK), которое мы используем, это не применимо. Или же разработчики могли считать, что раз PolarFS использует только небуферизованный I/O (O_DIRECT), явный fsync() не нужен.

На деле O_DIRECT лишь обходит кэш страниц ОС и гарантирует попадание данных в кэш устройства, а не обязательно на энергонезависимый носитель. Считать запись устойчивой можно только если железо гарантирует защиту от потери питания (PLP), а в общем случае — и тем более в программно-определяемом хранилище — полагаться на это нельзя.

Поэтому в нашей доработанной PolarFS исправлено: при вызове pfsd_fsync() / pfs_fsync() теперь принудительно выполняется сброс кэша записи нижележащего блочного устройства (аналог flush на уровне диска). Поведение включается опцией конфигурации diskdev_flush_enable (по умолчанию включено). Это даёт Tantor Polar корректную гарантию долговечности при использовании PolarFS на произвольном блочном устройстве или кластере хранения.


Если HAProxy знает кто мастер, и произошла потеря мастера, переключение на standby, может ли оказаться так, что бывший мастер, не имея связи с HAProxy, будет продолжать думать, что он мастер, и тажке проводить запись?
Ответ: Patroni с DCS (etcd/Consul) – единый источник истины о том, кто сейчас мастер. Эпоха увеличивается при каждом failover. Shared storage с fencing – при переключении новый мастер получает эксклюзивное право на запись в общее хранилище. Даже если на реплике случайно или намеренно выполнить promote, эта операция провалится – реплика не сможет перемонтировать storage в режим RW, так как shared storage уже захвачен действующим мастером. HAProxy в этой схеме отвечает только за маршрутизацию клиентского трафика, но не за предотвращение split-brain – эту работу делают Patroni и shared storage. Так что потеря связи с HAProxy не позволяет старому мастеру навредить данным.

ProxySQL с группой репликации – в нашей архитектуре мы используем ProxySQL, в котором группа репликации допускает только один пишущий узел. Роли узлов периодически проверяются в отдельном потоке мониторнга. Это гарантирует, что даже если какой-то узел по ошибке считает себя мастером, пишущий трафик на него не пойдёт. Таким образом, даже при полной потере связи между компонентами, ни один узел не сможет несанкционированно писать в данные.
🔥41
🔹Вопросы к докладу Александра Никитина «Работа с логами PostgreSQL»

Используются в Вашей организации ИИ-агенты для анализа логов?
Ответ: Нет, мы не используем ИИ для анализа логов


Отдел безопасности очень хочет видеть все изменения в БД, я смог им предложить только log_statements = all. Можно ли как-то этого избежать?
Ответ: Если интересуют изменения, то всё-таки - log_statement=mod должно вам подойти - all будет включать в себя и запросы (SELECT), которые вряд ли будут интересовать безопасников. Возможно, отделу безопасности не хочется видеть абсолютно все изменения, а только изменения на каких-то конкретных таблицах? Ведь объём изменений в БД очень велик и со временем он начнёт превышать размер самой БД. Если можно ограничиться конкретными таблицами, то можно посмотреть в сторону дополнительных расширений типа pgaudit или рассмотреть создание триггеров, на интересующих их таблицах. В любом случае, нужно исходить именно от поставленной задачи.


Напоминаем: презентации спикеров уже доступны, а видео выступлений мы выложим и оповестим вас в ближайшее время.
🔥6👍2
Друзья!

Видеозаписи докладов и фотоотчет с PG BootCamp Russia 2026 Moscow готовы.

Для вашего удобства просмотр доступен на:
📌Rutube
📌Youtube

Также доступен фотоотчет с конференции:
📌Облако с фотографиями

Приятного просмотра!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34👍1092
Forwarded from Pangolin Community
Привет, это Павел Селезнев, участник команды Pangolin. Пару недель назад я выступил на PG BootCamp с докладом «Временные таблицы для PostgreSQL. Почему это важно для платформы 1С и что можно улучшить?».

⏯️ Запись доклада можно посмотреть по ссылке

После выступления мне задали несколько интересных вопросов. На два из них я ответил в прошлом посте. Сегодня продолжу и разберу вопрос о медленной работе оператора UPDATE. Спасибо автору за вопрос и за то, что позже прислал почтой дополнительные детали 👍

Схема базы данных

Таблица cmn_object (назовем её  «Справочник идентификаторов»)
CREATE TABLE cmn_object
(
    id bigint PRIMARY KEY
);

 
Таблица od_structure_extension (назовем её «Справочником апартаментов»)
CREATE TABLE od_structure_extension
(
    id bigint PRIMARY KEY,
    object_id bigint ,
    common_apartment_number int NOT NULL
);

 
Таблица _result (назовем её «Доступными апартаментами»)
CREATE TEMP TABLE _result
(
    identity_column bigint NOT NULL,
    object_id bigint NOT NULL,
    living_rooms_amount varchar(30)
)

 
Проблемный запрос
-----------------
Задача: требуется обновить те апартаменты, которые есть в _result и не заняты.
 
UPDATE _result r_u
SET living_rooms_amount = ex.common_apartment_number::varchar
FROM _result r
JOIN cmn_object o
  ON r.object_id = o.id
JOIN no.od_structure_extension ex
  ON ex.object_id = o.id
WHERE r_u.identity_column = r.identity_column
  AND r.living_rooms_amount IS NULL;

 
Проблема: запрос выполняется очень медленно.

Уточним, что:
1) Проблема не относится к временным таблицам, если мы уберём ключевое слово TEMP, то она сохранится
2) Оптимизатор ошибается со статистикой, т.к. она не актуальна. Поэтому в начале здесь у нас происходит self join (то есть декартово произведение таблицы саму на себя), и далее идёт фильтрация миллионов строк.
 
✔️ Возможные решения

1) Можно переписать запрос так:
 
UPDATE _result u
SET living_rooms_amount = (
    SELECT ex.common_apartment_number::varchar
    FROM no.cmn_object o
    JOIN no.od_structure_extension ex
      ON ex.object_id = o.id
    WHERE o.id
= u.object_id
    LIMIT 1
)
WHERE u.living_rooms_amount IS NULL
  AND EXISTS (
      SELECT 1
      FROM no.cmn_object o
      JOIN no.od_structure_extension ex
        ON ex.object_id = o.id
      WHERE o.id
= u.object_id
  );


2) Если запрос редко выполняется, то можно запустить Analyze перед ним.

Если вы тоже хотите узнать побольше по теме временных таблиц для PostgreSQL, задавайте вопросы в комментариях — разберу их там, а может, сделаю отдельный следующий пост 👌

Подписывайтесь на Pangolin в Max | ВКонтакте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123🔥2