<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>逻辑复制 on Kernel Notes</title><link>https://my-blog.j8465383071.workers.dev/tags/%E9%80%BB%E8%BE%91%E5%A4%8D%E5%88%B6/</link><description>Recent content in 逻辑复制 on Kernel Notes</description><generator>Hugo -- 0.147.7</generator><language>zh-cn</language><lastBuildDate>Fri, 14 Aug 2026 17:47:31 +0800</lastBuildDate><atom:link href="https://my-blog.j8465383071.workers.dev/tags/%E9%80%BB%E8%BE%91%E5%A4%8D%E5%88%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>PostgreSQL 3-13 逻辑复制原理与性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-logical-replication-tuning/</link><pubDate>Mon, 29 Dec 2025 20:38:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-logical-replication-tuning/</guid><description>&lt;h1 id="目录">目录&lt;/h1>
&lt;ol>
&lt;li>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5">1 基本概念&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#1-1-%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF">1.1 业务场景&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-2-%E9%80%BB%E8%BE%91%E5%A4%8D%E5%88%B6">1.2 逻辑复制&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-3-%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF">1.3 实现思路&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-4-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5">1.4 基本概念&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#2-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95">2 使用方法&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#2-1-%E5%8F%91%E5%B8%83%E7%AB%AF%EF%BC%9A%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0">2.1 发布端：配置参数&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-2-%E5%8F%91%E5%B8%83%E7%AB%AF%EF%BC%9A%E5%88%9B%E5%BB%BA%E5%8F%91%E5%B8%83">2.2 发布端：创建发布&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-3-%E8%AE%A2%E9%98%85%E7%AB%AF%EF%BC%9A%E5%88%9B%E5%BB%BA%E8%AE%A2%E9%98%85">2.3 订阅端：创建订阅&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#3-%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1">3 核心设计&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#3-1-%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84">3.1 整体架构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-2-%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B">3.2 工作流程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#3-3-%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F">3.3 数据格式&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#4-%E5%AE%9E%E7%8E%B0%E6%BA%90%E7%A0%81">4 实现源码&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#4-1-%E8%AE%A2%E9%98%85%E7%AB%AF%EF%BC%9Aapply-launch">4.1 订阅端：apply-launch&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-2-%E8%AE%A2%E9%98%85%E7%AB%AF%EF%BC%9Aapply-worker">4.2 订阅端：apply-worker&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-3-%E5%8F%91%E5%B8%83%E7%AB%AF%EF%BC%9Apostmaster">4.3 发布端：postmaster&lt;/a>&lt;/li>
&lt;li>&lt;a href="#4-4-%E5%8F%91%E5%B8%83%E7%AB%AF%EF%BC%9Awal-sender">4.4 发布端：wal-sender&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#5-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96">5 性能优化&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#5-1-%E7%8E%B0%E7%8A%B6">5.1 现状&lt;/a>&lt;/li>
&lt;li>&lt;a href="#5-2-%E4%BC%98%E5%8C%96%E6%96%B9%E6%A1%88">5.2 优化方案&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%BC%98%E5%8C%96%E7%82%B9%E4%B8%80%EF%BC%9A%E5%8F%91%E5%B8%83%E7%AB%AF-%E6%B5%81%E5%A4%8D%E5%88%B6%E5%8D%8F%E8%AE%AE%EF%BC%88%E9%80%BB%E8%BE%91%E6%95%B0%E6%8D%AE%EF%BC%89">优化点一：发布端-流复制协议（逻辑数据）&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BC%98%E5%8C%96%E7%82%B9%E4%BA%8C%EF%BC%9A%E8%AE%A2%E9%98%85%E6%AE%B5-%E5%B9%B6%E8%A1%8C%E5%9B%9E%E6%94%BE%E6%9C%BA%E5%88%B6%EF%BC%88%E9%80%BB%E8%BE%91%E6%95%B0%E6%8D%AE%EF%BC%89">优化点二：订阅段-并行回放机制（逻辑数据）&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BC%98%E5%8C%96%E7%82%B9%E4%B8%89%EF%BC%9A%E5%8F%91%E5%B8%83%E7%AB%AF-%E5%B9%B6%E8%A1%8C%E8%A7%A3%E7%A0%81%E6%9C%BA%E5%88%B6">优化点三：发布端-并行解码机制&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#5-3-%E6%9C%AA%E6%9D%A5%E6%96%B9%E6%A1%88">5.3 未来方案&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E8%AE%A1%E5%88%92%E4%BC%98%E5%8C%96%E7%82%B9%E4%B8%80%EF%BC%9A%E5%8F%91%E5%B8%83%E7%AB%AF-%E4%BA%8B%E5%8A%A1%E6%8F%90%E4%BA%A4%E7%AD%89%E5%BE%85">一、计划优化点一：发布端-事务提交等待&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#5-4-%E6%96%B9%E6%A1%88%E5%88%86%E6%9E%90">5.4 方案分析&lt;/a>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%80%E3%80%81%E4%BA%8B%E5%8A%A1%E6%AD%A3%E7%A1%AE%E6%80%A7">一、事务正确性&lt;/a>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;a href="#6-%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95">6 性能测试&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99">参考资料&lt;/a>&lt;/li>
&lt;/ol>
&lt;h1 id="1-基本概念">1 基本概念&lt;/h1>
&lt;h2 id="11-业务场景">1.1 业务场景&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>场景一：数据共享（异构数据库）&lt;/strong>&lt;br>
1个公司，有2个部门：商品库存部门、商品成本部门。2个部门有不同技术栈，使用不同数据库产品:postgresql、mysql。2个部门需共享相同的表：商品信息表。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>场景二：数据容灾&lt;/strong>&lt;br>
应用存储数据时，同时将数据存储至postgresql于mysql中，避免某款数据库出现无法恢复的数据损坏问题。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>场景三：版本升级&lt;/strong>&lt;br>
从postgresql 13版本，升级到postgresql 16版本。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>场景四：数据迁移（异构数据库）&lt;/strong>&lt;br>
从postgresql，将数据库迁移到mysql中。&lt;/p></description></item><item><title>PostgreSQL 3-13 Vastbase 逻辑复制</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-vb-rep/</link><pubDate>Thu, 27 Nov 2025 19:07:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-vb-rep/</guid><description>&lt;h1 id="2-使用">2 使用&lt;/h1>
&lt;h2 id="21-发布端">2.1 发布端&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>配置&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># vb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;wal_level=logical&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;max_replication_slots=4&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;max_wal_senders=4&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># echo &amp;#34;max_worker_processes=8&amp;#34; &amp;gt;&amp;gt; $GAUSSHOME/data/postgresql.conf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;max_logical_replication_workers=32&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;listen_addresses=&amp;#39;*&amp;#39;&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/postgresql.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sed -i &lt;span class="s1">&amp;#39;1i host all all 0.0.0.0/0 md5\n&amp;#39;&lt;/span> &lt;span class="nv">$GAUSSHOME&lt;/span>/data/pg_hba.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;host replication all 0.0.0.0/0 md5&amp;#34;&lt;/span> &amp;gt;&amp;gt; &lt;span class="nv">$GAUSSHOME&lt;/span>/data/pg_hba.conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># host all all 0.0.0.0/0 md5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -d postgres -c &lt;span class="s2">&amp;#34;SELECT name,setting FROM pg_settings WHERE name in
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> (&amp;#39;wal_level&amp;#39;, &amp;#39;max_replication_slots&amp;#39;, &amp;#39;max_wal_senders&amp;#39;, &amp;#39;max_worker_processes&amp;#39;, &amp;#39;max_logical_replication_workers&amp;#39;)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>创建基表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pubdb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;data1-1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;data1-2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;data2-1&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;data2-2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>创建发布用户&lt;/p></description></item><item><title>PostgreSQL 3-13 逻辑复制性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-replication/</link><pubDate>Fri, 21 Nov 2025 15:18:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-replication/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>2025-11-21：持续更新中…&lt;/strong>&lt;/p>&lt;/blockquote>
&lt;h1 id="1-需求概述">1 需求概述&lt;/h1>
&lt;h2 id="11-原始需求">1.1 原始需求&lt;/h2>
&lt;p>主备部署模式下，滚动升级时，可能存在主节点未升级，备节点已升级的情况。在该条件下，客户要求主节点持续执行事务，并且主节点及时将数据同步至备节点。目前，存在一下问题：&lt;/p>
&lt;ul>
&lt;li>物理复制无法使用：由于主节点、备节点版本不一致，主节点生成的wal，备节点可能无法使用。因此，只能使用逻辑复制方案。&lt;/li>
&lt;li>逻辑复制性能较低：主节点作为发布端，解码wal。备节点作为订阅端，接收loggic-wal，并且回放logic-wal，可解决主备版本不一致的问题。但是，目前Vastbase的逻辑复制功能性能较低，无法满足及时同步数据的要求。&lt;/li>
&lt;/ul>
&lt;p>本需求将针对上述场景，端到端优化逻辑复制功能，让逻辑复制性能整体提升5倍以上，达到100m/s的要求。&lt;/p>
&lt;ul>
&lt;li>需求来源：&lt;a href="https://doc.weixin.qq.com/doc/w3_AYsAjQYkADwCNecwqsBM8ShS9YejB?scode=AHUAfwdSAA8UDeKla8AdwAfAa7AFk&amp;amp;roomid=Person:1688855660690652:1688855164259723&amp;amp;version=5.0.2.6008&amp;amp;platform=win">https://doc.weixin.qq.com/doc/w3_AYsAjQYkADwCNecwqsBM8ShS9YejB?scode=AHUAfwdSAA8UDeKla8AdwAfAa7AFk&amp;amp;roomid=Person%3A1688855660690652%3A1688855164259723&amp;amp;version=5.0.2.6008&amp;amp;platform=win&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="12-问题分析">1.2 问题分析&lt;/h2>
&lt;p>逻辑复制分为多个阶段，openGauss和PostgreSQL在部分阶段中做了优化，但未端到端优化。因此，本文将以早期逻辑复制为基础，指出优化设计。&lt;/p>
&lt;h3 id="版本一串行复制">版本一：串行复制&lt;/h3>
&lt;p>在postgresql 13以及之前版本，逻辑复制的关键设计如下：&lt;/p>
&lt;ul>
&lt;li>发布端：
&lt;ul>
&lt;li>解码日志：wal-sender进程，持续读取wal，串行对wal进行decode，生成logic-wal，并将不同事务的logic-wal，分别存放。&lt;/li>
&lt;li>发送日志：对wal进行decode时，如果是事务提交产生的wal，则将该事务的所有logic-wal打包，并发送到订阅端。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>订阅端：
&lt;ul>
&lt;li>回放日志：apply-worker进程，一次接收同一事务的一批logic-wal，串行回放本批logic-wal后，重新等待下一个事务的logic-wal。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>整体方案如下：&lt;/p>
&lt;p>&lt;img alt="pg-13" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/3-13-replication/pg-13.png">&lt;/p>
&lt;p>以上设计，存在多项性能瓶颈，以常见的tpcc测试为例，可能有400+postgres进程在执行事务，实时产生wal日志。但是，只有1个wal-sender进程在串行解码日志，只有1个apply-workder在串行回放日志。&lt;/p>
&lt;h2 id="13-方案设计">1.3 方案设计&lt;/h2>
&lt;h3 id="版本二发布端并行解码">版本二：发布端并行解码&lt;/h3>
&lt;p>在openGauss中，针对发布端的解码日志阶段，进行了优化，引入多个decoder线程，并行解码wal生成logic-wal。方案设计如下：&lt;/p>
&lt;p>&lt;img alt="og" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/3-13-replication/og.png">&lt;/p>
&lt;p>但是，在订阅端，每次对一个事务的一批logica-wal全部回放后，才会接收下一个事务的logic-wal。仅引入并发解码机制，对性能提升较小。发布端和订阅端，均存在负载不均衡的问题，例如，订阅端回放完一个事务的logic-wal之后，需等待下一个事务的logic-wal。&lt;/p>
&lt;h3 id="版本三流氏复制协议">版本三：流氏复制协议&lt;/h3>
&lt;p>在postgrsql 14版本，针对发布端发送日志阶段，进行了优化，引入流式复制协议，即无需一次发送完一个事务完整的一批logic-wal，而是随时发送logic-wal，即使事务未提交。可解决发布端、订阅端负载不均衡的问题。&lt;/p>
&lt;p>但是，在订阅端，tpcc场景，发布端400+postgres进程执行事务，订阅端1个apply-worker进程回放日志，仍是瓶颈。&lt;/p>
&lt;h3 id="版本四订阅端并行回放">版本四：订阅端并行回放&lt;/h3>
&lt;p>在postgrsql 16版本，针对订阅端回放日志阶段，进行了优化，引入多个apply进程，并行回放logic-wal。方案设计如下：&lt;/p>
&lt;p>&lt;img alt="pg-16" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/PostgreSQL/3-13-replication/pg-16.png">&lt;/p>
&lt;h3 id="版本五并行复制">版本五：并行复制&lt;/h3>
&lt;ul>
&lt;li>结论：本需求参考性能测试结果，认为需同时结合：并行解码、流式复制、并行回放机制，才能提升逻辑复制端到端性能。&lt;/li>
&lt;li>优先级：其中，流式复制、并行回放机制，对性能影响较大，优先级较高。可独立地、优先地实现。&lt;/li>
&lt;li>其他工作：同时采用上述3个机制，需合理控制发布端解码速率、订阅端回放速率，在实现负载均衡的同事，避免logic-wal堆积。&lt;/li>
&lt;/ul>
&lt;h1 id="2-设计分析">2 设计分析&lt;/h1>
&lt;h2 id="21-必要性">2.1 必要性&lt;/h2>
&lt;p>根据postgrsql-16的性能测试结果，流式复制和并行回放机制，可达到70Mb/s的复制速度。&lt;/p>
&lt;h3 id="一测试场景">一、测试场景&lt;/h3>
&lt;ul>
&lt;li>测试机器：
&lt;ul>
&lt;li>IP：172.16.103.90&lt;/li>
&lt;li>硬件：CPU：鲲鹏920-ARM-128核。缓存L1-L2-L3：8M/64M/256M。内存：760G。磁盘：NVME&lt;/li>
&lt;li>系统：openEuler&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>tpcc测试场景（为了快速测试，不太标准）
&lt;ul>
&lt;li>数据量：100 warhouse&lt;/li>
&lt;li>并发：400&lt;/li>
&lt;li>执行时间：1 min&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>逻辑复制配置：
&lt;ul>
&lt;li>部署：发布端、订阅端在同一台机器（找不到2台性能机）&lt;/li>
&lt;li>订阅：创建1个publiction，涵盖所有table&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="二测试数据">二、测试数据&lt;/h2>
&lt;p>由于机器、时间等限制，测试未严格控制变量，但是，和准确结果应该有80%以上符合度。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>版本&lt;/th>
&lt;th>配置&lt;/th>
&lt;th>tpmc&lt;/th>
&lt;th>发布端-wal写入速度&lt;/th>
&lt;th>逻辑复制速度（峰值）&lt;/th>
&lt;th>逻辑复制速度（平均值）&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>postgrsql-14&lt;/td>
&lt;td>串行解码、非流式复制、串行回放&lt;/td>
&lt;td>约65w&lt;/td>
&lt;td>207 Mb/s&lt;/td>
&lt;td>-&lt;/td>
&lt;td>16 Mb/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>postgresql-16&lt;/td>
&lt;td>串行解码、流式复制、串行回放&lt;/td>
&lt;td>约65w&lt;/td>
&lt;td>212 Mb/s&lt;/td>
&lt;td>117 Mb/s&lt;/td>
&lt;td>55 Mb/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>postgresql-16&lt;/td>
&lt;td>串行解码、流式复制、并行回放(4)&lt;/td>
&lt;td>约65w&lt;/td>
&lt;td>197 Mb/s&lt;/td>
&lt;td>113 Mb/s&lt;/td>
&lt;td>71 Mb/s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;ul>
&lt;li>测试：贾旭辉&lt;/li>
&lt;li>详细数据和结论见wiki：&lt;a href="https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007526">https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007526&lt;/a>&lt;/li>
&lt;/ul>&lt;/blockquote>
&lt;ul>
&lt;li>尝试修改源码，让订阅端只接受日志，不apply，确定发布端解码和发送的瓶颈，但是，测试结果有点奇怪，有空再继续。&lt;/li>
&lt;/ul>
&lt;h2 id="22-可行性">2.2 可行性&lt;/h2>
&lt;ul>
&lt;li>并行解码：openGauss已引入&lt;/li>
&lt;li>流式复制：postgreql-16版本已成熟&lt;/li>
&lt;li>并行回放：postgreql-16版本已成熟&lt;/li>
&lt;/ul>
&lt;h2 id="23-潜在风险">2.3 潜在风险&lt;/h2>
&lt;h3 id="一数据有一致性">一、数据有一致性&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>写写冲突&lt;/p></description></item><item><title>PostgreSQL 3-13 Publication</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-publication/</link><pubDate>Thu, 28 Aug 2025 16:18:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-13-publication/</guid><description>&lt;h1 id="1-逻辑复制背景">1 逻辑复制背景&lt;/h1>
&lt;h2 id="11-逻辑复制场景">1.1 逻辑复制场景&lt;/h2>
&lt;p>在使用数据库时，为提高整个系统的可靠性，或实现不同部门数据同步等场景，很多客户的部署模型存在：一主多备、异构数据库等特点，在保证性能的前提下，常见部署模型如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------+ sql +---------------------+ wal +--------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> application &lt;span class="p">|&lt;/span> --------&amp;gt; &lt;span class="p">|&lt;/span> postgresql &lt;span class="o">(&lt;/span>master&lt;span class="o">)&lt;/span> &lt;span class="p">|&lt;/span> -------&amp;gt; &lt;span class="p">|&lt;/span> postgresql &lt;span class="o">(&lt;/span>slave&lt;span class="o">)&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------+ +---------------------+ +--------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span> decoded-wal +--------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +---------------------&amp;gt; &lt;span class="p">|&lt;/span> mysql, oracle, .. &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +--------------------+
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="12-逻辑复制功能">1.2 逻辑复制功能&lt;/h2>
&lt;h2 id="13-逻辑复制基础">1.3 逻辑复制基础&lt;/h2>
&lt;p>首先，需自行了解一些存储的基本知识，包括事务特性、mvcc机制，表的物理存储格式：filenode、page、tuple等。&lt;br>
此处，以一个例子，介绍什么wal日志的特点。需了解一些&lt;/p>
&lt;ol>
&lt;li>
&lt;p>应用执行事务&lt;br>
假设同一时间，有2个事务，事务id分别为10和11。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>时间&lt;/th>
&lt;th>应用1&lt;/th>
&lt;th>应用2&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>0&lt;/td>
&lt;td>CREATE TABLE t1 (c1 INT,c2 INT)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>CREATE TABLE t2 (c1 INT,c2 INT)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>BEGIN (xid=10)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>INSERT INTO t1 VALUES(10, 1)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>-&lt;/td>
&lt;td>BEGIN (xid=11)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>-&lt;/td>
&lt;td>INSERT INTO t1 VALUES (11, 1)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>INSERT INTO t2 VALUES (10, 2)&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>COMMIT&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>-&lt;/td>
&lt;td>DELETE FROM t1 WHERE c1 = 10&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9&lt;/td>
&lt;td>-&lt;/td>
&lt;td>INSERT INTO t2 VALUES (11, 2)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10&lt;/td>
&lt;td>-&lt;/td>
&lt;td>COMMIT&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;p>内核产生wal日志&lt;br>
所有表的wal日志，按生成wal的顺序，组织在一起。上述示例中，产生的wal如下：（此处仅列举关键信息）&lt;/p></description></item><item><title>海量 11 需求 逻辑复制性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/11-requirement-logical-replication/</link><pubDate>Fri, 06 Feb 2026 14:30:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/11-requirement-logical-replication/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>&lt;strong>逻辑复制&lt;/strong>是一种在多个数据库实例之间复制数据的功能，通常用于从一个数据库实例中，将针对指定表的insert、delete、update等写操作，复制到其他另一个数据库实例。在数据库术语中，统一称逻辑复制的发送方为&lt;strong>发布端&lt;/strong>，称接收方为&lt;strong>订阅端&lt;/strong>。Oracle、Postgresql、Vastbase等数据库产品，均提供逻辑复制功能。&lt;/p>
&lt;p>当前版本，逻辑复制性能较低，以tpcc场景为例，发布端40w tmpc时，订阅端的复制速度约10m/s。在滚动升级等场景，通过逻辑复制在不同实例间同步大量数据，要求逻辑复制性能达到70-100m/s。&lt;/p>
&lt;p>发布端、订阅端均存在性能瓶颈，均需要优化。但是，由于交付时间较短，以及订阅端方案仍有瑕疵等因素，本版本交付发布端性能优化，下版本交付订阅端性能优化。&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>本文主要用于向开发、测试等角色，介绍G100 3.0.9 psu2及之后版本，逻辑复制的性能优化的设计方向与使用方法。&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>发布端：逻辑复制场景，发送数据方。&lt;/li>
&lt;li>订阅端：逻辑复制场景，接收数据方。&lt;/li>
&lt;/ul>
&lt;h2 id="13-参考资料">1.3 参考资料&lt;/h2>
&lt;ul>
&lt;li>Vastbase G100产品文档中逻辑复制使用介绍：&lt;a href="https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6">https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-g100审计功能重构">2 G100审计功能重构&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;h3 id="需求背景逻辑复制使用">需求背景：逻辑复制使用&lt;/h3>
&lt;p>使用逻辑复制的流程如下：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>发布端：配置逻辑复制&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置wal日志详细级别，设计身份等参数，重启集群&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$PGDATA&lt;/span> -c &lt;span class="s1">&amp;#39;wal_level=logical&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$PGDATA&lt;/span> -h &lt;span class="s2">&amp;#34;host all all 0.0.0.0/0 md5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gs_guc &lt;span class="nb">set&lt;/span> -D &lt;span class="nv">$PGDATA&lt;/span> -h &lt;span class="s2">&amp;#34;host replication all 0.0.0.0/0 md5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vb_ctl restart -D &lt;span class="nv">$PGDATA&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>发布端：创建表&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">INT&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">c2&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>发布端：创建发布，即指定哪些表需复制&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PUBLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pub1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FOR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pt1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">pt2&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>发布端：创建逻辑复制槽，用于存储复制状态等信息&lt;/p></description></item><item><title>海量 15 设计 逻辑复制性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/15-design-logical-replication/</link><pubDate>Wed, 06 May 2026 17:48:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/15-design-logical-replication/</guid><description>&lt;h1 id="1-逻辑复制性能优化">1 逻辑复制性能优化&lt;/h1>
&lt;h2 id="11-功能简述">1.1 功能简述&lt;/h2>
&lt;ul>
&lt;li>原理：&lt;br>
假设，发布端执行&lt;code>INSERT INTO t1 VALUES(1,'data1')&lt;/code>，更改1行数据，产生1条wal日志。逻辑复制功能将读取这条wal，解码并生成1条message，将message发送至订阅端。订阅端应用这条message，等价于重新执行&lt;code>INSERT INTO t1 VALUES(1,'data1')&lt;/code>。 &lt;img alt="rep" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/15-design-logical-replication/rep.png">&lt;/li>
&lt;li>问题：&lt;br>
308.1 psu1以及之前版本，逻辑复制性能较低。以tpcc场景为例，40w tmpc时，发布端产生wal日志速度约100m/s，订阅端的复制速度约10+m/s。&lt;/li>
&lt;li>客户：&lt;br>
滚动升级场景中，备机停机升级，主机持续执行业务，备机升级后使用逻辑复制追赶主机数据。长存客户场景，主机产生wal日志速度约40-50m/s，旧版本逻辑复制速度10+m/s，由于逻辑复制速度太慢，备机无法追赶主机，最终导致升级失败。&lt;/li>
&lt;li>优化&lt;br>
本需求设计与实现并行逻辑复制机制，大幅提高逻辑复制速度，在上述场景中，订阅端速度可达到70-90m/s。并行逻辑复制分为3个关键子机制：
&lt;ol>
&lt;li>发布端多线程并行解码&lt;/li>
&lt;li>发布端与订阅端流复制传输协议&lt;/li>
&lt;li>订阅端多线程并行应用&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h2 id="12-实现方案">1.2 实现方案&lt;/h2>
&lt;p>本章分3个章节，分别介绍3个关键子机制。&lt;/p>
&lt;h3 id="121-发布端并行解码机制">1.2.1 发布端并行解码机制&lt;/h3>
&lt;p>在旧版本中，发布端采用串行解码机制，只有1个walsender线程，串行执行：1次读取1条wal日志，解码1条wal生成1条message，缓存或发送message。&lt;/p>
&lt;p>旧版本代码中，发布端有实现并行解码的代码，但是，无法直接使用，订阅端只能是工具，不能是数据库实例，且存在大量问题。本需求基于旧版本并行解码，实现权限的并行解码机制。&lt;/p>
&lt;p>并行解码机制，将启动多个线程，包括1个reader、多个decoder、1个walsender，它们的功能如下：&lt;/p>
&lt;ul>
&lt;li>reader：1次读取1条wal日志，将wal发送给decoder&lt;/li>
&lt;li>decoder：1次接收1条reader发送的wal，解码生成message，将message发送给walsender&lt;/li>
&lt;li>walsender：1次接收1条decoder发送的message，将message发送给订阅端&lt;/li>
&lt;/ul>
&lt;p>线程架构图如下：&lt;/p>
&lt;p>&lt;img alt="pa-pub" loading="lazy" src="https://my-blog.j8465383071.workers.dev/images/ProjectDocs/15-design-logical-replication/pa-pub.png">&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">lsn 1-10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> d1 &lt;span class="m">1&lt;/span> &lt;span class="m">4&lt;/span> collect 阻塞 &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> d2 &lt;span class="m">2&lt;/span> &lt;span class="m">5&lt;/span> &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> d3 &lt;span class="m">3&lt;/span> &lt;span class="m">6&lt;/span> &lt;span class="m">3&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="122-发布端与订阅端流复制协议">1.2.2 发布端与订阅端流复制协议&lt;/h3>
&lt;h4 id="一握手阶段">一、握手阶段&lt;/h4>
&lt;p>订阅端与发布端建立连接时，订阅端会根据CRETE SUBSCRIPTION语法设置的参数，生成连接命令，根据连接命令，发布端和订阅端决定采用哪种通信协议，究竟是采用事务复制协议（旧版本）还是流复制协议（新版本）。&lt;/p>
&lt;h5 id="事务复制协议旧版本">事务复制协议（旧版本）&lt;/h5>
&lt;p>订阅端发送的连接命令如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SLOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;$slot_name&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGICAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">start_lsn&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proto_version&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">publication_names&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;$publication_name&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="流复制协议新版本">流复制协议（新版本）&lt;/h5>
&lt;p>如果CRETE SUBSCRIPTION时，指定worker_number&amp;gt;1，即启用并行逻辑复制机制，将使用新的连接命令，订阅端发送的连接命令如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_REPLICATION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SLOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;$slot_name&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LOGICAL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$&lt;/span>&lt;span class="n">start_lsn&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proto_version&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">publication_names&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;$publication_name&amp;#34;&amp;#39;&lt;/span>&lt;span class="err">，&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">streaming&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;extreme&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">parallel&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">num&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;20&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">max&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">recordbuffer&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">memory&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;100&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">max&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">txn&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">memory&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;100&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上述命令中新增了多个参数：&lt;/p></description></item><item><title>海量 15 需求 逻辑复制性能优化</title><link>https://my-blog.j8465383071.workers.dev/posts/projectdocs/15-requirement-logical-replication/</link><pubDate>Wed, 06 May 2026 10:05:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/projectdocs/15-requirement-logical-replication/</guid><description>&lt;h1 id="1-简介">1 简介&lt;/h1>
&lt;h2 id="11-目的">1.1 目的&lt;/h2>
&lt;p>&lt;strong>逻辑复制&lt;/strong>是一种在多个数据库实例之间复制数据的功能，通常用于从一个数据库实例中，将针对指定表的insert、delete、update等写操作，复制到其他另一个数据库实例。在数据库术语中，统一称逻辑复制的发送方为&lt;strong>发布端&lt;/strong>，称接收方为&lt;strong>订阅端&lt;/strong>。Oracle、Postgresql、Vastbase等数据库产品，均提供逻辑复制功能。&lt;/p>
&lt;p>当前版本，逻辑复制性能较低。以tpcc场景为例，发布端40w tmpc时，产生wal日志速度约100+m/s，订阅端的复制速度约10+m/s。在滚动升级场景，主机和备机可能是不同的产品版本，主备复制数据时，不能使用物理复制，只能使用逻辑复制。在长存客户场景中，主机产生wal日志速度在50+m/s左右，备机使用逻辑复制，复制速度约10+m/s，备机将追赶不上主机进度，导致滚动升级失败。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">主a 备b 备c
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-----------------------+---------------------------+-----------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="nv">1&lt;/span> &lt;span class="o">==&lt;/span>&amp;gt;执行业务
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">2&lt;/span> 开始滚动升级，暂停流复制 &lt;span class="nv">lag&lt;/span>&lt;span class="o">=&lt;/span>400M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">3&lt;/span> 暂停流复制（物理复制）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">4&lt;/span> 创建逻辑复制槽 &lt;span class="nv">lsn1&lt;/span>&lt;span class="o">=&lt;/span>1G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">5&lt;/span> 恢复流复制
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">6&lt;/span> 物理复制追赶，到逻辑复制槽
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">6&lt;/span> 开始单节点升级
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">7&lt;/span> &lt;span class="o">[&lt;/span>升级&lt;span class="o">]&lt;/span> 停止进程
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="o">[&lt;/span>升级&lt;span class="o">]&lt;/span> 替换二进制等
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">9&lt;/span> &lt;span class="o">[&lt;/span>升级&lt;span class="o">]&lt;/span> 启动进程
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">10&lt;/span> 单节点升级成功
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">11&lt;/span> 持续执行业务 &lt;span class="nv">lsn2&lt;/span>&lt;span class="o">=&lt;/span>2G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">12&lt;/span> 创建订阅，启动逻辑复制，lsn1&lt;span class="o">=&lt;/span>1G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">13&lt;/span> 逻辑复制开始追赶（初始差距：lsn2-lsn1&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">14&lt;/span> 持续执行业务 &lt;span class="nv">lsn3&lt;/span>&lt;span class="o">=&lt;/span>2.5G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">15&lt;/span> 逻辑复制持续追赶 &lt;span class="nv">lsn&lt;/span>&lt;span class="o">=&lt;/span>1.6G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">16&lt;/span> &lt;span class="o">(&lt;/span>可重置lag&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">17&lt;/span> 差距持续缩小（从lsn2-lsn1降低到lag）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">18&lt;/span> 发送停机命令
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">19&lt;/span> 停止业务
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">|&lt;/span>&lt;span class="m">20&lt;/span> 差距持续缩小，从lag缩小至0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>&lt;span class="m">21&lt;/span> 停止进程成功
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此，需大幅提高逻辑复制速度，在长存客户场景中，逻辑复制速度至少需达到70+m/s。目前，发布端、订阅端均存在性能瓶颈，均需要优化。&lt;/p>
&lt;h2 id="12-适用范围">1.2 适用范围&lt;/h2>
&lt;p>G100 3.0.9 psu2及之后版本&lt;/p>
&lt;h2 id="13-术语定义首字母缩写词和缩略语">1.3 术语定义、首字母缩写词和缩略语&lt;/h2>
&lt;ul>
&lt;li>发布端：逻辑复制场景，发送数据方。&lt;/li>
&lt;li>订阅端：逻辑复制场景，接收数据方。&lt;/li>
&lt;/ul>
&lt;h2 id="14-参考资料">1.4 参考资料&lt;/h2>
&lt;ul>
&lt;li>Vastbase G100产品文档中逻辑复制使用介绍：&lt;a href="https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6">https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6&lt;/a>&lt;/li>
&lt;li>oracle goldengate并行复制：&lt;a href="https://oracle.hydrogen.sagittarius.connect.product.adaptavist.com/en/database/goldengate/core/26/coredoc/replicat-parallel-replicat.html#GUID-F1CD8E03-8DA1-4A78-95D3-C0516F1DA09A">https://oracle.hydrogen.sagittarius.connect.product.adaptavist.com/en/database/goldengate/core/26/coredoc/replicat-parallel-replicat.html#GUID-F1CD8E03-8DA1-4A78-95D3-C0516F1DA09A&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="2-逻辑复制性能优化">2 逻辑复制性能优化&lt;/h1>
&lt;h2 id="21-功能简述">2.1 功能简述&lt;/h2>
&lt;h3 id="一逻辑复制使用示例">一、逻辑复制使用示例&lt;/h3>
&lt;p>使用逻辑复制，可概括为3个阶段：&lt;/p></description></item></channel></rss>