<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Комментарии / Профиль nullstack]]></title>
    <link>https://habr.com/ru/users/nullstack/comments/</link>
    <description><![CDATA[Хабр: комментарии пользователя nullstack]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Tue, 28 Jul 2026 10:43:33 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      

      
        
  
    <item>
      <title>04.03.2026 07:59:42 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000530/#comment_29616424</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000530/#comment_29616424</link>
      <description><![CDATA[<p>Да, честно говоря. что для меня, что для нашей постгрес команды это было довольно неожиданно :) </p>]]></description>
      <pubDate>Wed, 04 Mar 2026 07:59:42 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>02.03.2026 20:48:51 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000530/#comment_29609472</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000530/#comment_29609472</link>
      <description><![CDATA[<p>Тут справедливо, из текста статьи не совсем понятно что имел в виду :) </p><p>Здесь “зависшие” = не “транзакции должны были завершиться для миграции”, а <strong>долгоживущие сессии</strong>, которые держали <strong>локи/снапшоты</strong> и мешали DDL-шагам миграции (создание/переименование/attach partitions, индексация и т.п.).</p><p>Типичный кейс — <code>idle in transaction</code> или тяжёлый аналитический SELECT, который взял lock уровня таблицы/держал snapshot, и из-за этого наши операции начинали ждать или ловили дедлок. Такие сессии не являются частью миграции и не “обязаны успешно пройти” — это просто внешняя нагрузка, которая мешает окну работ.</p><p>Мы их завершали <strong>точечно</strong> и <strong>только после проверки</strong>, что это не критичный прод-запрос (по <code>pg_stat_activity</code>, времени старта, user/app_name, тексту запроса). После <code>terminate</code> БД остаётся консистентной, а клиент просто получает ошибку/отмену запроса.</p>]]></description>
      <pubDate>Mon, 02 Mar 2026 20:48:51 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>02.03.2026 20:32:52 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000530/#comment_29609420</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000530/#comment_29609420</link>
      <description><![CDATA[<p>Справедливая критика, и я здесь не спорю с базовой логикой:<br> <code>UNLOGGED → нет WAL → нет physical replication</code> — это известное свойство PostgreSQL, и именно поэтому кейс получился таким неприятным.</p><p>Но важно уточнить <strong>где реально была ошибка</strong>:</p><ol><li><p><strong>UNLOGGED использовался сознательно как временный режим на этапе bulk-load</strong> (мы ускоряли заливку).</p></li><li><p>Ошибка была в том, что мы <strong>доверились неявному поведению <code>ALTER TABLE … SET LOGGED</code> для partitioned tables</strong> в PG14: команда вернула SUCCESS, а мы <strong>не провели обязательную пост-проверку по всем партициям</strong> (<code>pg_class.relpersistence</code> / выборка по <code>relkind</code> и детям). Это именно процессный промах. </p></li><li><p>В результате “временное” внезапно стало “боевым”, и реплика тихо осталась пустой.</p></li></ol><p>LINT особо больше не нужен. новые кластеры создаются на новой постгре где просто нельзя задать UNLOGGED для партиционированных таблиц, а написать линтер на N-ое количество микросервисов абсолютно всей компании довольно проблематично :) </p><p>Микросервисов море, только в одной нашей команде их 150+, создать единое полиси и линтер + replication test на всю компанию или же на все команды в рамках всего отдела - крайне трудоёмкая задача и вызывает довольно много нюансов и сложностей, от слишком долгой выкладки до слишком сложного контроля :)</p><p>А так, идея хорошая, может быть найдём способ внедрить, спасибо большое за отличный комментарий.</p>]]></description>
      <pubDate>Mon, 02 Mar 2026 20:32:52 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>02.03.2026 20:25:47 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000530/#comment_29609404</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000530/#comment_29609404</link>
      <description><![CDATA[<p>Вы правы — в текущей документации PostgreSQL 18 прямо сказано, что <code>ALTER TABLE … SET {LOGGED|UNLOGGED}</code> <strong>не поддерживается для partitioned tables</strong>, и это ключевой момент. Я в тексте статьи сформулировал это слишком оптимистично/неаккуратно.</p><p>Что реально поменялось по линии 17 → 18 (упрощённо, по смыслу):</p><ul><li><p><strong>В версиях до 18</strong> ситуация была “плохая и тихая”:<br> <code>ALTER TABLE … SET [UN]LOGGED</code> на <em>partitioned table</em> мог <strong>вернуть SUCCESS</strong>, но <strong>по факту ничего полезного не сделать</strong> (как минимум — не затронуть партиции/relpersistence так, как ожидает пользователь). Именно на этом мы и обожглись. </p></li><li><p><strong>В PostgreSQL 18</strong> поведение сделали <strong>честным и предсказуемым</strong>:<br> такие операции на <em>partitioned tables</em> теперь <strong>запрещены/не поддерживаются</strong>, чтобы не создавать ложное ощущение, что вы “переключили в LOGGED”, хотя на самом деле нет. Это отражено и в release notes 18.0. </p></li></ul><p>То есть мой тезис “в 17 распространяется на партиции” — <strong>нужно считать неверным</strong>. Корректнее так:<br> <strong>до 18 включительно</strong> это место было источником путаницы, а <strong>в 18</strong> PostgreSQL выбрал стратегию “лучше ошибка, чем молча”. </p><p><strong>Про второй вопрос — “для обычных таблиц это полное пересоздание и нужен двойной диск?”</strong><br> Да, в общем случае смена режима LOGGED/UNLOGGED для обычной таблицы — операция тяжёлая: она <strong>требует переписывания данных (table rewrite)</strong> и берёт сильные блокировки; по ресурсам это действительно похоже на “пересоздание/перезапись” и может потребовать существенного дополнительного I/O и места на время операции (в зависимости от версии, <code>wal_level</code>, размера таблицы и т.п.). </p><p>Поправлю это в исходной статье, спасибо большое :) </p>]]></description>
      <pubDate>Mon, 02 Mar 2026 20:25:47 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>02.03.2026 20:24:27 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609394</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609394</link>
      <description><![CDATA[<p>Хотел бы отметить, мне казалось это в целом понятно из тона статьи и в целом описания :) </p><p>Я не продаю это как “единственно правильный путь”. Это постмортем: какие ограничения были, какие решения приняли, где ошиблись, что получили и какие выводы сделали. Если у кого-то в инфраструктуре проще поднять второй кластер/сделать pg_dump+restore — это часто действительно будет лучше. У нас на тот момент окно решений было уже.</p>]]></description>
      <pubDate>Mon, 02 Mar 2026 20:24:27 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>02.03.2026 20:23:50 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609388</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609388</link>
      <description><![CDATA[<p>Да, вы правы: <strong>жёсткого порога по размеру в документации нет</strong>, и критерий “таблица/индексы не помещаются в RAM” — один из базовых ориентиров.</p><p>Фраза про “300GB+” у меня была не как правило из доков, а как <strong>эмпирический сигнал тревоги</strong> из нашего опыта: в этот момент обычно начинают проявляться сразу несколько эффектов:</p><ul><li><p>обслуживание (VACUUM/REINDEX/ANALYZE) становится долгим и плохо прогнозируемым,</p></li><li><p>планировщик чаще ошибается без свежей статистики,</p></li><li><p>любой неожиданный bloat/индексный рост начинает очень быстро подъедать storage,</p></li><li><p>а самое неприятное — любые “случайные” операции (DDL, индексы, миграции) становятся рискованнее.</p></li></ul><p>И да, полностью согласен про “активно используемую часть”: если у вас workload обращается к 5% данных, решение может быть вообще другим (частичные индексы, кластеризация, hot/cold split, матвьюхи и т.д.). В нашем кейсе исторически получилось так, что <strong>критичные операции упирались именно в монолит и обслуживание целиком</strong>, поэтому партиционирование оказалось самым прямым рычагом.</p>]]></description>
      <pubDate>Mon, 02 Mar 2026 20:23:50 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>02.03.2026 20:23:04 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609386</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609386</link>
      <description><![CDATA[<p>Справедливо, и я с этим не спорю: технический долг тут был наш, и “надо было раньше” — это честный вывод.</p><p>Хотелось поделиться опытом, а что делать, если "грабли" уже сделали, и вам надо от них попробовать избавиться? :) </p>]]></description>
      <pubDate>Mon, 02 Mar 2026 20:23:04 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>02.03.2026 20:22:19 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609378</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609378</link>
      <description><![CDATA[<ol><li><p><strong>Про cost_delay / cost_limit.</strong> Мы действительно пробовали тюнить вакуум (в т.ч. aggressiveness), но упёрлись в то, что на нашем профиле нагрузки “выкрутить вакуум в максимум” означало <strong>начать заметно давить прод по I/O и latency</strong>, потому что таблицы и индексы очень крупные. То есть это был trade-off: “быстрее вакуум” ↔ “хуже сервис”. На бумаге это лечится, на практике — не всегда приемлемо без выделенного окна обслуживания или без запасов по дисковой подсистеме.</p></li><li><p><strong>Про “автовакуум выключили и раз в сутки руками VACUUM”.</strong> Нет, это было бы слишком грубо. Скорее так: на самых проблемных больших таблицах/индексах мы временно <strong>ограничивали/меняли поведение autovacuum</strong>, потому что он мог “пилить” систему долго и непредсказуемо под прод-нагрузкой. Параллельно делали <strong>точечные обслуживающие операции</strong> (VACUUM/ANALYZE по окнам), но основная боль была именно в том, что <strong>монолит</strong> обслуживать долго в любом режиме.</p></li></ol><p>И как раз партиционирование дало нам возможность вернуть autovacuum в адекватный режим, потому что он стал работать <strong>на маленьких объектах</strong>, а не на одной огромной таблице.</p>]]></description>
      <pubDate>Mon, 02 Mar 2026 20:22:19 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>02.03.2026 20:21:12 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609376</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000514/#comment_29609376</link>
      <description><![CDATA[<p>Хороший вопрос. Тут важно разделить “частоту обновлений” и “стоимость обслуживания таблиц такого размера”.</p><p>Даже если обновления приходят раз в неделю, там всё равно есть:</p><ul><li><p><strong>массовые UPSERT/DELETE</strong> в нормализованной схеме (ways/way_nodes особенно),</p></li><li><p><strong>обновления индексов</strong> на сотнях гигабайт,</p></li><li><p>и главное: VACUUM/ANALYZE на монолитной таблице в сотни миллионов/миллиарды строк — это не только про “много мёртвых строк”, а про <strong>объём скана + конкуренцию за I/O + стоимость поддержания visibility map/статистики</strong>.</p></li></ul><p>Плюс у нас данные “read-mostly”, но не “immutable”: обновления хоть и редкие, но достаточно тяжёлые, чтобы накапливать хвосты по bloat/статистике и деградировать планы :)</p>]]></description>
      <pubDate>Mon, 02 Mar 2026 20:21:12 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>26.02.2026 15:31:07 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/rwb/articles/1000514/#comment_29590530</guid>
      <link>https://habr.com/ru/companies/rwb/articles/1000514/#comment_29590530</link>
      <description><![CDATA[<p>Всё именно так, выше 1TB в целом кластеров не дают даже временно (их в целом не существует)</p><p>Но вообще скоро будет вторая часть, мы на другой кластер и уехали. но там не без сюрпризов :) </p>]]></description>
      <pubDate>Thu, 26 Feb 2026 15:31:07 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

      

      

    
  </channel>
</rss>
