<?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>Pgpool-II &#8211; SRA OSS Tech Blog</title>
	<atom:link href="https://www.sraoss.co.jp/tech-blog/category/pgpool/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>Fri, 23 Oct 2026 06:55:35 +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>Pgpool-II &#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.7 の紹介</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-7/</link>
		
		<dc:creator><![CDATA[越野 太基 (Taiki Koshino)]]></dc:creator>
		<pubDate>Wed, 25 Mar 2026 01:12:44 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[OSS]]></category>
		<category><![CDATA[Pgpool-II 4.6]]></category>
		<category><![CDATA[Pgpool-II 4.7]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=19057</guid>

					<description><![CDATA[2025 年 12 月 23 日、Pgpool-II の新しいメジャーバージョン 4.7 がリリースされました。 Pgpool-II 4.7 では、クライアント情報表示機能や、Watchdog と heartbeat r ...]]></description>
										<content:encoded><![CDATA[<p>2025 年 12 月 23 日、Pgpool-II の新しいメジャーバージョン 4.7 がリリースされました。</p>
<p>Pgpool-II 4.7 では、クライアント情報表示機能や、Watchdog と heartbeat receiver のセキュリティ強化、オンラインリカバリの機能が強化されました。また、フロントエンド/バックエンドプロトコルバージョン 3.2 サポートの追加、PostgreSQL 18 への対応も行われました。</p>
<p>Pgpool-II 4.7 の新機能及び変更点は Pgpool-II 公式ドキュメントの以下のページに記載されています。</p>
<p><a href="https://www.pgpool.net/docs/47/ja/html/release-4-7-0.html" target="_blank" rel="noopener">Pgpool-II 4.7 リリースノート</a></p>
<p>本記事では、これらの新機能について詳しく紹介します。</p>
<p><span id="more-19057"></span></p>
<h3>クライアント情報を表示するための pcp_proc_info, show pool_pools の機能強化</h3>
<p>4.6 までは Pgpool-II 経由で PostgreSQL に接続した場合、PostgreSQL 側からは各クライアントの接続情報を確認することができず、Pgpool-II のネットワークアドレスとポート番号のみしかわかりませんでした。<br />
そのため障害が起きてもどのクライアント接続で障害が発生しているのかを調査することが困難でした。</p>
<p>4.7 からは <a href="https://www.pgpool.net/docs/latest/ja/html/pcp-proc-info.html" target="_blank" rel="noopener">pcp_proc_info</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/sql-show-pool-pools.html" target="_blank" rel="noopener">show pool_pools</a> コマンドで Pgpool-II 経由で接続しているクライアントのホスト名、ポート番号、最後に実行した SQL を参照できるようになりました。</p>
<p><span class="PRODUCTNAME">Pgpool-II</span> の子プロセス情報を表示する <a href="https://www.pgpool.net/docs/latest/ja/html/pcp-proc-info.html" target="_blank" rel="noopener">pcp_proc_info</a> コマンドでは client_host(ホスト名), client_port(ポート番号), statement(最後に実行した SQL) が追加されました。</p>
<p>これにより PostgreSQL からでも Pgpool-II 経由で接続しているクライアントの接続情報や最後に実行したクエリ情報を参照できるようになり障害時などに障害が起きているクライアント接続を調査することが容易になりました。</p>
<pre>sraoss@server1:~/setuptest$ pcp_proc_info -p 50001 --verbose
Database : test
Username : sraoss
Start time : 2026-01-08 12:15:18 (0:15 before process restarting)
Client connection count : 1
Major : 3
Minor : 0
Backend connection time : 2026-01-08 12:15:18
Client connection time : 2026-01-08 12:15:18
Client idle duration : 0
Client disconnection time : 2026-01-08 12:16:38
Pool Counter : 1
Backend PID : 20250
Connected : 0
PID : 20195
Backend ID : 0
Status : Wait for connection
Load balance node : 0
client_host : 127.0.0.1
client_port : 54726
statement : SELECT 1;</pre>
<p><span class="PRODUCTNAME">Pgpool-II</span> のコネクションプールの状態を表示する <a href="https://www.pgpool.net/docs/latest/ja/html/sql-show-pool-pools.html" target="_blank" rel="noopener">show pool_pools</a> コマンドにも、client_host(ホスト名), client_port(ポート番号), statement(最後に実行した SQL) が追加されました。</p>
<p>これらの変更で子プロセスやコネクションプーリングの情報とあわせてクライアント情報を参照できるようになりました。</p>
<pre class="PROGRAMLISTING">test=# show pool_pools;
 pool_pid |                      start_time                      | client_connection_count | pool_id | backend_id | database | username | backend_connection_time | client_connection_time | client_disconnection_time | client_idle_duration | majorversion | minorversion | pool_counter | pool_backendpid | pool_connected |       status        | load_balance_node |  client_host  | client_port |  statement  
----------+------------------------------------------------------+-------------------------+---------+------------+----------+----------+-------------------------+------------------------+---------------------------+----------------------+--------------+--------------+--------------+-----------------+----------------+---------------------+-------------------+---------------+-------------+-------------
[snip]
 1336537  | 2025-06-24 10:53:35                                  | 0                       | 0       | 0          | test     |  sraoss  | 2025-06-24 10:55:58     | 2025-06-24 10:55:59    |                           | 0                    | 3            | 0            | 1            | 1336703         | 1              | Idle                | 0                 | 192.168.10.11 | 39216       | 
 1336537  | 2025-06-24 10:53:35                                  | 0                       | 0       | 1          | test     |  sraoss  | 2025-06-24 10:55:58     | 2025-06-24 10:55:59    |                           | 0                    | 3            | 0            | 1            | 1336704         | 1              | Idle                | 1                 | 192.168.10.11 | 39216       | select 1;
 1336537  | 2025-06-24 10:53:35                                  | 0                       | 1       | 0          |          |          |                         |                        |                           | 0                    | 0            | 0            | 0            | 0               | 0              | Idle                | 0                 | 192.168.10.11 | 39216       | 
 1336537  | 2025-06-24 10:53:35                                  | 0                       | 1       | 1          |          |          |                         |                        |                           | 0                    | 0            | 0            | 0            | 0               | 0              | Idle                | 0                 | 192.168.10.11 | 39216       | select 1;</pre>
<h3>pgpool_adm_pcp_proc_info 関数の追加</h3>
<p>pgpool_adm エクステンションに、Pgpool-II の子プロセスの情報を表示する <a href="https://www.pgpool.net/docs/latest/ja/html/pgpool-adm-pcp-proc-info.html" target="_blank" rel="noopener">pgool_adm_pcp_proc_info</a> 関数が追加されました。 pgpool_adm エクステンションは Pgpool-II 経由でも、あるいは直接 PostgreSQL から呼び出せる関数群です。</p>
<p><a href="https://www.pgpool.net/docs/latest/ja/html/pgpool-adm-pcp-proc-info.html" target="_blank" rel="noopener">pgool_adm_pcp_proc_info</a> で表示される情報は pcp_proc_info コマンドと同様ですが、pgpool_adm エクステンションの関数であるため 、PostgreSQL クライアントからでも呼び出せます。</p>
<p>pgpool_adm を使うメリットは、SQLが使用でき WHERE 句で条件を指定して表示内容を絞り込むことができることです。(pcp コマンドの場合は、出力結果を整形するために OS のコマンドを併用する必要があります。)</p>
<p>導入には以下コマンドで各サーバーで pgpool_adm をインストールしてください。</p>
<pre class="PROGRAMLISTING"># 各サーバーで以下を実行してインストール 
$ psql test
test=# CREATE EXTENSION pgpool_adm;</pre>
<p>その後 Pgpool-II や PostgreSQL のクライアント上で <a href="https://www.pgpool.net/docs/latest/ja/html/pgpool-adm-pcp-proc-info.html" target="_blank" rel="noopener">pgpool_adm_pcp_proc_info</a> を実行します。<br />
connected 列は接続状況を表示(0=接続なし, 1=接続中) しており、今回の例のように WHERE 句に &#8220;connected = 1&#8221; を指定することで接続中の情報に絞ることもできます。</p>
<pre class="PROGRAMLISTING">test=# select * from pcp_proc_info(host =&gt; '', port =&gt; 11001, username =&gt; 'sraoss', password =&gt; 'sraoss') where connected = '1';
-[ RECORD 1 ]-------------+----------------------------------------------------------------------------------------------------------------------------
database                  | test
username                  | sraoss
start_time                | 2026-01-08 10:56:08
client_connection_count   | 0
major                     | 3
minor                     | 0
backend_connection_time   | 2026-01-08 10:58:37
client_connection_time    | 2026-01-08 10:58:37
client_idle_duration      | 0
client_disconnection_time | 
pool_counter              | 1
backend_pid               | 14750
connected                 | 1
pid                       | 14585
backend_id                | 0
status                    | Execute command
load_balance_node         | 1
client_host               | 127.0.0.1
client_port               | 59120
statement                 | select * from pcp_proc_info(host =&gt; '', port =&gt; 11001, username =&gt; 'sraoss', password =&gt; 'sraoss') where connected = '1';</pre>
<p>また pg_stat_activity と組み合わせてより詳細な情報を表示することも可能です。<br />
以下の SQL では <a href="https://www.pgpool.net/docs/latest/ja/html/pgpool-adm-pcp-proc-info.html" target="_blank" rel="noopener">pgpool_adm_pcp_proc_info</a> とpg_stat_activity を結合して <a href="https://www.pgpool.net/docs/latest/ja/html/pgpool-adm-pcp-proc-info.html" target="_blank" rel="noopener">pgool_adm_pcp_proc_info</a> では取得できない state を pg_stat_activity をから取得しています。<br />
他にも wait_event など pg_stat_activity にしかない情報も同時に取得するなど要件に応じてクライアント情報を取得できます。</p>
<pre>test=# SELECT p.username, p.database, p.client_port, s.state, s.wait_event, s.query,
              p.pid as pgpool_pid, s.pid as backend_pid
              FROM pcp_proc_info(host =&gt; '', port =&gt; 11001,
                                 username =&gt; 'sraoss', password =&gt; 'sraoss') AS p
              JOIN pg_stat_activity AS s ON s.pid::text = p.backend_pid;
-[ RECORD 1 ]-------------+----------------------------------------------------------------------------------------------------------------------------
username                  | sraoss
 database                 |  test
 client_host              | 192.168.100.101
client_port               | 50001
state                     | active  
query                     | select 1;
pgpool_pid                | 21467
backend_pid               | 21500</pre>
<h3>ライフチェックログの改善</h3>
<p>ライフチェックが開始したとき Watchdog は ライフチェックが開始したことを知らせるログを出力します。<br />
4.6 までは正常に開始したタイミングでしかログが出力されないため、正常に動作しているかを確認するために開始ログが出るまでログを監視する必要があり、またライフチェックが正常に開始していない状況に気づくのが困難でした。</p>
<pre>LOG:  watchdog: lifecheck started</pre>
<p>4.7 からはライフチェックが開始されるまで定期的にライフチェックが開始していない警告を出力するようになり、ライフチェック開始までログファイルを監視する必要がなくなりました。<br />
間隔は wd_interval × 10 秒です。</p>
<pre><i>WARNING:  watchdog: lifecheck has not started yet</i></pre>
<h3>Watchdog と heartbeat receiver のセキュリティ強化</h3>
<p>Watchdog と heartbeat receiver が受け付けるアドレスを制限することができるようになりました。</p>
<p>4.6 まではいずれのプロセスも、ホストが持つすべてのネットワークアドレスへの接続を受け付けていました。</p>
<pre>tcp        0      0 <b>0.0.0.0:9000</b>            0.0.0.0:*     LISTEN   3583037/pgpool: watchdog
Tcp6       0      0 <b>:::9000                 </b>:::*          LISTEN   3583037/pgpool: watchdog
Udp        0      0 <b>0.0.0.0:9694</b>            0.0.0.0:*              3583050/pgpool: heartbeat receiver
udp        0      0 <b>0.0.0.0:9694</b>            0.0.0.0:*              3583044/pgpool: heartbeat receiver
udp6       0      0 <b>:::9694                 </b>:::*                   3583044/pgpool: heartbeat receiver
udp6       0      0 <b>:::9694                 </b>:::*                   3583050/pgpool: heartbeat receiver</pre>
<p>4.7 からはセキュリティ上の点から <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HOSTNAME" target="_blank" rel="noopener">hostname</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HEARTBEAT-HOSTNAME" target="_blank" rel="noopener">heartbeat_hostname</a> で指定したネットワークアドレスへのみ接続を受け付けるようになりました。</p>
<pre># pgpool.conf 設定例
hostname0 = '192.168.100.50'
wd_port0 = 9000
heartbeat_hostname0 = '192.168.100.101'
heartbeat_port0 = 9694
hostname1 = '192.168.100.60'
wd_port0 = 9000
heartbeat_hostname1 = '192.168.100.102'
heartbeat_port1 = 9694
hostname2 = '192.168.100.70'
wd_port0 = 9000
heartbeat_hostname2 = '192.168.100.103'
heartbeat_port2 = 9694</pre>
<pre>tcp        0      0 <b>192.168.100.50:</b><b>9000</b><b>    </b>0.0.0.0:*     LISTEN      41636/pgpool: watchdog
tcp        0      0 <b>192.168.100.50:</b><b>9000</b><b>    </b>0.0.0.0:*     LISTEN      41638/pgpool: watchdog
udp        0      0 <b>192.168.100.101:9694 </b>  0.0.0.0:*                 41649/pgpool: heartbeat receiver
udp        0      0 <b>192.168.100.101:9694</b>   0.0.0.0:*                 41650/pgpool: heartbeat receiver</pre>
<p>もし他ノードから <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HOSTNAME" target="_blank" rel="noopener">hostname</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HEARTBEAT-HOSTNAME" target="_blank" rel="noopener">heartbeat_hostname</a> で指定したネットワークアドレス以外へ heartbeat を送る設定とすると以下メッセージのように lifecheck に失敗します。<br />
4.7 へ移行する場合は <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HOSTNAME" target="_blank" rel="noopener">hostname</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HEARTBEAT-HOSTNAME" target="_blank" rel="noopener">heartbeat_hostname</a> で watchdog と heartbeat で LISTEN するソケットを設定し、他ノードから heartbeat を送るソケットを <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HOSTNAME" target="_blank" rel="noopener">hostname</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HEARTBEAT-HOSTNAME" target="_blank" rel="noopener">heatbeat_hostname</a> で指定したネットワークアドレスとしてください。</p>
<pre>WARNING:  watchdog: lifecheck has not started yet</pre>
<p>また 4.7. 1 ではさらに Watchdog と heartbeat それぞれについて LISTEN するソケットを個別で指定できるようになりました。<br />
これによりノード外部から見えるアドレスと、ノード内部から認識されるアドレスが異なる可能性があるコンテナ環境や、ポートフォワーディングを設定している場合でも、より柔軟に設定できるようになりました。<br />
Watchdog については <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-WD-LISTEN-ADDRESS" target="_blank" rel="noopener">wd_listen_address</a> によってネットワークアドレスを、<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-WD-LISTEN-PORT" target="_blank" rel="noopener">wd_listen_port</a> によってポートも指定することができます。<br />
heartbeat についてはそれぞれ <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-WD-HEARTBEAT-LISTEN-ADDRESSES" target="_blank" rel="noopener">wd_heartbeat_listen_addresses</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-WD-HEARTBEAT-LISTEN-PORT" target="_blank" rel="noopener">wd_heartbeat_listen_port</a> によって指定できます。<br />
これらのパラメータが設定されているとき <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HOSTNAME" target="_blank" rel="noopener">hostname</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HEARTBEAT-HOSTNAME" target="_blank" rel="noopener">heartbeat_hostname</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-WD-PORT" target="_blank" rel="noopener">wd_port</a>, <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-HEARTBEAT-PORT" target="_blank" rel="noopener">heartbeat_port</a> のローカルの設定は上書きされてソケットが作成されます。</p>
<pre># pgpool.conf 設定例
hostname0 = '192.168.100.50'
wd_port0 = 9000
heartbeat_hostname0 = '192.168.100.101'
heartbeat_port0 = 9694
wd_listen_address = 192.168.100.100
wd_listen_port = 50000
wd_heartbeat_listen_addresses = 102.168.100.110
wd_heartbeat_listen_port = 51000</pre>
<pre>tcp        0      0 <b>192.168.100.100:50000    </b>0.0.0.0:*     LISTEN      41636/pgpool: watchdog
udp        0      0 <b>192.168.100.110:51000 </b>   0.0.0.0:*                 41649/pgpool: heartbeat receiver
udp        0      0 <b>192.168.100.110:51000</b>    0.0.0.0:*                 41650/pgpool: heartbeat receiver</pre>
<p>これらのパラメータが導入された背景は、Docker 環境を代表とした TCP 転送ルールを設けているインターフェース間で通信をする際に LISTEN するソケットを転送ルールに合わせて設定したいケースに対応するためです。<br />
例えばノード 0 が IP:192.168.0.0, ポート番号:10000 のソケットに接続しようとし、TCP 転送ルールによってノード 1 の IP:192.168.100.100,ポート番号:20000 のソケットにリダイレクトされる環境の場合、ノード 1 側でリダイレクト後のネットワークアドレス、ポート番号(今回の例では IP:192.168.100.100, ポート番号:20000)に設定することで TCP 転送ルールがある場合でも通信が可能となりました。</p>
<h3>オンラインリカバリに使用するデータベースを指定する recovery_database パラメータの追加</h3>
<p>オンラインリカバリとは障害が発生して切り離されてしまった PostgreSQL ノードをプライマリに再同期して復帰する処理を各ノードを停止することなく行うことができる機能です。</p>
<p>以前はオンラインリカバリに template1 データベースを使用するようにしていましたが、今回追加された <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-online-recovery.html#GUC-RECOVERY-DATABASE" target="_blank" rel="noopener">recovery_databse</a> パラメータにオンラインリカバリに使用するデータベースを指定することができるようになりました。</p>
<pre>#pgpool.conf の recovery_database を指定
recovery_database = 'postgres'</pre>
<p>デフォルト値は postgres になっています。<br />
4.6 以前から移行をする際には <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-online-recovery.html#GUC-RECOVERY-DATABASE" target="_blank" rel="noopener">recovery_database</a> に指定したデータベースで下記コマンドを実施してオンラインリカバリに必要な関数をインストールしておく必要があります。</p>
<pre class="PROGRAMLISTING">psql postgres -c "CREATE EXTENSION pgpool_recovery"</pre>
<h3><tt class="FILENAME">.pcppass</tt>ファイルからの読み取りに失敗時の挙動改善</h3>
<p>.pcppass ファイルは pcp コマンドを実行したときに読み込まれるパスワードファイルです。</p>
<p>4.6 までは pcp コマンド実行時に .pcppass ファイルが未作成かパスワードファイルの権限設定が不適切の場合、エラーで終了していました。<br />
また -d, &#8211;debug オプションがないとデバッグ情報が出力されず失敗の原因も特定できませんでした。</p>
<pre>FATAL:  authentication failed for user "sraoss"
DETAIL:  username and/or password does not match</pre>
<p>失敗後は .pcppass ファイルを適切な権限で作成するか、パスワード入力を受け付けるオプションである -W オプションをつけて pcp コマンドを再実行する必要がありました。</p>
<pre>pcp_node_info -p 9898 -W
Password:</pre>
<p>4.7 からはエラーを出力して終了するのではなく、クライアントのコマンドプロンプトにフォールバックして引き続きパスワードを入力することができるようになりました。</p>
<p>また WARNING による警告が -d, &#8211;debug オプションなく出力される仕様に変更され、読み取りができなかった原因もメッセージから特定することができます。</p>
<pre class="PROGRAMLISTING">WARNING: password file ~/.pcppass is not a plain file
WARNING: password file ~/.pcppass has group or world access; permissions should be u=rw (0600) or less</pre>
<h3>フロントエンド / バックエンドプロトコルバージョン 3.2 サポートの追加</h3>
<p>PostgreSQL 18 ではプロトコルバージョン 3.2 に対応し、可変長のキャンセルキーが用いることができるようになりました。<br />
この変更に合わせ、Pgpool-II でもプロトコルバージョン 3.2 を利用できるように改善がされました。</p>
<p>max_protocol_version や PGMAXPROTOCOLVERSION を用いた以下のようなコマンドで 3.2 プロトコルを使用して PostgreSQL のフロントエンドとバックエンドを接続することができます。<br />
バージョンには 3.2 だけでなく PostgreSQL 18 のデフォルトのプロトコルバージョンである 3.0 を指定することもできます。</p>
<pre class="PROGRAMLISTING"># max_protocol_version オプションで 3.0 バージョンで接続
psql "host=localhost dbname=test user=sraoss max_protocol_version=3.0 port=11000"

# 環境変数 PGMAXPROTOCOLVERSION に 3.2 を指定して接続
PGMAXPROTOCOLVERSION="3.2" psql -p 11000 test</pre>
<p>新規接続時は指定したプロトコルバージョンで接続を確立しますが、コネクションプーリングのキャッシュがある場合は既存のキャッシュに保存されたのプロトコルバージョンを用いて接続を行うため確立済みの接続間でバージョンが異なることによるエラーの心配もありません。</p>
<h3>PostgreSQL 18 の SQL パーサの導入</h3>
<p>Pgpool-II ではメジャーリリースするたびに、PostgreSQL の最新パーサを移植しています。今回のリリースでは PostgreSQL 18 の新しいパーサを取り込みました。</p>
<p>Pgpool-II の負荷分散機能では、SQL を解析して参照か更新かを判別し、どのノードに振り分けるかを決めています。そのため、PostgreSQL の新バージョンでの SQL の変更に対応するには、SQL パーサを移植する必要があります。</p>
<p>PostgreSQL 18 での SQL のおもな変更点は以下のとおりです。</p>
<ul>
<li>生成列を仮想列として使用可能に</li>
<li>DML クエリの RETURNING にOLD/NEWのサポートを追加</li>
<li>各種制約の追加(例: WITHOUT OVERLAPS、ENFORCED/NOT ENFORCED)</li>
</ul>
<p>Pgpool-II 4.7 では上記の変更点に対応しています。</p>
<h3>logdir パラメータ名を work_dir へ変更</h3>
<p><tt>4.6 までは Pgpool-II の起動状態を記述する </tt><tt class="LITERAL">pgpool_status や memq_lock_file といった管理</tt>ファイルを logdir に指定するディレクトリに保存していました。<br />
しかし logdir というパラメータ名はログ関連のファイルを格納するディレクトリの設定パラメータと誤解されやすい問題がありました。</p>
<p>4.7 からはパラメータ名が <a href="https://www.pgpool.net/docs/47/ja/html/runtime-misc.html#GUC-WORK-DIR" target="_blank" rel="noopener">work_dir</a> へ変更となりました。</p>
<p>logdir のパラメータ自体も引き続き利用することができ、logdir に指定した値が <a href="https://www.pgpool.net/docs/47/ja/html/runtime-misc.html#GUC-WORK-DIR" target="_blank" rel="noopener">work_dir</a> の設定値へと再設定され Pgpool-II の終了時に以下ワーニングが表示されます。</p>
<pre>2026-01-08 11:50:48.193: main pid 18667: WARNING: logdir is changed to work_dir
2026-01-08 11:50:48.193: main pid 18667: DETAIL: if logdir is specified, the value will be set to work_dir</pre>
<h3>Slony モードの廃止</h3>
<p class="PROGRAMLISTING"><a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-running-mode.html#GUC-BACKEND-CLUSTERING-MODE" target="_blank" rel="noopener">backend_clustering_mode</a> で指定することができていた Slony モードが廃止されました。</p>
<p class="PROGRAMLISTING">データのレプリケーションを Slony-I が行うクラスタリングモードの一つでしたが、Slony-I は 3 年前からリリースが停止しています。<br />
現在は Slony モードについて積極的に利用するユーザーが見られず、廃止のアナウンスに異議がなかったため 4.7 からは廃止となりました。</p>
<h3>Pgpool-II の libpcp ライブラリの名称を libpgpoolpcp に変更</h3>
<p class="PROGRAMLISTING">4.7.1 のマイナリリースにて Pgpool-II のライブラリである libpcp の名称を libpgpoolpcp に変更されました。<br />
背景として、RHEL の libpcp ライブラリと Pgpool-II の libpcp ライブラリがコンフリクトする問題があったためです。</p>
<h2>おわりに</h2>
<p>今回は、Pgpool-II 4.7 の新機能について紹介しました。</p>
<p>Pgpool-II 4.7 では、より実用的で便利な機能が数多く追加・改善されています。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>
		<item>
		<title>Pgpool‑II コネクションプーリング機能の紹介</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-connection-pooling/</link>
		
		<dc:creator><![CDATA[彭 博 (Bo Peng)]]></dc:creator>
		<pubDate>Fri, 01 Aug 2025 04:51:53 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[Connection Pooling]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=18063</guid>

					<description><![CDATA[Pgpool-II は、PostgreSQL 専用のクラスタ管理ツールであり、コネクションプーリング、負荷分散、自動フェイルオーバーといった重要な機能を提供することで、PostgreSQL の高可用性と性能向上を実現しま ...]]></description>
										<content:encoded><![CDATA[<p><a href="https://pgpool.net/" target="_blank" rel="noopener">Pgpool-II</a> は、<a href="https://www.postgresql.org/" target="_blank" rel="noopener">PostgreSQL</a> 専用のクラスタ管理ツールであり、コネクションプーリング、負荷分散、自動フェイルオーバーといった重要な機能を提供することで、PostgreSQL の高可用性と性能向上を実現します。</p>
<p>本記事では、性能向上やサーバリソースの効率的な活用に役立つ<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-connection-pooling.html" target="_blank" rel="noopener">コネクションプーリング</a>の仕組みについて解説します。あわせて、運用時に押さえておくべき設定のポイントについても紹介します。</p>
<p><span id="more-18063"></span></p>
<h2>コネクションプーリングとは</h2>
<p>データベースへの接続には、ネットワークのハンドシェイクや認証といった初期処理が伴います。そのため、リクエストのたびに接続してすぐに切断するような動作を繰り返すと、システム全体に大きなオーバーヘッドが発生してしまいます。</p>
<p>そこで効果を発揮するのが、コネクションプーリングという仕組みです。この機能では、一度確立したデータベース接続をキャッシュしておき、次回のリクエスト時に再利用することで、接続処理の無駄を省きます。これにより、システム全体のパフォーマンスが向上し、リソースを無駄なく効率的に活用できるようになります。</p>
<h2>Pgpool‑II コネクションプーリングの仕組み</h2>
<p>Pgpool-II は、ユーザ名・データベース名・プロトコルバージョンなどの接続プロパティが同一であるリクエストに対して、すでに確立された接続を再利用する仕組みを持っています。これにより、毎回の接続処理にかかるコストを削減し、全体の処理効率を高めることができます。</p>
<p>以下は、Pgpool-II コネクションプーリングの基本的な動作の流れです。</p>
<ol>
<li>起動時に、Pgpool-II の親プロセスは <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-connection.html#GUC-NUM-INIT-CHILDREN" target="_blank" rel="noopener">num_init_children</a> で指定された数の子プロセスをあらかじめフォークします。各子プロセスは <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-connection-pooling.html#GUC-MAX-POOL" target="_blank" rel="noopener">max_pool</a> の設定値まで接続をキャッシュします。</li>
<li>Pgpool-II はクライアントからの接続要求を待ち受けます。</li>
<li>いずれかの Pgpool-II の子プロセスが、クライアントからの接続要求を受け取ります。</li>
<li>その子プロセスは、保持している接続内に、接続情報 (データベース/ユーザ) の一致するものがあるかどうかを探します。見つかったら再利用します。</li>
<li>見つからなければ、子プロセスは新たに PostgreSQL サーバへ接続し、それをプールに登録します。<br />
プールに空きスロットがない場合は、最も古い接続を切断し、そのスロットを再利用します。</li>
<li>クライアントがセッション終了要求を送るまで、クエリ処理を行います。</li>
<li>クライアントが接続を終了します。Pgpool-II はクライアントへの接続をクローズしますが、PostgreSQL への接続を保持します。</li>
</ol>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-18065" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling.png" alt="" width="2186" height="1678" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling.png 2186w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling-300x230.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling-1024x786.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling-768x590.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling-1536x1179.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling-2048x1572.png 2048w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling-279x214.png 279w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connection-pooling-282x216.png 282w" sizes="(max-width: 2186px) 100vw, 2186px" /></p>
<p>&nbsp;</p>
<h2>主な設定パラメータ</h2>
<p>以下は、コネクションプーリングに関連する設定項目です。</p>
<table>
<thead>
<tr>
<th><strong>パラメータ名</strong></th>
<th><strong>説明</strong></th>
<th><strong>デフォルト値</strong></th>
</tr>
</thead>
<tbody>
<tr>
<th nowrap="nowrap"><strong>connection_cache</strong></th>
<td style="font-size: 85%;">接続のキャッシュを有効にするかどうか</td>
<td style="font-size: 85%;">on (有効)</td>
</tr>
<tr>
<th nowrap="nowrap"><strong>max_pool</strong></th>
<td style="font-size: 85%;">各子プロセスがキャッシュできる接続の最大数</td>
<td style="font-size: 85%;">4</td>
</tr>
<tr>
<th nowrap="nowrap"><strong>connection_life_time</strong></th>
<td style="font-size: 85%;">キャッシュされた接続を切断するまで時間 (秒)</td>
<td style="font-size: 85%;">0 (無期限)</td>
</tr>
<tr>
<th nowrap="nowrap"><strong>child_life_time</strong></th>
<td style="font-size: 85%;">アイドル状態が続いた子プロセスを強制終了するまでの時間 (秒)</td>
<td style="font-size: 85%;">300 秒</td>
</tr>
<tr>
<th nowrap="nowrap"><strong>child_max_connections</strong></th>
<td style="font-size: 85%;">一つの子プロセスが処理できるクライアント接続数の上限。上限に達したらプロセスが終了し、新プロセスが生成される</td>
<td style="font-size: 85%;">0 (無制限)</td>
</tr>
</tbody>
</table>
<p>PostgreSQL では、接続ごとにプロセスが生成されますが、接続が切断されない限り、そのプロセスが使用するメモリは解放されません。Pgpool-II のコネクションプーリングを使用している場合、クライアントが切断しても PostgreSQL 側の接続は保持され続けるため、そのプロセスが使用するメモリも解放されません。</p>
<p>そのため、もし DB サーバのメモリ使用量が徐々に増加していく事象が発生している場合、Pgpool-II のコネクションプーリングが影響している可能性があります。このような事象やメモリリークのリスクを防ぐために、<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-connection-pooling.html#GUC-CHILD-LIFE-TIME" target="_blank" rel="noopener">child_life_time</a> を設定することが推奨されています。ただし、Pgpool-II の子プロセスがアイドル状態になる時間が <a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-connection-pooling.html#GUC-CHILD-LIFE-TIME" target="_blank" rel="noopener">child_life_time</a> より短い場合、PostgreSQL への接続を終了する機会が得られません。そのため、<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-connection-pooling.html#GUC-CHILD-MAX-CONNECTIONS" target="_blank" rel="noopener">child_max_connections</a> も併せて設定しておくことで、一定回数の接続処理後に子プロセスを終了させ、より確実に接続とメモリを解放することができます。</p>
<h2>設定上の注意点</h2>
<p>Pgpool-II は、各 PostgreSQL サーバに対して以下の数の接続を確立する可能性があります。</p>
<pre>num_init_children × max_pool</pre>
<p><img decoding="async" class="aligncenter size-full wp-image-18066" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-scaled.png" alt="" width="2560" height="1216" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-scaled.png 2560w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-300x143.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-1024x486.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-768x365.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-1536x730.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-2048x973.png 2048w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-304x144.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/07/connections-282x134.png 282w" sizes="(max-width: 2560px) 100vw, 2560px" /></p>
<p>そのため、PostgreSQL 側の <a href="https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS" target="_blank" rel="noopener">max_connections</a> 設定と照らし合わせて、Pgpool-II の接続数を適切に設定する必要があります。</p>
<p>まず、PostgreSQL にはスーパーユーザ用の接続枠が <a href="https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-SUPERUSER-RESERVED-CONNECTIONS" target="_blank" rel="noopener">superuser_reserved_connections</a> によって確保されており、これは通常ユーザの接続には使用できません。したがって、Pgpool-II からの接続数は、この予約分を除いた枠内に収まるように調整する必要があります。</p>
<p>また、Pgpool-II はクエリキャンセルを行う際に、既存の接続とは別に新たな接続を PostgreSQL に確立するため、この追加分も接続数として考慮する必要があります。</p>
<p>さらに、Pgpool-II の Watchdog 機能を利用している場合、リーダー切り替えのタイミングで旧リーダーの接続が残ったまま、新しいリーダーが接続を開始するケースもあります。このような状況では一時的に接続数が増加し、PostgreSQL 側の制限を超えてしまうリスクがあります。</p>
<p>これらを踏まえると、Pgpool-II の接続数が PostgreSQL の接続数上限に収まるように、以下の条件を満たすように設計する必要があります。</p>
<ul>
<li>クエリキャンセルを考慮しない場合</li>
</ul>
<pre>max_pool × num_init_children × 2 ≤ max_connections − superuser_reserved_connections</pre>
<ul>
<li>クエリキャンセルを考慮する場合</li>
</ul>
<pre>max_pool × num_init_children × 2 × 2 ≤ max_connections − superuser_reserved_connections</pre>
<h2>終わりに</h2>
<p>今回は Pgpool-II の<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-connection-pooling.html" target="_blank" rel="noopener">コネクションプーリング</a>機能について紹介しました。この機能を活用することで、PostgreSQL の接続効率を高め、リソースの最適化が期待できます。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>
		<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>
		<item>
		<title>Pgpool-II 4.1 新機能: Watchdogの機能強化【第9回】</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-9/</link>
		
		<dc:creator><![CDATA[石井 達夫 (Tatsuo Ishii)]]></dc:creator>
		<pubDate>Thu, 20 Feb 2020 02:30:17 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=5675</guid>

					<description><![CDATA[この記事はPgpool-II 4.1の紹介【第1回】の中のWatchdogの機能強化について詳しく紹介します。今回でPgpool-II 4.1の紹介は最後になります。 Watchdogとは 具体的にPgpool-II 4 ...]]></description>
										<content:encoded><![CDATA[<p>この記事は<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-1/">Pgpool-II 4.1の紹介【第1回】</a>の中のWatchdogの機能強化について詳しく紹介します。今回でPgpool-II 4.1の紹介は最後になります。</p>
<p><span id="more-5675"></span></p>
<h2>Watchdogとは</h2>
<p>具体的にPgpool-II 4.1のwatchdogの機能強化について説明する前に、watchdogとは何かについておさらいしておきましょう。Watchdogは、Pgpool-IIのオプション機能の一つで、Pgpool-II自体の可用性を高めるものです。Pgpool-IIでは、以下の図のようにすべてのクライアントからのアクセスがPgpool-IIを経由してPostgreSQLに送られるので、もしもPgpool-IIがダウンしてしまうと、データベースがまったく使えなくなってしまいます。</p>
<p><img decoding="async" class="size-medium wp-image-5677 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-193x300.png" alt="" width="193" height="300" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-193x300.png 193w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-138x214.png 138w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-167x260.png 167w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog.png 361w" sizes="(max-width: 193px) 100vw, 193px" /></p>
<p>そこでPgpool-IIを複数台用意し、万が一Pgpool-IIがダウンしてしまった時にもう1台のPgpool-IIに切り替えて処理を続行するのがwatchdogの役割です。</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-5678 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-2-217x300.png" alt="" width="217" height="300" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-2-217x300.png 217w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-2-155x214.png 155w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-2-188x260.png 188w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-2.png 406w" sizes="auto, (max-width: 217px) 100vw, 217px" /></p>
<p>Pgpool-IIが切り替わっても、クライアントは引き続き同じVIP (Virtual IP)でPgpool-IIに接続することにより、Pgpool-IIが切り替わったことを意識せずにデータベースシステム全体の利用を継続することができます。この図ではPgpool-IIは2つですが、実際にはいくつでもPgpool-IIをもっと設置することも可能で、Pgpool-IIは3台以上の奇数台数を設置することが推奨されています。この理由については後で説明します。</p>
<p>なお、wathdog機能は実際にはPgpool-IIから起動される別プロセスで実装されていますが、概念的にはPgpool-II = watchdogと考えて差し支えありません。そこで、以下の説明ではPgpool-IIの代わりにwatchdogという用語を用います。</p>
<h2>Watchdogの改善点その1 &#8211; マスタwatchdogノードの自動辞退</h2>
<p>上の図で、VIPを持つwatchdogとVIPを持たないwatchdogの2つが出てきました。VIPを持つwatchdogは「マスタwatchodg」と呼ばれ、watchdogがいくつあっても、クラスタ内には1台のみ存在するのが原則です。マスタwatchdogはクラスタシステム起動時にパラメータ「wd_priority」パラメータが大きいwatchdogがその役割を担います。マスタ以外のwatchdogは「スタンバイ」と呼ばれます。</p>
<p>さて、昨今ではPostgreSQLはストリーミングレプリケーションで構成するのが一般的です。これにより、可用性や参照負荷分散などのメリットをユーザは享受できます。以下はPgpool-IIコミュニティによって推奨される本格的なクラスタシステムで、Pgpool-IIが3台、PostgreSQLが2台で構成されています。</p>
<p>（具体的なセットアップ方法は<a href="https://www.pgpool.net/docs/latest/ja/html/example-cluster.html">マニュアル</a>に詳しく記載されています）</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-5681 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-3-300x298.png" alt="" width="300" height="298" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-3-300x298.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-3-150x150.png 150w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-3-215x214.png 215w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-3-261x260.png 261w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-3.png 564w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<p>この図の中で点線が各Pgpool-IIからPostgreSQLに出ていますが、これは「ヘルスチェック」という、Pgpool-IIがPostgreSQLデータベースの健全性をチェックする機能を表しています。これにより、たとえばプライマリPostgreSQLがダウンしても、スタンバイPostgreSQLを自動昇格させてデータベースシステムとしての運用を継続することができます。</p>
<h3>Pgpool-II同士で意見が合わない？</h3>
<p>PostgreSQLの健全性の確認は、ネットワークを通じてPgpool-IIがPostgreSQLに接続することにより行われます。ネットワークが正常ならば、どのPgpool-IIから見てもPostgreSQLが正常かどうかの見解は変わらないはずです。しかし、今マスタPgpool-IIとプライマリPostgreSQLの間のネットワーク<strong>だけ</strong>に故障が発生したらどうでしょう？この場合、マスタPgpool-IIはプライマリPostgreSQLを故障と判断、スタンバイPgpool-IIは健全と判断し、意見が別れてしまいます。そこでwatchdogはお互いに意見を交換して多数決で判断を下し、マスタPgpool-IIの「故障」判断は却下されます。（Pgpool-IIが偶数だと多数決が下せないので、困ったことになります。これが奇数台のPgpool-IIを設置することが推奨される理由です)</p>
<p>判断が却下されたプライマリPgpool-IIはプライマリPostgreSQLを「隔離(quarantine)」状態にします。隔離状態にあるPostgreSQLにはPgpool-IIは問い合わせを送信せず、スタンバイPostgreSQLに問い合わせを送ることになります。しかし相変わらずVIPはそのマスタPgpool-IIにアサインされており、クライアントからの更新問い合わせもスタンバイに送られます。スタンバイのPostgreSQLでは更新処理が実行できないので、そうした問い合わせはすべてエラーになってしまします。</p>
<h3>watchdogマスタが自主降格して問題を回避</h3>
<p>そこでPgpool-II 4.1では、こうした場合にマスタwatchdogは自主的に自分を降格して他のPgpool-IIにマスタの役割を移譲するようになりました。もちろんVIPも新しいPgpool-IIにアサインされるので、引き続き更新処理も正常に実行することができます。</p>
<h3>多数決原則はPgpool-IIダウン時にも適用</h3>
<p>ちなみに、Pgpool-IIが多数決でものごとを決める仕組みは、Pgpool-II自体のダウン時にも適用されます。Pgpool-IIはお互いに通信しながら互いの生死を確認しており、たとえば以下の図のように、Pgpool-IIの1,2はお互いに通信できるが、3は他のPgpool-IIと通信できない状態になっても、Pgpool-II 3は過半数の投票を得られないため、勝手にPgpool-II 3がマスタに昇格してしまうことを防ぐことができます。これはいわゆる「スプリットブレイン」状態の防止につながります。</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-5683 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-4-300x183.png" alt="" width="300" height="183" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-4-300x183.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-4-304x186.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-4-282x172.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/02/pgpool-II-4-1-watchdog-4.png 668w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<h2>Watchdogの改善点その2 &#8211; 新しいパラメータ<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#GUC-ENABLE-CONSENSUS-WITH-HALF-VOTES">enable_consensus_with_half_votes</a></h2>
<p>前述のように、Pgpool-IIでは多数決でものごとを決められるように、設置台数を奇数台にすることが推奨されています。しかし世の中にはリソースを節約するために2台でシステムを更正している例も多く、従来はPgpool-II台数が偶数の場合にはその半分、すなわち1台だけの賛成が得られても多数決の合意が得られるとしていました。しかしこれでは、たとえば台数が4台の時に2台の賛成で合意が得られることになり、おかしなことになります。そこでPgpool-II 4.1では、デフォルトで過半数の合意を得るためにPgpool-II台数の過半数の賛成が必要となりました。しかしPgpool-II台数が2台のときには、これだとPgpool-IIが1台ダウンした時に決して過半数が得られなくなってしまうため、救済のために新しいパラメータ<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-watchdog-config.html#CONFIG-WATCHDOG-FAILOVER-BEHAVIOR">enable_consensus_with_half_votes</a>が追加されました。このパラメータがonなら、Pgpool-II台数が2台のときには、1台のPgpool-IIの賛成のみで合意が得られます。ただし、Pgpool-IIが2台構成の時は、お互いの監視ネットワークがダウンした時にお互いに自分だけが生きていると思い込むスプリットブレイン状態になることを防ぐことができない点は変わりません。</p>
<h2>終わりに</h2>
<p>9回に渡ってPgpool-II 4.1の新機能をご紹介しました。Pgpool-IIはバージョンごとに機能が充実しており、適用できる案件が増えてきていると思います。今回のリリースでは、すぐに利用できるインストール方法とともに、各種雛形設定ファイルも配布物に同梱されています。この機会にPgpool-IIを使ったPostgreSQLクラスタシステムの構築にチャレンジしてみてはいかがでしょう。</p>
<p><a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-1/">Pgpool-II 4.1の紹介【第1回】</a><br />
<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-2/">Pgpool-II 4.1 新機能: ステートメントレベルの負荷分散【第2回】</a><br />
<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-3/">Pgpool-II 4.1 新機能: reserved_connections【第3回】</a><br />
<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-4/">Pgpool-II 4.1 新機能:自動フェイルバック 【第4回】</a><br />
<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-5/">Pgpool-II 4.1 新機能:PostgreSQL 12への対応【第5回】</a><br />
<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1newfeature-6/">Pgpool-II 4.1 新機能:2拠点に分かれたレプリケーション構成への対応【第6回】</a><br />
<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-7/">Pgpool-II 4.1 新機能: シェアードリレーションキャッシュ【第7回】</a><br />
<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-8/">Pgpool-II 4.1 新機能: Pgpool-II によって発行される内部クエリの改善【第8回】</a><br />
<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-9/">Pgpool-II 4.1 新機能: Watchdogの機能強化【第9回】</a></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>
		<item>
		<title>Pgpool-II 4.1 新機能: Pgpool-II によって発行される内部クエリの改善【第8回】</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-8/</link>
		
		<dc:creator><![CDATA[石井 達夫 (Tatsuo Ishii)]]></dc:creator>
		<pubDate>Thu, 06 Feb 2020 01:30:31 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=5472</guid>

					<description><![CDATA[この記事はPgpool-II 4.1の紹介【第1回】の中のPgpool-II によって発行される内部クエリの改善について詳しく紹介します。 バージョン情報を活用した内部クエリの削減 Pgpool-IIは、クライアントから ...]]></description>
										<content:encoded><![CDATA[<p>この記事は<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-1/">Pgpool-II 4.1の紹介【第1回】</a>の中のPgpool-II によって発行される内部クエリの改善について詳しく紹介します。</p>
<p><span id="more-5472"></span></p>
<h2>バージョン情報を活用した内部クエリの削減</h2>
<p>Pgpool-IIは、クライアントから受信した問い合わせを解析するために必要な様々な情報を入手するためにPostgreSQLに内部的にクエリを発行します。第7回で解説したシェアードリレーションキャッシュは、そうしたクエリ結果のキャッシュの利用を改善するものでした。Pgpool-II 4.1では、それとは別に発行する内部クエリそのものを削減する努力をしています。その一つが、PostgreSQLのバージョン情報を活用した内部クエリの削減です。</p>
<h3>バージョンで異なるPostgreSQLのシステムカタログへの問い合わせ</h3>
<p>Pgpool-IIが発行する内部クエリは、主にPostgreSQLのシステムカタログを問い合わせるものです。たとえば、Pgpool-IIではあるテーブルが一時テーブルかどうか各テーブルごとに問い合わせを行います。一時テーブルを含む問い合わせはストリーミングレプリケーションのスタンバイサーバには送信できないからです。あるテーブルが一時テーブルかどうかの判断方法はPostgreSQLのバージョンで異なり、実は結構厄介です。</p>
<ul>
<li>PostgreSQL 8.4と9.0では、システムカタログpg_classの&#8221;relistemp&#8221;列がtrueなら一時テーブル</li>
<li>それ以外のバージョンではスキーマが&#8221;pg_temp&#8221;なら一時テーブル</li>
</ul>
<p>という具合です。従来は、</p>
<ol>
<li>pg_classにrelistempという列があるかどうか調べる</li>
<li>もしなければシステムカタログpg_namespaceを調べてスキーマがpg_tempであるかどうか調べる</li>
<li>もしrelistempがあればそれがtrueなのかfalseなのか調べる</li>
</ol>
<p>という具合に最大2回の内部クエリ発行が必要でした。</p>
<h3>バージョン情報を活用して内部クエリを削減</h3>
<p>Pgpool-II 4.1では、あらかじめPostgreSQLのバージョンを調べておき、それによってpg_classのrelistempを調べるか、pg_namespaceを調べるかを判断できるので、内部クエリの発行回数を1回にすることができます。</p>
<p>他の内部クエリでも同様の工夫を行うことにより、従来一つのユーザからの問い合わせにつき最大内部クエリが7回ほど発行されていたのが2-3回に減らすことができました。</p>
<h2>より効率的な一時テーブルのチェック</h2>
<p>上の改良により、一時テーブルのチェックはかなり効率的になりましたが、それでも一時テーブルかどうか知るための内部クエリを完全になくすことはできません。そこで導入されたのが<tt class="VARNAME"><a href="https://www.pgpool.net/docs/latest/ja/html/runtime-misc.html#GUC-CHECK-TEMP-TABLE">check_temp_table</a>というパラメータです。このパラメータを"trace"に設定すると、システムカタログに内部クエリを発行せずに、CREATE TEMP TABLE文がこのセッションで投入されたかどうかを追跡することによって一時テーブルかどうかの判定を行います。これにより内部クエリの発行が不要になりますが、注意することもあります。<br />
</tt></p>
<p>一時テーブルの生成がPgpool-IIから見えない場合（たとえば関数やトリガの中で行われる場合）、Pgpool-IIは一時テーブルの生成を認識できません。この場合は、check_temp_tableに&#8221;catalog&#8221;を設定することにより、従来と同じシステムカタログを検索する動作になります。</p>
<h2>終わりに</h2>
<p>今回はPgpool-IIが発行する内部クエリの改善について解説しました。Pgpool-IIの発行する内部クエリの多さが気になる方はPgpool-II 4.1を試してみてはいかがでしょう。</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>
		<item>
		<title>Pgpool-II 4.1 新機能: シェアードリレーションキャッシュ【第7回】</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-7/</link>
		
		<dc:creator><![CDATA[Takuma Hoshiai]]></dc:creator>
		<pubDate>Thu, 30 Jan 2020 04:30:09 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=5340</guid>

					<description><![CDATA[この記事はPgpool-II 4.1の紹介【第1回】の中のシェアードリレーションキャッシュ 機能について詳しく紹介します。 リレーションキャッシュ Pgpool-IIではクライアントから送られてきたクエリを解析し、クエリ ...]]></description>
										<content:encoded><![CDATA[<p>この記事は<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-1/">Pgpool-II 4.1の紹介【第1回】</a>の中の<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-misc.html#GUC-ENABLE-SHARED-RELCACHE">シェアードリレーションキャッシュ</a> 機能について詳しく紹介します。</p>
<p><span id="more-5340"></span></p>
<h2>リレーションキャッシュ</h2>
<p>Pgpool-IIではクライアントから送られてきたクエリを解析し、クエリに含まれているテーブルや関数に関する情報をバックエンドのPostgreSQL上のシステムカタログから取得しています。<br />
これらの取得した情報により柔軟なクエリレベルの負荷分散などの様々な機能が実現しています。<br />
クエリが実行されるたびにシステムカタログを参照しに行くと無視できないオーバヘッドとなるため、各子プロセスでは1度取得した情報はローカルメモリにキャッシュしておきます。これをリレーションキャッシュと呼びます。<br />
ローカルメモリに既に該当のシステムカタログ情報がキャッシュされている場合、それを直接使用することでこのオーバヘッドを軽減しています。</p>
<h2>シェアードリレーションキャッシュ</h2>
<p>Pgpool-IIの起動直後やPostgreSQLのフェイルオーバ処理後、その他各種設定により子プロセスが再起動した直後では子プロセスはローカルキャッシュを持っていません。そのため num_init_children が大きな値に設定されるような接続数が多いシステムの場合、子プロセスの数だけシステムカタログへの問い合わせが同時に発生し、このオーバヘッドが重なり大きくなる場合があります。</p>
<p>このような場合を想定して、Pgpool-II 4.1ではリレーションキャッシュをローカルキャッシュに加えて共有メモリにもキャッシュできる機能が追加されました。この機能は、デフォルトで有効(<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-misc.html#GUC-ENABLE-SHARED-RELCACHE">enable_shared_relcache</a>=on)となります。<br />
リレーションキャッシュはローカルキャッシュに加え、 memqcache_method(デフォルトは&#8217;shmem&#8217;) で指定されているキャッシュストレージに保存されます。<br />
各子プロセスは、自身のローカルキャッシュにシステムカタログの情報が無ければ、キャッシュストレージを確認し、どちらにもなかった場合のみ、PostgreSQLのシステムカタログを参照します。その後、システムカタログから取得した情報は、自身のローカルキャッシュとキャッシュストレージの双方にキャッシュします。<br />
つまり、いずれかの子プロセスが参照したシステムカタログはすべての子プロセスで共有されるため、上記のようなケースでも同じシステムカタログを参照する処理は1度で済むため、オーバヘッドをかなり抑えることができます。</p>
<h4>ベンチマークによるシェアードリレーションキャッシュ機能の効果</h4>
<p>PostgreSQL12とPgpool-II 4.1を用いた簡易なベンチマークテストを行いました。以下のグラフは、 enable_shared_relation_cache=off の場合と比較して enable_shared_relation_cache=on の場合に実行速度が相対的にどの程度向上しているかを表しています。この結果より、シェアードリレーションキャッシュ機能により2倍程度実行速度が向上していることが確認できました。</p>
<pre>(テストコマンド)
pgbench  -C -T 30 -c 30 -n -f script_file
</pre>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-5464" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/result_pgbench-300x169.png" alt="" width="600" height="338" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/result_pgbench-300x169.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/result_pgbench-304x171.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/result_pgbench-282x159.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/result_pgbench.png 756w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h2>まとめ</h2>
<p>今回は、Pgpool-II 4.1で追加されたシェアードリレーションキャッシュ機能について紹介しました。<br />
この機能によりPgpool-II自体のオーバヘッドを軽減し、より快適に使用することができます。<br />
特に num_init_children の設定値が大きい場合や、接続先のテーブル数が多い大規模な環境で効果が見込めるため、このような環境の場合Pgpool-II 4.1の使用を検討していただくと良いかと思います。</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>
		<item>
		<title>Pgpool-II 4.1 新機能:2拠点に分かれたレプリケーション構成への対応【第6回】</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1newfeature-6/</link>
		
		<dc:creator><![CDATA[石井 達夫 (Tatsuo Ishii)]]></dc:creator>
		<pubDate>Thu, 09 Jan 2020 01:00:43 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=5313</guid>

					<description><![CDATA[Pgpool-II 4.1の新機能として、2拠点に別れたレプリケーション構成への対応を可能にする新しい設定パラメータrelcache_query_targetをご紹介します。]]></description>
										<content:encoded><![CDATA[<p>本記事は 、Pgpool-II 4.1の新機能、2拠点に分かれたレプリケーション構成への対応を可能にする新しい設定パラメータ<strong>relcache_query_target </strong>についてご紹介します。<br />
Pgpool-II 4.1 の概要ついては、<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-1/">Pgpool-II 4.1 の紹介【第 1 回】</a>を参照ください。</p>
<p><span id="more-5313"></span></p>
<h2>本店・支店が遠隔地にある場合のレプリケーション</h2>
<p>ある程度の規模の企業では、本店が東京、支店が大阪といったように、拠点が複数あり、しかもそれぞれが離れていることがよくあります。<br />
ときには本店が東京、支店がニューヨークというように、国をまたいで拠点が存在することも珍しくありません。<br />
今、ある企業で本店にPostgreSQLのストリーミングレプリケーションのプライマリサーバを置き、データベースの更新と本店社員の情報検索をそこで行い、一方支店の方にはスタンバイサーバを置いて、主に支店の社員が情報検索を行うものとします。たまにデータベースの更新を行うこともありますが、頻度は高くなく、その場合は本店のプライマリサーバに更新をかけるとします。</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-5321 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-1-1-300x205.png" alt="" width="300" height="205" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-1-1-300x205.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-1-1-304x208.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-1-1-282x193.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-1-1.png 755w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<p>このような構成を取ることにより、それぞれの拠点の情報検索業務はネットワーク的に近いサーバを利用できるため、レスポンスが高速になりますし、万が一本店のサーバがダウンしても支店のサーバを昇格させることによって業務が継続できます。</p>
<h2>Pgpool-IIによるサーバ問い合わせ自動振り分け</h2>
<p>こうした構成では社員はそれぞれ本店のサーバにアクセスするのか支店のサーバにアクセスするのかを意識する必要があります。更にデータベースへのアクセスは通常アプリケーションを通じて行いますので、そのアプリケーションを変更しない限り、データベースのアクセス先を適切に設定することができません。しかしPgpool-IIを使えば設定によってPgpool-IIが自動的に振り分けをしてくれるので、社員はアクセス先のデータベースを意識する必要がなくなります。以下の構成では、本店、支店の社員はそれぞれ本店、支店に設置されたPgpool-IIに常にアクセスします。支店において更新クエリを本店のプライマリサーバに送出するのはPgpool-IIが行います。</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-5322 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-2-300x212.png" alt="" width="300" height="212" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-2-300x212.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-2-304x214.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-2-282x199.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-2.png 755w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<h2>リレーションキャッシュ問題</h2>
<p>しかし従来のPgpool-IIでは、この構成はうまく動きません。なぜなら、Pgpool-IIはクエリを解析する際にクエリに含まれるテーブルなどに関する情報をプライマリサーバから取得するからです。これを<strong>リレーションキャッシュ</strong>と呼びます。キャッシュなので2度目以降は高速にアクセスされますが、支店から見て本店がネットワーク的に遠い場合、1度目は遅くなる可能性があります。（下の図における赤点線）</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-5323 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-3-300x212.png" alt="" width="300" height="212" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-3-300x212.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-3-304x214.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-3-282x199.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-3.png 755w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<h2>relcache_query_target</h2>
<p>そこで導入されたのが新しいパラメータ<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-misc.html#GUC-RELCACHE-QUERY-TARGET"><strong>relcache_query_target</strong></a>です。このパラメータは、リレーションキャッシュの取得先を指定します。デフォルトの値は<em>master</em>で従来と同じくプライマリサーバにアクセスします。スタンバイサーバ側のPgpool-IIの設定でこの値を<em>load_balance_node</em>とすると、負荷分散用のサーバにアクセスするようになります。更にこのときプライマリサーバの負荷分散の重みを0にしておけば、常にリレーションキャッシュの問い合わせは支店側のスタンバイサーバに送られるようになります。（下図参照）これで支店の社員も快適にPostgreSQLデータベースにアクセスできるようになります。</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-5327 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-4-300x212.png" alt="" width="300" height="212" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-4-300x212.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-4-304x214.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-4-282x199.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2020/01/Pgpool-6-4.png 755w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<h2>レプリケーションの遅延に注意</h2>
<p>ただし、relcache_query_targetをload_balanace_modeにした場合、注意すべきこともあります。たとえば新しいテーブルを作成した直後にそのテーブルに問い合わせを発行し、Pgpool-IIがスタンバイサーバ側のシステムカタログを検索した時に、レプリケーションの遅延によってスタンバイサーバ側のシステムカタログにそのテーブルの情報が到達していないと、その検索が失敗してしまいます。これを防ぐために同期レプリケーションを利用することもできますが、プライマリサーバ側の更新が遅くなります。ですからこの構成は、テーブルの作成が頻繁に行われるようなシステムでは採用が難しいかもしれません。</p>
<h2>まとめ</h2>
<p>今回はPgpool-II 4.1の新機能として、2拠点に分かれたレプリケーション構成への対応を可能にする新しい設定パラメータ<strong>relcache_query_target</strong>をご紹介しました。クラウドが活用される時代においては、物理的に店舗が遠隔地に分かれていなくても、クラウドサービスのリージョンを2つ用意して万が一に備えることも珍しくなくなってきました。こうした構成においても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>
		<item>
		<title>Pgpool-II 4.1 新機能:PostgreSQL 12への対応【第5回】</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-5/</link>
		
		<dc:creator><![CDATA[彭 博 (Bo Peng)]]></dc:creator>
		<pubDate>Fri, 27 Dec 2019 02:00:20 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=5230</guid>

					<description><![CDATA[この記事は Pgpool-II 4.1 の紹介【第 1 回】の中の PostgreSQL 12 への対応について詳しく紹介します。 PostgreSQL 12 への対応として、おもに最新の SQL パーサの移植とフェイル ...]]></description>
										<content:encoded><![CDATA[<p>この記事は <a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-1/">Pgpool-II 4.1 の紹介【第 1 回】</a>の中の PostgreSQL 12 への対応について詳しく紹介します。</p>
<p>PostgreSQL 12 への対応として、おもに最新の SQL パーサの移植とフェイルオーバやリカバリで使うサンプルスクリプトの修正が行われました。</p>
<p><span id="more-5230"></span></p>
<h2>PostgreSQL 12 SQL パーサの移植</h2>
<p>Pgpool-II の負荷分散機能では、SQL を解析して参照か更新かを判別し、どのノードに振り分けるかを決めています。そのため、PostgreSQL の新バージョンでの SQL の変更に対応するには、SQL パーサを移植する必要があります。</p>
<p>PostgreSQL 12 での SQL のおもな変更点は以下のとおりです。</p>
<ul>
<li>VACUUM コマンドの SKIP_LOCKED、INDEX_CLEANUP、TRUNCATE オプション</li>
<li>COMMIT AND CHAIN と ROLLBACK AND CHAIN コマンド</li>
<li>COPY FROM コマンドの WHERE 句</li>
<li>CREATE OR REPLACE AGGREGATE コマンド</li>
<li>CREATE STATISTICS コマンドの mcv 種別</li>
<li>REINDEX コマンドの CONCURRENTLY オプション</li>
<li>EXPLAIN コマンドの SETTINGS オプション</li>
</ul>
<p>Pgpool-II 4.1 では上記の変更点に対応しています。</p>
<h2>サンプルスクリプトの修正</h2>
<p>PostgreSQL 12 では、ストリーミングレプリケーションでスタンバイとして起動する場合の設定ファイル recovery.conf が廃止されました。パラメータは設定ファイル postgresql.conf で設定するように統合されました。また、スタンバイとして起動するかは recovery.signal ファイルを配置して指定するようになりました。</p>
<p>それに伴って、フェイルオーバやリカバリで使うサンプルスクリプトが修正され、PostgreSQL 12 でも動作するようになりました。サンプルスクリプトは <a href="https://www.pgpool.net/docs/latest/ja/html/">Pgpool-II 4.1 文書</a> の「<a href="https://www.pgpool.net/docs/latest/ja/html/example-cluster.html#EXAMPLE-CLUSTER-PGPOOL-CONFIG-FAILOVER">8.3. Pgpool-II + Watchdog の構築の例</a>」に掲載されています。</p>
<p>また、今回のリリースからサンプルスクリプトが配布物に同梱されるようになりました。RPM パッケージを使ってインストールした場合には、/etc/pgpool-II ディレクトリに配置されます。</p>
<pre>$ ll /etc/pgpool-II/*.sample
-rwxr-xr-x 1 postgres postgres 2756 11月 19 09:06 /etc/pgpool-II/failover.sh.sample
-rwxr-xr-x 1 postgres postgres 6575 11月 19 09:06 /etc/pgpool-II/follow_master.sh.sample
-rwxr-xr-x 1 postgres postgres 1080 11月 19 09:06 /etc/pgpool-II/pgpool_remote_start.sample
-rwxr-xr-x 1 postgres postgres 2830 11月 19 09:06 /etc/pgpool-II/recovery_1st_stage.sample
-rwxr-xr-x 1 postgres postgres 712 11月 19 09:06 /etc/pgpool-II/recovery_2nd_stage.sample</pre>
<p>サンプルスクリプトを使う場合には、ファイル名から .sample を外して適当な場所にコピーし、変数 PGHOME を PostgreSQL のインストール先に合わせて変更してください。</p>
<p>また、<a href="https://www.pgpool.net/docs/latest/ja/html/pgpool-setup.html">pgpool_setup</a> が生成するスクリプトも PostgreSQL 12 に対応しています。</p>
<h2>まとめ</h2>
<p>今回、PostgreSQL 12 への対応として SQL パーサの移植とサンプルスクリプトの修正について説明しました。今回からサンプルスクリプトが同梱されるようになったことで、これまでスクリプトの作成に悩んでいた方も導入しやすくなったと思います。これを機に 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>
		<item>
		<title>Pgpool-II 4.1 新機能:自動フェイルバック 【第4回】</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-4/</link>
		
		<dc:creator><![CDATA[Takuma Hoshiai]]></dc:creator>
		<pubDate>Thu, 19 Dec 2019 01:00:32 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=5208</guid>

					<description><![CDATA[この記事はPgpool-II 4.1の紹介【第1回】の中の自動フェイルバック 機能について詳しく紹介します。 Pgpool-II 4.1 の概要ついては、第1回記事を参照ください。 自動フェイルバック Pgpool-II ...]]></description>
										<content:encoded><![CDATA[<p>この記事は<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-1/">Pgpool-II 4.1の紹介【第1回】</a>の中の<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-failover.html#GUC-AUTO-FAILBACK">自動フェイルバック</a> 機能について詳しく紹介します。</p>
<p>Pgpool-II 4.1 の概要ついては、<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-41-newfeature-1/">第1回記事</a>を参照ください。</p>
<p><span id="more-5208"></span></p>
<h2>自動フェイルバック</h2>
<p>Pgpool-IIでは、ヘルスチェック機能やPostgreSQLからのデータの読み出し/書き込みの失敗を契機にクラスタ配下のPostgreSQLを自動でフェイルオーバします。これにより故障したノードを管理下から切り離しサービスを継続させることができます。ただし、一度切り離されたPosrtgreSQLをPgpool-IIの管理下に復帰させるためには、管理者が復旧を確認し手動でアタッチする必要がありました。これは、一度障害が発生したと判断され切り離されたPostgreSQLの正常性をPgpool-II側から自動で判断することが困難なためでした。<br />
Pgpool-II 4.1からは、一度切り離されてしまったスタンバイに対してPostgreSQLの正常性が確認できた際に自動で復帰させることができるようになりました。これにより、ネットワーク障害などによりスタンバイノードが切り離された場合においても、障害が復旧後にPgpool-IIが自動でスタンバイノードをフェイルバックするため、管理者の負担を軽減することが期待できます。</p>
<h2>使用方法</h2>
<p>自動フェイルバック機能では、新たに追加された以下のパラメータを使用します。</p>
<h4>auto_failback</h4>
<p>自動フェイルバック機能を有効化するためのパラメータです。デフォルトは、offです。</p>
<h4>auto_failback_interval</h4>
<p>自動フェイルバック機能の最短の実行間隔(秒単位)を指定できます。デフォルトは、60(秒)です。</p>
<p>また、<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-config-health-check.html">ヘルスチェック</a>と<a href="https://www.pgpool.net/docs/latest/ja/html/runtime-streaming-replication-check.html">ストリーミングレプリケーションのチェック</a>の機能と連携しているため、これらの機能も有効である必要があります。</p>
<h2>注意点</h2>
<p>ネットワークが不安定な環境で、自動フェイルバックを有効にした場合、自動フェイルオーバと自動フェイルバックを繰り返してしまい、サービスの性能に影響が出る可能性が考えられます。<br />
このような環境では、auto_failback_intervalの間隔を長めに設定することで防ぐことができます。</p>
<p>システムのメンテナンスなどにより意図的にPostgreSQLの再起動や切り離しを行う場合注意が必要です。自動フェイルバック機能が有効な場合、意図せずメンテナンス中のPostgreSQLが復帰してしまう可能性があります。そのため、メンテナンス作業などを行う際には、一時的にauto_failbackをoffにしPgpool-IIのreloadで設定を反映させてから実施することをお勧めします。</p>
<h2>まとめ</h2>
<p>今回は、Pgpool-II 4.1で追加された自動フェイルバック機能について紹介しました。<br />
この機能により、サーバ管理者の負担が軽減しPostgreSQLのクラスタ環境の運用がより容易になるかと思います。</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>
		<item>
		<title>Pgpool-II 4.1 新機能: reserved_connections【第3回】</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-3/</link>
		
		<dc:creator><![CDATA[石井 達夫 (Tatsuo Ishii)]]></dc:creator>
		<pubDate>Thu, 12 Dec 2019 01:00:28 +0000</pubDate>
				<category><![CDATA[Pgpool-II]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=5123</guid>

					<description><![CDATA[この記事はPgpool-II 4.1の紹介【第1回】の中のreserved connections 機能について詳しく紹介します。 Pgpool-IIにおけるクライアントからの接続管理 reserved_connecti ...]]></description>
										<content:encoded><![CDATA[<p>この記事は<a href="https://www.sraoss.co.jp/tech-blog/pgpool/pgpool-4-1-newfeature-1/">Pgpool-II 4.1の紹介【第1回】</a>の中の<a href="https://www.pgpool.net/docs/41/ja/html/runtime-config-connection.html#GUC-RESERVED-CONNECTIONS">reserved connections</a> 機能について詳しく紹介します。</p>
<p><span id="more-5123"></span></p>
<h3>Pgpool-IIにおけるクライアントからの接続管理</h3>
<p>reserved_connections機能を説明する前に、今までのクライアントからの接続管理について復習しておきましょう。reserved_connectionsは、今までの管理方法とは違う管理方法を導入するので、比較のためにもおさらいしておくのがわかりやすいと思います。Pgpool-IIでは、複数のサーバプロセスがクライアントからの接続を待ち受けており、クライアントからの接続要求があると、そのうちの一つのプロセスが接続要求を受け付けます。待受プロセスの数は<a href="https://www.pgpool.net/docs/41/ja/html/runtime-config-connection.html#GUC-NUM-INIT-CHILDREN">num_init_children</a>という設定パラメータで決まります。</p>
<p>では、すでにnum_init_children分のプロセスがすべてクライアントからの接続を受付中で、待受プロセスが無い場合はどうなるのでしょう？<br />
そのときはOSが新しいクライアントからの接続要求を一旦保留してキューに入れます。どれかのPgpool-IIプロセスへのクライアントからの接続が終了すると、そのプロセスは再びクライアントからの接続要求を待ち受ける状態になるので、OSはそのプロセスに接続要求を割り当てます。<br />
つまり、クライアントから見ると、空きプロセスが出るまで接続要求は待たされることになります。</p>
<p>PostgreSQLが順調に処理を行っていればこの方式は問題なく動きます。しかし、PostgreSQLの処理能力が追いつかない状態になったり、あるクライアントがPgpool-IIに接続したまま長い時間何もせずに接続を専有したりすると、OSのキューが満杯になり、いつまでたっても新しいクライアントがPgpool-IIに接続できなくなります。それどころか、システムに重い負荷がかかり、システム全体の状態が不安定になることもあります。</p>
<h3>reserved_connectionsによる接続管理の改善</h3>
<p>この問題を解決するのがPgpool-II 4.1で導入された新しい設定パラメータreserved_connectionsです。このパラメータが1以上に設定されていると、(<a href="https://www.pgpool.net/docs/41/ja/html/runtime-config-connection.html#GUC-NUM-INIT-CHILDREN">num_init_children</a> &#8211; <tt class="VARNAME">reserved_connections</tt>)以上のクライアントからの接続はブロックされるのではなく受け付けられず、&#8221;Sorry, too many clients already&#8221;というエラーになります。 たとえば、<tt class="VARNAME">reserved_connections</tt> = 1で、<a href="https://www.pgpool.net/docs/41/ja/html/runtime-config-connection.html#GUC-NUM-INIT-CHILDREN">num_init_children</a> = 32なら、32番目のクライアントからの接続は拒否されます。これにより、PostgreSQLが忙しい場合でもOSにこれ以上負担がかからずに済みます。そのかわり、クライアントは接続に失敗したらしばらくたってから再度接続を試みるなどの対応が必要になります。<br />
この挙動はPostgreSQLと同じで、PostgreSQLのmax_connectionsを越えた接続をしようとして&#8221;Sorry, too many clients already&#8221;のエラーが出てしまった経験をお持ちの方も多いと思います。ですから、reserved_connectionsを導入することによるこうした挙動の変化は、PostgreSQLユーザであればあまり違和感のないところでしょう。<br />
逆に、システムの処理能力に十分余裕があり、クライアントが待ち状態になることがほとんどないようなシステムでは、今までどおりの挙動を維持するために、reserved_connectionsを0に設定するのがおすすめです。（ちなみにreserved_connections = 0がデフォルト設定です）<br />
なお、reserved_connectionsを有効にしたい場合、できればその設定値を1ではなく、もう少し余裕を持たせると良いでしょう。具体的には、num_init_childrenの10%位をreserved_connectionsに割り当てます。Pgpool-IIのプロセスはクライアントの接続が解放されてから待ち受け状態に戻るまでに少し時間がかかることがあり、その分の余裕を見たいからです。</p>
<h3>まとめ</h3>
<p>今回、Pgpool-II 4.1の新しいパラメータreserved_connectionsについて説明しました。<br />
reserved_connectionsを導入することにより、常に高負荷に悩まされているシステムでは改善が見込めることがあるので、是非お試しください。</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>
