<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Always On и read scale-out: SQL Server vs PostgreSQL]]></title><description><![CDATA[<h2>Горизонтальное масштабирование чтения: SQL Server Always On и аналоги в PostgreSQL</h2>
<blockquote>
<p dir="auto"><strong>Аннотация.</strong> Разбор Always On Availability Groups (AG) в Microsoft SQL Server как способа повысить отказоустойчивость и разгрузить чтение, с оценкой типичного прироста производительности, требований к лицензированию и параллелями с экосистемой PostgreSQL (streaming/logical replication, Patroni, pgpool).</p>
</blockquote>
<hr />
<h3>1. Что именно масштабируем</h3>
<p dir="auto">«Горизонтальное масштабирование БД» часто смешивают с двумя разными задачами:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Задача</th>
<th>Always On AG</th>
<th>PostgreSQL</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Высокая доступность (HA)</strong> — быстрый failover</td>
<td>Да, основной сценарий</td>
<td>Да (Patroni, repmgr, встроенный failover)</td>
</tr>
<tr>
<td><strong>Масштабирование чтения (read scale-out)</strong></td>
<td>Да, readable secondary + read-only routing</td>
<td>Да, hot standby / read replicas</td>
</tr>
<tr>
<td><strong>Масштабирование записи (write scale-out)</strong></td>
<td>Нет*</td>
<td>Частично (шардинг: Citus, pg_shard, приложение)</td>
</tr>
</tbody>
</table>
<p dir="auto">* Always On AG — это <strong>одна первичная</strong> writable-копия данных. Вторичные реплики асинхронно/синхронно повторяют журнал; запись не распределяется между узлами.</p>
<p dir="auto"><strong>Вывод:</strong> AG и postgres-replica решают <strong>HA + read scale-out</strong>, но не заменяют шардирование для тяжёлой записи.</p>
<hr />
<h3>2. SQL Server: Always On Availability Groups</h3>
<h4>2.1. Архитектура</h4>
<ul>
<li><strong>Primary replica</strong> — принимает INSERT/UPDATE/DELETE.</li>
<li><strong>Secondary replica(s)</strong> — получают поток из transaction log (redo).</li>
<li><strong>Readable secondary</strong> — secondary, на которой разрешены SELECT с <code>ApplicationIntent=ReadOnly</code> или маршрутизацией read-only routing.</li>
<li><strong>Windows Server Failover Cluster (WSFC)</strong> или с SQL Server 2017+ <strong>Linux + Pacemaker/Corosync</strong> — координация failover.</li>
<li><strong>Listener (AG Listener)</strong> — виртуальное имя + IP, клиент подключается к listener, маршрутизатор отправляет чтение на secondary.</li>
</ul>
<pre><code>                    ┌─────────────────┐
   Запись ────────► │ Primary replica │
                    └────────┬────────┘
                             │ log stream
              ┌──────────────┼──────────────┐
              ▼              ▼              ▼
        Secondary-1    Secondary-2    Secondary-3
        (readable)     (readable)     (DR only)
              ▲
   Чтение ─────┘  (read-only routing / read intent)
</code></pre>
<h4>2.2. Режимы синхронизации и влияние на чтение</h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Режим</th>
<th>Failover RPO</th>
<th>Задержка чтения на secondary</th>
<th>Нагрузка на primary</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Synchronous commit</strong></td>
<td>~0 (при кворуме)</td>
<td>Минимальная</td>
<td>Выше latency записи</td>
</tr>
<tr>
<td><strong>Asynchronous commit</strong></td>
<td>секунды</td>
<td>Возможен <strong>replica lag</strong></td>
<td>Меньше влияние на запись</td>
</tr>
</tbody>
</table>
<p dir="auto">На readable secondary возможны:</p>
<ul>
<li><strong>Read-your-writes не гарантируется</strong> при async — пользователь может не увидеть только что записанные данные.</li>
<li><strong>Blocking redo</strong> — тяжёлый long-running SELECT на secondary может задерживать redo (зависит от версии и настроек <code>ALLOW_CONNECTIONS</code>, <code>READ_ONLY_ROUTING</code>).</li>
</ul>
<h4>2.3. Оценка прироста производительности чтения</h4>
<p dir="auto">Точный процент без профиля нагрузки не существует; ориентиры для <strong>OLAP/отчётов/read-heavy</strong> (70–95 % SELECT):</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Конфигурация</th>
<th>Ожидаемый эффект</th>
<th>Комментарий</th>
</tr>
</thead>
<tbody>
<tr>
<td>1 primary + 1 readable secondary</td>
<td><strong>+30–80 %</strong> суммарной пропускной способности чтения</td>
<td>При равном железе и если чтение упиралось в CPU/IO primary</td>
</tr>
<tr>
<td>1 primary + 2–3 readable secondary</td>
<td><strong>+50–150 %</strong> (не линейно)</td>
<td>Убывающая отдача: накладные расходы redo, lag, неидеальное распределение запросов</td>
</tr>
<tr>
<td>Тяжёлая запись + sync AG</td>
<td>Прирост чтения есть, <strong>запись может замедлиться на 5–25 %</strong></td>
<td>Цена синхронной репликации</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Когда эффект мал:</strong></p>
<ul>
<li>узкое место — диск primary (redo queue растёт быстрее, чем secondary успевает);</li>
<li>запросы требуют <strong>самых свежих</strong> данных (нужен primary);</li>
<li>много мелких random read — secondary не снимает блокировки на primary.</li>
</ul>
<p dir="auto"><strong>Практическая рекомендация:</strong> закладывать <strong>+1 readable secondary ≈ +40–60 % capacity SELECT</strong> при типичном DWH/BI, если secondary на сопоставимом железе и async replication.</p>
<h4>2.4. Лицензирование SQL Server (Always On)</h4>
<blockquote>
<p dir="auto">Актуально на семейство SQL Server 2019/2022; детали — в <a href="https://learn.microsoft.com/sql/database-engine/availability-groups/windows/always-on-availability-groups-sql-server" rel="nofollow ugc">документации Microsoft</a> и pricing guide.</p>
</blockquote>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Возможность</th>
<th>Standard Edition</th>
<th>Enterprise Edition</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Basic Availability Group</strong></td>
<td>Да: 1 AG, <strong>1 БД</strong>, 1 secondary, <strong>без</strong> read scale-out</td>
<td>—</td>
</tr>
<tr>
<td><strong>Always On AG (полноценный)</strong></td>
<td>Ограничено: обычно <strong>2 реплики</strong> (1 primary + 1 secondary)</td>
<td>До <strong>9 реплик</strong> (1 primary + 8 secondary)</td>
</tr>
<tr>
<td><strong>Несколько readable secondary</strong></td>
<td>Нет / сильно ограничено</td>
<td>Да</td>
</tr>
<tr>
<td><strong>Read-only routing</strong> (автоматическое направление SELECT)</td>
<td>Ограничено</td>
<td>Полная поддержка</td>
</tr>
<tr>
<td><strong>Distributed AG</strong> (между кластерами)</td>
<td>Нет</td>
<td>Enterprise</td>
</tr>
<tr>
<td><strong>Columnstore / advanced BI на secondary</strong></td>
<td>Ограничения</td>
<td>Полная поддержка</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Что покупать для типичного prod read scale-out:</strong></p>
<ul>
<li><strong>Enterprise Edition</strong> на каждый узел кластера (core-based licensing) <strong>или</strong> Server+CAL — если нужны <strong>несколько readable secondary</strong>, read-only routing, &gt;2 реплик, enterprise-функции.</li>
<li><strong>Standard Edition</strong> — если достаточно <strong>HA + одна secondary</strong> без полноценного read scale-out (Basic AG / минимальный AG).</li>
<li><strong>Windows Server Datacenter</strong> — если используется Storage Replica / несколько VM с общим SAN (зависит от топологии).</li>
<li><strong>Software Assurance</strong> — для migration rights / Azure hybrid benefit (опционально).</li>
</ul>
<p dir="auto"><strong>Rough cost logic (качественно):</strong></p>
<ul>
<li>HA «дешевле»: Standard + Basic AG.</li>
<li>BI/DWH с разгрузкой отчётов на 2–3 реплики: почти всегда <strong>Enterprise</strong> на всех SQL-узлах.</li>
</ul>
<hr />
<h3>3. PostgreSQL: как добиться того же</h3>
<h4>3.1. Streaming replication (физическая реплика)</h4>
<p dir="auto">Аналог <strong>async/sync secondary</strong> в AG:</p>
<pre><code class="language-text">Primary (read/write)  ──WAL stream──►  Standby (hot standby, read-only)
</code></pre>
<ul>
<li><code>pg_hba.conf</code> + <code>primary_conninfo</code> на standby.</li>
<li><code>hot_standby = on</code> — SELECT на replica.</li>
<li><strong>Lag</strong> — <code>pg_stat_replication.replay_lag</code> (PG 13+).</li>
</ul>
<p dir="auto"><strong>Прирост чтения:</strong> сопоставим с AG — <strong>+30–80 %</strong> на одну replica при read-heavy, если приложение умеет разделять read/write.</p>
<h4>3.2. Logical replication</h4>
<p dir="auto">Публикация таблиц → подписчик. Полезно для:</p>
<ul>
<li>частичной репликации (не вся БД);</li>
<li>upgrade major version;</li>
<li>несколько подписчиков с разным набором данных.</li>
</ul>
<p dir="auto">Минус: больше overhead, не заменяет полный HA-failover «из коробки» без доп. оркестрации.</p>
<h4>3.3. Оркестрация HA (аналог WSFC + AG)</h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Инструмент</th>
<th>Роль</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Patroni</strong> + etcd/Consul</td>
<td>Автовыбор primary, failover</td>
</tr>
<tr>
<td><strong>repmgr</strong></td>
<td>Управление replication + switchover</td>
</tr>
<tr>
<td><strong>pg_auto_failover</strong></td>
<td>Citus Data / Azure-стиль managed failover</td>
</tr>
</tbody>
</table>
<h4>3.4. Маршрутизация чтения (аналог read-only routing)</h4>
<p dir="auto">PostgreSQL <strong>не имеет AG Listener</strong> в ядре. Варианты:</p>
<ol>
<li><strong>Два connection string в приложении</strong> — <code>DATABASE_URL_WRITE</code>, <code>DATABASE_URL_READ</code>.</li>
<li><strong>PgBouncer</strong> — два pool'а (primary/replica).</li>
<li><strong>pgpool-II</strong> — load balancing + read/write split (<code>load_balance_mode</code>, <code>master_slave_mode</code>).</li>
<li><strong>HAProxy</strong> + healthcheck — TCP на primary:5432 / replica:5432.</li>
<li><strong>Managed cloud</strong> — AWS RDS/Aurora read replicas, Azure Flexible Server read replicas (встроенный endpoint).</li>
</ol>
<h4>3.5. Лицензирование PostgreSQL</h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Компонент</th>
<th>Лицензия</th>
</tr>
</thead>
<tbody>
<tr>
<td>PostgreSQL</td>
<td><strong>Open Source</strong> (PostgreSQL License, BSD-like)</td>
</tr>
<tr>
<td>Patroni, pgpool, PgBouncer</td>
<td>Open Source</td>
</tr>
<tr>
<td><strong>EnterpriseDB / Postgres Pro</strong></td>
<td>Коммерческая поддержка + доп. функции (опционально)</td>
</tr>
<tr>
<td><strong>Citus</strong> (write scale-out)</td>
<td>Open core / managed</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Итого:</strong> за сам движок платите <strong>железо/облако + поддержка</strong>, а не per-core SQL Server Enterprise.</p>
<hr />
<h3>4. Сравнительная таблица</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Критерий</th>
<th>SQL Server Always On AG</th>
<th>PostgreSQL</th>
</tr>
</thead>
<tbody>
<tr>
<td>HA failover</td>
<td>Встроено + WSFC/Pacemaker</td>
<td>Patroni / repmgr / cloud</td>
</tr>
<tr>
<td>Read replica</td>
<td>Readable secondary</td>
<td>Hot standby / logical replica</td>
</tr>
<tr>
<td>Авто-маршрутизация SELECT</td>
<td>Read-only routing (Enterprise)</td>
<td>pgpool / app-level / proxy</td>
</tr>
<tr>
<td>Синхронная реplica</td>
<td><code>SYNCHRONOUS_COMMIT</code></td>
<td><code>synchronous_standby_names</code></td>
</tr>
<tr>
<td>Lag monitoring</td>
<td>DMVs, <code>sys.dm_hadr_*</code></td>
<td><code>pg_stat_replication</code></td>
</tr>
<tr>
<td>Стоимость read scale-out</td>
<td>Enterprise ($$$)</td>
<td>Infra + engineering</td>
</tr>
<tr>
<td>Write scale-out</td>
<td>Шардирование вне AG</td>
<td>Citus / app sharding</td>
</tr>
<tr>
<td>Типичный прирост чтения (+1 replica)</td>
<td>+40–60 % SELECT*</td>
<td>+40–60 % SELECT*</td>
</tr>
</tbody>
</table>
<p dir="auto">* Оценка при read-heavy и равном железе; не гарантия SLA.</p>
<hr />
<h3>5. Пример топологии для NevaDWH-подобного DWH</h3>
<p dir="auto"><strong>SQL Server:</strong></p>
<pre><code class="language-text">AG «DWH-RO»
  Primary: ETL + админ-запись
  Secondary-1 (readable): Power BI / отчёты
  Secondary-2 (async, DR): аварийный failover
Listener: dwh-sql.neva.loc
</code></pre>
<p dir="auto">Connection string отчётов: <code>ApplicationIntent=ReadOnly;MultiSubnetFailover=True</code></p>
<p dir="auto"><strong>PostgreSQL:</strong></p>
<pre><code class="language-text">Primary (Patroni leader): ETL + запись
Replica-1: BI read pool (PgBouncer, pool_mode=transaction)
Replica-2: DR
HAProxy: dwh-pg-write:5432 / dwh-pg-read:5433
</code></pre>
<hr />
<h3>6. Риски и ограничения</h3>
<p dir="auto"><strong>SQL Server AG:</strong></p>
<ul>
<li>лицензионная стоимость Enterprise для полноценного read scale-out;</li>
<li>redo queue при пиках записи;</li>
<li>tempdb и agent jobs на secondary — ограничения.</li>
</ul>
<p dir="auto"><strong>PostgreSQL:</strong></p>
<ul>
<li>split read/write — ответственность приложения или pgpool;</li>
<li>failover → promotion replica (кратковременный downtime без Patroni);</li>
<li>logical replication — не все DDL реплицируются автоматически.</li>
</ul>
<hr />
<h3>7. Заключение</h3>
<p dir="auto"><strong>Always On Availability Groups</strong> — зрелое решение <strong>HA + масштабирование чтения</strong> в экосистеме Microsoft, но <strong>полноценный read scale-out с несколькими readable secondary и read-only routing — территория Enterprise Edition</strong>. Ожидайте <strong>~40–60 %</strong> дополнительной ёмкости SELECT на каждую сопоставимую readable-реплику при OLAP-нагрузке, не линейно.</p>
<p dir="auto"><strong>PostgreSQL</strong> даёт сопоставимую архитектуру (streaming replication + hot standby) <strong>без лицензий на ядро</strong>, но требует явной схемы маршрутизации (PgBouncer/pgpool/два URL) и оркестрации HA (Patroni).</p>
<p dir="auto">Для NevaDWH, где уже есть поддержка <strong>MS SQL и PostgreSQL</strong>, разумная стратегия:</p>
<ul>
<li><strong>prod SQL Server + тяжёлые корпоративные BI</strong> → AG + Enterprise, если бюджет позволяет;</li>
<li><strong>dev/test, стартапы, cloud-native</strong> → PostgreSQL replica + Patroni + PgBouncer read pool.</li>
</ul>
<hr />
<p dir="auto"><em>Обсуждение конфигураций под ваши SLA и sizing — в комментариях. Если нужен разбор конкретной версии SQL Server (2019 vs 2022) или Patroni-манифест для k3s — напишите.</em></p>
]]></description><link>https://prod26.neva.loc/forum/topic/3/always-on-и-read-scale-out-sql-server-vs-postgresql</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 15:59:16 GMT</lastBuildDate><atom:link href="https://prod26.neva.loc/forum/topic/3.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Aug 2026 16:48:53 GMT</pubDate><ttl>60</ttl></channel></rss>