<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pgpoo-ll 4.6 &#8211; SRA OSS Tech Blog</title>
	<atom:link href="https://www.sraoss.co.jp/tech-blog/tag/pgpoo-ll-4-6/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<description>OSS専門の技術ブログ。PostgreSQL、Zabbixを中心に10種類以上のOSSの解説、アップデート情報、運用ヒントを提供。</description>
	<lastBuildDate>Wed, 04 Nov 2026 06:52:59 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/07/blog-icon-150x150.png</url>
	<title>Pgpoo-ll 4.6 &#8211; SRA OSS Tech Blog</title>
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pgpool-II 4.6 の紹介</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-6/</link>
		
		<dc:creator><![CDATA[越野 太基 (Taiki Koshino)]]></dc:creator>
		<pubDate>Mon, 23 Jun 2025 05:00:22 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[OSS]]></category>
		<category><![CDATA[Pgpoo-ll 4.6]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=17518</guid>

					<description><![CDATA[2025 年 2 月 28 日、Pgpool-II の新しいメジャーバージョン 4.6 がリリースされました。 Pgpool-II 4.6 では、ロギングコレクター、クエリキャッシュの機能強化がされました。また、バックエ ...]]></description>
										<content:encoded><![CDATA[<p>2025 年 2 月 28 日、Pgpool-II の新しいメジャーバージョン 4.6 がリリースされました。</p>
<p>Pgpool-II 4.6 では、ロギングコレクター、クエリキャッシュの機能強化がされました。また、バックエンドからのメッセージのログ機能の搭載、PostgreSQL 17 への対応、Watchdog の IPv6 への対応も行われました。</p>
<p>Pgpool-II 4.6 の新機能及び変更点は Pgpool-II 公式ドキュメントの以下のページに記載されています。</p>
<p><a href="https://www.pgpool.net/docs/46/ja/html/release-4-6-0.html" target="_blank" rel="noopener">Pgpool-II 4.6 リリースノート</a></p>
<p>本記事では、これらの新機能について詳しく紹介します。</p>
<p><span id="more-17518"></span></p>
<h3>ログのローテーションを指示する新しい PCP コマンド</h3>
<p>Pgpool-II には、PostgreSQL のロギングコレクター(logging_collector) と同様のログ収集機能が備わっています。</p>
<p>ロギングコレクターを使ってログを収集する場合、これまではロギングコレクターにシグナルを送ることでしかログのローテーションを行えませんでしたが、pcp_log_rotate コマンドを使用することで Pgpool-II のログファイルを簡単にローテーションできるようになりました。</p>
<p>動作確認のための設定例は以下の通りです。</p>
<pre><code>(pgpool.conf 設定例)
log_destination = 'stderr' 
logging_collector = on 
log_directory = '/var/log/pgpool_log' 
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'</code></pre>
<p><code>log_directory</code> で指定したディレクトリを確認すると、現時点でのログが出力されていることが確認できます。</p>
<pre><code>[root@server1 ~]# ls -l /var/log/pgpool_log/
合計 4
-rw-------. 1 postgres postgres 193 6月 9 16:21 pgpool-2025-06-09_162145.log</code></pre>
<p>その後、 <code>pcp_log_rotate</code> を実行することで新しいログファイルへとローテートされていることが確認できます。</p>
<pre><code>[root@server1 ~]# pcp_log_rotate -h 192.168.100.50  -p 9898 -U pgpool -W
Password:
pcp_log_rotate -- Command Successful

[root@server1 ~]# ls -l /var/log/pgpool_log/
合計 8
-rw-------. 1 postgres postgres 284 6月 9 16:21 pgpool-2025-06-09_162145.log
-rw-------. 1 postgres postgres 193 6月 9 16:21 pgpool-2025-06-09_162159.log</code></pre>
<p>また <code>-s scope</code> オプションによってコマンドの与える影響範囲を指定することができます。サポートされているコマンドスコープは以下です。(デフォルトは <code>local</code>)</p>
<ul>
<li><code>c, cluster</code> : クラスタを構成するすべての Pgpool-II のログファイルをローテーションします。</li>
<li><code>l, local</code> : ローカル Pgpool-II のログファイルをローテーションします。</li>
</ul>
<h3>リロードによる logging_collector 関連のパラメータの変更</h3>
<p><a href="https://www.pgpool.net/docs/46/ja/html/runtime-config-logging.html#GUC-LOGGING-COLLECTOR" target="_blank" rel="noopener">logging_collector</a> 関連の以下の設定パラメータの変更が、Pgpool-II のリロードで反映されるようになりました。これにより <code>logging_collector</code> の設定の反映のために Pgpool-II の再起動の必要がなくなりました。</p>
<ul>
<li><code>log_truncate_on_rotation</code></li>
<li><code>log_directory</code></li>
<li><code>log_filename</code></li>
<li><code>log_rotation_age</code></li>
<li><code>log_rotation_size</code></li>
<li><code>log_file_mode</code></li>
</ul>
<p>リロードで設定が反映されるかの動作確認として <code>log_filename</code> の値を変更したうえで <code>pcp_log_rotate</code> コマンドを実行してログファイルの名前が変更されて出力されるかを確認します。</p>
<p>まず、pgpool.conf を以下の設定に変更し、 Pgpool-II をリロードします。</p>
<pre><code>[root@server1 ~]# vi /etc/pgpool-II/pgpool.conf
#log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_filename = 'pgpool-%a.log'

[root@server1 ~]# systemctl reload pgpool.service</code></pre>
<p>その後 <code>pcp_rotate_log</code> コマンドを実行すると出力されるログファイルの名前が変更されていることが確認できます。</p>
<pre><code>[root@server1 ~]# ls -l /var/log/pgpool_log/
合計 8
-rw-------. 1 postgres postgres 284  6月 12 09:51 pgpool-2025-06-12_095140.log
-rw-------. 1 postgres postgres 193  6月 12 09:51 pgpool-2025-06-12_095142.log

[root@server1 ~]# pcp_log_rotate -U pgpool -W -h 192.168.100.50
Password:
pcp_log_rotate -- Command Successful
[root@server1 ~]# ls -l /var/log/pgpool_log/
合計 12
-rw-------. 1 postgres postgres 284  6月 12 09:51 pgpool-2025-06-12_095140.log
-rw-------. 1 postgres postgres 411  6月 12 09:52 pgpool-2025-06-12_095142.log
-rw-------. 1 postgres postgres 361  6月 12 09:52 pgpool-Thu.log</code></pre>
<h3>クエリキャッシュの強制的な作成</h3>
<p><a href="https://www.pgpool.net/docs/latest/ja/html/runtime-in-memory-query-cache.html" target="_blank" rel="noopener">クエリキャッシュ</a>は <code>SELECT</code> クエリの実行結果を共有メモリに保存し、同じクエリ(パラメータ、データベース、ユーザ含む)が実行されたら、結果を再利用する機能です。PostgreSQL にアクセスせず、ディスクアクセスもないので極めて高速に問い合わせ結果を返すことができます。</p>
<p>Pgpool-II では、クエリキャッシュは通常自動的に作成されますが、安全性の観点から、immutable でない関数を含むクエリ (たとえば <code>SELECT now();</code>) はキャッシュされない仕様になっています。</p>
<p>以下の実行例では、クエリを実行するたびに結果が変化していることがわかります。</p>
<pre><code>postgres=&gt; SELECT now();
now
-------------------------------
2025-06-12 17:10:27.241885+09
(1 行)

postgres=&gt; SELECT now();
now
-------------------------------
2025-06-12 17:10:29.156295+09
(1 行)</code></pre>
<p>また、ログからも毎回 PostgreSQL にアクセスしていることが確認できます。</p>
<pre><code>2025-06-12 17:10:27.241: psql pid 2628: LOG: DB node id: 1 backend pid: 2644 statement: SELECT now();
2025-06-12 17:10:29.155: psql pid 2628: LOG: DB node id: 1 backend pid: 2644 statement: SELECT now();</code></pre>
<p>それでも、内容を理解したうえでキャッシュを行いたいユースケースが存在することから、今回のリリースではクエリキャッシュを強制的に作成する機能が追加されました。クエリの先頭に <code>/*FORCE QUERY CACHE*/</code> を付けて実行することで、クエリキャッシュを強制的に作成できるようになります。</p>
<p>以下のようにクエリを実行することで、キャッシュされた時点のタイムスタンプが返されていることが確認できます。このキャッシュは Pgpool-II を再起動するまで保持されます。</p>
<pre><code>postgres=&gt; /*FORCE QUERY CACHE*/SELECT now();
now
------------------------------
2025-06-12 17:14:47.297804+09
(1 行)

postgres=&gt; /*FORCE QUERY CACHE*/SELECT now();
now
------------------------------
2025-06-12 17:14:47.297804+09
(1 行)</code></pre>
<p>さらに、ログにもキャッシュが利用されていることが記録されています。</p>
<pre><code>2025-06-12 17:14:47.297: psql pid 2621: LOG: DB node id: 0 backend pid: 2901 statement: /*FORCE QUERY CACHE*/SELECT now(); 
2025-06-12 17:14:50.138: psql pid 2621: LOG: fetch from memory cache 
2025-06-12 17:14:50.138: psql pid 2621: DETAIL: query result fetched from cache. statement: /*FORCE QUERY CACHE*/SELECT now();</code></pre>
<p>また <code>/*NO QUERY CACHE*/</code> を冒頭に付記して宣言しても、 宣言したクエリキャッシュを削除することは出来ません。 <code>/*NO QUERY CACHE*/</code> はキャッシュエントリが作成されないようにするだけなためです。</p>
<p>Pgpool-II を再起動することなく作成したクエリを削除する場合は、後述する <code>PGPOOL SET CACHE DELETE</code> コマンドか、<code>pcp_invalidate_query_cache</code> コマンドを使用する必要があります。</p>
<h3>新しい PGPOOL SET CACHE DELETE コマンド</h3>
<p class="SYNOPSIS">登録されているクエリキャッシュを削除する <a href="https://www.pgpool.net/docs/46/ja/html/sql-pgpool-set-cache.html" target="_blank" rel="noopener"><code>PGPOOL SET CACHE DELETE</code></a> コマンドが追加されました。引数としてクエリの文字列を渡すことによってクエリキャッシュを指定して削除することができます。</p>
<pre><code>postgres=&gt; /*FORCE QUERY CACHE*/SELECT now();
              now
-------------------------------
 2025-06-12 09:58:49.983346+09
(1 行)

postgres=&gt; PGPOOL SET CACHE DELETE '/*FORCE QUERY CACHE*/SELECT now();';
NOTICE:  query cache deleted. query: "/*FORCE QUERY CACHE*/SELECT now();"
SET
postgres=&gt; /*FORCE QUERY CACHE*/SELECT now();
              now
-------------------------------
 2025-06-12 09:59:32.998492+09
(1 行)</code></pre>
<p>引数に記述するクエリキャッシュはクエリ文字列は、末尾の<tt>「;」</tt>も含めて以前のクエリと完全に一致していなければならず、一致しない場合は以下エラーとなります。</p>
<pre><code>postgres=&gt; PGPOOL SET CACHE DELETE '/*FORCE QUERY CACHE*/SELECT now()'; -- 末尾の ';' が不足
NOTICE: query cache does not exist for query: "/*FORCE QUERY CACHE*/SELECT now()" -- クエリキャッシュが存在しないエラーとなる
SET</code></pre>
<h3>クエリキャッシュを削除する新しい PCP コマンド</h3>
<p>すべてのクエリキャッシュを削除する PCP コマンド、<a href="https://www.pgpool.net/docs/46/ja/html/pcp-invalidate-query-cache.html" target="_blank" rel="noopener"><code>pcp_invalidate_query_cache</code></a> が追加されました。</p>
<p>今までは、クエリキャッシュの削除は Pgpool-II の再起動が必要でしたが、このコマンドを実行することによって Pgpool-II を再起動することなくクエリキャッシュを削除することができます。</p>
<p>「<code>/*FORCE QUERY CACHE*/</code>」で 「<code>SELECT now();</code>」 クエリをキャッシュします。</p>
<pre><code>postgres=&gt; /*FORCE QUERY CACHE*/SELECT now();
now
-------------------------------
2025-06-09 13:50:37.066191+09
(1 行)</code></pre>
<p>その後、<tt> </tt><tt class="COMMAND"> <code>pcp_invalidate_query_cache</code> を実行すると、</tt>クエリキャッシュを削除することができます。</p>
<pre><code>[postgres@server1 ~]$ pcp_invalidate_query_cache -h 192.168.100.50 -p 9898 -U pgpool -W
Password:
pcp_invalidate_query_cache -- Command Successful

postgres=&gt; /*FORCE QUERY CACHE*/SELECT now(); -- クエリキャッシュが削除されているため再作成となる
now
-------------------------------
2025-06-09 13:50:56.561619+09
(1 行)</code></pre>
<h3>新しい設定パラメータ log_backend_messages</h3>
<p>バックエンドからのメッセージログを出力する <a href="https://www.pgpool.net/docs/46/ja/html/runtime-config-logging.html#GUC-LOG-BACKEND-MESSAGES" target="_blank" rel="noopener"><code>log_backend_messages</code></a> パラメータが追加されました。<code>terse</code> または <code>verbose</code> に設定されている場合、バックエンドからのメッセージをログ出力します。</p>
<p>以下が受け取るメッセージ例です。</p>
<pre class="PROGRAMLISTING"><code>2025-06-09 14:00:57.494: psql pid 7579: LOG: last ParameterStatus message from backend 0 repeated 13 times</code></pre>
<p><tt class="LITERAL"><code>terse</code> </tt>では、同じ種類のメッセージが同じバックエンドから送られてくると、その回数を記録し、次に異なる種類のメッセージが送られてきた時に繰り返し回数を報告します。そのため、繰り返している最中にセッションに対応するプロセスが強制終了すると、その分のログが出力されません。この場合でもすべてのログを出力するには、 <tt class="LITERAL"><code>verbose</code></tt> オプションを使用します。<br />
<code></code></p>
<p><code>verbose</code> に設定したときのログ出力例は以下です。同一内容のメッセージであっても送られてくるたびに出力するためプロセスの強制終了によるログの損失は避けられますが、大量のメッセージがバックエンドから送られてくる場合は注意が必要です。</p>
<pre><code>2025-06-09 13:58:16.390: child pid 7263: LOG: ParameterStatus message from backend 0
2025-06-09 13:58:16.390: child pid 7263: LOG: ParameterStatus message from backend 0
2025-06-09 13:58:16.390: child pid 7263: LOG: ParameterStatus message from backend 0</code></pre>
<h3>PostgreSQL 17 の SQL パーサの導入</h3>
<p>Pgpool-II ではメジャーリリースするたびに、PostgreSQL の最新パーサを移植しています。今回のリリースでは PostgreSQL 17 の新しいパーサを取り込みました。</p>
<p>Pgpool-II の負荷分散機能では、SQL を解析して参照か更新かを判別し、どのノードに振り分けるかを決めています。そのため、PostgreSQL の新バージョンでの SQL の変更に対応するには、SQL パーサを移植する必要があります。</p>
<p>PostgreSQL 17 での SQL のおもな変更点は以下のとおりです。</p>
<ul>
<li><code>MERGE</code> への <code>NOT MATCHED BY SOURCE</code> と <code>RETURNING</code> 句の追加</li>
<li><code>COPY</code> オプションの <code>ON_ERROR ignore</code> と <code>LOG_VERBOSITY</code> の追加</li>
<li><code>COPY FROM</code> オプションの <code>FORCE_NOT_NULLとFORCE_NULL</code> で「*」 を使用した全列を指定できる機能の追加</li>
<li><code>EXPLAIN</code> への <code>SERIALIZE</code> と <code>MEMORY</code> オプションの追加</li>
<li><code>ALTER TABLE</code> で <code>SET STATISTICS DEFAULT</code> を用いて、デフォルトの統計上情報ターゲットとする列の指定できる機能の追加</li>
<li><code>ALTER TABLE</code> での列の生成式を変更する機能の追加</li>
<li><code>ALTER TABLE</code> で <code>.. SET ACCESS METHOD</code> のデフォルトを指定できる機能の追加</li>
<li>イベントトリガでログインイベントと <code>REINDEX</code>  を扱う機能の追加</li>
</ul>
<p>Pgpool-II 4.6 では上記の変更点に対応しています。</p>
<h3>Watchdog の hostname と heartbeat_hostname パラメータの IPv6 対応</h3>
<p>これまで、IPv6 に対応していたパラメータは以下の通りです。</p>
<ul>
<li><code>backend_hostnameX</code></li>
<li><code>listen_addresses</code></li>
<li><code> pcp_listen_addresses</code></li>
</ul>
<p>一方で、以下の Watchdog 関連パラメータはこれまで IPv6 に対応していませんでした。</p>
<ul>
<li><code><code>hostname</code></code></li>
<li><code><code>heartbeat_hostname</code></code></li>
</ul>
<p>今回のリリースにより、<code>hostname</code> と <code>heartbeat_hostname</code> も IPv6 に対応し、すべてのネットワーク関連パラメータで IPv6 アドレスを利用できるようになりました。</p>
<h2>おわりに</h2>
<p>今回は、Pgpool-II 4.6 の新機能について紹介しました。</p>
<p>Pgpool-II 4.6 では、より実用的で便利な機能が数多く追加・改善されています。PostgreSQL の高可用性構成や負荷分散の実現を検討されている方にとって、Pgpool-II は有力な選択肢です。ぜひこの機会に Pgpool-II の導入をご検討ください。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/pgsql-mainte/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-pgsql" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、PostgreSQL/Pgpool-II のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
