pgpool2.git / summary / log / commit / refs

commit    a3d79c03d17fb1dbf38467581973bf6afd7eb6e1
Author:   Nozomi Anzai <anzai@sraoss.co.jp>
Date:     Fri Jul 06 02:16:15 2012 +0000

    Add the release note about V3.2.
    Merge with the section of watchdog.


doc/pgpool-ja.html | 6992 +++++++++++++++++++++++++++++----------------------- 1 file changed, 3897 insertions(+), 3095 deletions(-) diff --git a/doc/pgpool-ja.html b/doc/pgpool-ja.html index cd2d57278..3036f9de5 100644 --- a/doc/pgpool-ja.html +++ b/doc/pgpool-ja.html @@ -1,9 +1,9 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> -<meta http-equiv="content-type" content="text/html;charset=iso-2022-jp"> +<meta http-equiv="content-type" content="text/html;charset=utf8"> <link rel="stylesheet" href="./pgpool.css" type="text/css"> -<title>pgpool-II $B%f!<%6%^%K%e%"%k(B</title> +<title>pgpool-II ユーザマニュアル</title> </head> <body> @@ -17,30 +17,31 @@ Last modified: Thu Jul 5 17:28:23 JST 2012 <div id="menu"> <div id="navcontainer"> <ul id="navlist"> - <li id="active"><a href="#Whatis" id="current">pgpool-II$B$H$O(B</a></li> - <li><a href="#platform">pgpool-II$B$N2TF/4D6-(B</a></li> - <li><a href="#install">pgpool-II$B$N%$%s%9%H!<%k(B</a></li> - <li><a href="#config">pgpool-II$B$N@_Dj(B</a></li> - <li><a href="#common">$B6&DL@_Dj9`L\(B</a></li> - <li><a href="#connection_pool_mode">$B%3%M%/%7%g%s%W!<%k%b!<%I(B</a></li> - <li><a href="#replication_mode">$B%l%W%j%1!<%7%g%s%b!<%I(B</a></li> - <li><a href="#master_slave_mode">$B%^%9%?!<%9%l!<%V%b!<%I(B</a></li> - <li><a href="#stream">Streaming Replication$B$X$NBP1~(B</a></li> - <li><a href="#parallel">$B%Q%i%l%k%b!<%I(B</a></li> - <li><a href="#hba">$B%/%i%$%"%s%HG'>Z(B(HBA)$B$N$?$a$N(B pool_hba.conf $B@_DjJ}K!(B</a></li> - <li><a href="#query_cache">$B%/%(%j%-%c%C%7%e$N@_DjJ}K!(B</a></li> - <li><a href="#memqcache">$B%*%s%a%b%j%/%(%j%-%c%C%7%e$N@_DjJ}K!(B</a></li> - <li><a href="#start">pgpool-II$B$N5/F0$HDd;_(B</a></li> - <li><a href="#reload">pgpool-II$B$N@_Dj%U%!%$%k$N:FFI$_9~$_(B</a></li> - <li><a href="#show-commands">SHOW$B%3%^%s%I(B</a></li> - <li><a href="#online-recovery">$B%*%s%i%$%s%j%+%P%j(B</a></li> - <li><a href="#backup">$B%P%C%/%"%C%W(B</a></li> - <li><a href="#deploy">pgpool-II$B$NG[CV$K$D$$$F(B</a></li> - <li><a href="#troubleshooting">$B%H%i%V%k%7%e!<%F%#%s%0(B</a></li> - <li><a href="#restriction">$B@)8B;v9`(B</a></li> - <li><a href="#reference">$B%j%U%!%l%s%9(B</a></li> - <li><a href="#internal">$BFbIt>pJs(B</a></li> - <li><a href="#release">$B%j%j!<%9%N!<%H(B</a></li> + <li id="active"><a href="#Whatis" id="current">pgpool-IIとは</a></li> + <li><a href="#platform">pgpool-IIの稼働環境</a></li> + <li><a href="#install">pgpool-IIのインストール</a></li> + <li><a href="#config">pgpool-IIの設定</a></li> + <li><a href="#common">共通設定項目</a></li> + <li><a href="#connection_pool_mode">コネクションプールモード</a></li> + <li><a href="#replication_mode">レプリケーションモード</a></li> + <li><a href="#master_slave_mode">マスタースレーブモード</a></li> + <li><a href="#stream">Streaming Replicationへの対応</a></li> + <li><a href="#parallel">パラレルモード</a></li> + <li><a href="#hba">クライアント認証(HBA)のための pool_hba.conf 設定方法</a></li> + <li><a href="#query_cache">クエリキャッシュの設定方法</a></li> + <li><a href="#memqcache">オンメモリクエリキャッシュの設定方法</a></li> + <li><a href="#start">pgpool-IIの起動と停止</a></li> + <li><a href="#reload">pgpool-IIの設定ファイルの再読み込み</a></li> + <li><a href="#show-commands">SHOWコマンド</a></li> + <li><a href="#online-recovery">オンラインリカバリ</a></li> + <li><a href="#backup">バックアップ</a></li> + <li><a href="#deploy">pgpool-IIの配置について</a></li> + <li><a href="#watchdog">watchdog</a></li> + <li><a href="#troubleshooting">トラブルシューティング</a></li> + <li><a href="#restriction">制限事項</a></li> + <li><a href="#reference">リファレンス</a></li> + <li><a href="#internal">内部情報</a></li> + <li><a href="#release">リリースノート</a></li> </ul> </div> @@ -53,167 +54,167 @@ Last modified: Thu Jul 5 17:28:23 JST 2012 <!-- ================================================================================ --> -<h1 style="margin-top: 20px">pgpool-II$B$H$O(B<a name="whatis"></a></h1> +<h1 style="margin-top: 20px">pgpool-IIとは<a name="whatis"></a></h1> <p> -pgpool-II$B$O(BPostgreSQL$B@lMQ$N%_%I%k%&%'%"$G!"(BPostgreSQL$B$N%G!<%?%Y!<%9%/%i%$%"%s%H$H(B -PostgreSQL$B%5!<%P$N4V$K3d$j9~$`7A$GF0:n$7!"(BPostgrSQL$B$K0J2<$N$h$&$J5!G=$rDI2C$7$^$9!#(B +pgpool-IIはPostgreSQL専用のミドルウェアで、PostgreSQLのデータベースクライアントと +PostgreSQLサーバの間に割り込む形で動作し、PostgrSQLに以下のような機能を追加します。 </p> <ul> - <li>$B%3%M%/%7%g%s%W!<%j%s%0(B + <li>コネクションプーリング <p> - PostgreSQL$B$X$N@\B3$rJ]B8$7$F$*$-!"F1$8B0@-(B($B%f!<%6L>!"%G!<%?%Y!<%9!"%W%m%H%3%k%P!<%8%g%s(B)$B$r;}$D@\B3$r(B - $B<u$1IU$1$?$H$-$K:FMxMQ$9$k$3$H$K$h$C$F(B - PostgreSQL$B$X$N@\B3%*!<%P%X%C%I$rDc8:$7!"%7%9%F%`A4BN$N%9%k!<%W%C%H$r8~>e$9$k$3$H$,$G$-$^$9!#(B + PostgreSQLへの接続を保存しておき、同じ属性(ユーザ名、データベース、プロトコルバージョン)を持つ接続を + 受け付けたときに再利用することによって + PostgreSQLへの接続オーバヘッドを低減し、システム全体のスループットを向上することができます。 </p> </li> - <li>$B%l%W%j%1!<%7%g%s(B + <li>レプリケーション <p> - pgpool-II$B$OJ#?t$N(BPostgreSQL$B%5!<%P$r4IM}$9$k$3$H$,$G$-$^$9!#%l%W%j%1!<%7%g%s5!G=$r;HMQ$9$k$3$H$K$h$j!"(B - $BJ*M}E*$K(B2$BBf0J>e$N(BDB$B%5!<%P$K%j%"%k%?%$%`$G%G!<%?$rJ]B8$9$k$3$H$,$G$-!"(B - $BK|$,0l$I$l$+$N(BDB$B%5!<%P$K>c32$,H/@8$7$F$b1?MQ$r7QB3$9$k$3$H$,$G$-$^$9!#(B + pgpool-IIは複数のPostgreSQLサーバを管理することができます。レプリケーション機能を使用することにより、 + 物理的に2台以上のDBサーバにリアルタイムでデータを保存することができ、 + 万が一どれかのDBサーバに障害が発生しても運用を継続することができます。 </p> </li> - <li>$BIi2YJ,;6(B + <li>負荷分散 <p> - $B%l%W%j%1!<%7%g%s$^$?%^%9%?!<%9%l!<%V%b!<%I$G1?MQ$7$F$$$k>l9g!"$I$N%5!<%P$KLd$$9g$o$;$F$bF1$87k2L$,JV$C$F$-$^$9!#(B - $BB??t$N8!:w%j%/%(%9%H$r$=$l$>$l$N%5!<%P$GJ,C4$7$FIi2Y$r7Z8:$5$;!"%7%9%F%`A4BN$N@-G=$r8~>e$5$;$k$3$H$,$G$-$^$9!#(B - $B:GNI$N>l9g$K$O%5!<%PBf?t$KHfNc$7$?@-G=8~>e$,8+9~$a$^$9!#(B + レプリケーションまたマスタースレーブモードで運用している場合、どのサーバに問い合わせても同じ結果が返ってきます。 + 多数の検索リクエストをそれぞれのサーバで分担して負荷を軽減させ、システム全体の性能を向上させることができます。 + 最良の場合にはサーバ台数に比例した性能向上が見込めます。 </p> <p> - $BFC$KB??t$N%f!<%6$,BgNL$NLd$$9g$o$;$rEj$2$k$h$&$J4D6-$G0RNO$rH/4x$7$^$9!#(B + 特に多数のユーザが大量の問い合わせを投げるような環境で威力を発揮します。 </p> </li> - <li>$B@\B3?t$N@)8B(B + <li>接続数の制限 <p> - PostgreSQL$B$K@\B32DG=$J%;%C%7%g%s?t$K$O>e8B$,$"$j!"$=$l$rD6$($F@\B3$9$k$3$H$O$G$-$^$;$s!#(B - $B$+$H8@$C$F!"F1;~%;%C%7%g%s?t$r$`$d$_$KB?$/$9$k$H!"%a%b%j!<$J$I$N%j%=!<%9$,B?$/>CHq$5$l$F(B - $B%Q%U%)!<%^%s%9$K1F6A$,$"$j$^$9!#(B + PostgreSQLに接続可能なセッション数には上限があり、それを超えて接続することはできません。 + かと言って、同時セッション数をむやみに多くすると、メモリーなどのリソースが多く消費されて + パフォーマンスに影響があります。 </p> <p> - pgpool-II$B$G$b%/%i%$%"%s%H$+$i$N@\B3?t$K$O>e8B$,$"$j$^$9$,!"$=$l$rD6$($F$b$?$@$A$K%(%i!<$K$J$k$3$H$O$J$/!"(B - $B0lDj$N4VBT$?$5$l$k$h$&$K$J$C$F$$$^$9!#(B - $B$7$?$,$C$F!"(Bpgpool-II$B$O(BPostgreSQL$B$X$N@\B3MW5a$r<B<AE*$K%-%e!<%$%s%0$7!"(B - PostgreSQL$B$X$N2aBg$J@\B3?t$r@)8B$9$k$3$H$,2DG=$G$9!#(B + pgpool-IIでもクライアントからの接続数には上限がありますが、それを超えてもただちにエラーになることはなく、 + 一定の間待たされるようになっています。 + したがって、pgpool-IIはPostgreSQLへの接続要求を実質的にキューイングし、 + PostgreSQLへの過大な接続数を制限することが可能です。 </p> </li> - <li>$B%Q%i%l%k%/%(%j(B + <li>パラレルクエリ <p> - $BJ#?t$N%5!<%P$K%G!<%?$rJ,3d$7$F<u$1;}$?$;!"$=$l$>$l$N%5!<%P$KF1;~$K8!:wLd$$9g$o$;$rEj$2$F!"(B - $BLd$$9g$o$;$N=hM};~4V$rC;=L$9$k%Q%i%l%k%/%(%j$,MxMQ$G$-$^$9!#(B - $BFC$KBg5,LO$J%G!<%?%Y!<%9$KBP$7$F8!:w$r<B9T$9$k$H$-$K0RNO$rH/4x$7$^$9!#(B + 複数のサーバにデータを分割して受け持たせ、それぞれのサーバに同時に検索問い合わせを投げて、 + 問い合わせの処理時間を短縮するパラレルクエリが利用できます。 + 特に大規模なデータベースに対して検索を実行するときに威力を発揮します。 </p> </li> </ul> <p> -pgpool-II$B$O(BPostgreSQL$B%P%C%/%(%s%I$H%U%m%s%H%(%s%I$NDL?.%W%m%H%3%k$rM}2r$7$F$=$N4V$rCf7Q$7$^$9!#(B -$B$9$J$o$A!"(BPostgreSQL$B$N%G!<%?%Y!<%9%"%W%j%1!<%7%g%s$+$i$O(BPostgreSQL$B%5!<%P$K!"(B -PostgreSQL$B$+$i$O%G!<%?%Y!<%9%"%W%j%1!<%7%g%s$K8+$($k$h$&$K@_7W$5$l$F$$$^$9!#(B +pgpool-IIはPostgreSQLバックエンドとフロントエンドの通信プロトコルを理解してその間を中継します。 +すなわち、PostgreSQLのデータベースアプリケーションからはPostgreSQLサーバに、 +PostgreSQLからはデータベースアプリケーションに見えるように設計されています。 </p> <p> -$B$=$N$?$a!"(BPostgreSQL$B$=$N$b$N$O$b$A$m$s!"%"%W%j%1!<%7%g%s$N3+H/8@8l$K$h$i$:!"(B -PostgreSQL$B$N%G!<%?%Y!<%9%"%W%j%1!<%7%g%s$K$[$H$s$I<j$r2C$($k$3$H$J$/!"(B -pgpool-II$B$N5!G=$,MxMQ$G$-$^$9!#(B +そのため、PostgreSQLそのものはもちろん、アプリケーションの開発言語によらず、 +PostgreSQLのデータベースアプリケーションにほとんど手を加えることなく、 +pgpool-IIの機能が利用できます。 </p> -<p><strong>$B0lIt$N(BSQL$B$K$O(B<a href="#restriction">$B@)8B;v9`(B</a>$B$,$"$j$^$9!#(B</strong></p> +<p><strong>一部のSQLには<a href="#restriction">制限事項</a>があります。</strong></p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1>pgpool-II$B$N2TF/4D6-(B<a name="platform"></a></h1> +<h1>pgpool-IIの稼働環境<a name="platform"></a></h1> <p> -pgpool-II$B$O!"(BLinux$B$r$O$8$a!"(BSolaris$B$d(BFreeBSD$B$J$I$N$[$H$s$I$N(BUNIX$B4D6-$GF0:n$7$^$9!#(BWindows$B$G$OF0$-$^$;$s!#(B +pgpool-IIは、Linuxをはじめ、SolarisやFreeBSDなどのほとんどのUNIX環境で動作します。Windowsでは動きません。 </p> <p> -$BBP1~$9$k(BPostgreSQL$B$N%P!<%8%g%s$O!"(BPostgreSQL$B$N(B6.4$B0J9_$G$9!#(B -$B$?$@$7%Q%i%l%k%/%(%j%b!<%I$r;HMQ$9$k$H$-$O(BPostgreSQL 7.4$B0J9_$r$*;H$$$/$@$5$$!#(B -$B$^$?!"(BPostgreSQL 7.4$B$h$jA0$N%P!<%8%g%s$G$O!";HMQ$G$-$k5!G=$K@)8B;v9`$,$"$j$^$9!#(B -$B$b$C$H$b!"$=$N$h$&$J8E$$%P!<%8%g%s$N(BPostgreSQL$B$O$=$b$=$b;H$&$Y$-$G$O$"$j$^$;$s!#(B +対応するPostgreSQLのバージョンは、PostgreSQLの6.4以降です。 +ただしパラレルクエリモードを使用するときはPostgreSQL 7.4以降をお使いください。 +また、PostgreSQL 7.4より前のバージョンでは、使用できる機能に制限事項があります。 +もっとも、そのような古いバージョンのPostgreSQLはそもそも使うべきではありません。 </p> <p> -pgpool-II$BG[2<$GMxMQ$9$k(BPostgreSQL$B%5!<%P$N%a%8%c!<%P!<%8%g%s!"(BOS$B$d%O!<%I%&%'%"%"!<%-%F%/%A%c$rF1$8$b$N$K$7$J$1$l$P$J$j$^$;$s!#(B -$B$^$?!"%P!<%8%g%s$,F1$8$G$"$C$F$b!"(BPostgreSQL$B$N%S%k%IJ}K!$,0c$&$b$N$r:.$<$F$$$k>l9g$NF0:n$OJ]>Z$G$-$^$;$s!#(B -$B$?$H$($P!"(BSSL$B%5%]!<%H$NM-L5!"F|IU7?$N<BAuJ}K!(B(--disable-integer-datetimes)$B!"%V%m%C%/%5%$%:$N0c$$$J$I$O!"(Bpgpool-II$B$N0lIt$N5!G=$K1F6A$rM?$($k$G$7$g$&!#(B -PostgreSQL$B$N%^%$%J!<%P!<%8%g%s$,0c$&>l9g$OBgDq$N>l9gLdBj$K$J$j$^$;$s$,!"$9$Y$F$N(BPostgreSQL$B$N%^%$%J!<%P!<%8%g%s$r8!>Z$7$?$o$1$G$O$J$$$N$G!"$G$-$l$P%^%$%J!<%P!<%8%g%s$r9g$o$;$F$*$/$3$H$r$*4+$a$7$^$9!#(B +pgpool-II配下で利用するPostgreSQLサーバのメジャーバージョン、OSやハードウェアアーキテクチャを同じものにしなければなりません。 +また、バージョンが同じであっても、PostgreSQLのビルド方法が違うものを混ぜている場合の動作は保証できません。 +たとえば、SSLサポートの有無、日付型の実装方法(--disable-integer-datetimes)、ブロックサイズの違いなどは、pgpool-IIの一部の機能に影響を与えるでしょう。 +PostgreSQLのマイナーバージョンが違う場合は大抵の場合問題になりませんが、すべてのPostgreSQLのマイナーバージョンを検証したわけではないので、できればマイナーバージョンを合わせておくことをお勧めします。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1>pgpool-II$B$N%$%s%9%H!<%k(B<a name="install"></a></h1> +<h1>pgpool-IIのインストール<a name="install"></a></h1> <p> -Linux$BMQ$N(BRPM$B%Q%C%1!<%8$O!"(BCentOS$B!"(BRedHat Enterprise Linux$B!"(BFedora$B!"(BDebian$BMQ$J$I$,Ds6!$5$l$F$$$^$9!#(B -$B3:Ev%j%]%8%H%j$r%A%'%C%/$7$F$_$F$/$@$5$$!#(B +Linux用のRPMパッケージは、CentOS、RedHat Enterprise Linux、Fedora、Debian用などが提供されています。 +該当リポジトリをチェックしてみてください。 </p> <p> -pgpool-II $B$N%=!<%9%3!<%I$O(B<a href="http://pgpool.net/mediawiki/index.php/Downloads">pgpool$B3+H/%Z!<%8(B</a> $B$+$i(B -$B%@%&%s%m!<%I$G$-$^$9!#(B +pgpool-II のソースコードは<a href="http://pgpool.net/mediawiki/index.php/Downloads">pgpool開発ページ</a> から +ダウンロードできます。 </p> <p> -pgpool-II$B$N%=!<%9%3!<%I$+$i$N%$%s%9%H!<%k$K$O!"(Bgcc 2.9$B0J>e!"$*$h$S(BGNU make$B$,I,MW$G$9!#(B -$B$^$?!"(Bpgpool-II$B$O(Blibpq(PostgreSQL$BIUB0$N%/%i%$%"%s%H%i%$%V%i%j(B)$B$r;HMQ$9$k$N$G!"(B -$B%S%k%I$r9T$&%^%7%s>e$K(Blibpq$B$,%$%s%9%H!<%k$5$l$F$$$k$3$H$,I,MW$G$9!#(B -$B$^$?!"(BOpenSSL$B%5%]!<%H$rM-8z$K$9$k>l9g$O!"(BOpenSSL$B%i%$%V%i%j$H3+H/MQ$N%X%C%@!<%U%!%$%k$,I,MW$G$9!#(B +pgpool-IIのソースコードからのインストールには、gcc 2.9以上、およびGNU makeが必要です。 +また、pgpool-IIはlibpq(PostgreSQL付属のクライアントライブラリ)を使用するので、 +ビルドを行うマシン上にlibpqがインストールされていることが必要です。 +また、OpenSSLサポートを有効にする場合は、OpenSSLライブラリと開発用のヘッダーファイルが必要です。 </p> <dl> -<dt>configure$B$N<B9T(B</dt> +<dt>configureの実行</dt> <dd> - <p>$B%=!<%9%3!<%I$N(Btar ball$B$rE83+$7$?$i!"(Bconfigure$B$r<B9T$7$^$9!#(B</p> + <p>ソースコードのtar ballを展開したら、configureを実行します。</p> <pre> ./configure </pre> - <p>configure$B$K;XDj$G$-$k%*%W%7%g%s$O0J2<$G$9!#(B</p> + <p>configureに指定できるオプションは以下です。</p> <table border> <tr><th class="nodec"><code>--prefix=path</code></th> - <td>pgpool-II$BK\BN$d4XO"%U%!%$%k$r%$%s%9%H!<%k$9$k%H%C%W%G%#%l%/%H%j$r;XDj$7$^$9!#(B - $B%G%U%)%k%H$O(B/usr/local$B$G$9!#(B + <td>pgpool-II本体や関連ファイルをインストールするトップディレクトリを指定します。 + デフォルトは/usr/localです。 </td></tr> <tr><th class="nodec"><code>--with-pgsql=path</code></th> - <td>PostgreSQL$B$N%/%i%$%"%s%H%i%$%V%i%j$J$I$,%$%s%9%H!<%k$5$l$F$$$k%H%C%W%G%#%l%/%H%j$r;XDj$7$^$9!#(B - $B%G%U%)%k%H$O(B<code>pg_config</code>$B%3%^%s%I$G<hF@$G$-$k%Q%9$G$9!#(B + <td>PostgreSQLのクライアントライブラリなどがインストールされているトップディレクトリを指定します。 + デフォルトは<code>pg_config</code>コマンドで取得できるパスです。 </td></tr> <tr><th class="nodec"><code>--with-openssl</code></th> - <td>pgpool-II$B$r(BOpenSSL$B%5%]!<%HIU$G:n@.$7$^$9!#(B - $B%G%U%)%k%H$G$O(BOpenSSL$B%5%]!<%H$OL58z$G$9!#(B - <span class="version">V2.3 $B!A(B</span> + <td>pgpool-IIをOpenSSLサポート付で作成します。 + デフォルトではOpenSSLサポートは無効です。 + <span class="version">V2.3 〜</span> </td></tr> <tr><th class="nodec"><code>--enable-sequence-lock</code></th> - <td>pgpool-II 3.0$B%7%j!<%:(B(3.0.4$B$^$G(B)$B8_49$N(Binsert_lock$B$r;HMQ$7$^$9!#(B - pgpool-II$B$O!"%7!<%1%s%9%F!<%V%k$N9T$KBP$7$F%m%C%/$r9T$$$^$9!#(B - $B$3$l$O!"(B2011$BG/(B06$B7n$h$j8e$K%j%j!<%9$5$l$?(BPostgreSQL 8.2$B0J9_$G$O;HMQ$G$-$^$;$s!#(B - <span class="version">V3.1 $B!A(B</span> + <td>pgpool-II 3.0シリーズ(3.0.4まで)互換のinsert_lockを使用します。 + pgpool-IIは、シーケンステーブルの行に対してロックを行います。 + これは、2011年06月より後にリリースされたPostgreSQL 8.2以降では使用できません。 + <span class="version">V3.1 〜</span> </td></tr> <tr><th class="nodec"><code>--enable-table-lock</code></th> - <td>pgpool-II 2.2$B$H(B2.3$B%7%j!<%:8_49$N(Binsert_lock$B$r;HMQ$7$^$9!#(B - pgpool-II$B$O!"A^F~BP>]$N%F!<%V%k$KBP$7$F%m%C%/$r9T$$$^$9!#(B - $B$3$l$O!"%m%C%/$,(BVACUUM$B$H6%9g$9$k$?$aHs?d>)$G$9!#(B - <span class="version">V3.1 $B!A(B</span> + <td>pgpool-II 2.2と2.3シリーズ互換のinsert_lockを使用します。 + pgpool-IIは、挿入対象のテーブルに対してロックを行います。 + これは、ロックがVACUUMと競合するため非推奨です。 + <span class="version">V3.1 〜</span> </td></tr> <tr><th class="nodec"><code>--with-memcached=path</code> </th> - <td>$B%-%c%C%7%e%9%H%l!<%8$K(B <a href="memcached_params">memcached</a> $B$rMxMQ$7!"(B - <a href="#memqcache">$B%*%s%a%b%j%/%(%j%-%c%C%7%e(B</a>$B5!G=$r(B - $BMxMQ$7$?$$>l9g$K;XDj$7$^$9!#(B - <a href="http://libmemcached.org/libMemcached.html">libMemcached</a>$B$N%$%s%9%H!<%k$,I,MW$G$9!#(B - <span class="version">V3.2 $B!A(B</span> + <td>キャッシュストレージに <a href="memcached_params">memcached</a> を利用し、 + <a href="#memqcache">オンメモリクエリキャッシュ</a>機能を + 利用したい場合に指定します。 + <a href="http://libmemcached.org/libMemcached.html">libMemcached</a>のインストールが必要です。 + <span class="version">V3.2 〜</span> </td></tr> </table> </dd> -<dt>make$B$N<B9T(B</dt> +<dt>makeの実行</dt> <dd> <pre> make @@ -221,16 +222,16 @@ make install </pre> </dd> -<dt>pgpool_regclass$B$N%$%s%9%H!<%k(B <span class="version">V3.0 $B!A(B</span></dt> +<dt>pgpool_regclassのインストール <span class="version">V3.0 〜</span></dt> <dd> <p> - PostgreSQL 8.0$B0J9_$r;HMQ$7$F$$$k>l9g$O!"(Bpgpool-II$B$,FbIt$G;HMQ$9$k(BC$B4X?t(Bpgpool_regclass$B$r%$%s%9%H!<%k$7$^$9!#(B - $B$3$N4X?t$,%$%s%9%H!<%k$5$l$F$$$J$/$F$b(Bpgpool-II$B$OF0:n$7$^$9$,!"0c$&%9%-!<%^$GF1$8%F!<%V%kL>$rDj5A$7$F$$$F!"(B - SQL$BJ8$NCf$G%9%-!<%^L>$r>JN,$7$F$$$k>l9g$K!"IT6q9g$,@8$8$k$3$H$,$"$j$^$9(B($B0l;~%F!<%V%k$r=|$/(B)$B!#(B - $B$7$?$,$C$F!"2DG=$J$i$P(Bpgpool_regclass$B$r%$%s%9%H!<%k$9$k$3$H$r$*4+$a$7$^$9!#(B + PostgreSQL 8.0以降を使用している場合は、pgpool-IIが内部で使用するC関数pgpool_regclassをインストールします。 + この関数がインストールされていなくてもpgpool-IIは動作しますが、違うスキーマで同じテーブル名を定義していて、 + SQL文の中でスキーマ名を省略している場合に、不具合が生じることがあります(一時テーブルを除く)。 + したがって、可能ならばpgpool_regclassをインストールすることをお勧めします。 </p> <p> - $B$3$N%$%s%9%H!<%k$O!"(Bpgpool-II$B$,%"%/%;%9$9$kM=Dj$N$9$Y$F$N(BPostgreSQL$B%5!<%P$G<B;\$7$F$/$@$5$$!#(B + このインストールは、pgpool-IIがアクセスする予定のすべてのPostgreSQLサーバで実施してください。 </p> <pre> cd pgpool-II-x.x.x/sql/pgpool-regclass @@ -240,25 +241,25 @@ psql -f pgpool-regclass.sql template1 </pre> <p> - pgpool-regclass.sql$B$N<B9T$O!"(Bpgpool-II$B7PM3$GMxMQ$9$k%G!<%?%Y!<%9Kh$KI,MW$K$J$j$^$9!#(B - $B$?$@$7!"(B"psql -f pgpool-regclass.sql template1"$B$r<B9T8e$K:n@.$5$l$?%G!<%?%Y!<%9$G$O(B - $B<+F0E*$K(Bpgpool-regclass.sql$B$NFbMF$,H?1G$5$l$F$$$k$N$G!"?7$?$K(Bpgpool-regclass.sql$B$r<B9T$9$kI,MW$O$"$j$^$;$s!#(B + pgpool-regclass.sqlの実行は、pgpool-II経由で利用するデータベース毎に必要になります。 + ただし、"psql -f pgpool-regclass.sql template1"を実行後に作成されたデータベースでは + 自動的にpgpool-regclass.sqlの内容が反映されているので、新たにpgpool-regclass.sqlを実行する必要はありません。 </p> </dd> -<dt>insert_lock$B%F!<%V%k$N:n@.(B <span class="version">V3.0 $B!A(B</span></dt> +<dt>insert_lockテーブルの作成 <span class="version">V3.0 〜</span></dt> <dd> <p> - $B%l%W%j%1!<%7%g%s%b!<%I$G(Binsert_lock$B$rMxMQ$7$?$$>l9g$O!"GSB>@)8fMQ$N%F!<%V%k(B - pgpool_catalog.insert_lock$B$r:n@.$7$^$9!#(B - insert_lock$B%F!<%V%k$,B8:_$7$J$/$F$b:#$N$H$3$m(Binsert_lock$B$OF0:n$7$^$9$,!"(B - $B$=$N>l9g$O!"A^F~BP>]$N%F!<%V%k$KBP$7$F%m%C%/$,9T$o$l$^$9!#(B - $B$3$l$O(Bpgpool-II 2.2$B$H(B2.3$B%7%j!<%:$NF0:n$HF1$8$G$9!#A^F~BP>]$N%F!<%V%k$KBP$9$k%m%C%/$O!"(B - VACUUM$B$H6%9g$7$F(BINSERT$B=hM}$,D9;~4V$,BT$?$5$l$k2DG=@-$,$"$j$^$9!#(B + レプリケーションモードでinsert_lockを利用したい場合は、排他制御用のテーブル + pgpool_catalog.insert_lockを作成します。 + insert_lockテーブルが存在しなくても今のところinsert_lockは動作しますが、 + その場合は、挿入対象のテーブルに対してロックが行われます。 + これはpgpool-II 2.2と2.3シリーズの動作と同じです。挿入対象のテーブルに対するロックは、 + VACUUMと競合してINSERT処理が長時間が待たされる可能性があります。 </p> <p> - $B$7$?$,$C$F!"(Binsert_lock$B%F!<%V%k$r:n@.$9$k$3$H$r$*4+$a$7$^$9!#(B - $B%F!<%V%k$N:n@.$O!"(Bpgpool-II$B$,%"%/%;%9$9$kM=Dj$N$9$Y$F$N(BPostgreSQL$B%5!<%P$G<B;\$7$F$/$@$5$$!#(B + したがって、insert_lockテーブルを作成することをお勧めします。 + テーブルの作成は、pgpool-IIがアクセスする予定のすべてのPostgreSQLサーバで実施してください。 </p> <pre> @@ -267,118 +268,118 @@ psql -f insert_lock.sql template1 </pre> <p> - insert_lock.sql$B$N<B9T$O!"(Bpgpool-II$B7PM3$GMxMQ$9$k%G!<%?%Y!<%9Kh$KI,MW$K$J$j$^$9!#(B - $B$?$@$7!"(B&quot;psql -f insert_lock.sql template1&quot;$B$r<B9T8e$K:n@.$5$l$?%G!<%?%Y!<%9$G$O(B - $B<+F0E*$K(Binsert_lock.sql$B$NFbMF$,H?1G$5$l$F$$$k$N$G!"(B - $B?7$?$K(Binsert_lock.sql$B$r<B9T$9$kI,MW$O$"$j$^$;$s!#(B + insert_lock.sqlの実行は、pgpool-II経由で利用するデータベース毎に必要になります。 + ただし、&quot;psql -f insert_lock.sql template1&quot;を実行後に作成されたデータベースでは + 自動的にinsert_lock.sqlの内容が反映されているので、 + 新たにinsert_lock.sqlを実行する必要はありません。 </p> </dd> </dl> <p> -$B0J>e$G%$%s%9%H!<%k$,40N;$7$^$9(B(GNU make$B$,I,MW$J$N$G!"(BSolaris$B$d(BFreeBSD$B$J$I$G$O(B -make$B$r(Bgmake$B$KFI$_BX$($F$/$@$5$$(B)$B!#(B +以上でインストールが完了します(GNU makeが必要なので、SolarisやFreeBSDなどでは +makeをgmakeに読み替えてください)。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1>pgpool-II$B$N@_Dj(B<a name="config"></a></h1> +<h1>pgpool-IIの設定<a name="config"></a></h1> <p> -pgpool-II$B$N@_Dj%U%!%$%k$O%G%U%)%k%H$G$O(B/usr/local/etc/pgpool.conf$B$*$h$S(B -/usr/local/etc/pcp.conf$B$G$9!#(Bpgpool-II$B$OF0:n%b!<%I$K$h$C$F;HMQ$G$-$k5!G=$H!"(B -$BI,MW$J@_Dj9`L\$,0[$J$j$^$9!#(B +pgpool-IIの設定ファイルはデフォルトでは/usr/local/etc/pgpool.confおよび +/usr/local/etc/pcp.confです。pgpool-IIは動作モードによって使用できる機能と、 +必要な設定項目が異なります。 </p> <table border> <tr class="header"> -<th>$B;HMQ$G$-$k5!G=(B/$B%b!<%I(B</th><th>raw$B%b!<%I(B(*3)</th><th>$B%l%W%j%1!<%7%g%s%b!<%I(B</th> -<th>$B%^%9%?%9%l!<%V%b!<%I(B</th><th>$B%Q%i%l%k%/%(%j%b!<%I(B</th> +<th>使用できる機能/モード</th><th>rawモード(*3)</th><th>レプリケーションモード</th> +<th>マスタスレーブモード</th><th>パラレルクエリモード</th> </tr> <tr> -<th>$B%3%M%/%7%g%s%W!<%j%s%0(B</th><td align="center">$B!_(B</td><td align="center">$B!{(B</td> -<td align="center">$B!{(B</td><td align="center">$B!{(B</td> +<th>コネクションプーリング</th><td align="center">×</td><td align="center">○</td> +<td align="center">○</td><td align="center">○</td> </tr> <tr> -<th>$B%l%W%j%1!<%7%g%s(B</th><td align="center">$B!_(B</td><td align="center">$B!{(B</td> -<td align="center">$B!_(B</td><td align="center">$B"$(B(*1)</td> +<th>レプリケーション</th><td align="center">×</td><td align="center">○</td> +<td align="center">×</td><td align="center">△(*1)</td> </tr> <tr> -<th>$BIi2YJ,;6(B</th><td align="center">$B!_(B</td><td align="center">$B!{(B</td> -<td align="center">$B!{(B</td><td align="center">$B"$(B(*1)</td> +<th>負荷分散</th><td align="center">×</td><td align="center">○</td> +<td align="center">○</td><td align="center">△(*1)</td> </tr> <tr> -<th>$B%U%'%$%k%*!<%P(B</th><td align="center">$B!{(B</td><td align="center">$B!{(B</td> -<td align="center">$B!{(B</td><td align="center">$B!_(B</td> +<th>フェイルオーバ</th><td align="center">○</td><td align="center">○</td> +<td align="center">○</td><td align="center">×</td> </tr> <tr> -<th>$B%*%s%i%$%s%j%+%P%j(B</th><td align="center">$B!_(B</td><td align="center">$B!{(B</td> -<td align="center">$B"$(B(*2)</td><td align="center">$B!_(B</td> +<th>オンラインリカバリ</th><td align="center">×</td><td align="center">○</td> +<td align="center">△(*2)</td><td align="center">×</td> </tr> <tr> -<th>$B%Q%i%l%k%/%(%j(B</th><td align="center">$B!_(B</td><td align="center">$B!_(B</td> -<td align="center">$B!_(B</td><td align="center">$B!{(B</td> +<th>パラレルクエリ</th><td align="center">×</td><td align="center">×</td> +<td align="center">×</td><td align="center">○</td> </tr> <tr> -<th>$B%5!<%PBf?t(B</th><td align="center">1$B0J>e(B</td><td align="center">2$B0J>e(B</td> -<td align="center">2$B0J>e(B</td><td align="center">2$B0J>e(B</td> +<th>サーバ台数</th><td align="center">1以上</td><td align="center">2以上</td> +<td align="center">2以上</td><td align="center">2以上</td> </tr> <tr> -<th>$B%7%9%F%`(BDB</th><td align="center">$BITMW(B</td><td align="center">$BITMW(B</td> -<td align="center">$BITMW(B</td><td align="center">$BI,MW(B</td> +<th>システムDB</th><td align="center">不要</td><td align="center">不要</td> +<td align="center">不要</td><td align="center">必要</td> </tr> </table> <ul> - <li>(*1)$B%Q%i%l%k%/%(%j%b!<%I$G$O!"%l%W%j%1!<%7%g%s$^$?$OIi2YJ,;6$rM-8z$K$9$kI,MW$,$"$j$^$9!#(B - $B$?$@$7!"J,3d$7$FJ]B8$7$F$$$k%F!<%V%k$KBP$7$F$O!"%l%W%j%1!<%7%g%s$J$i$S$KIi2YJ,;6$N5!G=$O;HMQ$5$l$^$;$s!#(B + <li>(*1)パラレルクエリモードでは、レプリケーションまたは負荷分散を有効にする必要があります。 + ただし、分割して保存しているテーブルに対しては、レプリケーションならびに負荷分散の機能は使用されません。 </li> - <li>(*2)$B%^%9%?!<%9%l!<%V%b!<%I$G$O!"(BStreaming Replication$B$HJ;MQ$9$k$H$-$K$N$_(B - $B%*%s%i%$%s%j%+%P%j$,2DG=$G$9!#(B + <li>(*2)マスタースレーブモードでは、Streaming Replicationと併用するときにのみ + オンラインリカバリが可能です。 </li> - <li>(*3)$BC1$K(Bpgpool-II$B$r7PM3$7$F@\B3$9$k$@$1$N%b!<%I$G$9!#(B - $B%l%W%j%1!<%7%g%s%b!<%I$b%^%9%?!<%9%l!<%V%b!<%I$bM-8z$K$7$F$$$J$$$H$-$NF0:n$G$9!#(B - PostgreSQL$B%5!<%P$X$N@\B3%;%C%7%g%s?t$r@)8B$7$?$j!"(B2$BBf0J>e$N(BPostgreSQL$B%5!<%P$rMQ0U$7$F(B - $B%U%'%$%k%*!<%PF0:n$r$5$;$?$$$H$-$KMxMQ$7$^$9!#(B + <li>(*3)単にpgpool-IIを経由して接続するだけのモードです。 + レプリケーションモードもマスタースレーブモードも有効にしていないときの動作です。 + PostgreSQLサーバへの接続セッション数を制限したり、2台以上のPostgreSQLサーバを用意して + フェイルオーバ動作をさせたいときに利用します。 </li> </ul> <!-- ================================================================================ --> -<h1 id="pcp_conf">pcp.conf$B$N@_Dj(B</h1> +<h1 id="pcp_conf">pcp.confの設定</h1> <p> -$B$I$NF0:n%b!<%I$G$b!"(Bpcp.conf$B$N@_Dj$OI,MW$G$9!#(Bpgpool-II$B$K$O4IM}<T$,(Bpgpool-II$B$N(B -$BDd;_$d>pJs<hF@$J$I$N4IM}A`:n$r9T$&$?$a$N%$%s%?!<%U%'%$%9$,MQ0U$5$l$F$$$^$9!#(B -$B$=$N%$%s%?!<%U%'%$%9$rMxMQ$9$k$?$a$K$O%f!<%6G'>Z$,I,MW$K$J$k$N$G!"(B -$B$=$N%f!<%6L>$H%Q%9%o!<%I$r(Bpcp.conf$B$KEPO?$7$^$9!#(B -pgpool-II$B$r%$%s%9%H!<%k$9$k$H!"(B$prefix/etc/pcp.conf.sample$B$,$G$-$k$N$G!"$=$l$r(B -$prefix/etc/pcp.conf$B$H$$$&L>A0$G%3%T!<$7$^$9!#(B +どの動作モードでも、pcp.confの設定は必要です。pgpool-IIには管理者がpgpool-IIの +停止や情報取得などの管理操作を行うためのインターフェイスが用意されています。 +そのインターフェイスを利用するためにはユーザ認証が必要になるので、 +そのユーザ名とパスワードをpcp.confに登録します。 +pgpool-IIをインストールすると、$prefix/etc/pcp.conf.sampleができるので、それを +$prefix/etc/pcp.confという名前でコピーします。 </p> <pre> cp $prefix/etc/pcp.conf.sample $prefix/etc/pcp.conf </pre> <p> -pcp.conf$B$G$O6uGr9T$d(B#$B$G;O$^$k9T$O%3%a%s%H$H8+$J$5$l$^$9!#(B -$B%f!<%6$H%Q%9%o!<%I$O!"(B +pcp.confでは空白行や#で始まる行はコメントと見なされます。 +ユーザとパスワードは、 </p> <pre> -$B%f!<%6L>(B:[md5$B0E9f2=$7$?%Q%9%o!<%I(B] +ユーザ名:[md5暗号化したパスワード] </pre> <p> -$B$N$h$&$K;XDj$7$^$9!#(B -[md5$B0E9f2=$7$?%Q%9%o!<%I(B]$B$O!"(B$prefix/bin/pg_md5$B%3%^%s%I$G:n@.$G$-$^$9!#(B +のように指定します。 +[md5暗号化したパスワード]は、$prefix/bin/pg_md5コマンドで作成できます。 </p> <pre> ./pg_md5 foo @@ -386,56 +387,56 @@ acbd18db4cc2f85cedef654fccc4a4d8 </pre> <p> -$B%Q%9%o!<%I$r0z?t$KEO$7$?$/$J$$>l9g$O(B pg_md5 -p $B$r<B9T$7$F$/$@$5$$!#(B +パスワードを引数に渡したくない場合は pg_md5 -p を実行してください。 </p> <pre> ./pg_md5 -p -password: &lt;$B%Q%9%o!<%I$rF~NO(B&gt; +password: &lt;パスワードを入力&gt; </pre> <p> -pcp.conf$B$O!"(Bpgpool-II$B$rF0:n$5$;$k%f!<%6(BID$B$GFI$_<h$j2DG=$K$J$C$F$$$J$1$l$P(B -$B$J$j$^$;$s!#(B +pcp.confは、pgpool-IIを動作させるユーザIDで読み取り可能になっていなければ +なりません。 </p> <!-- ================================================================================ --> -<h1 id="pgpool_conf">pgpool.conf$B$N@_Dj(B</h1> -<h2 id="pgpool_conf_sample">$B%5%s%W%k%U%!%$%k(B <span class="version">2.3 $B!A(B</span></h2> +<h1 id="pgpool_conf">pgpool.confの設定</h1> +<h2 id="pgpool_conf_sample">サンプルファイル <span class="version">2.3 〜</span></h2> <p> -pgpool-II$B$r%$%s%9%H!<%k$9$k$H!"%$%s%9%H!<%k@h%G%#%l%/%H%j(B($B%G%U%)%k%H$G$O(B/usr/local) -/etc/pgpool.conf.sample$B$,$G$-$k$N$G!"$=$l$r(B -$B%$%s%9%H!<%k@h%G%#%l%/%H%j(B/etc/pgpool.conf$B$H$$$&L>A0$G%3%T!<$7$^$9!#(B +pgpool-IIをインストールすると、インストール先ディレクトリ(デフォルトでは/usr/local) +/etc/pgpool.conf.sampleができるので、それを +インストール先ディレクトリ/etc/pgpool.confという名前でコピーします。 </p> <pre> -cp $B%$%s%9%H!<%k@h%G%#%l%/%H%j(B/etc/pgpool.conf.sample $prefix/etc/pgpool.conf +cp インストール先ディレクトリ/etc/pgpool.conf.sample $prefix/etc/pgpool.conf </pre> <p> -$B$^$?!"3FF0:n%b!<%IMQ$N%5%s%W%k(Bpgpool.conf$B$,MQ0U$5$l$F$$$^$9!#(B -$B$3$A$i$b$4MxMQ2<$5$$!#(B +また、各動作モード用のサンプルpgpool.confが用意されています。 +こちらもご利用下さい。 </p> <p> <table border> -<tr class="header"><th>$BF0:n%b!<%I(B</th><th>$B%5%s%W%k%U%!%$%kL>(B</th></tr> -<tr><th>$B%l%W%j%1!<%7%g%s%b!<%I(B</th><td>pgpool.conf.sample-replication</td></tr> -<tr><th>$B%^%9%?!<%9%l!<%V%b!<%I(B(Slony-I)</th><td>pgpool.conf.sample-master-slave</td></tr> -<tr><th>$B%^%9%?!<%9%l!<%V%b!<%I(B(Streaming replication)</th><td>pgpool.conf.sample-stream</td></tr> +<tr class="header"><th>動作モード</th><th>サンプルファイル名</th></tr> +<tr><th>レプリケーションモード</th><td>pgpool.conf.sample-replication</td></tr> +<tr><th>マスタースレーブモード(Slony-I)</th><td>pgpool.conf.sample-master-slave</td></tr> +<tr><th>マスタースレーブモード(Streaming replication)</th><td>pgpool.conf.sample-stream</td></tr> </table> </p> -<h2>$B%3%a%s%H$N07$$(B</h2> +<h2>コメントの扱い</h2> <p> -pgpool.conf$B$G$O6uGr9T$d(B#$B$G;O$^$k9T$O%3%a%s%H$H8+$J$5$l$^$9!#(B +pgpool.confでは空白行や#で始まる行はコメントと見なされます。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="common"></a>$B6&DL@_Dj9`L\(B</h1> +<h1><a name="common"></a>共通設定項目</h1> <p> -$B3FF0:n%b!<%I$G6&DL$9$k@_Dj9`L\$r@bL@$7$^$9!#(B +各動作モードで共通する設定項目を説明します。 </p> <h3>Connections</h3> @@ -444,85 +445,85 @@ pgpool.conf$B$G$O6uGr9T$d(B#$B$G;O$^$k9T$O%3%a%s%H$H8+$J$5$l$^$9!#(B <dt><a name="LISTEN_ADDRESS"></a>listen_addresses</dt> <dd> <p> - pgpool-II$B$,(BTCP/IP$B%3%M%/%7%g%s$r<u$1IU$1$k%"%I%l%9$r%[%9%HL>$^$?$O(BIP$B%"%I%l%9$G;XDj$7$^$9!#(B - $B!V(B*$B!W$r;XDj$9$k$H$9$Y$F$N(BIP$B%$%s%?%U%'!<%9$+$i$N%3%M%/%7%g%s$r<u$1IU$1$^$9!#(B - $B!V(B''$B!W$r;XDj$9$k$H(BTCP/IP$B%3%M%/%7%g%s$r<u$1IU$1$^$;$s!#%G%U%)%k%HCM$O!V(Blocalhost$B!W$G$9!#(B - UNIX$B%I%a%$%s%=%1%C%H7PM3$N%3%M%/%7%g%s$O>o$K<u$1IU$1$^$9!#(B + pgpool-IIがTCP/IPコネクションを受け付けるアドレスをホスト名またはIPアドレスで指定します。 + 「*」を指定するとすべてのIPインタフェースからのコネクションを受け付けます。 + 「''」を指定するとTCP/IPコネクションを受け付けません。デフォルト値は「localhost」です。 + UNIXドメインソケット経由のコネクションは常に受け付けます。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="PORT"></a>port</dt> <dd> <p> - pgpool-II$B$,%3%M%/%7%g%s$r<u$1IU$1$k%]!<%HHV9f$G$9!#%G%U%)%k%HCM$O(B9999 - $B$G$9!#(B - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + pgpool-IIがコネクションを受け付けるポート番号です。デフォルト値は9999 + です。 + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="SOCKET_DIR"></a>socket_dir</dt> <dd> <p> - pgpool-II$B$,%3%M%/%7%g%s$r<u$1IU$1$k(BUNIX$B%I%a%$%s%=%1%C%H$rCV$/%G%#%l%/%H%j$G$9!#(B - $B%G%U%)%k%HCM$O(B'/tmp'$B$G$9!#(B - $B$3$N%=%1%C%H$O!"(Bcron$B$K$h$C$F:o=|$5$l$k$3$H$,$"$k$N$GCm0U$7$F$/$@$5$$!#(B - <code>'/var/run'</code>$B$J$I$N%G%#%l%/%H%j$KJQ99$9$k$3$H$r$*4+$a$7$^$9!#(B + pgpool-IIがコネクションを受け付けるUNIXドメインソケットを置くディレクトリです。 + デフォルト値は'/tmp'です。 + このソケットは、cronによって削除されることがあるので注意してください。 + <code>'/var/run'</code>などのディレクトリに変更することをお勧めします。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="PCP_PORT"></a>pcp_port</dt> <dd> <p> - pcp$B$,;HMQ$9$k%]!<%HHV9f$G$9!#(B + pcpが使用するポート番号です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="PCP_SOCKET_DIR"></a>pcp_socket_dir</dt> <dd> <p> - pcp$B$,%3%M%/%7%g%s$r<u$1IU$1$k(BUNIX$B%I%a%$%s%=%1%C%H$rCV$/%G%#%l%/%H%j$G$9!#(B - $B%G%U%)%k%HCM$O(B'/tmp'$B$G$9!#(B - $B$3$N%=%1%C%H$O!"(Bcron$B$K$h$C$F:o=|$5$l$k$3$H$,$"$k$N$GCm0U$7$F$/$@$5$$!#(B - <code>'/var/run'</code>$B$J$I$N%G%#%l%/%H%j$KJQ99$9$k$3$H$r$*4+$a$7$^$9!#(B + pcpがコネクションを受け付けるUNIXドメインソケットを置くディレクトリです。 + デフォルト値は'/tmp'です。 + このソケットは、cronによって削除されることがあるので注意してください。 + <code>'/var/run'</code>などのディレクトリに変更することをお勧めします。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> -<dt><a name="BACKEND_SOCKET_DIR"></a>backend_socket_dir <span class="version">$B!A(B V3.0</dt> +<dt><a name="BACKEND_SOCKET_DIR"></a>backend_socket_dir <span class="version">〜 V3.0</dt> <dd> <p class="version_notice"> - <em class="caution">DEPRECATED$B!J!A(B 3.0$B!K(B</em> - $B$3$N%Q%i%a!<%?$O!"(Blibpq$B$N%]%j%7!<$K9g$o$;$F:o=|$5$l$^$9!#(B - $BBe$o$j$K(B <a href=#BACKEND_HOSTNAME">backend_hostname</a> $B%Q%i%a!<%?$r;H$C$F$/$@$5$$!#(B + <em class="caution">DEPRECATED(〜 3.0)</em> + このパラメータは、libpqのポリシーに合わせて削除されます。 + 代わりに <a href=#BACKEND_HOSTNAME">backend_hostname</a> パラメータを使ってください。 </p> <p> - UNIX$B%I%a%$%s%=%1%C%H7PM3$G(Bpgpool-II$B$,(BPostgreSQL$B$H@\B3$9$k:]$K;HMQ$9$k(B - PostgreSQL$B$N(BUNIX$B%I%a%$%s%=%1%C%H$,CV$+$l$F$$$k%G%#%l%/%H%j$G$9!#%G%U%)%k%HCM$O(B/tmp$B$G$9!#(B + UNIXドメインソケット経由でpgpool-IIがPostgreSQLと接続する際に使用する + PostgreSQLのUNIXドメインソケットが置かれているディレクトリです。デフォルト値は/tmpです。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="PCP_TIMEOUT"></a>pcp_timeout</dt> <dd> <p> - pcp$B$,(Bpgppool$B$H@\B3$9$k:]$N%?%$%`%"%&%HCM!#(B0$B$K$9$k$H%?%$%`%"%&%H$7$^$;$s!#(B - $B%G%U%)%k%HCM$O(B10($BIC(B)$B$G$9!#(B + pcpがpgppoolと接続する際のタイムアウト値。0にするとタイムアウトしません。 + デフォルト値は10(秒)です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> </dl> @@ -533,111 +534,111 @@ pgpool.conf$B$G$O6uGr9T$d(B#$B$G;O$^$k9T$O%3%a%s%H$H8+$J$5$l$^$9!#(B <dt><a name="NUM_INIT_CHILDREN"></a>num_init_children</dt> <dd> <p> - prefork$B$9$k(Bpgpool-II$B$N%5!<%P%W%m%;%9$N?t$G$9!#%G%U%)%k%HCM$O(B32$B$K$J$C$F$$$^$9!#(B - $B$3$l$,!"(Bpgpool-II$B$KBP$7$F%/%i%$%"%s%H$,F1;~$K@\B3$G$-$k>e8B$N?t$K$J$j$^$9!#(B - $B$3$l$rD6$($?>l9g$O!"$=$N%/%i%$%"%s%H$O!"(Bpgpool-II$B$N$I$l$+$i$N%W%m%;%9$X$N%U%m%s%H%(%s%I$N@\B3$,=*N;$9$k$^$G(B - $BBT$?$5$l$^$9(B(PostgreSQL$B$H0c$C$F%(%i!<$K$J$j$^$;$s(B)$B!#(B - $BBT$?$5$l$k?t$N>e8B$O!"(B2 * num_init_children $B$G$9!#(B + preforkするpgpool-IIのサーバプロセスの数です。デフォルト値は32になっています。 + これが、pgpool-IIに対してクライアントが同時に接続できる上限の数になります。 + これを超えた場合は、そのクライアントは、pgpool-IIのどれからのプロセスへのフロントエンドの接続が終了するまで + 待たされます(PostgreSQLと違ってエラーになりません)。 + 待たされる数の上限は、2 * num_init_children です。 </p> <p> - $B4pK\E*$K8e=R$N(Bmax_pool * num_init_children$BJ,$@$1(BPostgreSQL$B$X$N%3%M%/%7%g%s$,D%$i$l$^$9$,!"(B - $BB>$K0J2<$N9MN8$,I,MW$G$9!#(B + 基本的に後述のmax_pool * num_init_children分だけPostgreSQLへのコネクションが張られますが、 + 他に以下の考慮が必要です。 </p> <ul> - <li>$BLd$$9g$o$;$N%-%c%s%;%k$r9T$&$HDL>o$N%3%M%/%7%g%s$H$OJL$K?7$?$J%3%M%/%7%g%s$,D%$i$l$^$9!#(B - $B$7$?$,$C$F!"$9$Y$F$N%3%M%/%7%g%s$,;HMQCf$N>l9g$OLd$$9g$o$;$N%-%c%s%;%k$,$G$-$J$/$J$C$F$7$^$&$N$G!"(B - $B$4Cm0U2<$5$$!#(B - $BLd$$9g$o$;$N%-%c%s%;%k$rI,$:J]>Z$7$?$$>l9g$O!"A[Dj$5$l$k%3%M%/%7%g%s?t$NG\$NCM$r(B - $B@_Dj$9$k$3$H$r$*$9$9$a$7$^$9!#(B + <li>問い合わせのキャンセルを行うと通常のコネクションとは別に新たなコネクションが張られます。 + したがって、すべてのコネクションが使用中の場合は問い合わせのキャンセルができなくなってしまうので、 + ご注意下さい。 + 問い合わせのキャンセルを必ず保証したい場合は、想定されるコネクション数の倍の値を + 設定することをおすすめします。 </li> - <li>$B0lHL%f!<%6$G(BPostgreSQL$B$K@\B3$G$-$k$N$O!"(B - max_connections - superuser_reserved_connections $BJ,$@$1$G$9!#(B + <li>一般ユーザでPostgreSQLに接続できるのは、 + max_connections - superuser_reserved_connections 分だけです。 </li> </ul> <p> - $B0J>e$r$^$H$a$k$H!"(B + 以上をまとめると、 </p> <table border> - <tr><th>$B%/%(%j$N%-%c%s%;%k$r9MN8$7$J$$>l9g(B</th> + <tr><th>クエリのキャンセルを考慮しない場合</th> <td>max_pool * num_init_children &lt;=<br> (max_connections - superuser_reserved_connections)</td></tr> - <tr><th>$B%/%(%j$N%-%c%s%;%k$r9MN8$9$k>l9g(B</th> + <tr><th>クエリのキャンセルを考慮する場合</th> <td>max_pool * num_init_children * 2 &lt;=<br> (max_connections - superuser_reserved_connections)</td></tr> </table> <p> - $B$N$I$A$i$+$rK~$?$9$h$&$K@_Dj$7$F$/$@$5$$!#(B + のどちらかを満たすように設定してください。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="CHILD_LIFE_TIME"></a>child_life_time</dt> <dd> <p> - pgpool-II$B$N;R%W%m%;%9$N<wL?$G$9!#%"%$%I%k>uBV$K$J$C$F$+$i(B - child_life_time$BIC7P2a$9$k$H!"0lC6=*N;$7$F?7$7$$%W%m%;%9$r5/F0$7$^$9!#(B - $B%a%b%j!<%j!<%/$=$NB>$N>c32$KHw$($?M=KIA<CV$G$9!#(B - child_life_time$B$N%G%U%)%k%HCM$O(B300$BIC!"$9$J$o$A(B5$BJ,$G$9!#(B - 0$B$r;XDj$9$k$H$3$N5!G=$OF/$-$^$;$s!J$9$J$o$A5/F0$7$CJ|$7!K!#(B - $B$J$*!"$^$@0lEY$b%3%M%/%7%g%s$r<u$1IU$1$F$$$J$$%W%m%;%9$K$O(Bchild_life_time$B$OE,MQ$5$l$^$;$s!#(B + pgpool-IIの子プロセスの寿命です。アイドル状態になってから + child_life_time秒経過すると、一旦終了して新しいプロセスを起動します。 + メモリーリークその他の障害に備えた予防措置です。 + child_life_timeのデフォルト値は300秒、すなわち5分です。 + 0を指定するとこの機能は働きません(すなわち起動しっ放し)。 + なお、まだ一度もコネクションを受け付けていないプロセスにはchild_life_timeは適用されません。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="CHILD_MAX_CONNECTIONS"></a>child_max_connections</dt> <dd> <p> - $B3F(Bpgpool-II$B;R%W%m%;%9$X$N@\B32s?t$,$3$N@_DjCM$rD6$($k$H!"$=$N;R%W%m%;%9$r=*N;$7$^$9!#(B - <a href="#CHILD_LIFE_TIME">child_life_time</a> $B$d(B <a href="#CONNECTION_LIFE_TIME">connection_life_time</a>$B$,(B - $B8z$+$J$$$/$i$$K;$7$$%5!<%P$G!"(B - PostgreSQL$B%P%C%/%(%s%I$,HnBg2=$9$k$N$rKI$0$N$KM-8z$G$9!#(B + 各pgpool-II子プロセスへの接続回数がこの設定値を超えると、その子プロセスを終了します。 + <a href="#CHILD_LIFE_TIME">child_life_time</a> や <a href="#CONNECTION_LIFE_TIME">connection_life_time</a>が + 効かないくらい忙しいサーバで、 + PostgreSQLバックエンドが肥大化するのを防ぐのに有効です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="CLIENT_IDLE_LIMIT"></a>client_idle_limit</dt> <dd> <p> - $BA02s%/%i%$%"%s%H$+$iMh$?%/%(%j$+$i!"(Bclient_idle_limit $BIC1[$($F$b<!$N(B - $B%/%(%j$,FO$+$J$$>l9g$O!"%/%i%$%"%s%H$X$N@\B3$r6/@)E*$K@ZCG$7!"(B - $B%/%i%$%"%s%H$+$i$N<!$N%3%M%/%7%g%s$rBT$D$h$&$K$7$^$9!#(B - $B$3$N@_Dj$O!"$@$i$7$J$$%/%i%$%"%s%H%W%m%0%i%`$d!"%/%i%$%"%s%H$H(Bpgpool$B$N4V$N(B - TCP/IP$B%3%M%/%7%g%s$,ITD4$J$3$H$K$h$C$F!"(B - pgpool$B$N;R%W%m%;%9$,@jM-$5$l$F$7$^$&LdBj$r2sHr$9$k$N$KLrN)$A$^$9!#(B - $B%G%U%)%k%HCM$O(B 0($BL58z(B)$B$G$9!#$3$N%Q%i%a!<%?$O!"%*%s%i%$%s%j%+%P%j$N%;%+%s%I%9%F!<%8$G$OL5;k$5$l$^$9!#(B + 前回クライアントから来たクエリから、client_idle_limit 秒越えても次の + クエリが届かない場合は、クライアントへの接続を強制的に切断し、 + クライアントからの次のコネクションを待つようにします。 + この設定は、だらしないクライアントプログラムや、クライアントとpgpoolの間の + TCP/IPコネクションが不調なことによって、 + pgpoolの子プロセスが占有されてしまう問題を回避するのに役立ちます。 + デフォルト値は 0(無効)です。このパラメータは、オンラインリカバリのセカンドステージでは無視されます。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="ENABLE_POOL_HBA"></a>enable_pool_hba</dt> <dd> <p> - true$B$J$i$P!"(Bpool_hba.conf$B$K=>$C$F%/%i%$%"%s%HG'>Z$r9T$$$^$9!#(B - $B>\:Y$O(B<a href="#hba">$B%/%i%$%"%s%HG'>Z(B(HBA)$B$N$?$a$N(Bpool_hba.conf$B@_DjJ}K!(B</a>$B$r;2>H$7$F$/$@$5$$!#(B + trueならば、pool_hba.confに従ってクライアント認証を行います。 + 詳細は<a href="#hba">クライアント認証(HBA)のためのpool_hba.conf設定方法</a>を参照してください。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="AUTHENTICATION_TIMEOUT"></a>authentication_timeout</dt> <dd> <p> - $BG'>Z=hM}$N%?%$%`%"%&%H;~4V$rICC10L$G;XDj$7$^$9!#(B0 $B$r;XDj$9$k$H%?%$%`%"%&%H$rL58z$K$7$^$9!#(B - authentication_timeout $B$N%G%U%)%k%HCM$O(B60$B$G$9!#(B + 認証処理のタイムアウト時間を秒単位で指定します。0 を指定するとタイムアウトを無効にします。 + authentication_timeout のデフォルト値は60です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> </dl> @@ -645,19 +646,19 @@ pgpool.conf$B$G$O6uGr9T$d(B#$B$G;O$^$k9T$O%3%a%s%H$H8+$J$5$l$^$9!#(B <h3>Logs</h3> <dl> -<dt><a name="LOG_DESTINATION"></a>log_destination <span class="version">V3.1 $B!A(B</span></dt> +<dt><a name="LOG_DESTINATION"></a>log_destination <span class="version">V3.1 〜</span></dt> <dd> <p> - pgpool-II$B$O!"(Bstderr$B$+(Bsyslog$B$N$I$A$i$+$K%m%0$r=q$/$3$H$,$G$-$^$9!#%G%U%)%k%H$O(Bstderr$B$G$9!#(B + pgpool-IIは、stderrかsyslogのどちらかにログを書くことができます。デフォルトはstderrです。 </p> <p> - $BCm0U(B:syslog$B$r;H$&>l9g$O!"(Bsyslog$B%G!<%b%s$N@_Dj$rJQ99$9$kI,MW$,$"$j$^$9!#(B + 注意:syslogを使う場合は、syslogデーモンの設定を変更する必要があります。 </p> <p> - pgpool-II$B$O!"(Bsyslog $B%U%!%7%j%F%#(B LOCAL0 $B$+$i(B LOCAL7 $B$^$G$K%m%0$r=q$/$3$H$,$G$-$^$9(B - (syslog_facility$B$r$4Mw$/$@$5$$(B)$B!#(B - $B$7$+$7!"$[$H$s$I$N%G%U%)%k%H$N(Bsyslog$B@_Dj$O!"$=$N$h$&$J%a%C%;!<%8$rGQ4~$7$F$7$^$$$^$9!#(B - $B$=$3$G!"(Bsyslog$B%G!<%b%s$N0J2<$N$h$&$J@_Dj$,I,MW$K$J$j$^$9!#(B + pgpool-IIは、syslog ファシリティ LOCAL0 から LOCAL7 までにログを書くことができます + (syslog_facilityをご覧ください)。 + しかし、ほとんどのデフォルトのsyslog設定は、そのようなメッセージを廃棄してしまいます。 + そこで、syslogデーモンの以下のような設定が必要になります。 </p> <pre> local0.* /var/log/pgpool.log @@ -667,81 +668,81 @@ local0.* /var/log/pgpool.log <dt><a name="PRINT_TIMESTAMP"></a>print_timestamp</dt> <dd> <p> - true$B$J$i$P(Bpgpool-II$B$N%m%0$K%?%$%`%9%?%s%W$rDI2C$7$^$9!#%G%U%)%k%H$O(Btrue$B$G$9!#(B + trueならばpgpool-IIのログにタイムスタンプを追加します。デフォルトはtrueです。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="LOG_CONNECTIONS"></a>log_connections</dt> <dd> <p> - true$B$J$i$P!"A4$F$N%/%i%$%"%s%H@\B3$r%m%0$X=PNO$7$^$9!#(B + trueならば、全てのクライアント接続をログへ出力します。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="LOG_HOSTNAME"></a>log_hostname</dt> <dd> <p> - true$B$J$i$P!"(Bps$B%3%^%s%I$G$N>uBVI=<(;~$K(BIP$B%"%I%l%9$G$O$J$/!"%[%9%HL>$rI=<($7$^$9!#(B - $B$^$?!"(B<a href="#LOG_CONNECTIONS">log_connections</a>$B$,M-8z$J>l9g$K$O%m%0$K%[%9%HL>$r=PNO$7$^$9!#(B + trueならば、psコマンドでの状態表示時にIPアドレスではなく、ホスト名を表示します。 + また、<a href="#LOG_CONNECTIONS">log_connections</a>が有効な場合にはログにホスト名を出力します。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> <dt><a name="LOG_STATEMENT"></a>log_statement</dt> <dd> <p> - true$B$J$i$P(BSQL$BJ8$r%m%0=PNO$7$^$9!#$3$NLrL\$O(BPostgreSQL$B$N(Blog_statement$B%*%W%7%g%s$H;w$F$$$F!"(B - $B%G%P%C%0%*%W%7%g%s$,$J$$$H$-$G$bLd$$9g$o$;$r%m%0=PNO$7$FD4$Y$k$3$H$,$G$-$k$N$GJXMx$G$9!#(B + trueならばSQL文をログ出力します。この役目はPostgreSQLのlog_statementオプションと似ていて、 + デバッグオプションがないときでも問い合わせをログ出力して調べることができるので便利です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> -<dt><a name="LOG_PER_NODE_STATEMENT"></a>log_per_node_statement <span class="version">V2.3 $B!A(B</span></dt> +<dt><a name="LOG_PER_NODE_STATEMENT"></a>log_per_node_statement <span class="version">V2.3 〜</span></dt> <dd> <p> - <a href="#LOG_STATEMENT">log_statement</a>$B$H;w$F$$$^$9$,!"(BDB$B%N!<%IC10L$G%m%0$,=PNO$5$l$k$N$G!"(B - $B%l%W%j%1!<%7%g%s$dIi2YJ,;6$N3NG'$,MF0W$G$9!#(B + <a href="#LOG_STATEMENT">log_statement</a>と似ていますが、DBノード単位でログが出力されるので、 + レプリケーションや負荷分散の確認が容易です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> -<dt><a name="SYSLOG_FACILITY"></a>syslog_facility <span class="version">V3.1 $B!A(B</span></dt> +<dt><a name="SYSLOG_FACILITY"></a>syslog_facility <span class="version">V3.1 〜</span></dt> <dd> <p> - syslog$B$,M-8z$J>l9g!"$3$N%Q%i%a!<%?$K$h$C$F(Bsyslog$B$N!V%U%!%7%j%F%#!W$r@_Dj$7$^$9!#(B - LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7$B$+$iA*Br$7$^$9!#(B - $B%G%U%)%k%H$O(B LOCAL0 $B$G$9!#(B - $BJ;$;$F(Bsyslog$B%G!<%b%s$N%I%-%e%a%s%H$b$4Mw$/$@$5$$!#(B + syslogが有効な場合、このパラメータによってsyslogの「ファシリティ」を設定します。 + LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7から選択します。 + デフォルトは LOCAL0 です。 + 併せてsyslogデーモンのドキュメントもご覧ください。 </p> </dd> -<dt><a name="SYSLOG_IDENT"></a>syslog_ident <span class="version">V3.1 $B!A(B</span></dt> +<dt><a name="SYSLOG_IDENT"></a>syslog_ident <span class="version">V3.1 〜</span></dt> <dd> <p> - syslog$B$,M-8z$J>l9g!"$3$N%Q%i%a!<%?$K$h$C$F(Bsyslog$B$N%a%C%;!<%8$K$"$i$o$l$k%W%m%0%i%`L>$r@_Dj$7$^$9!#(B - $B%G%U%)%k%H$O(B"pgpool"$B$G$9!#(B + syslogが有効な場合、このパラメータによってsyslogのメッセージにあらわれるプログラム名を設定します。 + デフォルトは"pgpool"です。 </p> </dd> -<dt><a name="DEBUG_LEVEL"></a>debug_level <span class="version">V3.0 $B!A(B</span></dt> +<dt><a name="DEBUG_LEVEL"></a>debug_level <span class="version">V3.0 〜</span></dt> <dd> <p> - $B%G%P%C%0%a%C%;!<%8$N>\:Y%l%Y%k!#(B0$B$G%G%P%C%0%a%C%;!<%8$N=PNO$J$7!#(B - 1$B0J>e$G%G%P%C%0%a%C%;!<%8$r=PNO$7$^$9!#(B - $B?t;z$,Bg$-$1$l$P$h$j>\:Y$J%a%C%;!<%8$,=PNO$5$l$k$h$&$K$J$j$^$9(B - (3.0$B$G$O:#$N$H$3$m%a%C%;!<%8$N>\:YEY$OJQ$j$^$;$s(B)$B!#(B - $B%G%U%)%k%HCM$O(B0$B$G$9!#(B + デバッグメッセージの詳細レベル。0でデバッグメッセージの出力なし。 + 1以上でデバッグメッセージを出力します。 + 数字が大きければより詳細なメッセージが出力されるようになります + (3.0では今のところメッセージの詳細度は変りません)。 + デフォルト値は0です。 </p> </dd> </dl> @@ -749,21 +750,21 @@ local0.* /var/log/pgpool.log <h3>File locations</h3> <dl> -<dt><a name="PID_FILE_NAME"></a>pid_file_name <span class="version">V2.2 $B!A(B</span></dt> +<dt><a name="PID_FILE_NAME"></a>pid_file_name <span class="version">V2.2 〜</span></dt> <dd> <p> - pgpool-II$B$N(Bpid file($B%W%m%;%9(BID$B$r3JG<$7$?%U%!%$%k(B)$B$N%U%k%Q%9L>$G$9!#(B - $B%G%U%)%k%HCM$O(B'/var/run/pgpool/pgpool.pid'$B$G$9!#(B + pgpool-IIのpid file(プロセスIDを格納したファイル)のフルパス名です。 + デフォルト値は'/var/run/pgpool/pgpool.pid'です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="LOGDIR"></a>logdir</dt> <dd> <p> - $B$3$N%G%#%l%/%H%j2<$K!"(Bpgpool-II$B$N(BDB$B%N!<%I$N>uBV$r5-O?$9$k(Bpgpool_status$B%U%!%$%k$,=q$+$l$^$9!#(B + このディレクトリ下に、pgpool-IIのDBノードの状態を記録するpgpool_statusファイルが書かれます。 </p> </dd> </dl> @@ -774,10 +775,10 @@ local0.* /var/log/pgpool.log <dt><a name="CONNECTION_CACHE"></a>connection_cache</dt> <dd> <p> - true$B$J$i(BPostgreSQL$B$X$N%3%M%/%7%g%s$r%-%c%C%7%e$7$^$9!#%G%U%)%k%H$O(Btrue$B$G$9!#(B + trueならPostgreSQLへのコネクションをキャッシュします。デフォルトはtrueです。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> </dl> @@ -788,78 +789,78 @@ local0.* /var/log/pgpool.log <dt><a name="HEALTH_CHECK_TIMEOUT"></a>health_check_timeout</dt> <dd> <p> - pgpool-II$B$O%5!<%P>c32$d%M%C%H%o!<%/>c32$r8!CN$9$k$?$a$K!"Dj4|E*$K%P%C%/%(%s%I$K@\B3$r;n$_$^$9!#(B - $B$3$l$r!V%X%k%9%A%'%C%/!W$H8@$$$^$9!#>c32$,8!CN$5$l$k$H!"%U%'%$%k%*!<%P$d=LB`1?E>$r;n$_$^$9!#(B + pgpool-IIはサーバ障害やネットワーク障害を検知するために、定期的にバックエンドに接続を試みます。 + これを「ヘルスチェック」と言います。障害が検知されると、フェイルオーバや縮退運転を試みます。 </p> <p> - $B$3$N(B $B%Q%i%a!<%?$O!"%M%C%H%o!<%/%1!<%V%k$,H4$1$?:]$J$I$K%X%k%9%A%'%C%/$,D9;~4VBT$?$5$l$k$N$rKI$0$?$a$N(B - $B%?%$%`%"%&%HCM$rICC10L$G;XDj$7$^$9!#(B - $B%G%U%)%k%H$O(B20$BIC$G$9!#(B0$B$r;XDj$9$k$H%?%$%`%"%&%H=hM}$r$7$^$;$s(B - ($B$9$J$o$A(B TCP/IP $B$N%?%$%`%"%&%H$^$GBT$D$3$H$K$J$j$^$9(B)$B!#(B + この パラメータは、ネットワークケーブルが抜けた際などにヘルスチェックが長時間待たされるのを防ぐための + タイムアウト値を秒単位で指定します。 + デフォルトは20秒です。0を指定するとタイムアウト処理をしません + (すなわち TCP/IP のタイムアウトまで待つことになります)。 </p> <p> - $B$J$*!"%X%k%9%A%'%C%/$rM-8z$K$9$k$H!"%X%k%9%A%'%C%/$N$?$a$NM>J,$N@\B3$,(B1$B$DI,MW$K$J$j$^$9$N$G!"(B - PostgreSQL$B$N(Bpostgresql.conf$B$N@_Dj9`L\$N(Bmax_connections$B$r>/$/$H$b(B1$BA}$d$9$h$&$K$7$F$/$@$5$$!#(B + なお、ヘルスチェックを有効にすると、ヘルスチェックのための余分の接続が1つ必要になりますので、 + PostgreSQLのpostgresql.confの設定項目のmax_connectionsを少くとも1増やすようにしてください。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="HEALTH_CHECK_PERIOD"></a>health_check_period</dt> <dd> <p> - $B%X%k%9%A%'%C%/$r9T$&4V3V$rICC10L$G;XDj$7$^$9!#(B0$B$r;XDj$9$k$H%X%k%9%A%'%C%/$r9T$$$^$;$s!#(B - $B%G%U%)%k%H$O(B0$B$G$9(B($B$D$^$j%X%k%9%A%'%C%/$r9T$$$^$;$s(B)$B!#(B - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + ヘルスチェックを行う間隔を秒単位で指定します。0を指定するとヘルスチェックを行いません。 + デフォルトは0です(つまりヘルスチェックを行いません)。 + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="HEALTH_CHECK_USER"></a>health_check_user</dt> <dd> <p> - $B%X%k%9%A%'%C%/$r9T$&$?$a$N(BPostgreSQL$B%f!<%6L>$G$9!#(B - $B$3$N%f!<%6L>$O(BPostgreSQL$B$KEPO?:Q$_$G$J$1$l$P$J$j$^$;$s!#(B - $B$5$b$J$$$H!"%X%k%9%A%'%C%/$,%(%i!<$H$J$j$^$9!#(B + ヘルスチェックを行うためのPostgreSQLユーザ名です。 + このユーザ名はPostgreSQLに登録済みでなければなりません。 + さもないと、ヘルスチェックがエラーとなります。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> -<dt><a name="HEALTH_CHECK_PASSWORD"></a>health_check_password <span class="version">V3.1 $B!A(B</span></dt> +<dt><a name="HEALTH_CHECK_PASSWORD"></a>health_check_password <span class="version">V3.1 〜</span></dt> <dd> <p> - $B%X%k%9%A%'%C%/$r9T$&$?$a$N(BPostgreSQL$B%Q%9%o!<%I$G$9!#(B + ヘルスチェックを行うためのPostgreSQLパスワードです。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> -<dt><a name="HEALTH_CHECK_MAX_RETRIES"></a>health_check_max_retries <span class="version">V3.2 $B!A(B</span></dt> +<dt><a name="HEALTH_CHECK_MAX_RETRIES"></a>health_check_max_retries <span class="version">V3.2 〜</span></dt> <dd> <p> - $B%X%k%9%A%'%C%/$K<:GT$7$?8e(B($B$7$?$,$C$F%U%'%$%k%*!<%P$9$kA0$K(B)$B%j%H%i%$$9$k2s?t$r;XDj$7$^$9!#(B - $B$3$N@_Dj$OF0:n$K$`$i$N$"$k%M%C%H%o!<%/4D6-$K$*$$$F!"%^%9%?$,@5>o$G$"$k$K$b4X$o$i$:(B - $B$?$^$K%X%k%9%A%'%C%/$,<:GT$9$k$3$H$,M=A[$5$l$k>l9g$KM-MQ$G$9!#(B - $B%G%U%)%k%HCM$O(B0$B$G!"$3$N>l9g$O%j%H%i%$$r$7$^$;$s!#(B - $B$3$N@_Dj$rM-8z$K$9$k>l9g$O!"J;$;$F(B<a href="#FAIL_OVER_ON_BACKEND_ERROR">fail_over_on_backend_error</a>$B$r(B - off$B$K$9$k$3$H$r$*4+$a$7$^$9!#(B + ヘルスチェックに失敗した後(したがってフェイルオーバする前に)リトライする回数を指定します。 + この設定は動作にむらのあるネットワーク環境において、マスタが正常であるにも関わらず + たまにヘルスチェックが失敗することが予想される場合に有用です。 + デフォルト値は0で、この場合はリトライをしません。 + この設定を有効にする場合は、併せて<a href="#FAIL_OVER_ON_BACKEND_ERROR">fail_over_on_backend_error</a>を + offにすることをお勧めします。 </p> <p> - health_check_max_retries$B$rJQ99$7$?>l9g$O!"(Bpgpool.conf$B$N:FFI9~$,I,MW$G$9!#(B + health_check_max_retriesを変更した場合は、pgpool.confの再読込が必要です。 </p> </dd> -<dt><a name="HEALTH_CHECK_RETRY_DELAY"></a>health_check_retry_delay <span class="version">V3.2 $B!A(B</span></dt> +<dt><a name="HEALTH_CHECK_RETRY_DELAY"></a>health_check_retry_delay <span class="version">V3.2 〜</span></dt> <dd> <p> - $B%X%k%9%A%'%C%/$N%j%H%i%$$N4V$NIC?t$r;XDj$7$^$9(B(health_check_max_retries &gt; 0$B$G$J$1$l$PM-8z$K$J$j$^$;$s(B)$B!#(B - 0$B$r;XDj$9$k$H!"BT$A$J$7$KD>$A$K%j%H%i%$$7$^$9!#(B + ヘルスチェックのリトライの間の秒数を指定します(health_check_max_retries &gt; 0でなければ有効になりません)。 + 0を指定すると、待ちなしに直ちにリトライします。 </p> <p> - <a href="#HEALTH_CHECK_RETRY_DELAY">health_check_retry_delay</a>$B$rJQ99$7$?>l9g$O!"(Bpgpool.conf$B$N:FFI9~$,I,MW$G$9!#(B + <a href="#HEALTH_CHECK_RETRY_DELAY">health_check_retry_delay</a>を変更した場合は、pgpool.confの再読込が必要です。 </p> </dd> </dl> @@ -870,115 +871,115 @@ local0.* /var/log/pgpool.log <dt><a name="FAILOVER_COMMAND"></a>failover_command</dt> <dd> <p> - $B%N!<%I$,@Z$jN%$5$l$?;~$K<B9T$9$k%3%^%s%I$r;XDj$7$^$9!#FC<lJ8;z$r;XDj$9$k$H!"(B - pgpool $B$,I,MW$J>pJs$KCV$-49$($F%3%^%s%I$r<B9T$7$^$9!#(B + ノードが切り離された時に実行するコマンドを指定します。特殊文字を指定すると、 + pgpool が必要な情報に置き換えてコマンドを実行します。 </p> <center> <table border> - <tr class="header"><th>$BJ8;z(B</th><th>$B0UL#(B</th></tr> - <tr><td>%d</td><td>$B@Z$jN%$5$l$?%N!<%IHV9f(B</td></tr> - <tr><td>%h</td><td>$B@Z$jN%$5$l$?%N!<%I$N%[%9%HL>(B</td></tr> - <tr><td>%H</td><td>$B?7$7$$%^%9%?!<$N%[%9%HL>(B</td></tr> - <tr><td>%p</td><td>$B@Z$jN%$5$l$?%N!<%I$N%]!<%HHV9f(B</td></tr> - <tr><td>%D</td><td>$B@Z$jN%$5$l$?%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</td></tr> - <tr><td>%M</td><td>$B8E$$%^%9%?!<$N%N!<%IHV9f(B</td></tr> - <tr><td>%m</td><td>$B?7$7$$%^%9%?!<$N%N!<%IHV9f(B</td></tr> - <tr><td>%P</td><td>$B8E$$%W%i%$%^%j%N!<%IHV9f(B</td></tr> - <tr><td>%r</td><td>$B?7$7$$%^%9%?!<$N%]!<%HHV9f(B</td></tr> - <tr><td>%R</td><td>$B?7$7$$%^%9%?!<$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</td></tr> - <tr><td>%%</td><td>'%'$BJ8;z(B</td></tr> + <tr class="header"><th>文字</th><th>意味</th></tr> + <tr><td>%d</td><td>切り離されたノード番号</td></tr> + <tr><td>%h</td><td>切り離されたノードのホスト名</td></tr> + <tr><td>%H</td><td>新しいマスターのホスト名</td></tr> + <tr><td>%p</td><td>切り離されたノードのポート番号</td></tr> + <tr><td>%D</td><td>切り離されたノードのデータベースクラスタパス</td></tr> + <tr><td>%M</td><td>古いマスターのノード番号</td></tr> + <tr><td>%m</td><td>新しいマスターのノード番号</td></tr> + <tr><td>%P</td><td>古いプライマリノード番号</td></tr> + <tr><td>%r</td><td>新しいマスターのポート番号</td></tr> + <tr><td>%R</td><td>新しいマスターのデータベースクラスタパス</td></tr> + <tr><td>%%</td><td>'%'文字</td></tr> </table> </center> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> <p> - $B%U%'%$%k%*!<%P!<;~$K$O!"(Bpgpool$B$O$^$:;R%W%m%;%9$r@ZCG$7$^$9(B($B7k2L$H$7$F!"$9$Y$F$N%;%C%7%g%s$,@ZCG$5$l$^$9(B)$B!#(B - $B<!$K!"(Bpgpool$B$O%U%'%$%k%*!<%P%3%^%s%I$r<B9T$7!"$=$N40N;$rBT$A$^$9!#(B - $B$=$N$"$H$G?7$7$$(Bpgpool$B$N;R%W%m%;%9$,5/F0$5$l!"%/%i%$%"%s%H$+$i$N@\B3$r<u$1IU$1$i$l$k>uBV$K$J$j$^$9!#(B + フェイルオーバー時には、pgpoolはまず子プロセスを切断します(結果として、すべてのセッションが切断されます)。 + 次に、pgpoolはフェイルオーバコマンドを実行し、その完了を待ちます。 + そのあとで新しいpgpoolの子プロセスが起動され、クライアントからの接続を受け付けられる状態になります。 </p> </dd> <dt><a name="FAILBACK_COMMAND"></a>failback_command</dt> <dd> <p> - $B%N!<%I$,I|5"$7$?;~$K<B9T$9$k%3%^%s%I$r;XDj$7$^$9!#FC<lJ8;z$r;XDj$9$k$H!"(B - pgpool $B$,I,MW$J>pJs$KCV$-49$($F%3%^%s%I$r<B9T$7$^$9!#(B + ノードが復帰した時に実行するコマンドを指定します。特殊文字を指定すると、 + pgpool が必要な情報に置き換えてコマンドを実行します。 </p> <center> <table border> - <tr class="header"><th>$BJ8;z(B</th><th>$B0UL#(B</th></tr> - <tr><td>%d</td><td>$BI|5"$7$?%N!<%IHV9f(B</td></tr> - <tr><td>%h</td><td>$BI|5"$7$?%N!<%I$N%[%9%HL>(B</td></tr> - <tr><td>%p</td><td>$BI|5"$7$?%N!<%I$N%]!<%HHV9f(B</td></tr> - <tr><td>%D</td><td>$BI|5"$7$?%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</td></tr> - <tr><td>%M</td><td>$B8E$$%^%9%?!<$N%N!<%IHV9f(B</td></tr> - <tr><td>%m</td><td>$B?7$7$$%^%9%?!<$N%N!<%IHV9f(B</td></tr> - <tr><td>%H</td><td>$B?7$7$$%^%9%?!<$N%[%9%HL>(B</td></tr> - <tr><td>%P</td><td>$B8E$$%W%i%$%^%j%N!<%IHV9f(B</td></tr> - <tr><td>%r</td><td>$B?7$7$$%^%9%?!<$N%]!<%HHV9f(B</td></tr> - <tr><td>%R</td><td>$B?7$7$$%^%9%?!<$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</td></tr> - <tr><td>%%</td><td>'%'$BJ8;z(B</td></tr> + <tr class="header"><th>文字</th><th>意味</th></tr> + <tr><td>%d</td><td>復帰したノード番号</td></tr> + <tr><td>%h</td><td>復帰したノードのホスト名</td></tr> + <tr><td>%p</td><td>復帰したノードのポート番号</td></tr> + <tr><td>%D</td><td>復帰したノードのデータベースクラスタパス</td></tr> + <tr><td>%M</td><td>古いマスターのノード番号</td></tr> + <tr><td>%m</td><td>新しいマスターのノード番号</td></tr> + <tr><td>%H</td><td>新しいマスターのホスト名</td></tr> + <tr><td>%P</td><td>古いプライマリノード番号</td></tr> + <tr><td>%r</td><td>新しいマスターのポート番号</td></tr> + <tr><td>%R</td><td>新しいマスターのデータベースクラスタパス</td></tr> + <tr><td>%%</td><td>'%'文字</td></tr> </table> </center> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> -<dt><a name="FOLLOW_MASTER_COMMAND"></a>follow_master_command <span class="version">V3.1 $B!A(B</span></dt> +<dt><a name="FOLLOW_MASTER_COMMAND"></a>follow_master_command <span class="version">V3.1 〜</span></dt> <dd> <p> - $B%^%9%?!<%N!<%I$N%U%'%$%k%*!<%P!<8e$K<B9T$9$k%3%^%s%I$r;XDj$7$^$9!#(B - $B$3$l$O!"%^%9%?!<%9%l!<%V%b!<%I$G%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s9=@.$N>l9g$N$_M-8z$G$9!#(B - $BFC<lJ8;z$r;XDj$9$k$H!"(Bpgpool $B$,I,MW$J>pJs$KCV$-49$($F%3%^%s%I$r<B9T$7$^$9!#(B + マスターノードのフェイルオーバー後に実行するコマンドを指定します。 + これは、マスタースレーブモードでストリーミングレプリケーション構成の場合のみ有効です。 + 特殊文字を指定すると、pgpool が必要な情報に置き換えてコマンドを実行します。 </p> <center> <table border> - <tr class="header"><th>$BJ8;z(B</th><th>$B0UL#(B</th></tr> - <tr><td>%d</td><td>$B@Z$jN%$5$l$?%N!<%IHV9f(B</td></tr> - <tr><td>%h</td><td>$B@Z$jN%$5$l$?%N!<%I$N%[%9%HL>(B</td></tr> - <tr><td>%p</td><td>$B@Z$jN%$5$l$?%N!<%I$N%]!<%HHV9f(B</td></tr> - <tr><td>%D</td><td>$B@Z$jN%$5$l$?%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</td></tr> - <tr><td>%M</td><td>$B8E$$%^%9%?!<$N%N!<%IHV9f(B</td></tr> - <tr><td>%m</td><td>$B?7$7$$%^%9%?!<$N%N!<%IHV9f(B</td></tr> - <tr><td>%H</td><td>$B?7$7$$%^%9%?!<$N%[%9%HL>(B</td></tr> - <tr><td>%P</td><td>$B8E$$%W%i%$%^%j%N!<%IHV9f(B</td></tr> - <tr><td>%r</td><td>$B?7$7$$%^%9%?!<$N%]!<%HHV9f(B</td></tr> - <tr><td>%R</td><td>$B?7$7$$%^%9%?!<$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</td></tr> - <tr><td>%%</td><td>'%'$BJ8;z(B</td></tr> + <tr class="header"><th>文字</th><th>意味</th></tr> + <tr><td>%d</td><td>切り離されたノード番号</td></tr> + <tr><td>%h</td><td>切り離されたノードのホスト名</td></tr> + <tr><td>%p</td><td>切り離されたノードのポート番号</td></tr> + <tr><td>%D</td><td>切り離されたノードのデータベースクラスタパス</td></tr> + <tr><td>%M</td><td>古いマスターのノード番号</td></tr> + <tr><td>%m</td><td>新しいマスターのノード番号</td></tr> + <tr><td>%H</td><td>新しいマスターのホスト名</td></tr> + <tr><td>%P</td><td>古いプライマリノード番号</td></tr> + <tr><td>%r</td><td>新しいマスターのポート番号</td></tr> + <tr><td>%R</td><td>新しいマスターのデータベースクラスタパス</td></tr> + <tr><td>%%</td><td>'%'文字</td></tr> </table> </center> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> <p> - $B6uJ8;zNs0J30$r;XDj$9$k$H!"%^%9%?!<%N!<%I$N%U%'%$%k%*!<%P!<8e$K?7$7$$%^%9%?!<0J30$N$9$Y$F$N%N!<%I$O@Z$jN%$5$l!"(B - $B%/%i%$%"%s%H$+$i:F$S@\B3$r<u$1IU$1$k$?$a$K;R%W%m%;%9$N:F5/F0$,9T$o$l$^$9!#(B - $B$=$N8e!"@Z$jN%$5$l$?$=$l$>$l$N%N!<%I$KBP$7$F(Bfollow_master_command$B$K;XDj$7$?%3%^%s%I$,<B9T$5$l$^$9!#(B - $BDL>o$O!"$3$3$K(B <a href="#pcp_recovery_node">pcp_recovery_node</a> $B%3%^%s%I$rAH$_9~$s$@%7%'%k%9%/%j%W%H$J$I$r(B - $B;XDj$7!"?7$7$$%^%9%?!<$+$i%9%l!<%V$r%j%+%P%j$9$k$?$a$K;HMQ$7$^$9!#(B + 空文字列以外を指定すると、マスターノードのフェイルオーバー後に新しいマスター以外のすべてのノードは切り離され、 + クライアントから再び接続を受け付けるために子プロセスの再起動が行われます。 + その後、切り離されたそれぞれのノードに対してfollow_master_commandに指定したコマンドが実行されます。 + 通常は、ここに <a href="#pcp_recovery_node">pcp_recovery_node</a> コマンドを組み込んだシェルスクリプトなどを + 指定し、新しいマスターからスレーブをリカバリするために使用します。 </p> </dd> -<dt><a name="FAIL_OVER_ON_BACKEND_ERROR"></a>fail_over_on_backend_error <span class="version">V2.3 $B!A(B</span></dt> +<dt><a name="FAIL_OVER_ON_BACKEND_ERROR"></a>fail_over_on_backend_error <span class="version">V2.3 〜</span></dt> <dd> <p> - true$B$J$i$P!"%P%C%/%(%s%I$N%=%1%C%H$X$+$i$NFI$_=P$7!"=q$-9~$_$K<:GT$9$k$H%U%'%$%k%*!<%P$7$^$9!#(B - false$B$K$9$k$H!"%U%'%$%k%*!<%P$;$:!"C1$K%(%i!<$,%l%]!<%H$5$l$F%;%C%7%g%s$,@ZCG$5$l$^$9!#(B - $B$3$N%Q%i%a!<%?$r(Bfalse$B$K$9$k>l9g$K$O!"(Bhealth check$B$rM-8z$K$9$k$3$H$r$*4+$a$7$^$9!#(B - $B$J$*!"$3$N%Q%i%a!<%?$,(Bfalse$B$N>l9g$G$b!"%P%C%/%(%s%I$,%7%c%C%H%@%&%s$5$l$?$3$H$r(B - pgpool-II$B$,8!CN$7$?>l9g$K$O%U%'%$%k%*!<%P$,5/$-$k$3$H$KCm0U$7$F$/$@$5$$!#(B + trueならば、バックエンドのソケットへからの読み出し、書き込みに失敗するとフェイルオーバします。 + falseにすると、フェイルオーバせず、単にエラーがレポートされてセッションが切断されます。 + このパラメータをfalseにする場合には、health checkを有効にすることをお勧めします。 + なお、このパラメータがfalseの場合でも、バックエンドがシャットダウンされたことを + pgpool-IIが検知した場合にはフェイルオーバが起きることに注意してください。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> </dl> @@ -989,12 +990,12 @@ local0.* /var/log/pgpool.log <dt><a name="IGNORE_LEADING_WHITE_SPACE"></a>ignore_leading_white_space</dt> <dd> <p> - true$B$J$i$P!"(Bload balance$B$N:]$K(BSQL$BJ89TF,$N6uGr$rL5;k$7$^$9(B($BA43Q%9%Z!<%9$OL5;k$5$l$^$;$s(B)$B!#(B - $B$3$l$O!"(BDBI/DBD:Pg$B$N$h$&$K!">!<j$K9TF,$K%[%o%$%H%9%Z!<%9$rDI2C$9$k$h$&$J(BAPI$B$r;H$$!"(B - $B%m!<%I%P%i%s%9$7$?$$$H$-$KM-8z$G$9!#(B + trueならば、load balanceの際にSQL文行頭の空白を無視します(全角スペースは無視されません)。 + これは、DBI/DBD:Pgのように、勝手に行頭にホワイトスペースを追加するようなAPIを使い、 + ロードバランスしたいときに有効です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> </dl> @@ -1005,110 +1006,110 @@ local0.* /var/log/pgpool.log <dt><a name="BACKEND_HOSTNAME"></a>backend_hostname</dt> <dd> <p> - $B;HMQ$9$k(BPostgreSQL$B%5!<%P$N%[%9%HL>$r;XDj$7$^$9!#(B - pgpool-II$B$O!"$3$N%[%9%HL>$r;H$C$F(BPostgreSQL$B$HDL?.$7$^$9!#(B + 使用するPostgreSQLサーバのホスト名を指定します。 + pgpool-IIは、このホスト名を使ってPostgreSQLと通信します。 </p> <p> - TCP/IP$B$r;HMQ$9$k>l9g!"%[%9%HL>$^$?$O(BIP$B%"%I%l%9$r;XDj$G$-$^$9!#(B - "/"$B$G;O$^$kJ8;zNs$r;XDj$9$k$H!"(BTCP/IP$B$G$O$J$/!"(BUNIX$B%I%a%$%s%=%1%C%H$r;HMQ$5$l!"(B - $B%G%#%l%/%H%jL>$H$_$J$7$F$=$3$K%=%1%C%H%U%!%$%k$,:n@.$5$l$k$3$H$K$J$j$^$9!#(B - $B6uJ8;z(B(<code>''</code>)$B$r;XDj$9$k$H!"(B<code>/tmp</code>$B2<$K:n@.$7$?(BUNIX$B%I%a%$%s%=%1%C%H$G@\B3$7$^$9!#(B + TCP/IPを使用する場合、ホスト名またはIPアドレスを指定できます。 + "/"で始まる文字列を指定すると、TCP/IPではなく、UNIXドメインソケットを使用され、 + ディレクトリ名とみなしてそこにソケットファイルが作成されることになります。 + 空文字(<code>''</code>)を指定すると、<code>/tmp</code>下に作成したUNIXドメインソケットで接続します。 </p> <p> - $B<B:]$K$O!"(B"backend_hostname"$B$N8e$K(B0, 1, 2...$B$H?t;z$rIU2C$7$F;HMQ$9$kJ#?t(B - $B$N(BPostgreSQL$B$r6hJL$7$^$9(B($B$?$H$($P(B<code>backend_hostname0</code>)$B!#(B - $B$3$N?t;z$N$3$H$r!V(BDB$B%N!<%I(BID$B!W$H8F$S!"(B0$B$+$i3+;O$7$^$9!#(B - DB$B%N!<%I(BID == 0$B$N(BPostgreSQL$B$O!"FCJL$K!V%^%9%?!<(BDB$B!W$H8F$P$l$^$9!#(B - $BJ#?t$N(BDB$B%N!<%I$r1?MQ$7$F$$$k>l9g!">r7o$K$h$C$F$O%^%9%?!<(BDB$B$,%@%&%s$7$F$b1?MQ$rB3$1$k$3$H$,$G$-$^$9!#(B - $B$3$N>l9g$O!"2TF/Cf$+$D(BDB$B%N!<%I(BID$B$,$b$C$H$b<c$$$b$N$,?7$7$$%^%9%?!<(BDB$B$K$J$j$^$9!#(B + 実際には、"backend_hostname"の後に0, 1, 2...と数字を付加して使用する複数 + のPostgreSQLを区別します(たとえば<code>backend_hostname0</code>)。 + この数字のことを「DBノードID」と呼び、0から開始します。 + DBノードID == 0のPostgreSQLは、特別に「マスターDB」と呼ばれます。 + 複数のDBノードを運用している場合、条件によってはマスターDBがダウンしても運用を続けることができます。 + この場合は、稼働中かつDBノードIDがもっとも若いものが新しいマスターDBになります。 </p> <p> - $B$?$@$7!"%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s%b!<%I$G1?MQ$7$F$$$k>l9g$O!"(B - DB$B%N!<%I(BID$B$,(B0$B$N%N!<%I$K$OFCJL$J0UL#$O$J$/!"%W%i%$%^%j%N!<%I$+$I$&$+$,LdBj$K$J$j$^$9!#(B - $B>\:Y$O(B<a href="#stream">Streaming Replication$B$X$NBP1~(B</a>$B$r$4Mw$/$@$5$$!#(B + ただし、ストリーミングレプリケーションモードで運用している場合は、 + DBノードIDが0のノードには特別な意味はなく、プライマリノードかどうかが問題になります。 + 詳細は<a href="#stream">Streaming Replicationへの対応</a>をご覧ください。 <p> - 1$BBf$7$+(BPostgreSQL$B$r;HMQ$7$J$$>l9g$O!"(B"backend_hostname0"$B$H$7$F$/$@$5$$!#(B + 1台しかPostgreSQLを使用しない場合は、"backend_hostname0"としてください。 </p> <p> - backend_hostname $B$O?7$7$/DI2C$7$?9T$r@_Dj%U%!%$%k:FFI$_9~$_$GDI2C$9$k$3$H$,$G$-$^$9!#(B - $B$9$G$K$"$k>pJs$rESCf$GJQ99$9$k$3$H$O$G$-$^$;$s!#(B - $BJQ99$9$k>l9g$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + backend_hostname は新しく追加した行を設定ファイル再読み込みで追加することができます。 + すでにある情報を途中で変更することはできません。 + 変更する場合には pgpool-II を再起動してください。 </p> </dd> <dt><a name="BACKEND_PORT"></a>backend_port</dt> <dd> <p> - $B;HMQ$9$k(BPostgreSQL$B%5!<%P$N%]!<%HHV9f$r;XDj$7$^$9!#(B - $B<B:]$K$O!"(B"backend_port"$B$N8e$K(B0, 1, 2...$B$H(BDB$B%N!<%I(BID$B$rIU2C$7$F;HMQ$9$kJ#?t$N(BPostgreSQL$B$r6hJL$7$^$9!#(B - 1$BBf$7$+(BPostgreSQL$B$r;HMQ$7$J$$>l9g$O!"(B"backend_port0"$B$H$7$F$/$@$5$$!#(B + 使用するPostgreSQLサーバのポート番号を指定します。 + 実際には、"backend_port"の後に0, 1, 2...とDBノードIDを付加して使用する複数のPostgreSQLを区別します。 + 1台しかPostgreSQLを使用しない場合は、"backend_port0"としてください。 </p> <p> - backend_port $B$O?7$7$/DI2C$7$?9T$r@_Dj%U%!%$%k:FFI$_9~$_$GDI2C$9$k$3$H$,$G$-$^$9!#(B - $B$9$G$K$"$k>pJs$rESCf$GJQ99$9$k$3$H$O$G$-$^$;$s!#JQ99$9$k>l9g$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + backend_port は新しく追加した行を設定ファイル再読み込みで追加することができます。 + すでにある情報を途中で変更することはできません。変更する場合には pgpool-II を再起動してください。 </p> </dd> <dt><a name="BACKEND_WEIGHT"></a>backend_weight</dt> <dd> <p> - $B;HMQ$9$k(BPostgreSQL$B%5!<%P$KBP$9$kIi2YJ,;6$NHfN($r(B0$B0J>e$N@0?t$^$?$OIbF0>.?tE@$G;XDj$7$^$9!#(B - "backend_weight"$B$N8e$K$O!"(BDB$B%N!<%I(BID$B$rIU2C$7$F;HMQ$9$kJ#?t$N(BPostgreSQL$B$r6hJL$7$^$9!#(B - 1$BBf$7$+(BPostgreSQL$B$r;HMQ$7$J$$>l9g$O!"(B"backend_weight0"$B$H$7$F$/$@$5$$!#(B - $BIi2YJ,;6$r;HMQ$7$J$$>l9g$O!"!V(B1$B!W$r@_Dj$7$F$/$@$5$$!#(B + 使用するPostgreSQLサーバに対する負荷分散の比率を0以上の整数または浮動小数点で指定します。 + "backend_weight"の後には、DBノードIDを付加して使用する複数のPostgreSQLを区別します。 + 1台しかPostgreSQLを使用しない場合は、"backend_weight0"としてください。 + 負荷分散を使用しない場合は、「1」を設定してください。 </p> <p> - backend_weight $B$O?7$7$/DI2C$7$?9T$r@_Dj%U%!%$%k:FFI$_9~$_$GDI2C$9$k$3$H$,$G$-$^$9!#(B - pgpool-II 2.2.6/2.3$B0J9_$G$O!"@_Dj%U%!%$%k$N:FFI9~$G(Bbackend_weight$BCM$rJQ99$G$-$^$9!#(B - $B?7$7$/@\B3$7$?%/%i%$%"%s%H%;%C%7%g%s$+$i!"$3$N?7$7$$(Bweight$BCM$,H?1G$5$l$^$9!#(B - $B%^%9%?!<%9%l!<%V%b!<%I$K$*$$$F!"$"$k%9%l!<%V$KBP$7$F4IM}6HL3$r<B;\$9$kET9g>e!"(B - $BLd$$9g$o$;$,$=$N%9%l!<%V$KAw$i$l$k$N$rKI$.$?$$>l9g$KM-MQ$G$9!#(B + backend_weight は新しく追加した行を設定ファイル再読み込みで追加することができます。 + pgpool-II 2.2.6/2.3以降では、設定ファイルの再読込でbackend_weight値を変更できます。 + 新しく接続したクライアントセッションから、この新しいweight値が反映されます。 + マスタースレーブモードにおいて、あるスレーブに対して管理業務を実施する都合上、 + 問い合わせがそのスレーブに送られるのを防ぎたい場合に有用です。 </p> </dd> <dt><a name="BACKEND_DATA_DIRECTORY"></a>backend_data_directory</dt> <dd> <p> - $B;HMQ$9$k(B PostgreSQL $B%5!<%P$N%G!<%?%Y!<%9%/%i%9%?$N%Q%9$r;XDj$7$^$9!#(B - $B<B:]$K$O!"(B"backend_data_directory"$B$N8e$K(BDB$B%N!<%I(BID$B$rIU2C$7$F;HMQ$9$kJ#?t$N(BPostgreSQL$B$r6hJL$7$^$9!#(B - $B$3$N%Q%i%a!<%?$O%*%s%i%$%s%j%+%P%j$N:]$K;HMQ$7$^$9!#(B - $B%*%s%i%$%s%j%+%P%j$r;HMQ$7$J$$>l9g$K$O@_Dj$9$kI,MW$O$"$j$^$;$s!#(B + 使用する PostgreSQL サーバのデータベースクラスタのパスを指定します。 + 実際には、"backend_data_directory"の後にDBノードIDを付加して使用する複数のPostgreSQLを区別します。 + このパラメータはオンラインリカバリの際に使用します。 + オンラインリカバリを使用しない場合には設定する必要はありません。 </p> <p> - backend_data_directory $B$O?7$7$/DI2C$7$?9T$r@_Dj%U%!%$%k:FFI$_9~$_$GDI2C$9$k$3$H$,$G$-$^$9!#(B - $B$9$G$K$"$k>pJs$rESCf$GJQ99$9$k$3$H$O$G$-$^$;$s!#JQ99$9$k>l9g$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + backend_data_directory は新しく追加した行を設定ファイル再読み込みで追加することができます。 + すでにある情報を途中で変更することはできません。変更する場合には pgpool-II を再起動してください。 </p> </dd> -<dt><a name="BACKEND_FLAG"></a>backend_flag <span class="version">V3.1 $B!A(B</span></dt> +<dt><a name="BACKEND_FLAG"></a>backend_flag <span class="version">V3.1 〜</span></dt> <dd> <p> - $B%P%C%/%(%s%IC10L$G$NMM!9$J5sF0$r@)8f$9$k%U%i%0$G$9!#(B - $B<B:]$K$O!"(B"backend_flag"$B$N8e$K?t;z$rIU$1$F!"$I$N%P%C%/%(%s%I$N%U%i%0$+;XDj$7$^$9!#(B + バックエンド単位での様々な挙動を制御するフラグです。 + 実際には、"backend_flag"の後に数字を付けて、どのバックエンドのフラグか指定します。 </p> <p> - $BNc(B: <code>backend_flag0</code> + 例: <code>backend_flag0</code> </p> <p> - $BJ#?t$N%U%i%0$r(B"|"$B$GO"7k$7$F;XDj$9$k$3$H$,$G$-$^$9!#(B - $B8=:_0J2<$N$b$N$,$"$j$^$9!#(B + 複数のフラグを"|"で連結して指定することができます。 + 現在以下のものがあります。 </p> <table border> <tr><th class="nodec">ALLOW_TO_FAILOVER</th> - <td>$B%U%'%$%k%*!<%P$d%G%?%C%A$,2DG=$K$J$j$^$9!#$3$l$,%G%U%)%k%H$NF0:n$G$9!#(B - DISALLOW_TO_FAILOVER$B$HF1;~$K$O;XDj$G$-$^$;$s!#(B + <td>フェイルオーバやデタッチが可能になります。これがデフォルトの動作です。 + DISALLOW_TO_FAILOVERと同時には指定できません。 </td></tr> <tr><th class="nodec">DISALLOW_TO_FAILOVER</th> - <td>$B%U%'%$%k%*!<%P$d%G%?%C%A$,9T$o$l(Be$B$;$s!#(B - Heartbeat$B$d(BPacemaker$B$J$I$N(BHA(High Availability)$B%=%U%H$G%P%C%/%(%s%I$rFs=E2=$7$F$$$k$J$I$N;v>p$G!"(B - pgpool-II$BB&$G%U%'%$%k%*!<%P$N@)8f$r$7$FM_$7$/$J$$$H$-$J$I$K;XDj$7$^$9!#(B - ALLOW_TO_FAILOVER$B$HF1;~$K$O;XDj$G$-$^$;$s!#(B + <td>フェイルオーバやデタッチが行われeせん。 + HeartbeatやPacemakerなどのHA(High Availability)ソフトでバックエンドを二重化しているなどの事情で、 + pgpool-II側でフェイルオーバの制御をして欲しくないときなどに指定します。 + ALLOW_TO_FAILOVERと同時には指定できません。 </td></tr> </table> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> </dl> @@ -1116,42 +1117,42 @@ local0.* /var/log/pgpool.log <h3>SSL</h3> <dl> -<dt><a name="SSL">ssl</a> <span class="version">V2.3 $B!A(B</span></dt> +<dt><a name="SSL">ssl</a> <span class="version">V2.3 〜</span></dt> <dd> <p> - true$B$J$i$P(Bpgpool-II$B$H%U%m%s%H%(%s%I!"(Bpgpool-II$B$H%P%C%/%(%s%I$N4V$N(BSSL$B@\B3$,2DG=$K$J$j$^$9!#(B - $B$J$*!"(Bpgpool-II$B$H%U%m%s%H%(%s%I$N@\B3$K(BSSL$B$,MxMQ$G$-$k$?$a$K$O!"(B - <code>ssl_key</code>$B$H(B<code>ssl_cert</code>$B$,@_Dj$5$l$F$J$1$l$P$J$j$^$;$s!#(B + trueならばpgpool-IIとフロントエンド、pgpool-IIとバックエンドの間のSSL接続が可能になります。 + なお、pgpool-IIとフロントエンドの接続にSSLが利用できるためには、 + <code>ssl_key</code>と<code>ssl_cert</code>が設定されてなければなりません。 </p> <p> - $B%G%U%)%k%H$G$O(BSSL$B%5%]!<%H$O%*%U$K$J$C$F$$$^$9!#(B - SSL$B%5%]!<%H$rM-8z$K$9$k$?$a$K$O!"(Bconfigure$B;~$K(BOpenSSL$B%5%]!<%H$rM-8z$K$9$kI,MW$,$"$j$^$9!#(B - $B>\:Y$O(B<a href="#install">$B%$%s%9%H!<%k(B</a>$B$N9`L\$r$4Mw2<$5$$!#(B + デフォルトではSSLサポートはオフになっています。 + SSLサポートを有効にするためには、configure時にOpenSSLサポートを有効にする必要があります。 + 詳細は<a href="#install">インストール</a>の項目をご覧下さい。 </p> <p> - ssl$B$rM-8z$K@_Dj$7$?$i!"(Bpgpool$B$N:F5/F0$r$7$F$/$@$5$$!#(B + sslを有効に設定したら、pgpoolの再起動をしてください。 </p> </dd> -<dt><a name="SSL_KEY"></a>ssl_key <span class="version">V2.3 $B!A(B</span></dt> +<dt><a name="SSL_KEY"></a>ssl_key <span class="version">V2.3 〜</span></dt> <dd> <p> - $B%U%m%s%H%(%s%I$H$N@\B3$K;HMQ$9$k%W%i%$%Y!<%H%-!<%U%!%$%k$N%U%k%Q%9$r;XDj$7$^$9!#(B + フロントエンドとの接続に使用するプライベートキーファイルのフルパスを指定します。 </p> <p> - ssl_key$B$N%G%U%)%k%HCM$O$"$j$^$;$s!#(B - ssl_key$B$N@_Dj$,$J$$>l9g$O!"%U%m%s%H%(%s%I$H$N@\B3$G(BSSL$B$,;HMQ$5$l$J$/$J$j$^$9!#(B + ssl_keyのデフォルト値はありません。 + ssl_keyの設定がない場合は、フロントエンドとの接続でSSLが使用されなくなります。 </p> </dd> - <dt><a name="SSL_CERT"></a>ssl_cert <span class="version">V2.3 $B!A(B</span></dt> + <dt><a name="SSL_CERT"></a>ssl_cert <span class="version">V2.3 〜</span></dt> <dd> <p> - $B%U%m%s%H%(%s%I$H$N@\B3$K;HMQ$9$k8x3+(Bx509$B>ZL@=q$N%U%k%Q%9$r;XDj$7$^$9!#(B + フロントエンドとの接続に使用する公開x509証明書のフルパスを指定します。 </p> <p> - ssl_cert$B$N%G%U%)%k%HCM$O$"$j$^$;$s!#(B - ssl_cert$B$N@_Dj$,$J$$>l9g$O!"%U%m%s%H%(%s%I$H$N@\B3$G(BSSL$B$,;HMQ$5$l$J$/$J$j$^$9!#(B + ssl_certのデフォルト値はありません。 + ssl_certの設定がない場合は、フロントエンドとの接続でSSLが使用されなくなります。 </p> </dd> </dl> @@ -1159,264 +1160,264 @@ local0.* /var/log/pgpool.log <h3>Other</h3> <dl> -<dt><a name="RELCACHE_EXPIRE"></a>relcache_expire <span class="version">V3.1 $B!A(B</span></dt> +<dt><a name="RELCACHE_EXPIRE"></a>relcache_expire <span class="version">V3.1 〜</span></dt> <dd> <p> - $B%j%l!<%7%g%s%-%c%C%7%e$N<wL?$rICC10L$G;XDj$7$^$9!#(B - 0$B$r;XDj$9$k$H!"%-%c%C%7%e$N<wL?$N4IM}$O9T$o$:!"%W%m%;%9$,@8$-$F$$$k$+!"(B - $B%-%c%C%7%e$,0n$l$k$^$G$OM-8z$K$J$j$^$9(B($B%G%U%)%k%H$NF0:n(B)$B!#(B + リレーションキャッシュの寿命を秒単位で指定します。 + 0を指定すると、キャッシュの寿命の管理は行わず、プロセスが生きているか、 + キャッシュが溢れるまでは有効になります(デフォルトの動作)。 </p> <p> - $B%j%l!<%7%g%s%-%c%C%7%e$O!"(BPostgreSQL$B$N%7%9%F%`%+%?%m%0$KBP$9$kLd$$9g$o$;$rJ]B8$7$F$*$/$b$N$G$9!#(B - $BLd$$9g$o$;$kFbMF$O!"%F!<%V%k$N9=B$!"%F!<%V%k$,0l;~%F!<%V%k$+$I$&$+$J$I$,$"$j$^$9!#(B - $B%-%c%C%7%e$O(Bpgpool$B$N;R%W%m%;%9$N%m!<%+%k%a%b$j$KJ]4I$5$l$F$$$^$9!#(B + リレーションキャッシュは、PostgreSQLのシステムカタログに対する問い合わせを保存しておくものです。 + 問い合わせる内容は、テーブルの構造、テーブルが一時テーブルかどうかなどがあります。 + キャッシュはpgpoolの子プロセスのローカルメモりに保管されています。 <p> - $B$b$7(BALTER TABLE$B$,H/9T$5$l$k$H!"%F!<%V%k$N9=B$$,JQ$o$k>l9g$,$"$j!"(B - $B%j%l!<%7%g%s%-%c%C%7%e$NFbMF$H0lCW$7$J$/$J$k62$l$,$"$j$^$9!#(B - relcache_expire$B$K$h$j!"$=$N4m81@-$r%3%s%H%m!<%k$G$-$k$h$&$K$J$j$^$9!#(B + もしALTER TABLEが発行されると、テーブルの構造が変わる場合があり、 + リレーションキャッシュの内容と一致しなくなる恐れがあります。 + relcache_expireにより、その危険性をコントロールできるようになります。 </p> </dd> -<dt><a name="RELCACHE_SIZE"></a>relcache_size <span class="version">V3.2 $B!A(B</span></dt> +<dt><a name="RELCACHE_SIZE"></a>relcache_size <span class="version">V3.2 〜</span></dt> <dd> <p> - $B%j%l!<%7%g%s%-%c%C%7%e$N%5%$%:$r;XDj$7$^$9!#(B - $B%G%U%)%k%H$O(B256$B$G$9!#(B + リレーションキャッシュのサイズを指定します。 + デフォルトは256です。 </p> <pre> "pool_search_relcache: cache replacement happend" </pre> <p> - $B$N$h$&$J%a%C%;!<%8$,%m%0$KIQHK$K=P$k>l9g$O!"$3$N?t;z$rBg$-$/$7$F$/$@$5$$!#(B + のようなメッセージがログに頻繁に出る場合は、この数字を大きくしてください。 </p> </dd> -<dt><a name="CHECK_TEMP_TABLE"></a>check_temp_table <span class="version">V3.2 $B!A(B</span></dt> +<dt><a name="CHECK_TEMP_TABLE"></a>check_temp_table <span class="version">V3.2 〜</span></dt> <dd> <p> - $B$b$7(Bon$B$J$i!"(BSELECT$B$K4^$^$l$k%F!<%V%k$,0l;~%F!<%V%k$+$I$&$+$N%A%'%C%/$r9T$$$^$9!#(B - $B$3$N%A%'%C%/$O!"(Bprimary/master$B$N%7%9%F%`%+%?%m%0$X$N%"%/%;%9$rH/@8$5$;!"$=$l$J$j$KIi2Y$r>e$2$^$9!#(B - $B$b$70l;~%F!<%V%k$r;H$C$F$$$J$$$H$$$&$3$H$,3N$+$G!"(Bprimary/master$B$NIi2Y$r>/$7$G$b2<$2$?$$$N$G$"$l$P!"(B - off$B$K$9$k$3$H$,$G$-$^$9!#%G%U%)%k%H$O(Bon$B$G$9!#(B + もしonなら、SELECTに含まれるテーブルが一時テーブルかどうかのチェックを行います。 + このチェックは、primary/masterのシステムカタログへのアクセスを発生させ、それなりに負荷を上げます。 + もし一時テーブルを使っていないということが確かで、primary/masterの負荷を少しでも下げたいのであれば、 + offにすることができます。デフォルトはonです。 </p> </dd> </dl> -<h2>SSL$B>ZL@=q$N@8@.(B</h2> +<h2>SSL証明書の生成</h2> <p> -$B>ZL@=q$N07$$$K$D$$$F$O$3$N%^%K%e%"%k$NHO0O30$G$9!#(B -PostgreSQL$B%I%-%e%a%s%H(B<a href="http://www.postgresql.jp/document/pg842doc/html/ssl-tcp.html"> -SSL$B$K$h$k0BA4$J(BTCP/IP$B@\B3(B</a>$B$N>O$K<+J,$GG'>Z$9$k>ZL@=q$r:n@.$9$k%3%^%s%I$NNc$,$"$j$^$9!#(B +証明書の扱いについてはこのマニュアルの範囲外です。 +PostgreSQLドキュメント<a href="http://www.postgresql.jp/document/pg842doc/html/ssl-tcp.html"> +SSLによる安全なTCP/IP接続</a>の章に自分で認証する証明書を作成するコマンドの例があります。 </p> -<h2 id="failover_in_raw_mode">raw$B%b!<%I$K$*$1$k%U%'%$%k%*!<%PF0:n$K$D$$$F(B</h2> +<h2 id="failover_in_raw_mode">rawモードにおけるフェイルオーバ動作について</h2> <p> -raw$B%b!<%I$K$*$$$F!"(B2$BBf0J>e$N(BPostgreSQL$B%5!<%P$r;XDj$9$k$H!"%U%'%$%k%*!<%P$,2DG=$G$9!#(B -$B%U%'%$%k%*!<%P$G$O!"@5>o;~$K$O(Bbackend_hostname0$B$G;XDj$7$?(BPostgreSQL$B$N$_$r;HMQ$7!"(B -$B$[$+$N%5!<%P$K$O%"%/%;%9$7$^$;$s!#(B -backend_hostname0$B$N%5!<%P$,%@%&%s$9$k$H!"<!$K(Bbackend_hostname1$B$G;XDj$7$?%5!<%P$K%"%/%;%9$r$3$3$m$_!"(B -$B@.8y$9$l$P$=$l$r;HMQ$7$^$9!#0J2<!"(Bbackend_hostname2...$B$G$bF1MM$K$J$j$^$9!#(B +rawモードにおいて、2台以上のPostgreSQLサーバを指定すると、フェイルオーバが可能です。 +フェイルオーバでは、正常時にはbackend_hostname0で指定したPostgreSQLのみを使用し、 +ほかのサーバにはアクセスしません。 +backend_hostname0のサーバがダウンすると、次にbackend_hostname1で指定したサーバにアクセスをこころみ、 +成功すればそれを使用します。以下、backend_hostname2...でも同様になります。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="connection_pool_mode"></a>$B%3%M%/%7%g%s%W!<%k%b!<%I(B</h1> +<h1><a name="connection_pool_mode"></a>コネクションプールモード</h1> <p> -raw$B%b!<%I$K2C$(!"%3%M%/%7%g%s%W!<%j%s%0$,MxMQ$G$-$k$h$&$K$J$j$^$9!#(B -$B%3%M%/%7%g%s%W!<%k%b!<%I$rM-8z$K$9$k$K$O!"(B <a href="#CONNECTION_CACHE">connection_cache</a> $B$r(Bon$B$K$7$^$9!#(B -$B0J2<$N@_Dj9`L\$,%3%M%/%7%g%s%W!<%k$NF0:n$K1F6A$rM?$($^$9!#(B +rawモードに加え、コネクションプーリングが利用できるようになります。 +コネクションプールモードを有効にするには、 <a href="#CONNECTION_CACHE">connection_cache</a> をonにします。 +以下の設定項目がコネクションプールの動作に影響を与えます。 </p> <dl> <dt><a name="MOtherAX_POOL"></a>max_pool</dt> <dd> <p> - pgpool-II$B$N3F%5!<%P%W%m%;%9$,%-!<%W$9$k(BPostgreSQL$B$X$N:GBg%3%M%/%7%g%s?t$G$9!#(B - pgpool-II$B$O!"%f!<%6L>!"%G!<%?%Y!<%9$,F1$8$J$i$P%3%M%/%7%g%s$r:FMxMQ$7$^$9$,!"(B - $B$=$&$G$J$1$l$P?7$?$K(BPostgreSQL$B$X$N%3%M%/%7%g%s$r3NN)$7$h$&$H$7$^$9!#(B - $B$7$?$,$C$F!"$3$3$G$OA[Dj$5$l$k(B[$B%f!<%6L>(B:$B%G!<%?%Y!<%9L>(B]$B$N%Z%"$N<oN`$N?t$@$1$r(B - max_pool$B$K;XDj$7$F$*$/I,MW$,$"$j$^$9!#(B - $B$b$7(Bmax_pool$B$r;H$$$-$C$F$7$^$C$?>l9g$O0lHV8E$$%3%M%/%7%g%s$r@ZCG$7!"(B - $B$=$N%9%m%C%H$,:FMxMQ$5$l$^$9!#(B + pgpool-IIの各サーバプロセスがキープするPostgreSQLへの最大コネクション数です。 + pgpool-IIは、ユーザ名、データベースが同じならばコネクションを再利用しますが、 + そうでなければ新たにPostgreSQLへのコネクションを確立しようとします。 + したがって、ここでは想定される[ユーザ名:データベース名]のペアの種類の数だけを + max_poolに指定しておく必要があります。 + もしmax_poolを使いきってしまった場合は一番古いコネクションを切断し、 + そのスロットが再利用されます。 </p> <p> - max_pool$B$N%G%U%)%k%HCM$O(B4$B$G$9!#(B + max_poolのデフォルト値は4です。 </p> <p> - $B$J$*!"(Bpgpool-II$BA4BN$H$7$F$O!"(B<a href="#NUM_INIT_CHILDREN">num_init_children</a> * - <a href="#MAX_POOL">max_pool</a> $BJ,$@$1(B - PostgreSQL$B$X$N%3%M%/%7%g%s$,D%$i$l$kE@$KCm0U$7$F$/$@$5$$!#(B + なお、pgpool-II全体としては、<a href="#NUM_INIT_CHILDREN">num_init_children</a> * + <a href="#MAX_POOL">max_pool</a> 分だけ + PostgreSQLへのコネクションが張られる点に注意してください。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="CONNECTION_LIFE_TIME"></a>connection_life_time</dt> <dd> <p> - $B%3%M%/%7%g%s%W!<%kCf$N%3%M%/%7%g%s$NM-8z4|4V$rICC10L$G;XDj$7$^$9!#(B - 0$B$r;XDj$9$k$HM-8z4|4V$OL58B$K$J$j$^$9!#(B - connection_life_time$B$N%G%U%)%k%HCM$O(B0$B$G$9!#(B + コネクションプール中のコネクションの有効期間を秒単位で指定します。 + 0を指定すると有効期間は無限になります。 + connection_life_timeのデフォルト値は0です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="RESET_QUERY_LIST"></a>reset_query_list</dt> <dd> <p> - $B%;%C%7%g%s$,=*N;$9$k$H$-$K%3%M%/%7%g%s$r=i4|2=$9$k$?$a$N(BSQL$B%3%^%s%I$r!V(B;$B!W$G6h@Z$C$FNs5s$7$^$9!#(B - $B%G%U%)%k%H$O0J2<$N$h$&$K$J$C$F$$$^$9$,!"G$0U$N(BSQL$BJ8$rDI2C$7$F$b9=$$$^$;$s!#(B + セッションが終了するときにコネクションを初期化するためのSQLコマンドを「;」で区切って列挙します。 + デフォルトは以下のようになっていますが、任意のSQL文を追加しても構いません。 <pre> reset_query_list = 'ABORT; DISCARD ALL' </pre> <p> - PostgreSQL$B$N%P!<%8%g%s$K$h$C$F;HMQ$G$-$k(BSQL$B%3%^%s%I$,0c$$$^$9!#(B - $B3F%P!<%8%g%s$4$H$N$*4+$a@_Dj$O0J2<$G$9(B($B$?$@$7!"(B"ABORT"$B$OI,$:%3%^%s%I$K4^$a$F$/$@$5$$(B)$B!#(B + PostgreSQLのバージョンによって使用できるSQLコマンドが違います。 + 各バージョンごとのお勧め設定は以下です(ただし、"ABORT"は必ずコマンドに含めてください)。 </p> <table border> - <tr class="header"><th>PostgreSQL$B%P!<%8%g%s(B</th><th>reset_query_list$B$N?d>)@_DjCM(B</th></tr> - <tr><th>7.1$B0JA0(B</th><td>ABORT</td></tr> - <tr><th>7.2$B$+$i(B8.2</th><td>ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT</td></tr> - <tr><th>8.3$B0J9_(B</th><td>ABORT; DISCARD ALL</td></tr> + <tr class="header"><th>PostgreSQLバージョン</th><th>reset_query_listの推奨設定値</th></tr> + <tr><th>7.1以前</th><td>ABORT</td></tr> + <tr><th>7.2から8.2</th><td>ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT</td></tr> + <tr><th>8.3以降</th><td>ABORT; DISCARD ALL</td></tr> </table> <ul> - <li>$B!V(BABORT$B!W$O!"(BPostgreSQL 7.4$B0J>e$G$O%H%i%s%6%/%7%g%s%V%m%C%/$NCf$K$$$J$$>l9g$K$OH/9T$5$l$^$;$s!#(B</li> + <li>「ABORT」は、PostgreSQL 7.4以上ではトランザクションブロックの中にいない場合には発行されません。</li> </ul> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> </dl> -<h2 id="failover_in_cp_mode">$B%3%M%/%7%g%s%W!<%k%b!<%I$K$*$1$k%U%'%$%k%*!<%PF0:n$K$D$$$F(B</h2> +<h2 id="failover_in_cp_mode">コネクションプールモードにおけるフェイルオーバ動作について</h2> <p> -raw$B%b!<%I$HF1MM$NF0:n$r$7$^$9!#(B +rawモードと同様の動作をします。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="replication_mode"></a>$B%l%W%j%1!<%7%g%s%b!<%I(B</h1> +<h1><a name="replication_mode"></a>レプリケーションモード</h1> <p> -$B%l%W%j%1!<%7%g%s$rM-8z$K$9$k%b!<%I$G$9(B($B@_Dj%U%!%$%k$N?w7A$O(Bpgpool.conf-replication)$B!#(B -raw$B%b!<%I!"%3%M%/%7%g%s%W!<%k%b!<%I$K2C$(!"0J2<$r@_Dj$7$^$9!#(B +レプリケーションを有効にするモードです(設定ファイルの雛形はpgpool.conf-replication)。 +rawモード、コネクションプールモードに加え、以下を設定します。 </p> <dl> <dt><a name="REPLICATION_MODE"></a>replication_mode</dt> <dd> <p> - $B%l%W%j%1!<%7%g%s%b!<%I$GF0:n$5$;$k>l9g$O(Btrue$B$r;XDj$7$F$/$@$5$$!#%G%U%)%k%HCM$O(Bfalse$B$G$9!#(B + レプリケーションモードで動作させる場合はtrueを指定してください。デフォルト値はfalseです。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="LOAD_BALANCE_MODE"></a>load_balance_mode</dt> <dd> <p> - true$B$r;XDj$9$k$H%l%W%j%1!<%7%g%s%b!<%I$^$?$O%^%9%?!<%9%l!<%V%b!<%I$N:]$K!"(B - SELECT$BJ8$r%m!<%I%P%i%s%9$7$F8!:w@-G=$r8~>e$5$;$k$3$H$,$G$-$^$9!#%G%U%)%k%HCM$O(Bfalse$B$G$9!#(B + trueを指定するとレプリケーションモードまたはマスタースレーブモードの際に、 + SELECT文をロードバランスして検索性能を向上させることができます。デフォルト値はfalseです。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="REPLICATION_STOP_ON_MISMATCH"></a>replication_stop_on_mismatch</dt> <dd> <p> - $B3F(BDB$B%N!<%I$+$iAw$i$l$F$/$k%Q%1%C%H$N<oN`$,IT0lCW$K$J$C$?>l9g$K!"(BDB$B%N!<%I$r@Z$jJ|$7$F=LB`1?E>$KF~$j$^$9!#(B + 各DBノードから送られてくるパケットの種類が不一致になった場合に、DBノードを切り放して縮退運転に入ります。 </p> <p> - $BNI$/$"$k%1!<%9$H$7$F$O!"(B<a href="#REPLICATE_SELECT">replicate_select</a> $B$,;XDj$5$l$F$$$F(B - SELECT$B$,3F(BDB$B%N!<%I$G<B9T$5$l$F$$$k$H$-$K!"(B - $B8!:w7k2L9T?t$,0lCW$7$J$$$J$I!"$,$"$j$^$9(B($B$3$l$K8BDj$5$l$k$b$N$G$O$"$j$^$;$s!#(B - $B$?$H$($P$"$k(BDB$B%N!<%I$G(BUPDATE$B$,@.8y$7$?$N$K!"B>$N(BDB$B%N!<%I$G$O<:GT$7$?>l9g$,0lNc$G$9(B)$B!#(B - $B$?$@$7!"(Bpgpool$B$O%Q%1%C%H$NCf?H$^$G$O%A%'%C%/$7$F$$$J$$$N$G!"(BSELECT$B7k2L$N%G!<%?FbMF$,0[$J$C$F$$$F$b!"(B - $B=LB`$O5/$-$J$$$3$H$KCm0U$7$F$/$@$5$$!#(B + 良くあるケースとしては、<a href="#REPLICATE_SELECT">replicate_select</a> が指定されていて + SELECTが各DBノードで実行されているときに、 + 検索結果行数が一致しないなど、があります(これに限定されるものではありません。 + たとえばあるDBノードでUPDATEが成功したのに、他のDBノードでは失敗した場合が一例です)。 + ただし、pgpoolはパケットの中身まではチェックしていないので、SELECT結果のデータ内容が異なっていても、 + 縮退は起きないことに注意してください。 </p> <p> - $B=LB`BP>]$N(BDB$B%N!<%I$O!VB??t7h!W$G>/?tGI$K$J$C$?$b$N$,BP>]$K$J$j$^$9!#(B - $B$b$7B??t7h$GF1I<$K$J$C$?>l9g$O!"%^%9%?(BDB$B%N!<%I(B(DB$B%N!<%IHV9f$,$b$C$H$b$o$+$$$b$N(B)$B$r4^$`%0%k!<%W$,M%@h$5$l!"(B - $B$=$l0J30$N%0%k!<%W$K=jB0$9$k(BDB$B%N!<%I$,@Z$jJ|$7$NBP>]$K$J$j$^$9!#(B + 縮退対象のDBノードは「多数決」で少数派になったものが対象になります。 + もし多数決で同票になった場合は、マスタDBノード(DBノード番号がもっともわかいもの)を含むグループが優先され、 + それ以外のグループに所属するDBノードが切り放しの対象になります。 </p> <p> - $B$3$N%*%W%7%g%s$,(Bfalse$B$N>l9g$O!"3:Ev$N%;%C%7%g%s$r6/@)E*$K=*N;$9$k$@$1$KN1$a$^$9!#(B - $B%G%U%)%k%HCM$O(Bfalse$B$G$9!#(B + このオプションがfalseの場合は、該当のセッションを強制的に終了するだけに留めます。 + デフォルト値はfalseです。 </p> -<dt><a name="FAILOVER_IF_AFFECTED_TUPLES_MISMATCH"></a>failover_if_affected_tuples_mismatch <span class="version">V3.0 $B!A(B</span></dt> +<dt><a name="FAILOVER_IF_AFFECTED_TUPLES_MISMATCH"></a>failover_if_affected_tuples_mismatch <span class="version">V3.0 〜</span></dt> <dd> <p> - $B3F(BDB$B%N!<%I$G<B9T$5$l$?(BINSERT/UPDATE/DELETE$B$N7k2L9T?t$,IT0lCW$K$J$C$?>l9g$K!"(B - DB$B%N!<%I$r@Z$jJ|$7$F=LB`1?E>$KF~$j$^$9!#(B + 各DBノードで実行されたINSERT/UPDATE/DELETEの結果行数が不一致になった場合に、 + DBノードを切り放して縮退運転に入ります。 </p> <p> - $B=LB`BP>]$N(BDB$B%N!<%I$O!VB??t7h!W$G>/?tGI$K$J$C$?$b$N$,BP>]$K$J$j$^$9!#(B - $B$b$7B??t7h$GF1I<$K$J$C$?>l9g$O!"%^%9%?(BDB$B%N!<%I(B(DB$B%N!<%IHV9f$,$b$C$H$b$o$+$$$b$N(B)$B$r4^$`%0%k!<%W$,M%@h$5$l!"(B - $B$=$l0J30$N%0%k!<%W$K=jB0$9$k(BDB$B%N!<%I$,@Z$jJ|$7$NBP>]$K$J$j$^$9!#(B + 縮退対象のDBノードは「多数決」で少数派になったものが対象になります。 + もし多数決で同票になった場合は、マスタDBノード(DBノード番号がもっともわかいもの)を含むグループが優先され、 + それ以外のグループに所属するDBノードが切り放しの対象になります。 </p> <p> - $B$3$N%*%W%7%g%s$,(Bfalse$B$N>l9g$O!"3:Ev$N%;%C%7%g%s$r6/@)E*$K=*N;$9$k$@$1$KN1$a$^$9!#(B - $B%G%U%)%k%HCM$O(Bfalse$B$G$9!#(B + このオプションがfalseの場合は、該当のセッションを強制的に終了するだけに留めます。 + デフォルト値はfalseです。 </p> </dd> -<dt><a name="WHITE_FUNCTION_LIST"></a>white_function_list <span class="version">V3.0 $B!A(B</span></dt> +<dt><a name="WHITE_FUNCTION_LIST"></a>white_function_list <span class="version">V3.0 〜</span></dt> <dd> <p> - $B%G!<%?%Y!<%9$KBP$7$F(B<strong>$B99?7$r9T$J$o$J$$4X?tL>(B</strong>$B$r%3%s%^6h@Z$j$G;XDj$7$^$9!#(B - $B$3$N%j%9%H$K4^$^$l$J$$4X?t8F$S=P$7$r4^$`(BSELECT$B$O!"Ii2YJ,;6$NBP>]$H$O$J$i$:!"(B - $B%l%W%j%1!<%7%g%s%b!<%I$K$*$$$F$O$9$Y$F$N(BDB$B%N!<%I$G<B9T$5$l$^$9!#(B - ($B%^%9%?!<%9%l!<%V%b!<%I$K$*$$$F$O!"%^%9%?!<(B(primary)DB$B%N!<%I$K$N$_Aw?.$5$l$^$9(B)$B!#(B + データベースに対して<strong>更新を行なわない関数名</strong>をコンマ区切りで指定します。 + このリストに含まれない関数呼び出しを含むSELECTは、負荷分散の対象とはならず、 + レプリケーションモードにおいてはすべてのDBノードで実行されます。 + (マスタースレーブモードにおいては、マスター(primary)DBノードにのみ送信されます)。 </p> <p> - $B4X?tL>$K$O@55,I=8=$r;H$&$3$H$,$G$-$^$9!#(B - $B$?$H$($P!"FI$_=P$7$N$_$N4X?t$,(B"get_"$B$"$k$$$O(B"select_"$B$G;O$^$k$J$i$P!"0J2<$N$h$&$J;XDj$,2DG=$G$9!#(B + 関数名には正規表現を使うことができます。 + たとえば、読み出しのみの関数が"get_"あるいは"select_"で始まるならば、以下のような指定が可能です。 </p> <pre> white_function_list = 'get_.*,select_.*' </pre> </dd> -<dt><a name="BLACK_FUNCTION_LIST"></a>black_function_list <span class="version">V3.0 $B!A(B</span></dt> +<dt><a name="BLACK_FUNCTION_LIST"></a>black_function_list <span class="version">V3.0 〜</span></dt> <dd> <p> - $B%G!<%?%Y!<%9$KBP$7$F(B<strong>$B99?7$r9T$J$&4X?tL>(B</strong>$B$r%3%s%^6h@Z$j$G;XDj$7$^$9!#(B - $B$3$N%j%9%H$K4^$^$l$k4X?t8F$S=P$7$r4^$`(BSELECT$B$O!"Ii2YJ,;6$NBP>]$H$O$J$i$:!"(B - $B%l%W%j%1!<%7%g%s%b!<%I$K$*$$$F$O$9$Y$F$N(BDB$B%N!<%I$G<B9T$5$l$^$9!#(B - $B$3$N%j%9%H$K4^$^$l$J$$4X?t8F$S=P$7$r4^$`(BSELECT$B$O!"Ii2YJ,;6$NBP>]$H$J$j$^$9!#(B + データベースに対して<strong>更新を行なう関数名</strong>をコンマ区切りで指定します。 + このリストに含まれる関数呼び出しを含むSELECTは、負荷分散の対象とはならず、 + レプリケーションモードにおいてはすべてのDBノードで実行されます。 + このリストに含まれない関数呼び出しを含むSELECTは、負荷分散の対象となります。 </p> <p> - $B4X?tL>$K$O@55,I=8=$r;H$&$3$H$,$G$-$^$9!#(B - $B$?$H$($P!"FI$_=P$7$N$_$N4X?t$,(B"set_"$B!"(B"update_"$B!"(B"delete_"$B$"$k$$$O(B"insert_"$B$G;O$^$k$J$i$P!"(B - $B0J2<$N$h$&$J;XDj$,2DG=$G$9!#(B + 関数名には正規表現を使うことができます。 + たとえば、読み出しのみの関数が"set_"、"update_"、"delete_"あるいは"insert_"で始まるならば、 + 以下のような指定が可能です。 </p> <pre> black_function_list = 'nextval,setval,set_.*,update_.*,delete_.*,insert_.*' </pre> <p> - white_function_list$B$H(Bblack_function_list$B$NN>J}$r6u0J30$K$9$k$3$H$O$G$-$^$;$s!#(B - $B$I$A$i$+0lJ}$N$_$K4X?tL>$r;XDj$7$^$9!#(B + white_function_listとblack_function_listの両方を空以外にすることはできません。 + どちらか一方のみに関数名を指定します。 </p> <p> - pgpool-II 3.0$B$h$jA0$N%P!<%8%g%s$G$O!"8GDj$G(Bnextval$B$H(Bsetval$B$,=q$-9~$_$r9T$J$&4X?t$H$7$FG'<1$5$l$F$$$^$7$?!#(B - $B$=$l$HF1$8F0:n$r9T$J$o$;$k$K$O!"0J2<$N$h$&$K(Bwhite_function_list$B$H(Bblack_function_list$B$r;XDj$7$^$9!#(B + pgpool-II 3.0より前のバージョンでは、固定でnextvalとsetvalが書き込みを行なう関数として認識されていました。 + それと同じ動作を行なわせるには、以下のようにwhite_function_listとblack_function_listを指定します。 </p> <pre> white_function_list = '' @@ -1424,34 +1425,34 @@ black_function_list = 'nextval,setval,lastval,currval' </pre> <p> - $B>e$NNc$G$O!"(Bnextval$B$H(Bsetval$B$K2C$(!"(Blastval$B$H(Bcurrval$B$,DI2C$5$l$F$$$k$3$H$KCm0U$7$F$/$@$5$$!#(B - lastval$B$H(Bcurrval$B$O=q$-9~$_$r9T$&4X?t$G$O$"$j$^$;$s$,!"$3$l$i$N4X?t$,Ii2YJ,;6$5$l$k$3$H$K$h$C$F!"(B - $B%(%i!<$,H/@8$9$k$N$rL$A3$KKI$0$3$H$,$G$-$^$9!#(B - black_function_list$B$K4^$^$l$k4X?t$OIi2YJ,;6$5$l$J$$$+$i$G$9!#(B + 上の例では、nextvalとsetvalに加え、lastvalとcurrvalが追加されていることに注意してください。 + lastvalとcurrvalは書き込みを行う関数ではありませんが、これらの関数が負荷分散されることによって、 + エラーが発生するのを未然に防ぐことができます。 + black_function_listに含まれる関数は負荷分散されないからです。 </p> </dd> <dt><a name="REPLICATE_SELECT"></a>replicate_select</dt> <dd> <p> - true $B$r@_Dj$9$k$H!"%l%W%j%1!<%7%g%s%b!<%I$G$O(B SELECT $BJ8$r%l%W%j%1!<%7%g%s$7$^$9!#(B - $B$3$l$O(B pgpool-II 1.0 $B$^$G$N5sF0$HF1$8$K$J$j$^$9!#(B - false $B$r@_Dj$9$k$H(B SELECT $BJ8$r%^%9%?$N$_$KAw?.$7$^$9!#%G%U%)%k%HCM$O(B false $B$G$9!#(B + true を設定すると、レプリケーションモードでは SELECT 文をレプリケーションします。 + これは pgpool-II 1.0 までの挙動と同じになります。 + false を設定すると SELECT 文をマスタのみに送信します。デフォルト値は false です。 </p> <p> - replicate_select$B!"(B<a href="#LOAD_BALANCE_MODE">load_balance_mode</a>$B!"(B - SELECT$BLd9g$o$;$,L@<(E*$J%H%i%s%6%/%7%g%s%V%m%C%/$NFbB&$K$"$k$+$I$&$+$I$&$+$G!"(B - $B%l%W%j%1!<%7%g%s%b!<%I$NF0:n$,JQ2=$7$^$9!#>\:Y$rI=$K<($7$^$9!#(B + replicate_select、<a href="#LOAD_BALANCE_MODE">load_balance_mode</a>、 + SELECT問合わせが明示的なトランザクションブロックの内側にあるかどうかどうかで、 + レプリケーションモードの動作が変化します。詳細を表に示します。 </p> <table border> <tr> - <th class="nodec">SELECT$B$,L@<(E*$J%H%i%s%6%/%7%g%s%V%m%C%/$NFbB&$K$"$k(B</th> + <th class="nodec">SELECTが明示的なトランザクションブロックの内側にある</th> <td>Y</td><td>Y</td><td>Y</td><td>N</td><td>N</td><td>N</td><td>Y</td><td>N</td> </tr> <tr> - <th class="nodec">replicate_select$B$,(Btrue</th> + <th class="nodec">replicate_selectがtrue</th> <td>Y</td> <td>Y</td> <td>N</td> @@ -1463,12 +1464,12 @@ black_function_list = 'nextval,setval,lastval,currval' </tr> <tr> - <th class="nodec">load_balance_mode$B$,(Btrue</th> + <th class="nodec">load_balance_modeがtrue</th> <td>Y</td><td>N</td><td>N</td><td>N</td><td>Y</td><td>N</td><td>Y</td><td>Y</td> </tr> <tr> - <th class="nodec">$B7k2L(B(R:$B%l%W%j%1!<%7%g%s(B, M: $B%^%9%?$N$_$KAw?.(B, L: $B%m!<%I%P%i%s%9$5$l$k(B)</th> + <th class="nodec">結果(R:レプリケーション, M: マスタのみに送信, L: ロードバランスされる)</th> <td>R</td><td>R</td><td>M</td><td>M</td><td>R</td><td>R</td><td>M</td><td>L</td> </tr> </table> @@ -1477,18 +1478,18 @@ black_function_list = 'nextval,setval,lastval,currval' <dt><a name="INSERT_LOCK"></a>insert_lock</dt> <dd> <p> - SERIAL$B7?$r;H$C$F$$$k%F!<%V%k$r%l%W%j%1!<%7%g%s$9$k$H!"(BSERIAL$B7?$NNs$NCM$,(BDB$B%N!<%I$N4V$G(B - $B0lCW$7$J$/$J$k$3$H$,$"$j$^$9!#(B - $B$3$NLdBj$O!"3:Ev%F!<%V%k$rL@<(E*$K%m%C%/$9$k$3$H$G2sHr$G$-$^$9(B - ($B$b$A$m$s%H%i%s%6%/%7%g%s$NJBNs<B9T@-$O5>@7$K$J$j$^$9$,(B)$B!#(B - $B$7$+$7!"$=$N$?$a$K$O!"(B + SERIAL型を使っているテーブルをレプリケーションすると、SERIAL型の列の値がDBノードの間で + 一致しなくなることがあります。 + この問題は、該当テーブルを明示的にロックすることで回避できます + (もちろんトランザクションの並列実行性は犠牲になりますが)。 + しかし、そのためには、 </p> <pre> INSERT INTO ... </pre> <p> - $B$r(B + を </p> <pre> @@ -1499,247 +1500,247 @@ COMMIT; </pre> <p> - $B$K=q$-49$($J$1$l$P$J$j$^$;$s!#(B - insert_lock$B$r(Btrue$B$K$9$k$H<+F0E*$K%H%i%s%6%/%7%g%s$N3+;O!"%F!<%V%k%m%C%/!"%H%i%s%6%/%7%g%s$N=*N;$r(B - $B9T$C$F$/$l$k$N$G!"$3$&$7$?<j4V$r>J$/$3$H$,$G$-$^$9(B - $B!J$9$G$K%H%i%s%6%/%7%g%s$,3+;O$5$l$F$$$k>l9g$O(BLOCK TABLE...$B$@$1$,<B9T$5$l$^$9!K!#(B + に書き換えなければなりません。 + insert_lockをtrueにすると自動的にトランザクションの開始、テーブルロック、トランザクションの終了を + 行ってくれるので、こうした手間を省くことができます + (すでにトランザクションが開始されている場合はLOCK TABLE...だけが実行されます)。 </p> <dl> - <dt>pgpool-II 2.2$B0J9_(B</dt> + <dt>pgpool-II 2.2以降</dt> <dd><p> - $B%F!<%V%k$,(BSERIAL$BNs$r;}$D$+$I$&$+<+F0H=JL$9$k$?$a!"(B - SERIAL$BNs$,$J$1$l$P7h$7$F%F!<%V%k$r%m%C%/$7$^$;$s!#(B + テーブルがSERIAL列を持つかどうか自動判別するため、 + SERIAL列がなければ決してテーブルをロックしません。 </p></dd> - <dt>pgpool-II 3.0.4$B$^$G$N(B3.0$B%7%j!<%:(B</dt> + <dt>pgpool-II 3.0.4までの3.0シリーズ</dt> <dd><p> - $BBP1~$9$k%7!<%1%s%9%F!<%V%k$KBP$7$F9T%m%C%/$r$+$1$k$3$H$GGSB>@)8f$r9T$J$$$^$9!#(B - $B$=$l0JA0$N%P!<%8%g%s$HHf$Y$k$H!"(BVACUUM(autovacuum$B$r4^$`(B)$B$H$N%m%C%/6%9g$,$J$/$J$k%a%j%C%H$,$"$j$^$9!#(B + 対応するシーケンステーブルに対して行ロックをかけることで排他制御を行ないます。 + それ以前のバージョンと比べると、VACUUM(autovacuumを含む)とのロック競合がなくなるメリットがあります。 </p> <p> - $B$7$+$7!"$3$l$OB>$NLdBj$r0z$-5/$3$7$^$9!#(B - $B%H%i%s%6%/%7%g%s<~2s$,5/$-$?8e!"%7!<%1%s%9%F!<%V%k$KBP$9$k9T%m%C%/$O(BPostgreSQL$B$NFbIt%(%i!<(B - ($B>\:Y$K$O!"%H%i%s%6%/%7%g%s>uBV$rJ];}$9$k(Bpg_clog$B$X$N%"%/%;%9%(%i!<(B)$B$r5/$3$7$^$9!#(B - $B$3$l$rKI$0$?$a!"(BPostgreSQL$B$N%3%"3+H/<T$O%7!<%1%s%9%F!<%V%k$KBP$9$k9T%m%C%/$r5v2D$7$J$$$3$H$r7hDj$7$^$7$?!#(B - $B$3$l$O$b$A$m$s(Bpgpool-II$B$rF0:nITG=$K$7$^$9(B($B=$@5$5$l$?(BPostgreSQL$B$O%P!<%8%g%s(B - 9.0.5, 8.4.9, 8.3.16$B$=$7$F(B8.2.22$B$H$7$F%j%j!<%9$5$l$k$G$7$g$&(B)$B!#(B + しかし、これは他の問題を引き起こします。 + トランザクション周回が起きた後、シーケンステーブルに対する行ロックはPostgreSQLの内部エラー + (詳細には、トランザクション状態を保持するpg_clogへのアクセスエラー)を起こします。 + これを防ぐため、PostgreSQLのコア開発者はシーケンステーブルに対する行ロックを許可しないことを決定しました。 + これはもちろんpgpool-IIを動作不能にします(修正されたPostgreSQLはバージョン + 9.0.5, 8.4.9, 8.3.16そして8.2.22としてリリースされるでしょう)。 </p></dd> - <dt>pgpool-II 3.0.5$B0J9_(B</dt> + <dt>pgpool-II 3.0.5以降</dt> <dd><p> - $B?7$7$$(BPostgreSQL$B$,%7!<%1%s%9%F!<%V%k$KBP$9$k%m%C%/$r5v2D$7$J$/$J$C$?$?$a!"(B - pgpool_catalog.insert_lock$B%F!<%V%k$KBP$7$F9T%m%C%/$r$+$1$k$3$H$GGSB>@)8f$r9T$J$$$^$9!#(B - $B$7$?$,$C$F!"(Bpgpool-II$B7PM3$G%"%/%;%9$9$k$9$Y$F$N%G!<%?%Y!<%9$K(Binsert_lock$B%F!<%V%k$r(B - $B$"$i$+$8$a:n@.$7$F$*$/I,MW$,$"$j$^$9!#(B - $B>\:Y$O(B<a href="#install">insert_lock$B%F!<%V%k$N:n@.(B</a>$B$N9`L\$r$4Mw$/$@$5$$!#(B + 新しいPostgreSQLがシーケンステーブルに対するロックを許可しなくなったため、 + pgpool_catalog.insert_lockテーブルに対して行ロックをかけることで排他制御を行ないます。 + したがって、pgpool-II経由でアクセスするすべてのデータベースにinsert_lockテーブルを + あらかじめ作成しておく必要があります。 + 詳細は<a href="#install">insert_lockテーブルの作成</a>の項目をご覧ください。 </p> <p> - $B$b$7!"(Binsert_lock$B%F!<%V%k$,B8:_$7$J$$>l9g$O!"A^F~BP>]$N%F!<%V%k$KBP$7$F%m%C%/$r9T$$$^$9!#(B - $B$3$l$O!"(Bpgpool-II 2.2$B$H(B2.3$B%7%j!<%:$N(Binsert_lock$B$HF1$8F0:n$G$9!#(B - $B$^$?!"2a5n$N%P!<%8%g%s$H8_49@-$N$"$k(Binsert_lock$B$r;HMQ$7$?$$>l9g$O!"(Bconfigure$B%9%/%j%W%H$G@_Dj$G$-$^$9!#(B - $B>\:Y$O(B<a href="#install">configure$B$N<B9T(B</a>$B$N9`L\$r$4Mw2<$5$$!#(B + もし、insert_lockテーブルが存在しない場合は、挿入対象のテーブルに対してロックを行います。 + これは、pgpool-II 2.2と2.3シリーズのinsert_lockと同じ動作です。 + また、過去のバージョンと互換性のあるinsert_lockを使用したい場合は、configureスクリプトで設定できます。 + 詳細は<a href="#install">configureの実行</a>の項目をご覧下さい。 </dd></p> </dl> <p> - $B$J$*!"$"$^$jI,MW$J$$$+$bCN$l$^$;$s$,!"%3%a%s%H$rMxMQ$7$F!"$3$N5sF0$r:Y$+$/@)8f$9$k$3$H$b$G$-$^$9!#(B + なお、あまり必要ないかも知れませんが、コメントを利用して、この挙動を細かく制御することもできます。 </p> <ol> - <li>insert_lock$B$r(Btrue$B$K$7$F!"(BINSERT$BJ8$N@hF,$K(B/*NO INSERT LOCK*/$B%3%a%s%H$rDI2C$9$k!#(B - $B$3$N%3%a%s%H$,$"$k$H!"%F!<%V%k%m%C%/$O9T$o$l$^$;$s(B(pgpool-II 3.0$B0J9_$G$bF1MM(B)$B!#(B + <li>insert_lockをtrueにして、INSERT文の先頭に/*NO INSERT LOCK*/コメントを追加する。 + このコメントがあると、テーブルロックは行われません(pgpool-II 3.0以降でも同様)。 </li> - <li>insert_lock$B$r(Bfalse$B$K$7$F!"(BINSERT$BJ8$N@hF,$K(B/*INSERT LOCK*/$B%3%a%s%H$rDI2C$9$k!#(B - $B$3$N%3%a%s%H$,$"$k$H!"$3$N(BINSERT$BJ8$KBP$7$F$N$_%F!<%V%k%m%C%/$,9T$o$l$^$9(B(pgpool-II 3.0$B0J9_$G$bF1MM(B)$B!#(B + <li>insert_lockをfalseにして、INSERT文の先頭に/*INSERT LOCK*/コメントを追加する。 + このコメントがあると、このINSERT文に対してのみテーブルロックが行われます(pgpool-II 3.0以降でも同様)。 </li> </ol> <p> - insert_lock$B$N%G%U%)%k%HCM$O(Btrue$B$G$9!#(B + insert_lockのデフォルト値はtrueです。 </p> <p> - $B$J$*!"(Binsert_lock$B$rM-8z$K$7$F(Bregression test$B$r<B9T$9$k$H!">/$/$H$b(BPostgreSQL 8.0$B$G$O(B - transactions, privileges, rules, alter_table$B$,(Bfail$B$7$^$9!#(B - rule$B$G$O!"(Bview$B$KBP$7$F(BLOCK$B$r$7$h$&$H$7$F$7$^$&$3$H!"$[$+$N$b$N$O(B + なお、insert_lockを有効にしてregression testを実行すると、少くともPostgreSQL 8.0では + transactions, privileges, rules, alter_tableがfailします。 + ruleでは、viewに対してLOCKをしようとしてしまうこと、ほかのものは </p> <pre> ! ERROR: current transaction is aborted, commands ignored until end of transaction block </pre> <p> - $B$H$$$&$h$&$J%a%C%;!<%8$,=P$F$7$^$&$?$a$G$9!#$?$H$($P!"(Btransactions $B$G$O!"(B - $BB8:_$7$J$$%F!<%V%k$KBP$7$F(BINSERT$B$r9T$&%F%9%H$,4^$^$l$F$*$j!"(B - pgpool$B$,:G=i$KB8:_$7$J$$%F!<%V%k$KBP$7$F(BLOCK$B$r9T$&7k2L!"%(%i!<$K$J$C$F%H%i%s%6%/%7%g%s$,%"%\!<%H>uBV$K$J$j!"(B - $BB3$/(BINSERT$B$G>e5-%(%i!<$,=P$F$7$^$$$^$9!#(B + というようなメッセージが出てしまうためです。たとえば、transactions では、 + 存在しないテーブルに対してINSERTを行うテストが含まれており、 + pgpoolが最初に存在しないテーブルに対してLOCKを行う結果、エラーになってトランザクションがアボート状態になり、 + 続くINSERTで上記エラーが出てしまいます。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="RECOVERY_USER"></a>recovery_user</dt> <dd> <p> - $B%*%s%i%$%s%j%+%P%j$r9T$&$?$a$N(B PostgreSQL $B%f!<%6L>$G$9!#(B - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + オンラインリカバリを行うための PostgreSQL ユーザ名です。 + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="RECOVERY_PASSWORD"></a>recovery_password</dt> <dd> <p> - $B%*%s%i%$%s%j%+%P%j$r9T$&$?$a$N(B PostgreSQL $B%f!<%6%Q%9%o!<%I$G$9!#(B - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + オンラインリカバリを行うための PostgreSQL ユーザパスワードです。 + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="RECOVERY_1ST_STAGE_COMMAND"></a>recovery_1st_stage_command</dt> <dd> <p> - $B%*%s%i%$%s%j%+%P%jCf$K5/F0$9$k%3%^%s%IL>$r;XDj$7$^$9!#(B - $B$3$N%9%/%j%W%H$O(BPostgreSQL$B$N%^%9%?%5!<%P(B($B%W%i%$%^%j%5!<%P(B)$B$,5/F0$7$^$9!#(B - $B%3%^%s%I%U%!%$%k$O%;%-%e%j%F%#>e$N4QE@$+$i%G!<%?%Y!<%9%/%i%9%?0J2<$K$"$k(B - $B%3%^%s%I$d%9%/%j%W%H$N$_$r8F$S=P$7$^$9!#(B - $BNc$($P!"(Brecovery_1st_stage_command = 'sync-command' $B$H@_Dj$7$F$"$k>l9g!"(B - $PGDATA/sync-command $B$r5/F0$7$h$&$H$7$^$9!#(B + オンラインリカバリ中に起動するコマンド名を指定します。 + このスクリプトはPostgreSQLのマスタサーバ(プライマリサーバ)が起動します。 + コマンドファイルはセキュリティ上の観点からデータベースクラスタ以下にある + コマンドやスクリプトのみを呼び出します。 + 例えば、recovery_1st_stage_command = 'sync-command' と設定してある場合、 + $PGDATA/sync-command を起動しようとします。 </p> <p> - recovery_1st_stage_command $B$O<!$N(B3$B$D$N0z?t$r<u$1$H$j$^$9!#(B + recovery_1st_stage_command は次の3つの引数を受けとります。 </p> <ol> - <li>$B%^%9%?(B($B%W%i%$%^%j(B)$B%G!<%?%Y!<%9%/%i%9%?$X$N%Q%9(B</li> - <li>$B%j%+%P%jBP>]$N(BPostgreSQL$B$N%[%9%HL>(B</li> - <li>$B%j%+%P%jBP>]$N%G!<%?%Y!<%9%/%i%9%?$X$N%Q%9(B</li> + <li>マスタ(プライマリ)データベースクラスタへのパス</li> + <li>リカバリ対象のPostgreSQLのホスト名</li> + <li>リカバリ対象のデータベースクラスタへのパス</li> </ol> <p> - recovery_1st_stage_command $B$r<B9T$7$F$$$k4V$O(B pgpool $B$G$O%/%i%$%"%s(B - $B%H$+$i$N@\B3$r(B<b>$B@)8B$7$^$;$s(B</b>$B!#;2>H$d99?7$r9T$&$3$H$,$G$-$^$9!#(B + recovery_1st_stage_command を実行している間は pgpool ではクライアン + トからの接続を<b>制限しません</b>。参照や更新を行うことができます。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="RECOVERY_2ND_STAGE_COMMAND"></a>recovery_2nd_stage_command</dt> <dd> <p> - 2 $B2sL\$N%*%s%i%$%s%j%+%P%jCf$K5/F0$9$k%3%^%s%IL>$r;XDj$7$^$9!#(B - $B$3$N%9%/%j%W%H$O(BPostgreSQL$B$N%^%9%?%5!<%P(B($B%W%i%$%^%j%5!<%P(B)$B$,5/F0$7$^$9!#(B - $B%3%^%s%I%U%!%$%k$O%;%-%e%j%F%#>e$N4QE@$+$i%G!<%?%Y!<%9%/%i%9%?0J2<$K$"$k(B - $B%3%^%s%I$d%9%/%j%W%H$N$_$r8F$S=P$7$^$9!#(B - $BNc$($P!"(Brecovery_2nd_stage_command = 'sync-command' $B$H@_Dj$7$F$"$k>l9g!"(B - $PGDATA/sync-command $B$r5/F0$7$h$&$H$7$^$9!#(B + 2 回目のオンラインリカバリ中に起動するコマンド名を指定します。 + このスクリプトはPostgreSQLのマスタサーバ(プライマリサーバ)が起動します。 + コマンドファイルはセキュリティ上の観点からデータベースクラスタ以下にある + コマンドやスクリプトのみを呼び出します。 + 例えば、recovery_2nd_stage_command = 'sync-command' と設定してある場合、 + $PGDATA/sync-command を起動しようとします。 </p> <p> - recovery_2nd_stage_command $B$O<!$N(B3$B$D$N0z?t$r<u$1$H$j$^$9!#(B + recovery_2nd_stage_command は次の3つの引数を受けとります。 </p> <ol> - <li>$B%^%9%?(B($B%W%i%$%^%j(B)$B%G!<%?%Y!<%9%/%i%9%?$X$N%Q%9(B</li> - <li>$B%j%+%P%jBP>]$N(BPostgreSQL$B$N%[%9%HL>(B</li> - <li>$B%j%+%P%jBP>]$N%G!<%?%Y!<%9%/%i%9%?$X$N%Q%9(B</li> + <li>マスタ(プライマリ)データベースクラスタへのパス</li> + <li>リカバリ対象のPostgreSQLのホスト名</li> + <li>リカバリ対象のデータベースクラスタへのパス</li> </ol> </p> <p> - recovery_2nd_stage_command $B$r<B9T$7$F$$$k4V$O(B pgpool $B$G$O%/%i%$%"%s%H$+$i(B - $B@\B3!";2>H!"99?7=hM}$r0l@Z(B<b>$B<u$1IU$1$^$;$s(B</b>$B!#(B - $B$^$?!"%P%C%A=hM}$J$I$K$h$C$F@\B3$7$F$$$k%/%i%$%"%s%H$,D9;~4VB8:_$7$F$$$k>l9g$K$O%3%^%s%I$r5/F0$7$^$;$s!#(B - $B?7$?$J@\B3$r@)8B$7!"8=:_$N@\B3?t$,(B 0 $B$K$J$C$?;~E@(B - $B$G%3%^%s%I$r5/F0$7$^$9!#(B + recovery_2nd_stage_command を実行している間は pgpool ではクライアントから + 接続、参照、更新処理を一切<b>受け付けません</b>。 + また、バッチ処理などによって接続しているクライアントが長時間存在している場合にはコマンドを起動しません。 + 新たな接続を制限し、現在の接続数が 0 になった時点 + でコマンドを起動します。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> <dt><a name="RECOVERY_TIMEOUT"></a>recovery_timeout</dt> <dd> <p> - pgpool$B$O!"%*%s%i%$%s%j%+%P%j$N:]$K$9$Y$F$N%/%i%$%"%s%H$,@\B3$r=*N;$9$k$^$GBT$A$^$9!#(B - recovery_timeout$B$G$=$N:GBgBT$A;~4V$r;XDj$7$^$9!#C10L$OIC$G$9!#(B - $BBT$A;~4V$,(Brecovery_timeout$B$r1[$($k$H!"%*%s%i%$%s%j%+%P%j$OCf;_$5$l!"DL>o$N>uBV$KLa$j$^$9!#(B + pgpoolは、オンラインリカバリの際にすべてのクライアントが接続を終了するまで待ちます。 + recovery_timeoutでその最大待ち時間を指定します。単位は秒です。 + 待ち時間がrecovery_timeoutを越えると、オンラインリカバリは中止され、通常の状態に戻ります。 </p> <p> - $B%"%$%I%k>uBV$N%/%i%$%"%s%H$,<+J,$+$i@ZCG$9$k$N$rBT$A$?$/$J$$>l9g$O!"(B - <a href="#CLIENT_IDLE_LIMIT_IN_RECOVERY">client_idle_limit_in_recovery</a>$B$rMxMQ$9$k$3$H$b$G$-$^$9!#(B + アイドル状態のクライアントが自分から切断するのを待ちたくない場合は、 + <a href="#CLIENT_IDLE_LIMIT_IN_RECOVERY">client_idle_limit_in_recovery</a>を利用することもできます。 </p> </p> <p> - recovery_timeout$B$O!"$3$NB>!"%*%s%i%$%s%j%+%P%j$N:G8e$K%j%+%P%jBP>]$N(BDB$B%N!<%I$G(B - postmaster$B$r5/F0$9$k:]$NBT$A;~4V$K$bMxMQ$5$l$^$9!#(B + recovery_timeoutは、この他、オンラインリカバリの最後にリカバリ対象のDBノードで + postmasterを起動する際の待ち時間にも利用されます。 </p> <p> - recovery_timeout$B$N%G%U%)%k%HCM$O(B90$BIC$G$9!#(B - recovery_timeout$B$r(B0$B$H$7$F$b%?%$%`%"%&%H$,L58z$K$J$k$o$1$G$O$J$/!"(B - $BC1$KB(:B$K%?%$%`%"%&%H$9$k$@$1$G$9$N$GCm0U$7$F$/$@$5$$!#(B - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + recovery_timeoutのデフォルト値は90秒です。 + recovery_timeoutを0としてもタイムアウトが無効になるわけではなく、 + 単に即座にタイムアウトするだけですので注意してください。 + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> -<dt><a name="CLIENT_IDLE_LIMIT_IN_RECOVERY"></a>client_idle_limit_in_recovery <span class="version">V2.2 $B!A(B</span></dt> +<dt><a name="CLIENT_IDLE_LIMIT_IN_RECOVERY"></a>client_idle_limit_in_recovery <span class="version">V2.2 〜</span></dt> <dd> <p> - client_idle_limit$B$H;w$F$$$^$9$,!"$3$N%Q%i%a!<%?$O%j%+%P%j$N%;%+%s%I%9%F!<%8$G$N$_8zNO$,$"$j$^$9!#(B - $BA02s%/%i%$%"%s%H$+$iMh$?%/%(%j$+$i!"(Bclient_idle_limit_in_recovery $BIC1[$($F$b<!$N%/%(%j$,FO$+$J$$>l9g$O!"(B - $B%/%i%$%"%s%H$X$N@\B3$r6/@)E*$K@ZCG$7!"%j%+%P%j$N%;%+%s%I%9%F!<%8$N?J9T$,K832$5$l$k$N$rKI$.$^$9!#(B - -1$B$r;XDj$9$k$H!"D>$A$K%/%i%$%"%s%H$X$N@\B3$r@ZCG$7$F%;%+%s%I%9%F!<%8$KF~$j$^$9!#(B - $B%G%U%)%k%HCM$O(B 0($BL58z(B)$B$G$9!#(B + client_idle_limitと似ていますが、このパラメータはリカバリのセカンドステージでのみ効力があります。 + 前回クライアントから来たクエリから、client_idle_limit_in_recovery 秒越えても次のクエリが届かない場合は、 + クライアントへの接続を強制的に切断し、リカバリのセカンドステージの進行が妨害されるのを防ぎます。 + -1を指定すると、直ちにクライアントへの接続を切断してセカンドステージに入ります。 + デフォルト値は 0(無効)です。 </p> <p> - $B%/%i%$%"%s%H$,K;$7$/!"%"%$%I%k>uBV$K$J$i$J$$>l9g$O(Bclient_idle_limit_in_recovery$B$r@_Dj$7$F$b(B - $B%;%+%s%I%9%F!<%8$K0\9T$G$-$^$;$s!#(B - $B$3$N>l9g!"(Bclient_idle_limit_in_recovery$B$K(B-1$B$r@_Dj$9$k$H!"%/%i%$%"%s%H$,%S%8!<$G$"$C$F$b(B - $B$?$@$A$K%/%i%$%"%s%H$X$N@\B3$r@ZCG$7!"%;%+%s%I%9%F!<%8$K0\9T$9$k$3$H$,$G$-$^$9!#(B + クライアントが忙しく、アイドル状態にならない場合はclient_idle_limit_in_recoveryを設定しても + セカンドステージに移行できません。 + この場合、client_idle_limit_in_recoveryに-1を設定すると、クライアントがビジーであっても + ただちにクライアントへの接続を切断し、セカンドステージに移行することができます。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O@_Dj%U%!%$%k$r:FFI$_9~$_$7$F$/$@$5$$!#(B + このパラメータを変更した時には設定ファイルを再読み込みしてください。 </p> </dd> -<dt><a name="LOBJ_LOCK_TABLE"></a>lobj_lock_table <span class="version">V2.3 $B!A(B</span></dt> +<dt><a name="LOBJ_LOCK_TABLE"></a>lobj_lock_table <span class="version">V2.3 〜</span></dt> <dd> <p> - $B%i!<%8%*%V%8%'%/%H$N%l%W%j%1!<%7%g%s$r9T$$$?$$$H$-$K%m%C%/4IM}$K;H$&$?$a$N%F!<%V%kL>$r;XDj$7$^$9!#(B - $B$3$N%F!<%V%k$,;XDj$5$l$F$$$F!"%i!<%8%*%V%8%'%/%H$N:n@.MW5a$,%/%i%$%"%s%H$+$iAw?.$5$l!"(B - $B$+$D$=$NMW5a$NCf$K%i!<%8%*%V%8%'%/%H$N(BID$B$NL@<(E*$J;XDj$,4^$^$l$F$$$J$$>l9g(B - ($B$D$^$j!"(Blo_creat$B$G%i!<%8%*%V%8%'%/%H$r:n@.$9$k>l9g(B)$B!"(B - pgpool-II$B$O!"GSB>@)8f$N$?$a$K$3$N%F!<%V%k$r%m%C%/$7$?8e!"(B - $B%i!<%8%*%V%8%'%/%H$r3JG<$9$k%7%9%F%`%+%?%m%0(Bpg_largeobject$B$N%i!<%8%*%V%8%'%/%H$K3JG<$5$l$F$$$k(B - ID$B$N:GBgCM$r<h$j$@$7!"$=$NCM(B+1$B$N(BID$B$r;H$C$F(Blo_create()$B$r8F$S=P$7$F%i!<%8%*%V%8%'%/%H$N:n@.$r9T$$$^$9(B - (lo_create()$B$r;}$?$J$$%P!<%8%g%s(B8.1$B$h$jA0$N(BPostgreSQL$B$G$O$3$N=hM}$O9T$o$l$^$;$s(B)$B!#(B - $B$3$NJ}K!$K$h$j!"$9$Y$F$N(BDB$B%N!<%I$GF1$8(BID$B$r;}$D%i!<%8%*%V%8%'%/%H$,:n@.$5$l$k$3$H$,J]>Z$5$l$^$9!#(B + ラージオブジェクトのレプリケーションを行いたいときにロック管理に使うためのテーブル名を指定します。 + このテーブルが指定されていて、ラージオブジェクトの作成要求がクライアントから送信され、 + かつその要求の中にラージオブジェクトのIDの明示的な指定が含まれていない場合 + (つまり、lo_creatでラージオブジェクトを作成する場合)、 + pgpool-IIは、排他制御のためにこのテーブルをロックした後、 + ラージオブジェクトを格納するシステムカタログpg_largeobjectのラージオブジェクトに格納されている + IDの最大値を取りだし、その値+1のIDを使ってlo_create()を呼び出してラージオブジェクトの作成を行います + (lo_create()を持たないバージョン8.1より前のPostgreSQLではこの処理は行われません)。 + この方法により、すべてのDBノードで同じIDを持つラージオブジェクトが作成されることが保証されます。 </p> <p> - $B$3$N$h$&$J=hM}$NBP>]$H$J$k%i!<%8%*%V%8%'%/%H$NA`:n$O!"(BPostgreSQL$B$N(BC$B8@8lMQ$N(BAPI(libpq)$B$G8@$&$H!"(Blo_creat()$B$G$9!#(B - 2010$BG/(B2$B7n;~E@$N2f!9$ND4::$G$O!"0J2<$N8@8l$N%i!<%8%*%V%8%'%/%H:n@.(BAPI$B$O!"$9$Y$F(Blo_creat()$B$r8F$S=P$9$+!"(B - $B$^$?$O(Blo_creat()$B$HF1$8DL?.%W%m%H%3%k$r;H$C$F$$$k$N$G!"(Bpgpool-II$B$N>e5-$NA`:n$NBP>]$K$J$j!"(B - $B%i!<%8%*%V%8%'%/%H$N%l%W%j%1!<%7%g%s$,0BA4$K9T$o$l$k$h$&$K$J$j$^$9!#(B + このような処理の対象となるラージオブジェクトの操作は、PostgreSQLのC言語用のAPI(libpq)で言うと、lo_creat()です。 + 2010年2月時点の我々の調査では、以下の言語のラージオブジェクト作成APIは、すべてlo_creat()を呼び出すか、 + またはlo_creat()と同じ通信プロトコルを使っているので、pgpool-IIの上記の操作の対象になり、 + ラージオブジェクトのレプリケーションが安全に行われるようになります。 </p> <ul> - <li>Java(JDBC$B%I%i%$%P(B)</li> - <li>PHP(pg_lo_create$B4X?t!"$^$?$O(BPDO$B$J$I$N3:Ev(BAPI)</li> - <li>psql$B$+$i(B\lo_import$B$r8F$S=P$9>l9g(B</li> + <li>Java(JDBCドライバ)</li> + <li>PHP(pg_lo_create関数、またはPDOなどの該当API)</li> + <li>psqlから\lo_importを呼び出す場合</li> </ul> <p> - $B>e5-0J30$G$"$C$F$b!"%i!<%8%*%V%8%'%/%H$N:n@.(BAPI$B$G(B - $B%i!<%8%*%V%8%'%/%H$N(BID$B$r0z?t$H$7$FEO$9$h$&$K$J$C$F$$$J$$$b$N$O(B - $B4V0c$$$J$/(Blo_creat()$B$r;H$C$F$*$j!"(Bpgpool-II$B$N>e5-$NA`:n$NBP>]$K$J$k$H9M$($FNI$$$G$7$g$&!#(B + 上記以外であっても、ラージオブジェクトの作成APIで + ラージオブジェクトのIDを引数として渡すようになっていないものは + 間違いなくlo_creat()を使っており、pgpool-IIの上記の操作の対象になると考えて良いでしょう。 </p> <p> - pgpool-II$B$N>e5-=hM}$NBP>]$H$J$i$J$$$h$&$J%i!<%8%*%V%8%'%/%H$N:n@.=hM}$O0J2<$N$b$N$G$9!#(B + pgpool-IIの上記処理の対象とならないようなラージオブジェクトの作成処理は以下のものです。 </p> <ul> - <li>libpq$B$N(Blo_create()$B$r;HMQ$7$F$$$k(B</li> - <li>C$B8@8l0J30$N(BAPI$B$G!"(Blo_create()$B$r;HMQ$7$F$$$k$b$N(B</li> - <li>$B%P%C%/%(%s%I4X?t$N(Blo_import$B$r(BSELECT$B$G8F$S=P$9>l9g(B</li> - <li>$B%P%C%/%(%s%I4X?t$N(Blo_creat$B$r(BSELECT$B$G8F$S=P$9>l9g(B</li> + <li>libpqのlo_create()を使用している</li> + <li>C言語以外のAPIで、lo_create()を使用しているもの</li> + <li>バックエンド関数のlo_importをSELECTで呼び出す場合</li> + <li>バックエンド関数のlo_creatをSELECTで呼び出す場合</li> </ul> <p> - lobj_lock_table$B$G;XDj$9$k%F!<%V%k$O$I$N$h$&$JDj5A$N$b$N$G$b9=$$$^$;$s$,!"(B - $B$"$i$+$8$a:n@.:Q$G$+$D$9$Y$F$N%f!<%6$,=q$-9~$_2DG=$G$J$1$l$P$J$j$^$;$s!#(B - $B$=$N$h$&$J%F!<%V%k$r:n$kNc$r<($7$^$9!#(B + lobj_lock_tableで指定するテーブルはどのような定義のものでも構いませんが、 + あらかじめ作成済でかつすべてのユーザが書き込み可能でなければなりません。 + そのようなテーブルを作る例を示します。 </p> <pre> @@ -1748,41 +1749,41 @@ GRANT ALL ON public.my_lock_table TO PUBLIC; </pre> <p> - $B$3$NA`:n$O(Bpgpool-II$B7PM3$G@\B3$9$k$9$Y$F$N%G!<%?%Y!<%9$KBP$7$F!"$"$i$+$8$a<B;\$7$F$*$+$J$1$l$P$J$j$^$;$s!#(B - $B$7$+$7!"$3$NA`:n$r(Btemplate1$B%G!<%?%Y!<%9$KBP$7$F0lEY9T$C$F$*$1$P!"(B - $B0J8e:n@.$5$l$k%G!<%?%Y!<%9$K$O$3$N%F!<%V%k$,4^$^$l$k$h$&$K$J$k$N$G!"4IM}$N<j4V$,>J$1$^$9!#(B + この操作はpgpool-II経由で接続するすべてのデータベースに対して、あらかじめ実施しておかなければなりません。 + しかし、この操作をtemplate1データベースに対して一度行っておけば、 + 以後作成されるデータベースにはこのテーブルが含まれるようになるので、管理の手間が省けます。 </p> <p> - lobj_lock_table$B$K;XDj$9$k%F!<%V%kL>$,6uJ8;z$N>l9g$O!"%i!<%8%*%V%8%'%/%H$K4X$9$k>e5-$N=hM}$O9T$$$^$;$s(B - ($B$7$?$,$C$F!"%i!<%8%*%V%8%'%/%H$N%l%W%j%1!<%7%g%s$OJ]>Z$5$l$^$;$s(B)$B!#(B - lobj_lock_table$B$N%G%U%)%k%HCM$O6uJ8;z$G$9!#(B + lobj_lock_tableに指定するテーブル名が空文字の場合は、ラージオブジェクトに関する上記の処理は行いません + (したがって、ラージオブジェクトのレプリケーションは保証されません)。 + lobj_lock_tableのデフォルト値は空文字です。 </p> </dd> </dl> -<h2 id="condition_for_load_balance">$B%m!<%I%P%i%s%9$N>r7o$K$D$$$F(B</h2> +<h2 id="condition_for_load_balance">ロードバランスの条件について</h2> <p> -load_balance_mode = true $B$r@_Dj$7$?>l9g!"0J2<$N>r7o$N$9$Y$F$rK~$?$7$?;~$K(B -SELECT$B$J$I$NLd$$9g$o$;$,%m!<%I%P%i%s%9$5$l$^$9!#(B +load_balance_mode = true を設定した場合、以下の条件のすべてを満たした時に +SELECTなどの問い合わせがロードバランスされます。 </p> <ul> - <li>PostgreSQL$B$N%P!<%8%g%s$,(B7.4$B0J9_$G$"$k(B</li> - <li>$BLd$$9g$o$;$,L@<(E*$J%H%i%s%/%6%7%g%s%V%m%C%/$NFbB&$K$J$$(B($B$D$^$j!"(BBEGIN$B$rH/9T$7$F$$$J$$(B)</li> - <li>SELECT$BJ8(B(WITH$BIU$b4^$`!#(B<a href="#BLACK_FUNCTION_LIST">black_list</a> $B$^$?$O(B - <a href="#WHITE_FUNCTION_LIST">white_list</a> $B$G;XDj$5$l$?=q$-9~$_$r4^$`(BSELECT$B$r=|$/(B) - $B$^$?$O(BCOPY TO STDOUT, EXPLAIN, EXPLAIN ANALYZE SELECT... $B$N$$$:$l$+$G$"$k(B</li> - <li>SELECT INTO $BJ8$G$O$J$$(B</li> - <li>SELECT FOR UPDATE/SELECT FOR SHARE$BJ8$G$O$J$$(B</li> - <li>$B%/%(%jJ8;zNs$,(B SELECT$B$^$?$O(BWITH $B$G;O$^$k(B(ignore_leading_white_space = true$B$N>l9g$O6uGr$OL5;k$7$^$9(B)</li> + <li>PostgreSQLのバージョンが7.4以降である</li> + <li>問い合わせが明示的なトランクザションブロックの内側にない(つまり、BEGINを発行していない)</li> + <li>SELECT文(WITH付も含む。<a href="#BLACK_FUNCTION_LIST">black_list</a> または + <a href="#WHITE_FUNCTION_LIST">white_list</a> で指定された書き込みを含むSELECTを除く) + またはCOPY TO STDOUT, EXPLAIN, EXPLAIN ANALYZE SELECT... のいずれかである</li> + <li>SELECT INTO 文ではない</li> + <li>SELECT FOR UPDATE/SELECT FOR SHARE文ではない</li> + <li>クエリ文字列が SELECTまたはWITH で始まる(ignore_leading_white_space = trueの場合は空白は無視します)</li> </ul> <p> -(<a href="#replicate_select">replicate_select$B$N9`L\(B</a>$B$b;29M$K$7$F$/$@$5$$(B) -$B$^$?!"(B<a href="where_to_send_queries.pdf">$B>\:Y$JH=Dj>r7o$r%U%m!<%A%c!<%H$K$7$?$b$N(B</a>$B$b$4Mw2<$5$$!#(B +(<a href="#replicate_select">replicate_selectの項目</a>も参考にしてください) +また、<a href="where_to_send_queries.pdf">詳細な判定条件をフローチャートにしたもの</a>もご覧下さい。 </p> <p> -$B$J$*!"(B +なお、 </p> <pre> @@ -1790,34 +1791,34 @@ SELECT$B$J$I$NLd$$9g$o$;$,%m!<%I%P%i%s%9$5$l$^$9!#(B </pre> <p> -$B$H$9$k$3$H$K$h$C$F!"K\MhIi2YJ,;6$5$l$?$j!"%^%9%?$N$_$KAw?.$5$l$k$Y$-Ld9g$o$;$,(B -$B$9$Y$F$N%P%C%/%(%s%I$KAw?.$5$l$k!J%l%W%j%1!<%7%g%s$5$l$k!K$h$&$K$J$j$^$9!#(B -$BI{:nMQ$,$"$k4X?t$r4^$`Ld9g$o$;$KBP$7$F$O$3$N%F%/%K%C%/$,MxMQ$G$-$^$9!#(B +とすることによって、本来負荷分散されたり、マスタのみに送信されるべき問合わせが +すべてのバックエンドに送信される(レプリケーションされる)ようになります。 +副作用がある関数を含む問合わせに対してはこのテクニックが利用できます。 </p> <p> <font color="red"> -$BCm0U(B: JDBC $B%I%i%$%P$J$I$N$h$&$K!"%I%i%$%PFb$G(B autocommit $B$NM-8z!&L58z$N%*%W%7%g%s$,$"$k>l9g!"(B -autocommit $B$rL58z$K$9$k$H!"%I%i%$%P$,FbIt$G(B BEGIN $B%3%^%s%I$r<B9T$9$k4X78>e!"(B -$B@5$7$/%m!<%I%P%i%s%9$5$l$J$$2DG=@-$,$"$j$^$9!#(B -$B%/%(%j$r%m!<%I%P%i%s%9$5$;$?$$>l9g$O(B autocommit $B$rM-8z$K$7$F$/$@$5$$!#(B -$B$?$H$($P(BJDBC$B$G$"$l$P(B setAutoCommit(true) $B$r<B9T$7$F$/$@$5$$!#(B +注意: JDBC ドライバなどのように、ドライバ内で autocommit の有効・無効のオプションがある場合、 +autocommit を無効にすると、ドライバが内部で BEGIN コマンドを実行する関係上、 +正しくロードバランスされない可能性があります。 +クエリをロードバランスさせたい場合は autocommit を有効にしてください。 +たとえばJDBCであれば setAutoCommit(true) を実行してください。 </font> </p> -<h2 id="detach_in_replication_mode">$B%l%W%j%1!<%7%g%s%b!<%I$K$*$1$k=LB`1?E>$K$D$$$F(B</h2> +<h2 id="detach_in_replication_mode">レプリケーションモードにおける縮退運転について</h2> <p> -PostgreSQL$B%5!<%P$N$&$A!"(B1$BBf$,%@%&%s$9$k$H!"$=$N%5!<%P$r@Z$jN%$7$F=LB`1?E>$KF~$j$^$9!#(B -1$BBf$G$b%5!<%P$,@8$-;D$C$F$$$l$P!"%7%9%F%`$H$7$F$N1?MQ$r7QB3$G$-$^$9!#(B +PostgreSQLサーバのうち、1台がダウンすると、そのサーバを切り離して縮退運転に入ります。 +1台でもサーバが生き残っていれば、システムとしての運用を継続できます。 </p> -<h2 id="errors_in_replication_mode">$B%l%W%j%1!<%7%g%s%b!<%I8GM-$N%(%i!<$K$D$$$F(B</h2> +<h2 id="errors_in_replication_mode">レプリケーションモード固有のエラーについて</h2> <p> -$B%l%W%j%1!<%7%g%s%b!<%I$K$*$$$F!"(Bpgpool$B$O%l%W%j%1!<%7%g%s;~$K(B INSERT$B!"(BUPDATE$B!"(BDELETE $B$N99?77o?t$,(B -$B$9$Y$F$N%N!<%I$,F1$8$G$J$$>l9g!"(B -<a href="#FAILOVER_IF_AFFECTED_TUPLES_MISMATCH">failover_if_affected_tuples_mismatch</a> $B$,(B false$B$J$i$P!"(B -$B0U?^E*$K9=J8%(%i!<$r5/$9(BSQL$B$rAw?.$9$k$3$H$K$h$C$F!"%H%i%s%6%/%7%g%s$r%"%\!<%H$5$;$^$9!#(B -true$B$J$i$P!"%U%'%$%k%*!<%P$,5/$-$^$9!#$=$N:]!"0J2<$N$h$&$J%(%i!<%a%C%;!<%8$,I=<($5$l$^$9!#(B +レプリケーションモードにおいて、pgpoolはレプリケーション時に INSERT、UPDATE、DELETE の更新件数が +すべてのノードが同じでない場合、 +<a href="#FAILOVER_IF_AFFECTED_TUPLES_MISMATCH">failover_if_affected_tuples_mismatch</a> が falseならば、 +意図的に構文エラーを起すSQLを送信することによって、トランザクションをアボートさせます。 +trueならば、フェイルオーバが起きます。その際、以下のようなエラーメッセージが表示されます。 </p> <pre> @@ -1827,7 +1828,7 @@ HINT: check data consistency between master and other db node </pre> <p> -$B%m%0$K$O99$K0J2<$N$h$&$K!"99?79T?t$,5-O?$5$l$^$9(B($B$3$N>l9g$O(BDB$B%N!<%I(B0$B$,(B0$B9T!"(BDB$B%N!<%I(B1$B$,(B1$B9T(B)$B!#(B +ログには更に以下のように、更新行数が記録されます(この場合はDBノード0が0行、DBノード1が1行)。 </p> <pre> 2010-07-22 13:23:25 LOG: pid 5490: SimpleForwardToFrontend: Number of affected tuples are: 0 1 @@ -1835,165 +1836,165 @@ HINT: check data consistency between master and other db node 2010-07-22 13:23:25 LOG: pid 5490: ReadyForQuery: Number of affected tuples are: 0 1 </pre> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="master_slave_mode"></a>$B%^%9%?!<%9%l!<%V%b!<%I(B</h1> +<h1><a name="master_slave_mode"></a>マスタースレーブモード</h1> <p> -master/slave$B%b!<%I$O!"(BSlony-I$B$d(BStreaming Replication$B$N$h$&$J!"(B -master/slave$B<0$N%l%W%j%1!<%7%g%s%=%U%H$K%l%W%j%1!<%7%g%s$r$^$+$;$k%b!<%I$G$9!#(B -$B$3$N%b!<%I$G;H$&$?$a$K$O!"%l%W%j%1!<%7%g%s%b!<%I$HF1$8$h$&$K!"(B -DB$B%N!<%I$N%[%9%H>pJs(B(<a href="#BACKEND_HOSTNAME">backend_hostname</a>, +master/slaveモードは、Slony-IやStreaming Replicationのような、 +master/slave式のレプリケーションソフトにレプリケーションをまかせるモードです。 +このモードで使うためには、レプリケーションモードと同じように、 +DBノードのホスト情報(<a href="#BACKEND_HOSTNAME">backend_hostname</a>, <a href="#BACKEND_PORT">backend_port</a>, <a href="#BACKEND_WEIGHT">backend_weight</a>, -<a href="#BACKEND_FLAG">backend_flag</a> $B$=$l$K%*%s%i%$%s%j%+%P%j$,I,MW$J$i$P(B -<a href="#BACKEND_DATA_DIRECTORY">backend_data_directory</a>)$B$r%;%C%H$7!"(B -<a href="#MASTER_SLAVE_MODE">master_slave_mode</a>$B$H(B<a href="LOAD_BALANCE_MODE">load_balance_mode</a>$B$r(Btrue$B$K$7$^$9!#(B +<a href="#BACKEND_FLAG">backend_flag</a> それにオンラインリカバリが必要ならば +<a href="#BACKEND_DATA_DIRECTORY">backend_data_directory</a>)をセットし、 +<a href="#MASTER_SLAVE_MODE">master_slave_mode</a>と<a href="LOAD_BALANCE_MODE">load_balance_mode</a>をtrueにします。 </p> <p> -pgpool-II$B$O!"%l%W%j%1!<%7%g%s$5$l$kI,MW$N$"$kLd$$9g$o$;$O%^%9%?!<$KAw$j!"(B -$B$=$NB>$NLd$$9g$o$;$r2DG=$J$i$PIi2YJ,;6$7$^$9!#Ld$$9g$o$;$K$h$C$F%^%9%?!<(BDB$B$@$1$KLd$$9g$o$;$,Aw$i$l$k>l9g$H!"(B -DB$B%N!<%I$N4V$G%m!<%I%P%i%s%9$5$l$FLd$$9g$o$;$,Aw$i$l$k>l9g$,$"$j$^$9!#(B +pgpool-IIは、レプリケーションされる必要のある問い合わせはマスターに送り、 +その他の問い合わせを可能ならば負荷分散します。問い合わせによってマスターDBだけに問い合わせが送られる場合と、 +DBノードの間でロードバランスされて問い合わせが送られる場合があります。 </p> <p> -$B%^%9%?%9%l!<%V%b!<%I$G$O!"0l;~%F!<%V%k$N:n@.!"99?7!"8!:w$O%^%9%?%N!<%I$G$N$_<B9T$5$l$^$9!#(B -SELECT$B$r%^%9%?$@$1$G<B9T$9$k$h$&$K6/@)$9$k$3$H$,$G$-$^$9!#(B -$B$3$N$?$a$K$O!"(B/*NO LOAD BALANCE*/ $B%3%a%s%H$r(BSELECT$B$KA0$KA^F~$7$J$1$l$P$J$j$^$;$s!#(B +マスタスレーブモードでは、一時テーブルの作成、更新、検索はマスタノードでのみ実行されます。 +SELECTをマスタだけで実行するように強制することができます。 +このためには、/*NO LOAD BALANCE*/ コメントをSELECTに前に挿入しなければなりません。 </p> <p> -$B%^%9%?!<%9%l!<%V%b!<%I$G$O!"(Bpgpool.conf$B$N(Breplication_mode$B$r(Bfalse$B$K!"(B -<a href="#MASTER_SLAVE_MODE">master_slave_mode</a> $B$r(Btrue$B$K$7$^$9(B($BF1;~$K(Btrue$B$K$O$G$-$^$;$s(B)$B!#(B -$B$^$?!"(B'<a href="#MASTER_SLAVE_SUB_MODE">master_slave_sub_mode</a>'$B$r;XDj$7$^$9!#(B -$B$3$l$O!"(B'slony'($B%G%U%)%k%H(B)$B$+!"(B'stream'$B$G$9!#(B +マスタースレーブモードでは、pgpool.confのreplication_modeをfalseに、 +<a href="#MASTER_SLAVE_MODE">master_slave_mode</a> をtrueにします(同時にtrueにはできません)。 +また、'<a href="#MASTER_SLAVE_SUB_MODE">master_slave_sub_mode</a>'を指定します。 +これは、'slony'(デフォルト)か、'stream'です。 </p> <p> -'slony'$B$O(BSlony-I$B$rMxMQ$9$k;~$K;XDj$7$^$9!#(B -'stream'$B$O!"(BPostgreSQL$BAH$_9~$_$N(BStreaming Replication$B$rMxMQ$9$k$H$-$K;XDj$7$^$9!#(B +'slony'はSlony-Iを利用する時に指定します。 +'stream'は、PostgreSQL組み込みのStreaming Replicationを利用するときに指定します。 </p> <p> -Slony-I$B$r;H$&>l9g$N@_Dj%U%!%$%k$N?w7A$O(Bpgpool.conf.sample-master-slave$B$G$9!#(B -Streaming Replication$B$r;H$&>l9g$N?w7A$O(Bpgpool.conf.sample-stream$B$G$9!#(B +Slony-Iを使う場合の設定ファイルの雛形はpgpool.conf.sample-master-slaveです。 +Streaming Replicationを使う場合の雛形はpgpool.conf.sample-streamです。 </p> <p> -$B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B +このパラメータを変更した時には pgpool-II を再起動してください。 </p> <p> -$B%^%9%?!<%9%l!<%V%b!<%I$G$b!"(BDB$B=q$-9~$_$r9T$J$&4X?t$N8F$S=P$7$r4^$`(BSELECT$B$rIi2YJ,;6$NBP>]$+$i30$9;XDj$r(B -<a href="#white_function_list">white_function_list</a>$B$H(B -<a href="#black_function_list">black_function_list</a>$B$G9T$J$&$3$H$,$G$-$^$9!#(B -$B>\:Y$O(B<a href="#white_function_list">white_function_list</a>$B$N9`$r$4Mw2<$5$$!#(B +マスタースレーブモードでも、DB書き込みを行なう関数の呼び出しを含むSELECTを負荷分散の対象から外す指定を +<a href="#white_function_list">white_function_list</a>と +<a href="#black_function_list">black_function_list</a>で行なうことができます。 +詳細は<a href="#white_function_list">white_function_list</a>の項をご覧下さい。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="stream"></a>Streaming Replication$B$X$NBP1~(B <span class="version">V3.1 $B!A(B</span></h1> +<h1><a name="stream"></a>Streaming Replicationへの対応 <span class="version">V3.1 〜</span></h1> <p> -$BA0=R$N$h$&$K!"%^%9%?%9%l!<%V%b!<%I$G!"(B'<a href="#MASTER_SLAVE_SUB_MODE">master_slave_sub mode</a>'$B$K(B -'stream'$B$r;XDj$9$k$H!"(BPostgreSQL 9.0$B$+$iMxMQ2DG=$K$J$C$?(BStreaming Replication$B$KBP1~$7$^$9(B -(pgpool-II$B$G$O!":#$N$H$3$m!"(BStreaming Replication$B$H(BHot Standby$B$rJ;MQ$9$k$3$H$rA0Ds$K$7$F$$$^$9(B)$B!#(B -$B$3$N%b!<%I$G$O!"0J2<$N@_Dj9`L\$bMxMQ$G$-$^$9!#(B +前述のように、マスタスレーブモードで、'<a href="#MASTER_SLAVE_SUB_MODE">master_slave_sub mode</a>'に +'stream'を指定すると、PostgreSQL 9.0から利用可能になったStreaming Replicationに対応します +(pgpool-IIでは、今のところ、Streaming ReplicationとHot Standbyを併用することを前提にしています)。 +このモードでは、以下の設定項目も利用できます。 <dl id="params_for_stream_mode"> -<dt id="DELAY_THRESHOLD">delay_threshold <span class="version">V3.0 $B!A(B</span></dt> +<dt id="DELAY_THRESHOLD">delay_threshold <span class="version">V3.0 〜</span></dt> <dd> <p> - $B%9%?%s%P%$%5!<%P$X$N%l%W%j%1!<%7%g%s$NCY1d5vMFEY$r%P%$%HC10L$G;XDj$7$^$9!#(B - pgpool-II$B$O!"%9%?%s%P%$%5!<%P$NCY1d$,$3$NCM$rD6$($?>l9g$K$O!"(B - $BIi2YJ,;6$,M-8z$G$"$C$F$b$=$N(BDB$B%N!<%I$K(BSELECT$B$rAw?.$;$:!"%W%i%$%^%j%5!<%P$KAw$k$h$&$K$7$^$9!#(B - delay_threshold$B$,(B0$B$N>l9g$O!"CY1d$N%A%'%C%/$r9T$J$$$^$;$s!#(B - $B$^$?!"(Bdelay_threshold$B$,;XDj$5$l$F$$$F$b!"(B<a href="#SR_CHECK_PERIOD">sr_check_period</a>$B$,L58z(B(=0)$B$J$i$P!"(B - $B$d$O$j$3$N5!G=$OF/$-$^$;$s!#(B - $B%G%U%)%k%HCM$O(B0$B$G$9!#(B + スタンバイサーバへのレプリケーションの遅延許容度をバイト単位で指定します。 + pgpool-IIは、スタンバイサーバの遅延がこの値を超えた場合には、 + 負荷分散が有効であってもそのDBノードにSELECTを送信せず、プライマリサーバに送るようにします。 + delay_thresholdが0の場合は、遅延のチェックを行ないません。 + また、delay_thresholdが指定されていても、<a href="#SR_CHECK_PERIOD">sr_check_period</a>が無効(=0)ならば、 + やはりこの機能は働きません。 + デフォルト値は0です。 </p> <p> - $B$3$N%Q%i%a!<%?$O@_Dj%U%!%$%k$N:FFI9~$K$h$C$FJQ99$G$-$^$9!#(B + このパラメータは設定ファイルの再読込によって変更できます。 </p> </li> -<dt id="SR_CHECK_PERIOD">sr_check_period <span class="version">V3.1 $B!A(B</span></dt> +<dt id="SR_CHECK_PERIOD">sr_check_period <span class="version">V3.1 〜</span></dt> <dd> <p> - $B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s$NCY1d%A%'%C%/$N4V3V$rICC10L$G;XDj$7$^$9!#(B - $B%G%U%)%k%HCM$O(B0$B$G!"$3$l$O%A%'%C%/$r9T$o$J$$$3$H$r0UL#$7$^$9!#(B + ストリーミングレプリケーションの遅延チェックの間隔を秒単位で指定します。 + デフォルト値は0で、これはチェックを行わないことを意味します。 </p> <p> - $B$3$N%Q%i%a!<%?$O@_Dj%U%!%$%k$N:FFI9~$K$h$C$FJQ99$G$-$^$9!#(B + このパラメータは設定ファイルの再読込によって変更できます。 </p> </dd> -<dt id="SR_CHECK_USER">sr_check_user <span class="version">V3.1 $B!A(B</span></dt> +<dt id="SR_CHECK_USER">sr_check_user <span class="version">V3.1 〜</span></dt> <dd> <p> - $B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s$NCY1d%A%'%C%/$r9T$&%f!<%6L>$r;XDj$7$^$9!#(B - $B$3$N%f!<%6$O!"$9$Y$F$N%P%C%/%(%s%I$KB8:_$7$J$1$l$P$J$j$^$;$s!#(B - $B$5$b$J$1$l$P%(%i!<$K$J$j$^$9!#(B - sr_check_user$B$H(Bsr_check_password$B$O!"(Bsr_check_period$B$,(B0$B$G$"$C$F$b(B - $B;XDj$,I,MW$G$9!#(Bpgpool-II$B$O!"$I$N%5!<%P$,(Bprimary$B%5!<%P$G$"$k$N$+$rD4$Y$k$?$a$K!"(B - PostgreSQL$B%P%C%/%(%s%I$K4X?t8F$S=P$7$N%j%/%(%9%H$rAw$j$^$9!#(B - $B$=$N%;%C%7%g%s$G(Bsr_check_user$B$H(Bsr_check_password$B$,;H$o$l$k$+$i$G$9!#(B + ストリーミングレプリケーションの遅延チェックを行うユーザ名を指定します。 + このユーザは、すべてのバックエンドに存在しなければなりません。 + さもなければエラーになります。 + sr_check_userとsr_check_passwordは、sr_check_periodが0であっても + 指定が必要です。pgpool-IIは、どのサーバがprimaryサーバであるのかを調べるために、 + PostgreSQLバックエンドに関数呼び出しのリクエストを送ります。 + そのセッションでsr_check_userとsr_check_passwordが使われるからです。 </p> <p> - $B$3$N%Q%i%a!<%?$O@_Dj%U%!%$%k$N:FFI9~$K$h$C$FJQ99$G$-$^$9!#(B + このパラメータは設定ファイルの再読込によって変更できます。 </p> </dd> -<dt id="SR_CHECK_PASSWORD">sr_check_password <span class="version">V3.1 $B!A(B</span></dt> +<dt id="SR_CHECK_PASSWORD">sr_check_password <span class="version">V3.1 〜</span></dt> <dd> <p> - $B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s$NCY1d%A%'%C%/$r9T$&%f!<%6$KBP$9$k%Q%9%o!<%I$r$r;XDj$7$^$9!#(B - $B%Q%9%o!<%I$,I,MW$J$1$l$P6uJ8;z(B('')$B$r;XDj$7$^$9!#(B + ストリーミングレプリケーションの遅延チェックを行うユーザに対するパスワードをを指定します。 + パスワードが必要なければ空文字('')を指定します。 </p> <p> - $B$3$N%Q%i%a!<%?$O@_Dj%U%!%$%k$N:FFI9~$K$h$C$FJQ99$G$-$^$9!#(B + このパラメータは設定ファイルの再読込によって変更できます。 </p> </dd> -<dt id="LOG_STANDBY_DELAY">log_standby_delay <span class="version">V3.0 $B!A(B</span></dt> +<dt id="LOG_STANDBY_DELAY">log_standby_delay <span class="version">V3.0 〜</span></dt> <dd> <p> - $B%l%W%j%1!<%7%g%s$NCY1d>u67$r%m%0$9$k>r7o$r;XDj$7$^$9!#(B - 'none'$B$r;XDj$9$k$H!"%m%0$r=PNO$7$^$;$s!#(B - 'always'$B$J$i%X%k%9%A%'%C%/$r<B9T$9$k$?$S$KI,$:=PNO$7$^$9!#(B - 'if_over_threshold'$B$r;XDj$9$k$H!"(B<a href="#DELAY_THRESHOLD">delay_threshold</a>$B$rD6$($?$H$-$@$1(B - $B%m%0$,=PNO$5$l$^$9!#(B - $B%G%U%)%k%HCM$O(B'none'$B$G$9!#(B + レプリケーションの遅延状況をログする条件を指定します。 + 'none'を指定すると、ログを出力しません。 + 'always'ならヘルスチェックを実行するたびに必ず出力します。 + 'if_over_threshold'を指定すると、<a href="#DELAY_THRESHOLD">delay_threshold</a>を超えたときだけ + ログが出力されます。 + デフォルト値は'none'です。 </p> <p> - $B$3$N%Q%i%a!<%?$O@_Dj%U%!%$%k$N:FFI9~$K$h$C$FJQ99$G$-$^$9!#(B + このパラメータは設定ファイルの再読込によって変更できます。 </p> <p> - $B$J$*!"%l%W%j%1!<%7%g%s$NCY1d>u67$O(B <a href="#pool_status">show pool_status</a> $B%3%^%s%I$G$b3NG'$G$-$^$9!#(B - $B9`L\L>$O(B"standby_delay#"$B$G$9(B(#$B$O(BDB$B%N!<%I(BID$B$G$9(B)$B!#(B + なお、レプリケーションの遅延状況は <a href="#pool_status">show pool_status</a> コマンドでも確認できます。 + 項目名は"standby_delay#"です(#はDBノードIDです)。 </p> </dd> </dl> -<h2 id="failover_in_stream_mode">Streaming Replication$B$G$N%U%'%$%k%*!<%P(B</h2> +<h2 id="failover_in_stream_mode">Streaming Replicationでのフェイルオーバ</h2> <p> -Streaming replication$B$rMxMQ$7$?%^%9%?%9%l!<%V%b!<%I$G$O!"(BPrimary$B$d(BStandby$B%N!<%I$,Dd;_$7$?>l9g$K!"(B -$B%l%W%j%1!<%7%g%s%b!<%I$HF1$8$h$&$K<+F0%U%'%$%k%*!<%P$r9T$J$o$;$k$3$H$,$G$-$^$9!#(B -$BFC$K2?$b@_Dj$7$J$/$F$b!"Dd;_$7$?%N!<%I$r<+F0E*$K@Z$jJ|$9$3$H$,$G$-$^$9$,!"(BStreaming replication$B$G$O!"(B -$B!V%H%j%,%U%!%$%k!W$r:n@.$9$k$3$H$K$h$j!"(BStandby$B%N!<%I$r!"%j%+%P%j%b!<%I$+$i99?7Ld$$9g$o$;$r<u$1IU$1$k(B -$BDL>o$N(BPostgreSQL$B$NF0:n%b!<%I$K<+F0JQ99$9$k$3$H$,$G$-$^$9!#(B -$B$3$l$rMxMQ$7$F!"%U%'%$%k%*!<%P%3%^%s%I$rJ;MQ$7$F!"(BPrimary$B%N!<%I$,%@%&%s$7$?$H$-$K!"(B -Standby$B%N!<%I$,<+F0E*$K$H$C$FBe$k$h$&$J@_Dj$r9T$J$&$3$H$,$G$-$^$9!#(B +Streaming replicationを利用したマスタスレーブモードでは、PrimaryやStandbyノードが停止した場合に、 +レプリケーションモードと同じように自動フェイルオーバを行なわせることができます。 +特に何も設定しなくても、停止したノードを自動的に切り放すことができますが、Streaming replicationでは、 +「トリガファイル」を作成することにより、Standbyノードを、リカバリモードから更新問い合わせを受け付ける +通常のPostgreSQLの動作モードに自動変更することができます。 +これを利用して、フェイルオーバコマンドを併用して、Primaryノードがダウンしたときに、 +Standbyノードが自動的にとって代るような設定を行なうことができます。 </p> <p> -<strong>$BCm0U(B: $BJ#?t$N(BStandby$B%N!<%I$rMxMQ$7$F$$$k>l9g!"$3$N@_Dj$r9T$J$&$H$-$O!"(B -<a href="#DELAY_THRESHOLD">delay_threshold</a>$B$r@_Dj$7$F!"(B -$BB>$N(BStandby$B$K?6$jJ,$1$i$l$?(BSELECT$B$,8E$$%G!<%?$r<hF@$7$J$$$h$&$K$7$F$*$/$3$H$r$*4+$a$7$^$9!#(B -$B$^$?!"(B1$BBfL\$N(BStandby$B%N!<%I$,(BPrimary$B$K$H$C$FBe$C$?$N$A$K%@%&%s$7$F$7$^$C$?%1!<%9$G!"(B -2$BBfL\$N(BStandby$B$,99$K<h$C$FBe$o$k$H%G!<%?$KIT@09g$,$*$-$k$N$G!"$=$N$h$&$J@_Dj$O9T$J$o$J$$$h$&$K$7$F$/$@$5$$!#(B</strong> +<strong>注意: 複数のStandbyノードを利用している場合、この設定を行なうときは、 +<a href="#DELAY_THRESHOLD">delay_threshold</a>を設定して、 +他のStandbyに振り分けられたSELECTが古いデータを取得しないようにしておくことをお勧めします。 +また、1台目のStandbyノードがPrimaryにとって代ったのちにダウンしてしまったケースで、 +2台目のStandbyが更に取って代わるとデータに不整合がおきるので、そのような設定は行なわないようにしてください。</strong> </p> <p> -$B%U%'%$%k%*!<%P$N@_Dj<j=g$r<($7$^$9!#(B +フェイルオーバの設定手順を示します。 </p> <p> <ol> - <li>$B%U%'%$%k%*!<%PMQ$N%9%/%j%W%H$rE,Ev$J>l=j(B($B$3$3$G$O(B/usr/local/pgsql/bin)$B$KG[CV$7$F!"<B9T8"8B$rM?$($F$*$-$^$9!#(B + <li>フェイルオーバ用のスクリプトを適当な場所(ここでは/usr/local/pgsql/bin)に配置して、実行権限を与えておきます。 <pre> $ cd /usr/loca/pgsql/bin $ cat failover_stream.sh @@ -2025,34 +2026,34 @@ chmod 755 failover_stream.sh </pre> </li> - <li>pgpool.conf$B$N!"(B<a href="#FAILBACK_COMMAND">failover_commmand</a>$B$r@_Dj$7$^$9!#(B + <li>pgpool.confの、<a href="#FAILBACK_COMMAND">failover_commmand</a>を設定します。 <pre> failover_command = '/usr/local/src/pgsql/9.0-beta/bin/failover_stream.sh %d %H /tmp/trigger_file0' </pre> </li> - <li>standby$B%N!<%I$N(Brecovery.conf$B$r@_Dj$7$^$9!#(B - <a href="recovery.conf.sample">recovery.conf$B$N%5%s%W%k(B</a>$B$O(B PostgreSQL$B$N%$%s%9%H!<%k%G%#%l%/%H%j2<$N(B - "share/recovery.conf.sample"$B$K$"$j$^$9!#(B - $B$3$l$r(Bstanndby$B%N!<%I$N%G!<%?%Y!<%9%/%i%9%?2<$K(B"recovery.conf"$B$H$7$F%3%T!<$7$F$*$-$^$9!#(B - $B$=$7$F!"0J2<$N9`L\$r@_Dj$7$^$9!#(B + <li>standbyノードのrecovery.confを設定します。 + <a href="recovery.conf.sample">recovery.confのサンプル</a>は PostgreSQLのインストールディレクトリ下の + "share/recovery.conf.sample"にあります。 + これをstanndbyノードのデータベースクラスタ下に"recovery.conf"としてコピーしておきます。 + そして、以下の項目を設定します。 <pre> standby_mode = 'on' -primary_conninfo = 'host=primary_host$B$N%[%9%HL>(B user=postgres' +primary_conninfo = 'host=primary_hostのホスト名 user=postgres' trigger_file = '/tmp/trigger_file0' </pre> </li> - <li>primary$B%N!<%I$N(Bpostgresql.conf$B$r@_Dj$7$^$9!#(B - $B0J2<$ONc$G$9$N$G!"I,$:<B:]$K9g$o$;$FD4@0$7$F$/$@$5$$!#(B + <li>primaryノードのpostgresql.confを設定します。 + 以下は例ですので、必ず実際に合わせて調整してください。 <pre> wal_level = hot_standby max_wal_senders = 1 </pre> </li> -<li>primary$B%N!<%I$N(Bpg_hba.conf$B$r@_Dj$7$^$9!#(B -$B0J2<$ONc$G$9$N$G!"I,$:<B:]$K9g$o$;$FD4@0$7$F$/$@$5$$!#(B +<li>primaryノードのpg_hba.confを設定します。 +以下は例ですので、必ず実際に合わせて調整してください。 <pre> host replication postgres 192.168.0.10/32 trust @@ -2062,60 +2063,60 @@ host replication postgres 192.168.0.10/32 trust </ol> <p> -primary$B$H(Bstandby$B$N(BPostgreSQL$B$r5/F0$9$l$P!"(BStreaming replication$B$,3+;O$5$l$^$9!#(B -$B$=$7$F!"(Bprimary$B%N!<%I$,%@%&%s$7$?$H$-$K!"<+F0E*$K(Bstandby$B%N!<%I$,DL>o$N(BPostgreSQL$B$H$7$FN)$A>e$,$j!"(B -$B99?7Ld$$9g$o$;$r<u$1IU$1$k$h$&$K$J$j$^$9!#(B +primaryとstandbyのPostgreSQLを起動すれば、Streaming replicationが開始されます。 +そして、primaryノードがダウンしたときに、自動的にstandbyノードが通常のPostgreSQLとして立ち上がり、 +更新問い合わせを受け付けるようになります。 </p> -<h2 id="load_balance_in_stream_mode">Streaming Replication$B$G$N%/%(%j?6$jJ,$1(B</h2> +<h2 id="load_balance_in_stream_mode">Streaming Replicationでのクエリ振り分け</h2> <p> -Streaming replication$B$H(BHot Standby$B$rMxMQ$7$F$$$k4D6-$G$O!"(Bprimary$B%N!<%I$KAw$C$F$h$$Ld$$9g$o$;!"(B -standby$B$KAw$C$F$b$h$$Ld$$9g$o$;!"N>J}$KAw$i$J$1$l$P$J$i$J$$Ld$$9g$o$;$r87L)$K4IM}$9$kI,MW$,$"$j$^$9!#(B -pgpool-II$B$N(BStreaming Replication$B%b!<%I$O!"$3$&$7$??6$jJ,$1$r<+F0E*$K9T$J$$$^$9!#(B -$B$3$3$G$O!"$=$N%m%8%C%/$K$D$$$F@bL@$7$^$9!#(B +Streaming replicationとHot Standbyを利用している環境では、primaryノードに送ってよい問い合わせ、 +standbyに送ってもよい問い合わせ、両方に送らなければならない問い合わせを厳密に管理する必要があります。 +pgpool-IIのStreaming Replicationモードは、こうした振り分けを自動的に行ないます。 +ここでは、そのロジックについて説明します。 </p> <p> -$B$^$:!"Ld$$9g$o$;$N<oN`$K$h$C$F0J2<$N$h$&$KJ,$1$i$l$^$9!#(B +まず、問い合わせの種類によって以下のように分けられます。 </p> <ul> - <li>Primary$B%N!<%I$K$7$+Aw$i$l$J$$Ld$$9g$o$;(B + <li>Primaryノードにしか送られない問い合わせ <ul> <li>INSERT, UPDATE, DELETE, COPY FROM, TRUNCATE, CREATE, DROP, ALTER, COMMENT</li> <li>SELECT ... FOR SHARE | UPDATE</li> - <li>$B%H%i%s%6%/%7%g%s$NJ,N%%l%Y%k$,%7%j%"%i%$%6%V%k$N>l9g$N(BSELECT</li> - <li>ROW EXCLUSIVE MODE$B$h$j$b6/$$(BLOCK</li> - <li>$B%H%i%s%6%/%7%g%s%3%^%s%I$N0lIt(B + <li>トランザクションの分離レベルがシリアライザブルの場合のSELECT</li> + <li>ROW EXCLUSIVE MODEよりも強いLOCK</li> + <li>トランザクションコマンドの一部 <ul> <li>BEGIN READ WRITE, START TRANSACTION READ WRITE <li>SET TRANSACTION READ WRITE, SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE <li>SET transaction_read_only = off </ul> </li> - <li>$BFsAj%3%_%C%H4XO"$N%3%^%s%I!#(BPREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK PREPARED</li> + <li>二相コミット関連のコマンド。PREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK PREPARED</li> <li>LISTEN, UNLISTEN, NOTIFY</li> <li>VACUUM</li> - <li>$B%7!<%1%s%94XO"$N4X?t(B(nextval$B$d(Bsetval$B$J$I(B)$B$N8F$S=P$7!#(B</li> - <li>$B%i!<%8%*%V%8%'%/%H$N@8@.(B</li> + <li>シーケンス関連の関数(nextvalやsetvalなど)の呼び出し。</li> + <li>ラージオブジェクトの生成</li> </ul> </li> - <li>Primary/Standby$B$I$A$i$K$bAw$k$3$H$N$G$-$kLd$$9g$o$;!#(B + <li>Primary/Standbyどちらにも送ることのできる問い合わせ。 <p> - $BIi2YJ,;6@_Dj$,M-8z$J$i$P!"(Bstandby$B%N!<%I$K$bAw?.$5$l$^$9!#(B - $B$?$@$7!"%l%W%j%1!<%7%g%s$NCY1d>e8B(B(delay_threshold)$B$,@_Dj$5$l$F$$$F!"(B - $B%l%W%j%1!<%7%g%s$NCY1d$,(B<a href="#DELAY_THRESHOLD">delay_threshold</a>$B$r>e2s$C$F$$$k>l9g$O(B - $BLd$$9g$o$;$O(BPrimary$B$KAw$i$l$^$9!#(B + 負荷分散設定が有効ならば、standbyノードにも送信されます。 + ただし、レプリケーションの遅延上限(delay_threshold)が設定されていて、 + レプリケーションの遅延が<a href="#DELAY_THRESHOLD">delay_threshold</a>を上回っている場合は + 問い合わせはPrimaryに送られます。 </p> <ul> - <li>$B>e5-0J30$N(BSELECT</li> + <li>上記以外のSELECT</li> <li>COPY TO</li> <li>DECLARE, FETCH, CLOSE</li> <li>SHOW</li> </ul> </li> - <li>Primary/Standby$B$I$A$i$K$bAw$i$l$kLd$$9g$o$;(B + <li>Primary/Standbyどちらにも送られる問い合わせ <ul> <li>SET</li> <li>DISCARD</li> @@ -2125,93 +2126,93 @@ pgpool-II$B$N(BStreaming Replication$B%b!<%I$O!"$3$&$7$??6$jJ,$1$r<+F0E*$K9T$ </ul> <p> -$BL@<(E*$J%H%i%s%6%/%7%g%s$G$O!"0J2<$N$h$&$K$J$j$^$9!#(B +明示的なトランザクションでは、以下のようになります。 </p> <ul> - <li>BEGIN$B$J$I$N%H%i%s%6%/%7%g%s3+;O%3%^%s%I$O!"(BPrimary$B%5!<%P$KAw$i$l$^$9!#(B</li> - <li>$BB3$/(BSELECT$B$J$I!"(BPrimary/Standby$B$I$A$i$K$bAw$k$3$H$N$G$-$kLd$$9g$o$;$O!"(B - Primary$B$N%H%i%s%6%/%7%g%sFb$G$=$N$^$^<B9T$5$l$k$+!"(BStandby$B%5!<%P$G<B9T$5$l$^$9!#(B</li> + <li>BEGINなどのトランザクション開始コマンドは、Primaryサーバに送られます。</li> + <li>続くSELECTなど、Primary/Standbyどちらにも送ることのできる問い合わせは、 + Primaryのトランザクション内でそのまま実行されるか、Standbyサーバで実行されます。</li> <li> - INSERT$B$J$I!"(BStandby$B$KAw$k$3$H$N$G$-$J$$Ld$$9g$o$;$,8=$o$l$?>l9g$O!"(BPrimary$B%5!<%P$G<B9T$5$l$^$9!#(B - $B0J8e!"(BSELECT$B$J$I!"K\Mh(BStandby$B$KAw?.$7$F$b9=$o$J$$%3%^%s%I$b(BPrimary$B%5!<%P$G<B9T$5$l$^$9!#(B - $B$3$l$O!"%H%i%s%6%/%7%g%s$NCf$G<B9T$5$l$?(BINSERT$B$J$I$NLd$$9g$o$;$N7k2L$r(B - SELECT$B$,D>$A$K;2>H$G$-$k$h$&$K$9$k$?$a$G$9!#(B - $B$3$N>uBV$O!"%H%i%s%6%/%7%g%s$,JD$8$k$+!"%"%\!<%H$9$k$^$GB3$-$^$9!#(B + INSERTなど、Standbyに送ることのできない問い合わせが現われた場合は、Primaryサーバで実行されます。 + 以後、SELECTなど、本来Standbyに送信しても構わないコマンドもPrimaryサーバで実行されます。 + これは、トランザクションの中で実行されたINSERTなどの問い合わせの結果を + SELECTが直ちに参照できるようにするためです。 + この状態は、トランザクションが閉じるか、アボートするまで続きます。 </li> </ul> <p> -$BLd$$9g$o$;$,!"3HD%Ld$$9g$o$;%b!<%I$G<B9T$5$l$k>l9g$O!"Ld$$9g$o$;$N(Bparse$BCJ3,$G!"(B -$BLd$$9g$o$;$,Ii2YJ,;62DG=$+$I$&$+$GAw?.@h$,7h$^$j$^$9!#(B -$B$=$N:]$NH=CG%k!<%k$O!"DL>o$N(BSQL$B$HF1$8$G$9!#(B -$B$?$H$($PLd$$9g$o$;$,(BINSERT$B$J$i$P!"(BPrimary$B%5!<%P$G<B9T$5$l$k!"$H$$$&6q9g$G$9!#(B -parse$B$KB3$/(Bbind, describe, execute$B$bF1$8(BDB$B%N!<%I$G<B9T$5$l$^$9!#(B +問い合わせが、拡張問い合わせモードで実行される場合は、問い合わせのparse段階で、 +問い合わせが負荷分散可能かどうかで送信先が決まります。 +その際の判断ルールは、通常のSQLと同じです。 +たとえば問い合わせがINSERTならば、Primaryサーバで実行される、という具合です。 +parseに続くbind, describe, executeも同じDBノードで実行されます。 </p> <p> -[$BCm(B: SELECT$B$,Ii2YJ,;6$5$l$F(B Standby $B%N!<%I$G(B parse$B$,<B9T$5$l$F$+$i99?7%/%(%j$,Mh$?>l9g$O!"(B -$B$=$N(BSELECT$B$O(BPrimary$B%N!<%I$G<B9T$5$l$J$1$l$P$J$j$^$;$s!#(B -$B$=$N$?$a!"F1$8(BSELECT$B$,:FEY(BPrimary$B%N!<%I$G%Q!<%9$5$l$k$3$H$K$J$j$^$9!#(B] +[注: SELECTが負荷分散されて Standby ノードで parseが実行されてから更新クエリが来た場合は、 +そのSELECTはPrimaryノードで実行されなければなりません。 +そのため、同じSELECTが再度Primaryノードでパースされることになります。] </p> <p> -$B:G8e$K!"(Bpgpool-II$B$N%Q!<%5$,9=J8%(%i!<$HH=CG$7$?Ld$$9g$o$;$O(BPrimary$B%N!<%I$@$1$KAw$i$l$^$9!#(B +最後に、pgpool-IIのパーサが構文エラーと判断した問い合わせはPrimaryノードだけに送られます。 </p> -<h2 id="online_recovery_in_stream_mode">Streaming Replication$B$G$N%*%s%i%$%s%j%+%P%j(B</h2> +<h2 id="online_recovery_in_stream_mode">Streaming Replicationでのオンラインリカバリ</h2> <p> -Streaming replication$B$rMxMQ$7$?%^%9%?%9%l!<%V%b!<%I$G$O!"(B -$B%l%W%j%1!<%7%g%s%b!<%I$HF1$8$h$&$K%*%s%i%$%s%j%+%P%j$,MxMQ$G$-$^$9!#(B -primary$B%5!<%P$r%^%9%?$H$7!"(Bstandby$B%5!<%P$r%j%+%P%j$7$^$9!#(B -primary$B%5!<%P$,F0:n$7$F$$$k$N$,$3$NJ}K!$NA0Ds>r7o$G$9$N$G!"(B -primary$B%5!<%P$,Dd;_$7$F$$$k>uBV$G$O%*%s%i%$%s%j%+%P%j$O$G$-$^$;$s!#(B -primary$B%5!<%,Dd;_$7$F$$$k>uBV$+$i$NI|5l$O!"$9$Y$F$N(BDB$B%N!<%I$H(Bpgpool-II$B$rDd;_$5$;$F<jF0$G<B;\$7$J$1$l$P$J$j$^$;$s!#(B +Streaming replicationを利用したマスタスレーブモードでは、 +レプリケーションモードと同じようにオンラインリカバリが利用できます。 +primaryサーバをマスタとし、standbyサーバをリカバリします。 +primaryサーバが動作しているのがこの方法の前提条件ですので、 +primaryサーバが停止している状態ではオンラインリカバリはできません。 +primaryサーガ停止している状態からの復旧は、すべてのDBノードとpgpool-IIを停止させて手動で実施しなければなりません。 </p> <ol> - <li>$B%j%+%P%j=hM}$r<B9T$9$k%f!<%6(B <a href="#RECOVERY_USER">recovery_user</a> $B$r@_Dj$7$^$9!#(B - $BDL>o!"(Bpostgres$B%f!<%6$H$J$j$^$9!#(B + <li>リカバリ処理を実行するユーザ <a href="#RECOVERY_USER">recovery_user</a> を設定します。 + 通常、postgresユーザとなります。 <pre> recovery_user = 'postgres' </pre> </li> - <li><a href="#RECOVERY_PASSWORD">recovery_password</a> $B$r@_Dj$7$^$9!#(B - $B$3$l$O!"(B<a href="#RECOVERY_USER">recovery_user</a> $B$,(BDB$B$K%m%0%$%s$9$k$H$-$K;H$&%Q%9%o!<%I$G$9!#(B + <li><a href="#RECOVERY_PASSWORD">recovery_password</a> を設定します。 + これは、<a href="#RECOVERY_USER">recovery_user</a> がDBにログインするときに使うパスワードです。 <pre> recovery_password = 't-ishii' </pre> </li> - <li><a href="#RECOVERY_1ST_STAGE_COMMAND">recovery_1st_stage_command</a> $B$r@_Dj$7$^$9!#(B + <li><a href="#RECOVERY_1ST_STAGE_COMMAND">recovery_1st_stage_command</a> を設定します。 <p> - $B$3$3$G;XDj$9$k%U%!%$%k$O!"(Bprimary$B%5!<%P$+$i%Y!<%9%P%C%/%"%C%W$r<hF@$7!"(B - standby$B%5!<%P$K%j%9%H%"$9$k$b$N$G$J$1$l$P$J$j$^$;$s!#(B - recovery_1st_stage_command $B$O!"(Bprimary$B$N(BPostgreSQL$B$+$i!"(Brecovery_user$B$N8"8B$G5/F0$5$l!"(B - $B$=$N;~$K0z?t$r<u$1$H$j$^$9!#(B - $B>\:Y$O!"(B<a href="#RECOVERY_1ST_STAGE_COMMAND">recovery_1st_stage_command</a>$B$N@_Dj9`L\$r$4Mw$/$@$5$$!#(B + ここで指定するファイルは、primaryサーバからベースバックアップを取得し、 + standbyサーバにリストアするものでなければなりません。 + recovery_1st_stage_command は、primaryのPostgreSQLから、recovery_userの権限で起動され、 + その時に引数を受けとります。 + 詳細は、<a href="#RECOVERY_1ST_STAGE_COMMAND">recovery_1st_stage_command</a>の設定項目をご覧ください。 </p> <p> - $B$3$N%9%/%j%W%H%U%!%$%k$O!"(Bprimary$B$N%G!<%?%Y!<%9%/%i%9%?2<$KG[CV$7!"<B9T8"8B$rM?$($F$*$-$^$9!#(B - $B%5%s%W%k$H$7$F!"(Bprimary/standby$B$=$l$>$l0lBf9=@.$N>l9g$N%9%/%j%W%H(B - <a href="basebackup.sh">(basebackup.sh)</a>$B$r<($7$^$9!#(B - $B$3$N%9%/%j%W%H$G$O!"(Brecovery_user $B$,%Q%9%o!<%I$J$7$G%j%+%P%jBP>]$N(B - standby$B%N!<%I$K%m%0%$%s$G$-$k$3$H$rA0Ds$K$7$F$$$k$N$G!"(B - $B$"$i$+$8$a(Bssh$B$N@_Dj$r9T$J$C$F$*$/I,MW$,$"$j$^$9!#(B + このスクリプトファイルは、primaryのデータベースクラスタ下に配置し、実行権限を与えておきます。 + サンプルとして、primary/standbyそれぞれ一台構成の場合のスクリプト + <a href="basebackup.sh">(basebackup.sh)</a>を示します。 + このスクリプトでは、recovery_user がパスワードなしでリカバリ対象の + standbyノードにログインできることを前提にしているので、 + あらかじめsshの設定を行なっておく必要があります。 </p> <pre> recovery_1st_stage_command = 'basebackup.sh' </pre> </li> - <li><a href="#RECOVERY_2ND_STAGE_COMMAND">recovery_2nd_stage_command</a> $B$O!"6u$N$^$^$G9=$$$^$;$s!#(B + <li><a href="#RECOVERY_2ND_STAGE_COMMAND">recovery_2nd_stage_command</a> は、空のままで構いません。 <pre> recovery_2nd_stage_command = '' </pre> </li> - <li>$B%*%s%i%$%s%j%+%P%j$r<B;\$9$k$?$a$N(B PostgreSQL $B$N(B C $B8@8l4X?t$d(BSQL$B4X?t$r3F(BDB$B%N!<%I$K%$%s%9%H!<%k$7$^$9!#(B + <li>オンラインリカバリを実施するための PostgreSQL の C 言語関数やSQL関数を各DBノードにインストールします。 <pre> # cd pgpool-II-x.x.x/sql/pgpool-recovery @@ -2221,259 +2222,259 @@ recovery_2nd_stage_command = '' </pre> </li> - <li>$B%*%s%i%$%s%j%+%P%j$,=*N;$7$?$"$H!"(Bpgpool-II$B$O!"Dd;_$7$F$$$?(BDB$B%N!<%I$N(BPostgreSQL$B$r5/F0$7$^$9!#(B - $B$=$N$?$a$N%9%/%j%W%H$r!"3F(BDB$B%N!<%I$N(BDB$B%/%i%9%?$K%$%s%9%H!<%k$7$^$9!#(B + <li>オンラインリカバリが終了したあと、pgpool-IIは、停止していたDBノードのPostgreSQLを起動します。 + そのためのスクリプトを、各DBノードのDBクラスタにインストールします。 <p> - <a href="pgpool_remote_start">$B%9%/%j%W%H$N%5%s%W%k(B</a>$B$,%=!<%9%3!<%I$N(B"sample"$B%G%#%l%/%H%j$K4^$^$l$F$$$k$N$G!"(B - $B$=$l$rMxMQ$7$F$/$@$5$$!#(B - $B$3$N%5%s%W%k$NCf$G$O!"(BPostgreSQL$B$N5/F0$r(Bpg_ctl$B%3%^%s%I$G9T$C$F$*$j!"(Bpg_ctl$B%3%^%s%I$X$N%Q%9$,5-=R$5$l$F$$$^$9!#(B - $B%G%U%)%k%H$G$O(B/usr/local/pgsql/bin/pg_ctl$B$H$J$C$F$$$k$N$G!"$*;H$$$N4D6-$K9g$o$;$F=$@5$7$F$/$@$5$$!#(B + <a href="pgpool_remote_start">スクリプトのサンプル</a>がソースコードの"sample"ディレクトリに含まれているので、 + それを利用してください。 + このサンプルの中では、PostgreSQLの起動をpg_ctlコマンドで行っており、pg_ctlコマンドへのパスが記述されています。 + デフォルトでは/usr/local/pgsql/bin/pg_ctlとなっているので、お使いの環境に合わせて修正してください。 </p> <p> - $B$J$*!"$3$N%9%/%j%W%H$O(Bssh$B$r;HMQ$7$^$9$N$G!">/$/$H$b!"(Bprimary$B$N(BDB$B%N!<%I$+$i!"(Bstandby$B$N(BDB$B%N!<%I$KBP$7$F!"(B - recovery_user$B$G%Q%9%o!<%I$J$7$G(Bssh$B$,MxMQ$G$-$k$3$H$,I,MW$G$9!#(B - $BI,MW$J$i$P$"$i$+$8$a@_Dj$7$F$*$$$F$/$@$5$$!#(B + なお、このスクリプトはsshを使用しますので、少くとも、primaryのDBノードから、standbyのDBノードに対して、 + recovery_userでパスワードなしでsshが利用できることが必要です。 + 必要ならばあらかじめ設定しておいてください。 </p> </li> </ol> <p> -$B0J>e$G%*%s%i%$%s%j%+%P%j$N@_Dj$,=*N;$7$^$7$?!#(B -standby$B%N!<%I$rDd;_$7$?>uBV$G!"(B<a href="#pcp_recovery_node">pcp_recovery_node</a> $B$rMxMQ$9$k$+!"(B -pgpoolAdmin$B$N!V%j%+%P%j!W%\%?%s$G%*%s%i%$%s%j%+%P%j$,=PMh$k$h$&$K$J$C$?$O$:$G$9!#(B -$B$&$^$/$$$+$J$$>l9g$O!"(Bpgpool-II$B$N%m%0!"(Bprimary$B%5!<%P!"(Bstandby$B%5!<%P$N%m%0$r3NG'$7$F$/$@$5$$!#(B +以上でオンラインリカバリの設定が終了しました。 +standbyノードを停止した状態で、<a href="#pcp_recovery_node">pcp_recovery_node</a> を利用するか、 +pgpoolAdminの「リカバリ」ボタンでオンラインリカバリが出来るようになったはずです。 +うまくいかない場合は、pgpool-IIのログ、primaryサーバ、standbyサーバのログを確認してください。 </p> <p> -$B;29M$^$G$K!"%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s$G$N%*%s%i%$%s%j%+%P%j$NFbIt=hM}$NN.$l$r@bL@$7$^$9!#(B +参考までに、ストリーミングレプリケーションでのオンラインリカバリの内部処理の流れを説明します。 </p> <ol id="setting_for_online_recovery_in_stream_mode"> - <li>pgpool-II$B$O!"(Bprimary$B%5!<%P$K%f!<%6(B: <a href="#RECOVERY_USER">recovery_user</a>, - $B%Q%9%o!<%I(B: <a href="#RECOVERY_PASSWORD">recovery_password</a> $B$G(B - template1$B%G!<%?%Y!<%9$K@\B3$7$^$9!#(B + <li>pgpool-IIは、primaryサーバにユーザ: <a href="#RECOVERY_USER">recovery_user</a>, + パスワード: <a href="#RECOVERY_PASSWORD">recovery_password</a> で + template1データベースに接続します。 </li> - <li>primary$B%5!<%P$G!"(Bpgpool_recovery$B4X?t$r<B9T$7$^$9!#(B + <li>primaryサーバで、pgpool_recovery関数を実行します。 </li> - <li>pgpool_recovery$B4X?t$O!"(B<a href="#RECOVERY_1ST_STAGE_COMMAND">recovery_1st_stage_command</a> $B$G(B - $B;XDj$5$l$?%9%/%j%W%H$r<B9T$7$^$9!#(B + <li>pgpool_recovery関数は、<a href="#RECOVERY_1ST_STAGE_COMMAND">recovery_1st_stage_command</a> で + 指定されたスクリプトを実行します。 <p> - $B$J$*!"(BPostgreSQL$B$O!"%G!<%?%Y!<%9%/%i%9%?%G%#%l%/%H%jCf$G4X?t$r<B9T$7$^$9!#(B - $B$h$C$F!"(Bpgpool_recovery$B4X?t$b(Bprimary$B%5!<%P$N%G!<%?%Y!<%9%/%i%9%?%G%#%l%/%H%jCf$G(B - $B4X?t$r<B9T$5$l$k$3$H$KCm0U$7$F$/$@$5$$!#(B + なお、PostgreSQLは、データベースクラスタディレクトリ中で関数を実行します。 + よって、pgpool_recovery関数もprimaryサーバのデータベースクラスタディレクトリ中で + 関数を実行されることに注意してください。 </p> </li> - <li>primary$B%5!<%P$G!"(Bpgpool_remote_start$B4X?t$r<B9T$7$^$9!#(B + <li>primaryサーバで、pgpool_remote_start関数を実行します。 <p> - $B$3$N4X?t$O!"(Bprimary$B%5!<%P$N%G!<%?%Y!<%9%/%i%9%?%G%#%l%/%H%jCf$K$"$k(B - pgpool_remote_start$B$H$$$&L>A0$N%9%/%j%W%H$r5/F0$7!"(B - $B$3$3$+$i(Bssh$B7PM3$G%j%+%P%jBP>]$N(Bstandby$B%5!<%P$N(BPostgreSQL$B$r(Bpg_ctl$B%3%^%s%I$r;H$C$F5/F0$7$^$9!#(B - $B5/F0$O%P%C%/%0%i%&%s%I$G9T$o$l!"5/F0$G$-$?$+$I$&$+$O<!$N%9%F%C%W$G3NG'$5$l$^$9!#(B + この関数は、primaryサーバのデータベースクラスタディレクトリ中にある + pgpool_remote_startという名前のスクリプトを起動し、 + ここからssh経由でリカバリ対象のstandbyサーバのPostgreSQLをpg_ctlコマンドを使って起動します。 + 起動はバックグラウンドで行われ、起動できたかどうかは次のステップで確認されます。 </p> </li> - <li>pgpool-II$B$+$i!"(Bstandby$B%5!<%P$N(BPostgreSQL$B$N(Bpostgres$B%G!<%?%Y!<%9(B - (postgres$B%G!<%?%Y!<%9$,$J$$>l9g$O(Btemplate1$B%G!<%?%Y!<%9(B)$B$K!"(B - $B%f!<%6(B: <a href="#RECOVERY_USER">recovery_user</a>, - $B%Q%9%o!<%I(B: <a href="#RECOVERY_PASSWORD">recovery_password</a> $B$G(Btemplate1$B%G!<%?%Y!<%9$K@\B3$r;n$_$^$9!#(B + <li>pgpool-IIから、standbyサーバのPostgreSQLのpostgresデータベース + (postgresデータベースがない場合はtemplate1データベース)に、 + ユーザ: <a href="#RECOVERY_USER">recovery_user</a>, + パスワード: <a href="#RECOVERY_PASSWORD">recovery_password</a> でtemplate1データベースに接続を試みます。 <p> - $B%j%H%i%$$O!"(B<a href="#RECOVERY_TIMEOUT">recovery_timeout</a>$BIC4V9T$o$l$^$9!#(B - PostgreSQL$B$N5/F0$K@.8y$7$?$i!"<!$N%9%F%C%W$K0\$j$^$9!#(B + リトライは、<a href="#RECOVERY_TIMEOUT">recovery_timeout</a>秒間行われます。 + PostgreSQLの起動に成功したら、次のステップに移ります。 </p> </li> - <li><a href="#FAILBACK_COMMAND">failback_command</a>$B$,6u$G$J$$>l9g$O!"(B - pgpool-II$B$N?F%W%m%;%9$O;XDj$5$l$?%9%/%j%W%H$r5/F0$7$^$9!#(B + <li><a href="#FAILBACK_COMMAND">failback_command</a>が空でない場合は、 + pgpool-IIの親プロセスは指定されたスクリプトを起動します。 </li> - <li><a href="#FAILBACK_COMMAND">failback_command</a>$B$,=*N;$7$?$i!"(Bpgpool-II$B$N;R%W%m%;%9$r$9$Y$F:F5/F0$7$^$9!#(B + <li><a href="#FAILBACK_COMMAND">failback_command</a>が終了したら、pgpool-IIの子プロセスをすべて再起動します。 </li> </ol> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="parallel"></a>$B%Q%i%l%k%b!<%I(B</h1> +<h1><a name="parallel"></a>パラレルモード</h1> <p> -$B%Q%i%l%k%/%(%j5!G=$,MxMQ$G$-$k%b!<%I$G$9!#(B -$B%F!<%V%k$rJ,3d$5$;!"3F%N!<%I$K%G!<%?$r;}$?$;$k$3$H$,$G$-$^$9!#$^$?%l%W%j%1!<%7%g%s$dIi2YJ,;65!G=$bF1;~$K;H$&$3$H$,$G$-$^$9!#(B +パラレルクエリ機能が利用できるモードです。 +テーブルを分割させ、各ノードにデータを持たせることができます。またレプリケーションや負荷分散機能も同時に使うことができます。 </p> <p> -$B%Q%i%l%k%b!<%I$G$O!"(Bpgpool.conf$B$N(B<a href="#REPLICATION_MODE">replication_mode</a>$B$^$?$O(B -<a href="#LOAD_BALANCE_MODE">loadbalance_mode</a>$B$K(Btrue$B$r@_Dj$7!"(B -<a href="#MASTER_SLAVE_MODE">master_slave</a> $B$r(Bfalse$B$K$7!"(B -<a href="#PARALLEL_MODE">parallel_mode</a> $B$r(Btrue$B$K$7$^$9!#(B -$B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B +パラレルモードでは、pgpool.confの<a href="#REPLICATION_MODE">replication_mode</a>または +<a href="#LOAD_BALANCE_MODE">loadbalance_mode</a>にtrueを設定し、 +<a href="#MASTER_SLAVE_MODE">master_slave</a> をfalseにし、 +<a href="#PARALLEL_MODE">parallel_mode</a> をtrueにします。 +このパラメータを変更した時には pgpool-II を再起動してください。 </p> -<h2 id="system_db">$B%7%9%F%`(BDB$B$N@_Dj(B</h2> +<h2 id="system_db">システムDBの設定</h2> <p> -$B%Q%i%l%k%b!<%I$rMxMQ$9$k$?$a$K$O!"%7%9%F%`(BDB$B$r@_Dj$9$kI,MW$,$"$j$^$9!#(B -$B%7%9%F%`(BDB$B$O%G!<%?$r3F(BPostgreSQL$B%5!<%P$GJ,3d$9$k$?$a$N%k!<%k$r(BPostgreSQL$B$N%F!<%V%k$N7A$GJ];}$7$^$9!#(B -$B%7%9%F%`(BDB$B$O(Bpgpool$B$,F0:n$9$k%[%9%H$HF1$8%[%9%H$KCV$/I,MW$O$"$j$^$;$s!#(B -$B%7%9%F%`(BDB$B$N@_Dj$O(Bpgpool.conf$B$G9T$$$^$9!#(B +パラレルモードを利用するためには、システムDBを設定する必要があります。 +システムDBはデータを各PostgreSQLサーバで分割するためのルールをPostgreSQLのテーブルの形で保持します。 +システムDBはpgpoolが動作するホストと同じホストに置く必要はありません。 +システムDBの設定はpgpool.confで行います。 </p> <dl> <dt><a name="SYSTEM_DB_HOSTNAME"></a>system_db_hostname</dt> <dd> <p> - $B%7%9%F%`(BDB$B$,F0$$$F$$$k%[%9%HL>$G$9!#6uJ8;z$r;XDj$9$k$H!"(BUNIX$B%I%a%$%s%=%1%C%H$G@\B3$7$^$9!#(B + システムDBが動いているホスト名です。空文字を指定すると、UNIXドメインソケットで接続します。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="SYSTEM_DB_PORT"></a>system_db_port</dt> <dd> <p> - $B%7%9%F%`(BDB$B$N%]!<%HHV9f$G$9!#(B + システムDBのポート番号です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II$B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-IIを再起動してください。 </p> </dd> <dt><a name="SYSTEM_DBNAME"></a>system_dbname</dt> <dd> <p> - $B%7%9%F%`(BDB$B$O@lMQ$N%G!<%?%Y!<%9$K@_CV$7$^$9!#$=$N%G!<%?%Y!<%9L>$r;XDj$7$^$9!#(B - $B$3$N%G!<%?%Y!<%9$O$"$i$+$8$aB8:_$7$J$1$l$P$J$j$^$;$s!#$3$3$G$O!"(B - "pgpool"$B$H$$$&%G!<%?%Y!<%9L>$K$9$k$b$N$H$7$^$9!#(B + システムDBは専用のデータベースに設置します。そのデータベース名を指定します。 + このデータベースはあらかじめ存在しなければなりません。ここでは、 + "pgpool"というデータベース名にするものとします。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="SYSTEM_DB_SCHEMA"></a>system_db_schema</dt> <dd> <p> - $B%7%9%F%`(BDB$B$O@lMQ$N%9%-!<%^$K@_CV$7$^$9!#$=$N%9%-!<%^L>$r;XDj$7$^$9!#(B - $B$3$N%9%-!<%^$O$"$i$+$8$aB8:_$7$J$1$l$P$J$j$^$;$s!#$3$3$G$O!"(B - "pgpool_catalog"$B$H$$$&%9%-!<%^$K$9$k$b$N$H$7$^$9!#(B + システムDBは専用のスキーマに設置します。そのスキーマ名を指定します。 + このスキーマはあらかじめ存在しなければなりません。ここでは、 + "pgpool_catalog"というスキーマにするものとします。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="SYSTEM_DB_USER"></a>system_db_user</dt> <dd> <p> - $B%7%9%F%`(BDB$B$K@\B3$9$k$H$-$N%f!<%6L>$G$9!#(B + システムDBに接続するときのユーザ名です。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> <dt><a name="SYSTEM_DB_PASSWORD"></a>system_db_password</dt> <dd> <p> - $B%7%9%F%`(BDB$B$K@\B3$9$k$H$-$N%Q%9%o!<%I$G$9!#%Q%9%o!<%I$r@_Dj$7$F$$$J$$>l9g$O6uJ8;z$K$7$F$*$-$^$9!#(B + システムDBに接続するときのパスワードです。パスワードを設定していない場合は空文字にしておきます。 </p> <p> - $B$3$N%Q%i%a!<%?$rJQ99$7$?;~$K$O(B pgpool-II $B$r:F5/F0$7$F$/$@$5$$!#(B + このパラメータを変更した時には pgpool-II を再起動してください。 </p> </dd> </dl> -<h2 id="system_db_sql">$B%7%9%F%`(BDB$B$N=i4|@_Dj(B</h2> +<h2 id="system_db_sql">システムDBの初期設定</h2> <p> -$B%7%9%F%`(BDB$B$K%9%-!<%^$H%F!<%V%k$r:n@.$7$^$9!#=i4|@_DjMQ$N%9%/%j%W%H$,(B -$prefix/share/system_db.sql$B$K$"$k$N$G$=$l$rMxMQ$7$^$9!#(B -$B$?$@$7!"$3$N%9%/%j%W%H$G$O%9%-!<%^L>$,(B"pgpool_catalog"$B$H$J$C$F$$$k$N$G!"(B -$B0c$&%9%-!<%^$r;H$&>l9g$OE,Ev$K=q$-49$($F$/$@$5$$!#(B -$B$^$?!"%G!<%?%Y!<%9L>$H$7$F(B"pgpool"$B0J30$r;H$&>l9g$O0J2<$rE,Ev$KFI$_BX$($F$/$@$5$$!#(B +システムDBにスキーマとテーブルを作成します。初期設定用のスクリプトが +$prefix/share/system_db.sqlにあるのでそれを利用します。 +ただし、このスクリプトではスキーマ名が"pgpool_catalog"となっているので、 +違うスキーマを使う場合は適当に書き換えてください。 +また、データベース名として"pgpool"以外を使う場合は以下を適当に読み替えてください。 <pre> psql -f $prefix/share/system_db.sql pgpool </pre> -<h2 id="install_dblink">dblink$B$N%$%s%9%H!<%k(B</h2> +<h2 id="install_dblink">dblinkのインストール</h2> <p> -$B%Q%i%l%k%b!<%I$G$O(Bdblink$B$r;H$$$^$9!#(Bdblink$B$O(BPostgreSQL$B%=!<%9%U%!%$%k(B($POSTGRES_SRC) +パラレルモードではdblinkを使います。dblinkはPostgreSQLソースファイル($POSTGRES_SRC) </p> <pre> $(POSTGRES_SRC)/contrib/dblink </pre> <p> -$B$K$"$j$^$9!#(B$POSTGRES_SRC/contrib/dblink/README.dblink$B$r;29M$K%7%9%F%`(B -DB$B$K(Bdblink$B$r%$%s%9%H!<%k$7$F$/$@$5$$!#(B +にあります。$POSTGRES_SRC/contrib/dblink/README.dblinkを参考にシステム +DBにdblinkをインストールしてください。 </p> <p> -$B$^$?!"(Bpgpool$B%G!<%?%Y!<%9$K4X?t$NEPO?$,I,MW$G$9!#(B +また、pgpoolデータベースに関数の登録が必要です。 </p> <pre> psql pgpool &lt; $POSTGRES_SRC/contrib/dblink/dblink.sql </pre> -<h2 id="connection_setting">$B%3%M%/%7%g%s?t$N@_Dj(B</h2> +<h2 id="connection_setting">コネクション数の設定</h2> <p> -$B%Q%i%l%k%b!<%I$G$O!"%/%(%j$K$h$j%7%9%F%`(BDB$B$+$i(Bdblink$B7PM3$G(Bpgpool$B$K@\B3$9$k$N$G!"(B -$BA[Dj$5$l$kF1;~@\B3?t0J>e$N%3%M%/%7%g%s$,I,MW$K$J$k>l9g$,$"$j$^$9!#(B -$B$=$N$?$a!"(Bpgpool.conf$B$N(B<a href="#NUM_INIT_CHILDREN">num_init_children</a>$B$K$O(B -$BF1;~@\B3?t$h$j==J,Bg$-$$CM$r@_Dj$7$F2<$5$$!#(B +パラレルモードでは、クエリによりシステムDBからdblink経由でpgpoolに接続するので、 +想定される同時接続数以上のコネクションが必要になる場合があります。 +そのため、pgpool.confの<a href="#NUM_INIT_CHILDREN">num_init_children</a>には +同時接続数より十分大きい値を設定して下さい。 </p> <p> -$BL\0B$H$7$F0J2<$N<0$G(B<a href="#NUM_INIT_CHILDREN">num_init_children</a>$B$r@_Dj$7$F$/$@$5$$!#(B +目安として以下の式で<a href="#NUM_INIT_CHILDREN">num_init_children</a>を設定してください。 </p> <pre> -num_init_children = $BA[Dj$5$l$kF1;~@\B3?t(B * ( 1 + $B%/%(%j$NCf$G;H$o$l$F$$$k%F!<%V%k$N:GBg?t(B) +num_init_children = 想定される同時接続数 * ( 1 + クエリの中で使われているテーブルの最大数) </pre> -<h3 id="distdef">$B%G!<%?J,3d%k!<%k$NEPO?(B</h3> +<h3 id="distdef">データ分割ルールの登録</h3> <p> -$B%G!<%?J,3d$r9T$&%F!<%V%k$KBP$7$F$O!"%F!<%V%k>pJs$r$"$i$+$8$a(B pgpool_catalog.dist_def -$B$H$$$&%F!<%V%k$KEPO?$7$F$*$-$^$9!#(B +データ分割を行うテーブルに対しては、テーブル情報をあらかじめ pgpool_catalog.dist_def +というテーブルに登録しておきます。 </p> <pre> CREATE TABLE pgpool_catalog.dist_def( - dbname TEXT, -- DB$BL>(B - schema_name TEXT, --schema$BL>(B - table_name TEXT, -- $B%F!<%V%kL>(B - col_name TEXT NOT NULL CHECK (col_name = ANY (col_list)), -- $BJ,;6%-!<NsL>(B - col_list TEXT[] NOT NULL, -- table$B$NB0@-L>(B - type_list TEXT[] NOT NULL, -- $BB0@-$N%?%$%WL>(B - dist_def_func TEXT NOT NULL, -- $BJ,;6@h$N(BDB$B%N!<%I$r7hDj$9$k4X?tL>(B + dbname TEXT, -- DB名 + schema_name TEXT, --schema名 + table_name TEXT, -- テーブル名 + col_name TEXT NOT NULL CHECK (col_name = ANY (col_list)), -- 分散キー列名 + col_list TEXT[] NOT NULL, -- tableの属性名 + type_list TEXT[] NOT NULL, -- 属性のタイプ名 + dist_def_func TEXT NOT NULL, -- 分散先のDBノードを決定する関数名 PRIMARY KEY (dbname,schema_name,table_name) ); </pre> -<h3 id="replicate_def">$B%l%W%j%1!<%7%g%s%F!<%V%k$N%k!<%kEPO?(B</h3> +<h3 id="replicate_def">レプリケーションテーブルのルール登録</h3> <p> -$B0l$D$N(BSQL$BJ8$K(BJOIN$BEy$G%G!<%?J,3d%k!<%k$KEPO?$7$?%F!<%V%k$H6&$K(B -$B%l%W%j%1!<%7%g%s$r9T$&%F!<%V%k$r;XDj$9$k>l9g$K$O!"%l%W%j%1!<%7%g%s$r9T$&%F!<%V%k$N>pJs$r(B -$B$"$i$+$8$a!"(Bpgpool_catalog.replicate_def$B$H$$$&%F!<%V%k$KEPO?$7$F$*$-$^$9!#(B +一つのSQL文にJOIN等でデータ分割ルールに登録したテーブルと共に +レプリケーションを行うテーブルを指定する場合には、レプリケーションを行うテーブルの情報を +あらかじめ、pgpool_catalog.replicate_defというテーブルに登録しておきます。 </p> <pre> CREATE TABLE pgpool_catalog.replicate_def( - dbname TEXT, -- DB$BL>(B - schema_name TEXT, -- schema$BL>(B - table_name TEXT, -- $B%F!<%V%kL>(B - col_list TEXT[] NOT NULL, -- table$B$NB0@-L>(B - type_list TEXT[] NOT NULL, -- $BB0@-$N%?%$%WL>(B + dbname TEXT, -- DB名 + schema_name TEXT, -- schema名 + table_name TEXT, -- テーブル名 + col_list TEXT[] NOT NULL, -- tableの属性名 + type_list TEXT[] NOT NULL, -- 属性のタイプ名 PRIMARY KEY (dbname,schema_name,table_name) ); </pre> -<h2 id="example_partitioning">pgbench $B%F!<%V%k$G$NJ,3d%k!<%kNc(B</h2> +<h2 id="example_partitioning">pgbench テーブルでの分割ルール例</h2> <p> -pgbench$B$N%F!<%V%k$rJ,3d$9$k%k!<%k$NNc$r<($7$^$9!#(B +pgbenchのテーブルを分割するルールの例を示します。 </p> <p> -$B$3$NNc$G$O!"(Baccounts$B%F!<%V%k$KBP$7$F$OJ,3d$r9T$$!"(Bbranches$B%F!<%V%k(B -$B$H(Btellers$B%F!<%V%k$KBP$7$F$O%l%W%j%1!<%7%g%s$r9T$&$3$H$K$7$^$9!#(B -$B$^$?!"(Baccounts$B%F!<%V%k$H(Bbanches$B%F!<%V%k$O(Bbid$B$G7k9g$5$l$k$3$H$rA[Dj$7(B -branches$B%F!<%V%k$O%l%W%j%1!<%7%g%s%F!<%V%k$N%k!<%kEPO?$r9T$$$^$9!#(B +この例では、accountsテーブルに対しては分割を行い、branchesテーブル +とtellersテーブルに対してはレプリケーションを行うことにします。 +また、accountsテーブルとbanchesテーブルはbidで結合されることを想定し +branchesテーブルはレプリケーションテーブルのルール登録を行います。 </p> <p> -$B$b$7!"(Baccounts$B%F!<%V%k!"(Bbranches$B%F!<%V%k$H(Btellers$B%F!<%V%k$N#3$D$N(B -$B%F!<%V%k$N7k9g$,9T$o$l$k>l9g$K$O!"$"$i$+$8$a(Btellers$B%F!<%V%k$KBP$7$F$b(B -$B%l%W%j%1!<%7%g%s%F!<%V%k$N%k!<%kEPO?$r9T$&I,MW$,$"$j$^$9!#!!(B +もし、accountsテーブル、branchesテーブルとtellersテーブルの3つの +テーブルの結合が行われる場合には、あらかじめtellersテーブルに対しても +レプリケーションテーブルのルール登録を行う必要があります。  </p> <pre> @@ -2497,9 +2498,9 @@ INSERT INTO pgpool_catalog.replicate_def VALUES ( </pre> <p> -$B$3$3$G!"(Bpgpool_catalog.dist_def_accounts$B$O!"0z?t$H$7$FJ,3d%-!<$NCM$r<u$1<h$j!"(B -$B$I$N(BPostgreSQL$B%5!<%P(B($B!V(BDB$B%N!<%I!W$H8F$S$^$9(B)$B$r(B0$B$+$i$NHV9f$GJV$94X?t$G$9!#(B -$B$3$3$G$O!"(B3$BBf$N(BDB$B%N!<%I$K%G!<%?$rJ,3d$9$k4X?t$NNc$r<($7$^$9!#(B +ここで、pgpool_catalog.dist_def_accountsは、引数として分割キーの値を受け取り、 +どのPostgreSQLサーバ(「DBノード」と呼びます)を0からの番号で返す関数です。 +ここでは、3台のDBノードにデータを分割する関数の例を示します。 </p> <pre> CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_accounts (val ANYELEMENT) RETURNS INTEGER AS ' @@ -2509,118 +2510,118 @@ CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_accounts (val ANYELEMENT) RET END' LANGUAGE SQL; </pre> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="hba"></a>$B%/%i%$%"%s%HG'>Z(B(HBA)$B$N$?$a$N(B pool_hba.conf $B@_DjJ}K!(B</h1> +<h1><a name="hba"></a>クライアント認証(HBA)のための pool_hba.conf 設定方法</h1> <p> -PostgreSQL$B$N(Bpg_hba.conf$B$HF1$8$h$&$K(Bpgpool$B$G$b(Bpool_hba.conf$B%U%!%$%k$r;H$C$?(B -$B%/%i%$%"%s%HG'>Z$,%5%]!<%H$5$l$F$$$^$9!#(B +PostgreSQLのpg_hba.confと同じようにpgpoolでもpool_hba.confファイルを使った +クライアント認証がサポートされています。 </p> <p> -pgpool$B$r%$%s%9%H!<%k$9$k$H%G%U%)%k%H%$%s%9%H!<%k@h$N@_Dj%U%!%$%k%G%#%l%/%H%j(B -"/usr/local/etc"$B$K(Bpool_hba.conf.sample$B$,0l=o$K%$%s%9%H!<%k$5$l$^$9!#(B -$B$3$N(Bpool_hba.conf.sample$B%U%!%$%k$r(Bpool_hba.conf$B$H$7$F%3%T!<$7!"(B -$BI,MW$G$"$l$PJT=8$7$F$/$@$5$$!#(B -$B%G%U%)%k%H$G$O(Bpool_hba$B$K$h$kG'>Z$OM-8z$K$J$C$F$$$^$9!#(B +pgpoolをインストールするとデフォルトインストール先の設定ファイルディレクトリ +"/usr/local/etc"にpool_hba.conf.sampleが一緒にインストールされます。 +このpool_hba.conf.sampleファイルをpool_hba.confとしてコピーし、 +必要であれば編集してください。 +デフォルトではpool_hbaによる認証は有効になっています。 </p> <p> -pool_hba.conf$B$N%U%)!<%^%C%H$O(Bpg_hba.conf$B$N$b$N$H$[$H$s$IF1$8$G$9!#(B +pool_hba.confのフォーマットはpg_hba.confのものとほとんど同じです。 </p> <pre> local DATABASE USER METHOD [OPTION] host DATABASE USER CIDR-ADDRESS METHOD [OPTION] </pre> <p> -$B3F%U%#!<%k%I$G@_Dj$G$-$kCM$N>\:Y$O(B"pool_hba.conf.sample"$B$r;2>H$7$F$/$@$5$$!#(B +各フィールドで設定できる値の詳細は"pool_hba.conf.sample"を参照してください。 </p> <p> -$B0J2<$O(Bpool_hba$B$N@)8B;v9`$G$9!#(B +以下はpool_hbaの制限事項です。 </p> <ul> - <li>"hostssl"$B@\B3%?%$%W$O%5%]!<%H$5$l$^$;$s(B</li> + <li>"hostssl"接続タイプはサポートされません</li> <p> - pool_hba.conf$B$K(B"hostssl"$B$O;XDj$9$k$3$H$O$G$-$^$;$s$,!"(Bpgpool-II$B$O(B2.3$B0J9_$G(BSSL$B$r%5%]!<%H$7$F$$$^$9!#(B - $B>\:Y$O(B<a href="#ssl">SSL</a>$B$r;2>H$7$F$/$@$5$$!#(B + pool_hba.confに"hostssl"は指定することはできませんが、pgpool-IIは2.3以降でSSLをサポートしています。 + 詳細は<a href="#ssl">SSL</a>を参照してください。 </p> - <li>DATABASE$B%U%#!<%k%ICM$H$7$F(B"samegroup"$B$O%5%]!<%H$5$l$^$;$s(B</li> + <li>DATABASEフィールド値として"samegroup"はサポートされません</li> <p> - pgpool$B$O%P%C%/%(%s%I%5!<%P$K$"$k%f!<%6>pJs$r;vA0$KCN$k;v$,$G$-$J$$$?$a!"(B - $B%G!<%?%Y!<%9L>$O(Bpool_hba.conf$B$K$"$kCM$N$_$HHf3S$5$l$^$9!#(B - $B$J$N$G%0%k!<%W$K4X$9$kG'>Z$O(Bpool_hba$B$G9T$&$3$H$,$G$-$^$;$s!#(B + pgpoolはバックエンドサーバにあるユーザ情報を事前に知る事ができないため、 + データベース名はpool_hba.confにある値のみと比較されます。 + なのでグループに関する認証はpool_hbaで行うことができません。 </p> </li> -<li>USER$B%U%#!<%k%ICM$H$7$F(B"+"$B$r;H$C$?%0%k!<%W;XDj$O%5%]!<%H$5$l$^$;$s(B</li> +<li>USERフィールド値として"+"を使ったグループ指定はサポートされません</li> <p> - $B>e5-$N(B"samegroup"$B$HF1$8M}M3$G!"%f!<%6L>$O(Bpool_hba.conf$B$K$"$kCM$N$_$HHf3S$5$l$^$9!#(B - $B%0%k!<%W$K4X$9$kG'>Z$O(Bpool_hba$B$G9T$&$3$H$O$G$-$^$;$s!#(B + 上記の"samegroup"と同じ理由で、ユーザ名はpool_hba.confにある値のみと比較されます。 + グループに関する認証はpool_hbaで行うことはできません。 </p> </li> -<li>IPv6$B%"%I%l%9(B/$B%^%9%/I=5-K!$O%5%]!<%H$5$l$^$;$s(B</li> +<li>IPv6アドレス/マスク表記法はサポートされません</li> <p> - $B8=:_(Bpgpool$B$O(BIPv6$B$r%5%]!<%H$7$F$$$^$;$s!#(B + 現在pgpoolはIPv6をサポートしていません。 </p> </li> -<li>"trust", "reject", "pam", "md5"$B0J30$N%a%=%C%I$O%5%]!<%H$5$l$^$;$s(B</li> +<li>"trust", "reject", "pam", "md5"以外のメソッドはサポートされません</li> <p> - $B$3$l$b>e5-$N(B"samegroup"$B$HF1$8M}M3$K$h$k$b$N$G$9!#(B - pgpool$B$O%P%C%/%(%s%I$N%f!<%6(B/$B%Q%9%o!<%I>pJs$r;}$C$F$$$J$$$N$G!"(B - $B%P%C%/%(%s%I$KJ]B8$5$l$F$$$k%Q%9%o!<%I$r;H$C$?G'>Z$r9T$&$3$H$,$G$-$^$;$s!#(B + これも上記の"samegroup"と同じ理由によるものです。 + pgpoolはバックエンドのユーザ/パスワード情報を持っていないので、 + バックエンドに保存されているパスワードを使った認証を行うことができません。 </p> <p> - md5$B$K4X$7$F$O!"(Bpool_passwd$B$H$$$&%Q%9%o!<%I%U%!%$%k$rJ;MQ$9$k$3$H$K$h$C$FMxMQ$G$-$^$9!#(B - $B>\:Y$O(B<a href="#md5">$BG'>Z!&%"%/%;%9@)8fJ}<0(B</a>$B$r;2>H$7$F$/$@$5$$!#(B + md5に関しては、pool_passwdというパスワードファイルを併用することによって利用できます。 + 詳細は<a href="#md5">認証・アクセス制御方式</a>を参照してください。 </p> </li> </ul> <p> -$B$3$3$G@bL@$5$l$?5!G=!"@)8B$O%/%i%$%"%s%H$H(Bpgpool$B4V$G9T$o$l$k%/%i%$%"%s%HG'>Z$K$D$$$F$@$H$$$&$3$H$K(B -$BCm0U$7$F$/$@$5$$!#(B -$B%/%i%$%s%"%s%H$O(Bpgpool$B$N%/%i%$%"%s%HG'>Z$K@.8y$7$?$H$7$F$b!"(B -PostgreSQL$B$K$h$k%/%i%$%"%s%HG'>Z$K@.8y$7$J$$$H@\B3>uBV$H$J$j$^$;$s!#(B -pool_hba$B$K$H$C$F$O%/%i%$%"%s%H$K;XDj$5$l$?%f!<%6L>$d%G!<%?%Y!<%9L>(B($BNc(B. psql -U testuser testdb)$B$,(B -$B<B:]$K%P%C%/%(%s%I>e$KB8:_$9$k$+$I$&$+$OLdBj$G$O$"$j$^$;$s!#(B -$B$=$l$,(Bpool_hba.conf$B$NCM$H%^%C%A$9$k$+$I$&$+$G%A%'%C%/$,9T$o$l$^$9!#(B +ここで説明された機能、制限はクライアントとpgpool間で行われるクライアント認証についてだということに +注意してください。 +クラインアントはpgpoolのクライアント認証に成功したとしても、 +PostgreSQLによるクライアント認証に成功しないと接続状態となりません。 +pool_hbaにとってはクライアントに指定されたユーザ名やデータベース名(例. psql -U testuser testdb)が +実際にバックエンド上に存在するかどうかは問題ではありません。 +それがpool_hba.confの値とマッチするかどうかでチェックが行われます。 </p> <p> -pgpool$B$,2TF/$9$k%[%9%H>e$N%f!<%6>pJs$r;H$C$?(BPAM$BG'>Z$rMxMQ$9$k$3$H$,$G$-$^$9!#(B -pgpool$B$r(BPAM$B%5%]!<%HIU$-$G%S%k%I$9$k$K$O(Bconfigure$B%*%W%7%g%s$K(B"--with-pam"$B$r;XDj$7$F$/$@$5$$!#(B +pgpoolが稼働するホスト上のユーザ情報を使ったPAM認証を利用することができます。 +pgpoolをPAMサポート付きでビルドするにはconfigureオプションに"--with-pam"を指定してください。 </p> <pre> ./configure --with-pam </pre> <p> -$B<B:]$K(BPAM$BG'>Z$rM-8z$K$9$k$K$O!"(Bpool_hba.conf$B$G(B"pam"$B%a%=%C%I$r@_Dj$9$k$N$K2C$(!"(B -pgpool$B$N%5!<%S%9@_Dj%U%!%$%k$r%7%9%F%`$N(BPAM$B@_Dj%G%#%l%/%H%j!JDL>o$O(B /etc/pam.d $B$K:n@.$9$kI,MW$,$"$j$^$9!#(B -$B%5!<%S%9@_Dj%U%!%$%k$NNc$O%$%s%9%H!<%k%G%#%l%/%H%j$N(B"share/pgpool.pam"$B$r;29M$K$7$F$/(B -$B$@$5$$!#(B +実際にPAM認証を有効にするには、pool_hba.confで"pam"メソッドを設定するのに加え、 +pgpoolのサービス設定ファイルをシステムのPAM設定ディレクトリ(通常は /etc/pam.d に作成する必要があります。 +サービス設定ファイルの例はインストールディレクトリの"share/pgpool.pam"を参考にしてく +ださい。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="query_cache"></a>$B%/%(%j%-%c%C%7%e$N@_DjJ}K!(B <span class="version">$B!A(B V3.1 (DEPRECATED)</span></h1> +<h1><a name="query_cache"></a>クエリキャッシュの設定方法 <span class="version">〜 V3.1 (DEPRECATED)</span></h1> <p> -pgpool-II$B$G$O!"$9$Y$F$N%b!<%I$G%/%(%j%-%c%C%7%e$rMxMQ$9$k$3$H$,$G$-$^$9!#(B -$B%/%(%j%-%c%C%7%e$O!"(BSELECT$B$N7k2L$r:FMxMQ$9$k$3$H$K$h$j!"@-G=$r8~>e$5$;$^$9!#(B -$BMxMQ$9$k>l9g$K$O!"(Bpgpool.conf$B$N@_Dj$r0J2<$N$h$&$K@_Dj$7$^$9!#(B +pgpool-IIでは、すべてのモードでクエリキャッシュを利用することができます。 +クエリキャッシュは、SELECTの結果を再利用することにより、性能を向上させます。 +利用する場合には、pgpool.confの設定を以下のように設定します。 </p> <pre> enable_query_cache = true </pre> <p> -$B$^$?!"%7%9%F%`(BDB$B$K0J2<$N%F!<%V%k$r:n@.$7$F$/$@$5$$!#(B +また、システムDBに以下のテーブルを作成してください。 </p> <pre> CREATE TABLE pgpool_catalog.query_cache ( @@ -2634,197 +2635,197 @@ CREATE TABLE pgpool_catalog.query_cache ( </pre> <p> -$B$?$@$7!"$3$NNc$G$O%9%-!<%^L>$,(B"pgpool_catalog"$B$H$J$C$F$$$k$N$G!"(B -$B0c$&%9%-!<%^$r;H$&>l9g$OE,Ev$K=q$-49$($F$/$@$5$$!#(B +ただし、この例ではスキーマ名が"pgpool_catalog"となっているので、 +違うスキーマを使う場合は適当に書き換えてください。 </p> <p> -<strong>$BCm0U(B: $B8=:_$N%/%(%j%-%c%C%7%e$N<BAu$G$O!"%-%c%C%7%e$,%G!<%?%Y!<%9>e$K:n@.$5$l$^$9!#(B -$B$=$N$?$a!"<B9T$K$"$^$j;~4V$N$+$+$i$J$$$h$&$J(BSELECT$B$G$O!"%/%(%j%-%c%C%7%e$rM-8z$K$9$k$3$H$K$h$C$F!"(B -$B$+$($C$FCY$/$J$k$3$H$,$"$j$^$9!#$^$?!"%/%(%j%-%c%C%7%e$NFbMF$O!"%F!<%V%k$,99?7$5$l$F$b$=$N$^$^$G$9!#(B -$B<jF0$G>e5-%F!<%V%k$+$i:o=|$9$k$+!"(B-c $B%*%W%7%g%s(B($B%/%(%j%-%c%C%7%e$N%/%j%"(B)$B$rDI2C$7$F(B -pgpool-II$B$r:F5/F0$9$kI,MW$,$"$j$^$9!#(B</strong> +<strong>注意: 現在のクエリキャッシュの実装では、キャッシュがデータベース上に作成されます。 +そのため、実行にあまり時間のかからないようなSELECTでは、クエリキャッシュを有効にすることによって、 +かえって遅くなることがあります。また、クエリキャッシュの内容は、テーブルが更新されてもそのままです。 +手動で上記テーブルから削除するか、-c オプション(クエリキャッシュのクリア)を追加して +pgpool-IIを再起動する必要があります。</strong> </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="memqcache"></a>$B%*%s%a%b%j%/%(%j%-%c%C%7%e$N@_DjJ}K!(B <span class="version">V3.2 $B!A(B</span></h1> +<h1><a name="memqcache"></a>オンメモリクエリキャッシュの設定方法 <span class="version">V3.2 〜</span></h1> <p> -pgpool-II$B$G$O!"$9$Y$F$N%b!<%I$G%*%s%a%b%j%/%(%j%-%c%C%7%e$rMxMQ$9$k$3$H$,$G$-$^$9!#(B -$B>e5-$N%/%(%j%-%c%C%7%e$H0c$$!"%a%b%j>e$K%-%c%C%7%e$,CV$+$l$k$N$G9bB.$G$"$k$P$+$j$G$J$/!"(B -$B%G!<%?$,99?7$5$l$k$H<+F0E*$K%-%c%C%7%e$,L58z$K$J$j!"(Bpgpool-II$B$N:F5/F0$NI,MW$,$"$j$^$;$s!#(B +pgpool-IIでは、すべてのモードでオンメモリクエリキャッシュを利用することができます。 +上記のクエリキャッシュと違い、メモリ上にキャッシュが置かれるので高速であるばかりでなく、 +データが更新されると自動的にキャッシュが無効になり、pgpool-IIの再起動の必要がありません。 </p> <p> -$B%*%s%a%b%j%/%(%j%-%c%C%7%e$O!"Ld$$9g$o$;$N(BSELECT$BJ8(B($B3HD%Ld$$9g$o$;$N>l9g$O99$K%P%$%s%I%Q%i%a!<%?(B)$B$H(B -$B8!:w7k2L$r%Z%"$G5-O?$7!"(B2$B2sL\0J9_$KF1$8(BSELECT$BJ8$,H/9T$5$l$?>l9g$K!"%-%c%C%7%e$+$i7k2L$rJV$7$^$9!#(B -$BDL>o$N(BSELECT$BJ8=hM}$H0c$C$F!"(BPostgreSQL$B$K%"%/%;%9$7$J$$$@$1$G$J$/!"(B -pgpool$BFbIt$N(BSQL$B%Q!<%9=hM}$J$I$r7PM3$7$J$$$?$a!"Hs>o$K9bB.$G$9!#(B +オンメモリクエリキャッシュは、問い合わせのSELECT文(拡張問い合わせの場合は更にバインドパラメータ)と +検索結果をペアで記録し、2回目以降に同じSELECT文が発行された場合に、キャッシュから結果を返します。 +通常のSELECT文処理と違って、PostgreSQLにアクセスしないだけでなく、 +pgpool内部のSQLパース処理などを経由しないため、非常に高速です。 </p> <p> -$BH?LL!"%-%c%C%7%e$K%R%C%H$7$J$$>l9g$ODL>o$N(BSELECT$BJ8$N=hM}$K2C$($F%-%c%C%7%e=hM}$N%*!<%P%X%C%I$,@8$8$k$N$G!"(B -$B$+$($C$FCY$/$J$j$^$9!#(B -$B$^$?!"$"$k%F!<%V%k$,99?7$5$l$?>l9g!"$=$N%F!<%V%k$r;2>H$7$F$$$k(B -$B$9$Y$F$N%-%c%C%7%e$,<+F0:o=|$5$l$k$?$a(B($B<+F0:o=|$7$J$$@_Dj$b2DG=(B)$B!"(B -$B99?7=hM}$,B?$$%7%9%F%`$G$O%*%s%a%b%j%/%(%j%-%c%C%7%e$rM-8z$K$7$F$$$k$3$H$G$+$($C$FCY$/$J$j$^$9!#(B -$B%-%c%C%7%e$N%R%C%HN($,(B70%$B0J2<$N>l9g$O!"%*%s%a%b%j%/%(%j%-%c%C%7%e$N@_Dj$rM-8z$K$7$J$$$[$&$,NI$$$G$7$g$&!#(B +反面、キャッシュにヒットしない場合は通常のSELECT文の処理に加えてキャッシュ処理のオーバヘッドが生じるので、 +かえって遅くなります。 +また、あるテーブルが更新された場合、そのテーブルを参照している +すべてのキャッシュが自動削除されるため(自動削除しない設定も可能)、 +更新処理が多いシステムではオンメモリクエリキャッシュを有効にしていることでかえって遅くなります。 +キャッシュのヒット率が70%以下の場合は、オンメモリクエリキャッシュの設定を有効にしないほうが良いでしょう。 </p> -<h2 id="MEMORY_CACHE_RESTRICTIONS">$B%*%s%a%b%j%/%(%j%-%c%C%7%e$N@)8B;v9`(B</h2> +<h2 id="MEMORY_CACHE_RESTRICTIONS">オンメモリクエリキャッシュの制限事項</h2> <ul> - <li>$B%*%s%a%b%j%/%(%j%-%c%C%7%e$G$O!"%F!<%V%k$KJQ99$,$"$k$H!"4XO"$9$k%-%c%C%7%e$r<+F0E*$K:o=|$7$F8E$$%G!<%?$,JV5Q$5$l$J$$$h$&$K$9$k5!G=$,$"$j$^$9!#(B - $B$3$N$?$a!"(Bpgpool$B$O>o$K(BUPDATE$B$d(BINSERT$B$d(BALTER TABLE$B$J$I$N%3%^%s%I$,H/9T$5$l$?$+$I$&$+$r%b%K%?$7$F$$$^$9!#(B - $B$7$+$7!"%H%j%,!"30It%-!<$d(BDROP TABLE CASCADE$B$J$I$NF/$-$K$h$C$F0EL[E*$K%F!<%V%k$,99?7$5$l$?$3$H$O(Bpgpool-II$B$+$i$O$o$+$i$J$$$?$a!"$3$N5!G=$,F/$-$^$;$s!#(B - $B$3$NLdBj$r2sHr$9$k$?$a$K$O!"(B<a href="#MEMQCACHE_EXPIRE">memqcache_expire</a>$B$r;H$C$F0lDj;~4V7P2a$7$?%-%c%C%7%e$r:o=|$9$k$h$&$K$9$k$+!"(B<a href="#BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list</a>$B$r;H$C$F!"3:Ev%F!<%V%k$,%-%c%C%7%e$5$l$J$$$h$&$K$7$F$/$@$5$$!#(B</li> - <li>$BJ#?t$N(Bpgpool-II$B$rF0$+$94D6-$G6&M-%a%b%j$r;H$C$?%*%s%a%b%j%/%(%j%-%c%C%7%e$r;HMQ$9$k$H!"$"$k(Bpgpool-II$B7PM3$G%F!<%V%k$,99?7$5$l$?;~$K!"B>$N(Bpgpool-II$B$N%-%c%C%7%e$,:o=|$5$l$:!"8E$$%G!<%?$rFI$_$@$7$F$7$^$&$3$H$,$"$j$^$9!#(B - $B$3$N$h$&$J4D6-$G$O!"%-%c%C%7%e%9%H%l!<%8$K(Bmemcached$B$r;H$C$F$/$@$5$$!#(B</li> + <li>オンメモリクエリキャッシュでは、テーブルに変更があると、関連するキャッシュを自動的に削除して古いデータが返却されないようにする機能があります。 + このため、pgpoolは常にUPDATEやINSERTやALTER TABLEなどのコマンドが発行されたかどうかをモニタしています。 + しかし、トリガ、外部キーやDROP TABLE CASCADEなどの働きによって暗黙的にテーブルが更新されたことはpgpool-IIからはわからないため、この機能が働きません。 + この問題を回避するためには、<a href="#MEMQCACHE_EXPIRE">memqcache_expire</a>を使って一定時間経過したキャッシュを削除するようにするか、<a href="#BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list</a>を使って、該当テーブルがキャッシュされないようにしてください。</li> + <li>複数のpgpool-IIを動かす環境で共有メモリを使ったオンメモリクエリキャッシュを使用すると、あるpgpool-II経由でテーブルが更新された時に、他のpgpool-IIのキャッシュが削除されず、古いデータを読みだしてしまうことがあります。 + このような環境では、キャッシュストレージにmemcachedを使ってください。</li> </ul> -<h2 id="MEMORY_CACHE_ENABLED">$B%*%s%a%b%j%/%(%j%-%c%C%7%e$NM-8z2=(B</h2> +<h2 id="MEMORY_CACHE_ENABLED">オンメモリクエリキャッシュの有効化</h2> <p> -$B%*%s%a%b%j%/%(%j%-%c%C%7%e$rM-8z$K$9$k$K$O!"(Bpgpool.conf$B$N(B"memory_cache_enabled"$B$rM-8z$K$7$^$9!#(B +オンメモリクエリキャッシュを有効にするには、pgpool.confの"memory_cache_enabled"を有効にします。 <pre> memory_cache_enabled = true </pre> </p> -<h2 id="MEMQCACHE_METHOD">$B%-%c%C%7%e%9%H%l!<%8$NA*Br(B</h2> +<h2 id="MEMQCACHE_METHOD">キャッシュストレージの選択</h2> <p> -$B%a%b%j%-%c%C%7%e$N%9%H%l!<%8$K$O!"6&M-%a%b%j$H(B<a href="http://memcached.org">memcached</a>$B$N$I$A$i$+$r(B -$BA*Br$9$k$3$H$,$G$-$^$9(B($BJ;MQ$O$G$-$^$;$s(B)$B!#(B +メモリキャッシュのストレージには、共有メモリと<a href="http://memcached.org">memcached</a>のどちらかを +選択することができます(併用はできません)。 <p> -$B6&M-%a%b%j$r;HMQ$9$k%/%(%j%-%c%C%7%e$O9bB.$G!"(Bmemcached$B$NN)$A>e$2$bI,MW$J$/!"<j7Z$KMxMQ$G$-$^$9!#(B -$B$?$@$7!"6&M-%a%b%j%5%$%:$N>e8B$K$h$C$FJ]B8$G$-$k%-%c%C%7%e$NNL$K@)8B$,$"$j$^$9!#(B -memcached$B$r%-%c%C%7%e%9%H%l!<%8$K;HMQ$9$k>l9g$O!"%M%C%H%o!<%/%"%/%;%9$N%*!<%P%X%C%I$,$"$k$b$N$N!"(B -$BHf3SE*<+M3$K%-%c%C%7%e%a%b%j$NBg$-$5$r@_Dj$G$-$^$9!#(B +共有メモリを使用するクエリキャッシュは高速で、memcachedの立ち上げも必要なく、手軽に利用できます。 +ただし、共有メモリサイズの上限によって保存できるキャッシュの量に制限があります。 +memcachedをキャッシュストレージに使用する場合は、ネットワークアクセスのオーバヘッドがあるものの、 +比較的自由にキャッシュメモリの大きさを設定できます。 </p> <p> -$B6&M-%a%b%j$rMxMQ$9$k>l9g$O(B"memqcache_method"$B$K(B 'shmem'$B!"(BMemcached$B$rMxMQ$9$k>l9g$O(B'memcached'$B$H@_Dj$7$^$9!#(B -$B%G%U%)%k%H$O!"(B'shmem'$B$G$9!#(B +共有メモリを利用する場合は"memqcache_method"に 'shmem'、Memcachedを利用する場合は'memcached'と設定します。 +デフォルトは、'shmem'です。 </p> -<h2 id="memqcache_cases">$B%-%c%C%7%e$,:n@.$5$l$k>l9g$H:n@.$5$l$J$$>l9g(B</h2> +<h2 id="memqcache_cases">キャッシュが作成される場合と作成されない場合</h2> <p> -$B$9$Y$F$N(BSELECT($B$b$7$/$O(BWITH)$B$,%*%s%a%b%j%/%(%j%-%c%C%7%e$NBP>]$K$J$k$o$1$G$O$"$j$^$;$s!#(B -$B%-%c%C%7%e$H(BDB$B$N0l4S@-$r6KNOJ]$D$?$a$K!"%-%c%C%7%e$5$l$J$$%1!<%9$,$"$j$^$9!#0J2<$=$l$rNs5s$7$^$9!#(B +すべてのSELECT(もしくはWITH)がオンメモリクエリキャッシュの対象になるわけではありません。 +キャッシュとDBの一貫性を極力保つために、キャッシュされないケースがあります。以下それを列挙します。 </p> <ul> - <li> <a href="#BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list</a>$B$G;XDj$5$l$F$$$k%F!<%V%k$r;H$C$F$$$k(BSELECT</li> - <li>$B!V(B/*NO QUERY CACHE*/$B!W%3%a%s%H$G;O$^$k(BSELECT</li> - <li>SELECT FOR SHARE$B$^$?$O(BUPDATE</li> - <li>IMMUTABLE$B$G$J$$4X?t$r;H$C$F$$$k(BSELECT</li> - <li>$B0l;~%F!<%V%k$r;H$C$F$$$k(BSELECT</li> - <li>$B%7%9%F%`%+%?%m%0$r8!:w$7$F$$$k(BSELECT</li> - <li>VIEW$B$r$^$?$O(Bunlogged$B%F!<%V%k;H$C$F$$$k(BSELECT$B!#(B - $B$?$@$7!"$=$l$i$N%F!<%V%k$,(B<a href="#WHITE_MEMQCACHE_TABLE_LIST">white_memqcache_table_list</a>$B$G;XDj$5$l$F$$$k>l9g$O%-%c%C%7%e$NBP>]$K$J$j$^$9!#(B</li> - <li>$BL@<(E*$J%H%i%s%6%/%7%g%sFb$G(BSELECT$B$,H/9T$5$l!"$=$N%H%i%s%6%/%7%g%s$,%"%\!<%H$7$?;~(B</li> - <li>SELECT$B7k2L$,Bg$-$$>l9g(B(<a href="#MEMQCACHE_MAXCACHE">memqcache_maxcache</a>$B$N9`;2>H(B)</li> + <li> <a href="#BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list</a>で指定されているテーブルを使っているSELECT</li> + <li>「/*NO QUERY CACHE*/」コメントで始まるSELECT</li> + <li>SELECT FOR SHAREまたはUPDATE</li> + <li>IMMUTABLEでない関数を使っているSELECT</li> + <li>一時テーブルを使っているSELECT</li> + <li>システムカタログを検索しているSELECT</li> + <li>VIEWをまたはunloggedテーブル使っているSELECT。 + ただし、それらのテーブルが<a href="#WHITE_MEMQCACHE_TABLE_LIST">white_memqcache_table_list</a>で指定されている場合はキャッシュの対象になります。</li> + <li>明示的なトランザクション内でSELECTが発行され、そのトランザクションがアボートした時</li> + <li>SELECT結果が大きい場合(<a href="#MEMQCACHE_MAXCACHE">memqcache_maxcache</a>の項参照)</li> </ul> -<h2 id="non_memqcache_case">$B%-%c%C%7%e$,$"$C$F$b;2>H$5$l$J$$>l9g(B</h2> +<h2 id="non_memqcache_case">キャッシュがあっても参照されない場合</h2> <p> -$B%*%s%a%b%j%/%(%j%-%c%C%7%e$,B8:_$7$F$b!"$=$N%-%c%C%7%e$,MxMQ$5$l$J$$%1!<%9$,$"$j$^$9!#(B -$B0J2<$=$l$rNs5s$7$^$9!#(B +オンメモリクエリキャッシュが存在しても、そのキャッシュが利用されないケースがあります。 +以下それを列挙します。 </p> <ul> - <li>$BL@<(E*$J%H%i%s%6%/%7%g%sFb$G99?7%/%(%j$,H/9T$5$l$F$$$k>l9g$O!"$=$N%H%i%s%6%/%7%g%sFb$G$O(B - $B0l@Z%/%(%j%-%c%C%7%e$O;2>H$5$l$^$;$s!#(B</li> - <li>$B$=$N%-%c%C%7%e$r0c$&%f!<%6$,:n@.$7$F$$$?>l9g(B($B%;%-%e%j%F%#>e$NM}M3(B)</li> - <li>$B%-%c%C%7%e$N<wL?$rD6$($F$$$?>l9g(B(<a href="#MEMQCACHE_EXPIRE">memqcache_expire$B$N9`(B</a>$B$r;2>H(B)</li> + <li>明示的なトランザクション内で更新クエリが発行されている場合は、そのトランザクション内では + 一切クエリキャッシュは参照されません。</li> + <li>そのキャッシュを違うユーザが作成していた場合(セキュリティ上の理由)</li> + <li>キャッシュの寿命を超えていた場合(<a href="#MEMQCACHE_EXPIRE">memqcache_expireの項</a>を参照)</li> </ul> -<h2 id="memqcache_params">$B6&DL@_Dj9`L\(B</h2> +<h2 id="memqcache_params">共通設定項目</h2> <p> -$B%-%c%C%7%e%9%H%l!<%8$r6&M-%a%b%j$K$9$k>l9g$G$b!"(Bmemcached$B$K$9$k>l9g$G$b!"6&DL$G@_Dj$9$k9`L\$r@bL@$7$^$9!#(B +キャッシュストレージを共有メモリにする場合でも、memcachedにする場合でも、共通で設定する項目を説明します。 </p> <dl> -<dt id="MEMQCACHE_EXPIRE">memqcache_expire <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_EXPIRE">memqcache_expire <span class="version">V3.2 〜</span></dt> <dd> <p> - $B%/%(%j%-%c%C%7%e$N<wL?$rICC10L$G@_Dj$7$^$9!#%G%U%)%k%H(B0$B$G$9!#(B - 0$B$r;XDj$9$k$H<wL?$,L58BBg$K$J$j!"4XO"%F!<%V%k$,99?7$5$l$k$^$G$O%-%c%C%7%e$,M-8z$K$J$j$^$9!#(B - $B$J$*!"$3$N@_Dj$O!"(B<a href="#MEMQCACHE_AUTO_CACHE_INVALIDATION">memqcache_auto_cache_invalidation</a>$B$H$O(B - $BFHN)$G$9!#(B + クエリキャッシュの寿命を秒単位で設定します。デフォルト0です。 + 0を指定すると寿命が無限大になり、関連テーブルが更新されるまではキャッシュが有効になります。 + なお、この設定は、<a href="#MEMQCACHE_AUTO_CACHE_INVALIDATION">memqcache_auto_cache_invalidation</a>とは + 独立です。 </p> </dd> -<dt id="MEMQCACHE_AUTO_CACHE_INVALIDATION">memqcache_auto_cache_invalidation <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_AUTO_CACHE_INVALIDATION">memqcache_auto_cache_invalidation <span class="version">V3.2 〜</span></dt> <dd> <p> - true$B$J$i$P4XO"$9$k%F!<%V%k$,99?7$5$l$k$H%-%c%C%7%e$rL58z2=$7$^$9!#(B - false$B$J$i$P%F!<%V%k$,99?7$5$l$F$b%-%c%C%7%e$rL58z2=$7$^$;$s!#(B - $B%G%U%)%k%HCM$O(Bon$B$G$9!#(B - $B$J$*!"$3$N@_Dj$O(B<a href="#MEMQCACHE_EXPIRE">memqcache_expire</a>$B$N@_Dj$H$OFHN)$G$9!#(B + trueならば関連するテーブルが更新されるとキャッシュを無効化します。 + falseならばテーブルが更新されてもキャッシュを無効化しません。 + デフォルト値はonです。 + なお、この設定は<a href="#MEMQCACHE_EXPIRE">memqcache_expire</a>の設定とは独立です。 </p> </dd> -<dt id="WHITE_MEMQCACHE_TABLE_LIST">white_memqcache_table_list <span class="version">V3.2 $B!A(B</span></dt> +<dt id="WHITE_MEMQCACHE_TABLE_LIST">white_memqcache_table_list <span class="version">V3.2 〜</span></dt> <dd> <p> - VIEW $B$d(Bunlogged$B%F!<%V%k$r;H$C$F$$$k(BSELECT$B$ODL>o%-%c%C%7%e$NBP>]$K$J$j$^$;$s$,!"(B - white_memqcache_table_list $B$K5-=R$7$F$*$/$3$H$G!"%-%c%C%7%e$5$l$k$h$&$K$J$j$^$9!#(B - $B%F!<%V%kL>$O%+%s%^6h@Z$j$G;XDj$7$^$9!#@55,I=8=$bMxMQ$G$-$^$9!#(B + VIEW やunloggedテーブルを使っているSELECTは通常キャッシュの対象になりませんが、 + white_memqcache_table_list に記述しておくことで、キャッシュされるようになります。 + テーブル名はカンマ区切りで指定します。正規表現も利用できます。 <p> - $B$J$*!"F1$8%F!<%V%k!&(BVIEW $B$,(B <a href="#BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list</a> $B$HN>J}$K(B - $B;XDj$5$l$F$$$k>l9g$O!"(Bwhite_memqcache_table_list $B$,M%@h$5$l!"%-%c%C%7%e$rMxMQ$7$^$9!#(B + なお、同じテーブル・VIEW が <a href="#BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list</a> と両方に + 指定されている場合は、white_memqcache_table_list が優先され、キャッシュを利用します。 </p> </dd> -<dt id="BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list <span class="version">V3.2 $B!A(B</span></dt> +<dt id="BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list <span class="version">V3.2 〜</span></dt> <dd> <p> - SELECT$B7k2L$r%-%c%C%7%e$7$?$/$J$$%F!<%V%kL>$r%+%s%^6h@Z$j$G;XDj$7$^$9!#@55,I=8=$bMxMQ$G$-$^$9!#(B + SELECT結果をキャッシュしたくないテーブル名をカンマ区切りで指定します。正規表現も利用できます。 </p> </dd> -<dt id="MEMQCACHE_MAXCACHE">memqcache_maxcache <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_MAXCACHE">memqcache_maxcache <span class="version">V3.2 〜</span></dt> <dd> <p> - SELECT$BJ8$N<B9T7k2L$,(Bmemqcache_maxcache$B%P%$%H$rD6$($k$H!"%-%c%C%7%e$5$l$^$;$s!#(B - $B$3$N>l9g!"0J2<$N$h$&$J%a%C%;!<%8$,I=<($5$l$^$9!#(B + SELECT文の実行結果がmemqcache_maxcacheバイトを超えると、キャッシュされません。 + この場合、以下のようなメッセージが表示されます。 </p> <pre> 2012-05-02 15:08:17 LOG: pid 13756: pool_add_temp_query_cache: data size exceeds memqcache_maxcache. current:4095 requested:111 memq_maxcache:4096 </pre> <p> - $B$3$NLdBj$r2sHr$9$k$?$a$K$O!"(Bmemqcache_maxcache$B$rBg$-$/$9$l$PNI$$$N$G$9$,!"(B - $B%-%c%C%7%e%9%H%l!<%8$H$7$F6&M-%a%b%j$r;HMQ$9$k>l9g$O!"(B - <a href="#MEMQCACHE_CACHE_BLOCK_SIZE">memqcache_cache_block_size</a>$B$rD6$($J$$$h$&$K$7$F$/$@$5$$!#(B - $B%-%c%C%7%e%9%H%l!<%8$H$7$F(Bmemcached$B$r;HMQ$9$k>l9g$O!"(B - memcached$B$N%9%i%V%5%$%:(B($B%G%U%)%k%H$G(B1MB)$B$rD6$($J$$$h$&$K$7$F$/$@$5$$!#(B + この問題を回避するためには、memqcache_maxcacheを大きくすれば良いのですが、 + キャッシュストレージとして共有メモリを使用する場合は、 + <a href="#MEMQCACHE_CACHE_BLOCK_SIZE">memqcache_cache_block_size</a>を超えないようにしてください。 + キャッシュストレージとしてmemcachedを使用する場合は、 + memcachedのスラブサイズ(デフォルトで1MB)を超えないようにしてください。 </p> </dd> -<dt id="MEMQCACHE_OIDDIR">memqcache_oiddir <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_OIDDIR">memqcache_oiddir <span class="version">V3.2 〜</span></dt> <dd> <p> - SELECT$BJ8$,;HMQ$9$k%F!<%V%k$K(BOID$B$r3JG<$9$k0l;~%U%!%$%kNN0h$N%H%C%W%G%#%l%/%H%j$r%U%k%Q%9$G;XDj$7$^$9!#(B - memqcache_oiddir$B0J2<$K$O!"%G!<%?%Y!<%9(BOID$BL>$N%G%#%l%/%H%j$,:n@.$5$l!"(B - $B99$K$=$N2<$K$O%F!<%V%k(BOID$BL>$N%U%!%$%k$,:n@.$5$l$^$9!#(B - $B%F!<%V%k(BOID$BL>%U%!%$%k$NCf$K$O!"%/%(%j%-%c%C%7%e$X$N%]%$%s%?$,3JG<$5$l$F$*$j!"(B - $B%F!<%V%k$N99?7$,$"$C$?:]$K%-%c%C%7%e$r:o=|$9$k%-!<$H$J$j$^$9!#(B + SELECT文が使用するテーブルにOIDを格納する一時ファイル領域のトップディレクトリをフルパスで指定します。 + memqcache_oiddir以下には、データベースOID名のディレクトリが作成され、 + 更にその下にはテーブルOID名のファイルが作成されます。 + テーブルOID名ファイルの中には、クエリキャッシュへのポインタが格納されており、 + テーブルの更新があった際にキャッシュを削除するキーとなります。 </p> <p> - $B$3$NNN0h$O%G%U%)%k%H$G$O!"(Bpgpool $B$r:F5/F0$7$F$b:FMxMQ$5$l$^$9!#(B - $B:FMxMQ$;$:$K:o=|$7$F5/F0$7$?$$>l9g$O!"(B<a href="#start">pgpool $B%3%^%s%I(B</a> $B$K(B -C $B%*%W%7%g%s$r$D$1$F5/F0$7$^$9!#(B + この領域はデフォルトでは、pgpool を再起動しても再利用されます。 + 再利用せずに削除して起動したい場合は、<a href="#start">pgpool コマンド</a> に -C オプションをつけて起動します。 </p> </dd> </dl> -<h2 id="monitoring_memqcache">$B%-%c%C%7%e$N%b%K%?%j%s%0(B</h2> +<h2 id="monitoring_memqcache">キャッシュのモニタリング</h2> <p> -$B%*%s%a%b%j%/%(%j%-%c%C%7%e$r%b%K%?$9$kJ}K!$r@bL@$7$^$9!#(B -$B%-%c%C%7%e$+$i8!:w7k2L$,<hF@$5$l$?$+$I$&$+$O!"(B<a href="#LOG_PER_NODE_STATEMENT">log_per_node_statement</a> $B$r(B -$BM-8z$K$9$k$3$H$G3NG'$G$-$^$9!#(B +オンメモリクエリキャッシュをモニタする方法を説明します。 +キャッシュから検索結果が取得されたかどうかは、<a href="#LOG_PER_NODE_STATEMENT">log_per_node_statement</a> を +有効にすることで確認できます。 </p> <pre> 2012-05-01 15:42:09 LOG: pid 20181: query result fetched from cache. statement: select * from t1; </pre> <p> -$B%/%(%j%-%c%C%7%e$N%R%C%HN($O!"(B<a href="#pool_status">show pool_status $B%3%^%s%I(B</a> $B$G3NG'$G$-$^$9!#(B +クエリキャッシュのヒット率は、<a href="#pool_status">show pool_status コマンド</a> で確認できます。 </p> <pre> memqcache_stats_start_time | Tue May 1 15:41:59 2012 | Start time of query cache stats @@ -2834,101 +2835,101 @@ memqcache_cache_hits | 36717 | Number of SELE <p> -$B$3$NNc$G$O!"(B +この例では、 </p> <p> <pre> (memqcache_cache_hits) / (memqcache_no_cache_hits+memqcache_cache_hits) = 36717 / (36717 + 80471) = 31.3% </pre> <p> -$B$,%-%c%C%7%e%R%C%HN($H$$$&$3$H$K$J$j$^$9!#(B +がキャッシュヒット率ということになります。 </p> <p> -<a href="#pool_cache">show pool_cache</a>$B%3%^%s%I$G$bF1MM$NFbMF$,3NG'$G$-$^$9!#(B +<a href="#pool_cache">show pool_cache</a>コマンドでも同様の内容が確認できます。 </p> -<h2 id="shmem_params">$B6&M-%a%b%j@_Dj9`L\(B</h2> +<h2 id="shmem_params">共有メモリ設定項目</h2> <p> -$B%-%c%C%7%e%9%H%l!<%8$H$7$F6&M-%a%b%j$r;HMQ$9$k>l9g$N@_Dj9`L\$r@bL@$7$^$9!#(B +キャッシュストレージとして共有メモリを使用する場合の設定項目を説明します。 </p> <dl> -<dt id="MEMQCACHE_TOTAL_SIZE">memqcache_total_size <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_TOTAL_SIZE">memqcache_total_size <span class="version">V3.2 〜</span></dt> <dd> <p> - $B%-%c%C%7%e%9%H%l!<%8$K;HMQ$9$k6&M-%a%b%jNN0h$N%5%$%:$r;XDj$7$^$9!#C10L$O%P%$%H$G$9!#(B + キャッシュストレージに使用する共有メモリ領域のサイズを指定します。単位はバイトです。 </p> </dd> -<dt id="MEMQCACHE_MAX_NUM_CACHE">memqcache_max_num_cache <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_MAX_NUM_CACHE">memqcache_max_num_cache <span class="version">V3.2 〜</span></dt> <dd> <p> - $B%-%c%C%7%e$N?t$r;XDj$7$^$9!#(B - $B$3$N@_Dj9`L\$O!"%-%c%C%7%e$N4IM}NN0h$NBg$-$5$r7h$a$k$?$a$K;HMQ$7$^$9(B - (<a href="MEMQCACHE_TOTAL_SIZE">memqcache_total_size</a>$B$H$OJL$K<h$i$l$^$9(B)$B!#(B - $B4IM}NN0h$NBg$-$5$O!"(Bmemqcache_max_num_cache * 48($B%P%$%H(B)$B$K$J$j$^$9!#(B - $B$3$N?t$O>/$J$9$.$k$H%-%c%C%7%e$rEPO?$9$k$3$H$,$G$-$:$K%(%i!<$K$J$j$^$9!#(B - $B5U$KB?$9$.$k$HL5BL$K$J$j$^$9!#(B + キャッシュの数を指定します。 + この設定項目は、キャッシュの管理領域の大きさを決めるために使用します + (<a href="MEMQCACHE_TOTAL_SIZE">memqcache_total_size</a>とは別に取られます)。 + 管理領域の大きさは、memqcache_max_num_cache * 48(バイト)になります。 + この数は少なすぎるとキャッシュを登録することができずにエラーになります。 + 逆に多すぎると無駄になります。 </p> </dd> -<dt id="MEMQCACHE_CACHE_BLOCK_SIZE">memqcache_cache_block_size <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_CACHE_BLOCK_SIZE">memqcache_cache_block_size <span class="version">V3.2 〜</span></dt> <dd> <p> - $B%-%c%C%7%e%9%H%l!<%8$H$7$F6&M-%a%b%j$r;HMQ$9$k>l9g$O!"%a%b%j$r(B - memqcache_cache_block_size $B$N%V%m%C%/$KJ,$1$FMxMQ$7$^$9!#8!:w7k2L(B - $B$N%-%c%C%7%e$O$3$N%V%m%C%/$KF~$k$@$15M$a9~$^$l$^$9!#(B - $B$?$@$7!"%-%c%C%7%e$OJ#?t$N%V%m%C%/$K$^$?$,$C$F3JG<$5$l$J$$$N$G!"(B - memqcache_cache_block_size$B$r8!:w7k2L$,D6$($k$H!"%-%c%C%7%e$K3JG<$G$-$J$/$J$j$^$9!#(B - memqcache_cache_block_size$B$O!"(B512$B0J>e$NCM$G$J$1$l$P$J$j$^$;$s!#(B + キャッシュストレージとして共有メモリを使用する場合は、メモリを + memqcache_cache_block_size のブロックに分けて利用します。検索結果 + のキャッシュはこのブロックに入るだけ詰め込まれます。 + ただし、キャッシュは複数のブロックにまたがって格納されないので、 + memqcache_cache_block_sizeを検索結果が超えると、キャッシュに格納できなくなります。 + memqcache_cache_block_sizeは、512以上の値でなければなりません。 </p> </dd> </dl> -<h2 id="memcached_params">memcached$B@_Dj9`L\(B</h2> +<h2 id="memcached_params">memcached設定項目</h2> <p> -$B%-%c%C%7%e%9%H%l!<%8$H$7$F(Bmemcached$B$r;HMQ$9$k>l9g$N@_Dj9`L\$r@bL@$7$^$9!#(B +キャッシュストレージとしてmemcachedを使用する場合の設定項目を説明します。 </p> <dl> -<dt id="MEMQCACHE_MEMCACHED_HOST">memqcache_memcached_host <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_MEMCACHED_HOST">memqcache_memcached_host <span class="version">V3.2 〜</span></dt> <dd> <p> - memcached$B$,F0$$$F$$$k%[%9%HL>$^$?$O(BIP$B%"%I%l%9$r;XDj$7$^$9!#(B - pgpool-II$B$HF1$8%^%7%s$G(Bmemcached$B$rF0$+$9>l9g$O!"(B'localhost'$B$H$7$^$9!#(B + memcachedが動いているホスト名またはIPアドレスを指定します。 + pgpool-IIと同じマシンでmemcachedを動かす場合は、'localhost'とします。 </p> </dd> -<dt id="MEMQCACHE_MEMCACHED_PORT">memqcache_memcached_port <span class="version">V3.2 $B!A(B</span></dt> +<dt id="MEMQCACHE_MEMCACHED_PORT">memqcache_memcached_port <span class="version">V3.2 〜</span></dt> <dd> <p> - memcached$B$N%]!<%HHV9f$r;XDj$7$^$9!#%G%U%)%k%HCM$O(B 11211 $B$G$9!#(B + memcachedのポート番号を指定します。デフォルト値は 11211 です。 </p> </dd> </dl> -<h3 id="install_memcached">memcached$B$N%$%s%9%H!<%k(B</h3> +<h3 id="install_memcached">memcachedのインストール</h3> <p> -pgpool-II$B$N%/%(%j%-%c%C%7%e%9%H%l!<%8$H$7$F(Bmemcached$B$r;HMQ$9$k>l9g$O!"F0:n$7$F$$$k(Bmemcached$B$H!"(B -libmemcached$B$H$$$&%/%i%$%"%s%H%i%$%V%i%j$N%$%s%9%H!<%k$,I,MW$G$9!#(B -rpm$B$J$I$+$i%$%s%9%H!<%k$9$k$N$,$*$9$9$a$G$9$,!"$3$3$G$O%=!<%9%3!<%I$+$i%$%s%9%H!<%k$9$kJ}K!$r@bL@$7$^$9!#(B +pgpool-IIのクエリキャッシュストレージとしてmemcachedを使用する場合は、動作しているmemcachedと、 +libmemcachedというクライアントライブラリのインストールが必要です。 +rpmなどからインストールするのがおすすめですが、ここではソースコードからインストールする方法を説明します。 </p> <p> -memcached$B$N%=!<%9%3!<%I$O(B<a href="http://memcached.org/">memcached$B3+H/%Z!<%8(B</a>$B$+$i%@%&%s%m!<%I$G$-$^$9!#(B +memcachedのソースコードは<a href="http://memcached.org/">memcached開発ページ</a>からダウンロードできます。 </p> <dl> -<dt>configure$B$N<B9T(B +<dt>configureの実行 <dd> <p> - $B%=!<%9%3!<%I$N(Btar ball$B$rE83+$7$?$i!"(Bconfigure$B$r<B9T$7$^$9!#(B + ソースコードのtar ballを展開したら、configureを実行します。 </p> <pre> ./configure </pre> </dd> -<dt>make$B$N<B9T(B +<dt>makeの実行 <dd> <pre> make @@ -2937,39 +2938,39 @@ make install </dd> </dl> -<h3 id="install_libmemcached">libmemcached$B$N%$%s%9%H!<%k(B</h3> +<h3 id="install_libmemcached">libmemcachedのインストール</h3> <p> -memcached$B$N%/%i%$%"%s%H%i%$%V%i%j$O!"(Blibmemcached$B$r;HMQ$7$F$$$^$9!#(B<br> -memcached$B$N%$%s%9%H!<%k8e$K!"(Blibmemcached$B$r%$%s%9%H!<%k$9$kI,MW$,$"$j$^$9!#(B +memcachedのクライアントライブラリは、libmemcachedを使用しています。<br> +memcachedのインストール後に、libmemcachedをインストールする必要があります。 </p> <p> -libmemcached$B$N%=!<%9%3!<%I$O!"(B<a href="http://libmemcached.org/libMemcached.html">libMemcached$B3+H/%Z!<%8(B</a>$B$+$i(B -$B%@%&%s%m!<%I$G$-$^$9!#(B +libmemcachedのソースコードは、<a href="http://libmemcached.org/libMemcached.html">libMemcached開発ページ</a>から +ダウンロードできます。 </p> <dl> -<dt>configure$B$N<B9T(B +<dt>configureの実行 <dd> <p> - $B%=!<%9%3!<%I$N(Btar ball$B$rE83+$7$?$i!"(Bconfigure$B$r<B9T$7$^$9!#(B + ソースコードのtar ballを展開したら、configureを実行します。 </p> <pre> ./configure </pre> <p> - configure$B$K;XDj$G$-$k%*%W%7%g%s$O0J2<$G$9!#(B + configureに指定できるオプションは以下です。 </p> <ul> <li><code>--with-memcached=path</code><br/> - Memcached$B$,%$%s%9%H!<%k$5$l$F$$$k%H%C%W%G%#%l%/%H%j$r;XDj$7$^$9!#(B</li> + Memcachedがインストールされているトップディレクトリを指定します。</li> </ul> </dd> -<dt>make$B$N<B9T(B +<dt>makeの実行 <dd> <pre> make @@ -2978,15 +2979,15 @@ make install </dd> </dl> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1>pgpool-II$B$N5/F0$HDd;_(B<a name="start"></a></h1> +<h1>pgpool-IIの起動と停止<a name="start"></a></h1> -<h2 id="start_pgpool">pgpool-II $B$N5/F0(B</h2> +<h2 id="start_pgpool">pgpool-II の起動</h2> <p> -$B0J>e$G@_Dj$,=*$o$C$?$N$G!"3F(BDB$B%N!<%I$r5/F0$7!"I,MW$J$i$P%7%9%F%`(BDB$B$b5/F0$7$F$+$i(Bpgpool-II$B$r5/F0$7$^$9!#(B +以上で設定が終わったので、各DBノードを起動し、必要ならばシステムDBも起動してからpgpool-IIを起動します。 </p> <pre> pgpool [-c][-f config_file][-a hba_file][-F pcp_config_file][-n][-D][-d] @@ -2994,32 +2995,32 @@ pgpool [-c][-f config_file][-a hba_file][-F pcp_config_file][-n][-D][-d] <table border> <tr><td>-c</td><td>--clear-cache</td> - <td>$B%/%(%j%-%c%C%7%e$r>C5n$7$^$9(B</td></tr> + <td>クエリキャッシュを消去します</td></tr> <tr><td>-f config_file</td><td>--config-file config-file</td> - <td>pgpool-II$B$N@_Dj%U%!%$%k$r;XDj$7$^$9(B</td></tr> + <td>pgpool-IIの設定ファイルを指定します</td></tr> <tr><td>-a hba_file</td><td>--hba-file hba_file</td> - <td>HBA$BG'>Z@_Dj%U%!%$%k$r;XDj$7$^$9(B</td></tr> + <td>HBA認証設定ファイルを指定します</td></tr> <tr><td>-F pcp_config_file</td><td>--pcp-password-file</td> - <td>pcp$B$N@_Dj%U%!%$%k$r;XDj$7$^$9(B</td></tr> + <td>pcpの設定ファイルを指定します</td></tr> <tr><td>-n</td><td>--no-daemon</td> - <td>$B%G!<%b%s%b!<%I$G5/F0$7$^$;$s!J@)8fC<Kv$r@Z$jN%$7$^$;$s!K(B</td></tr> + <td>デーモンモードで起動しません(制御端末を切り離しません)</td></tr> <tr><td>-D</td><td>--discard-status</td> - <td>pgpool_status$B$r:o=|$7!"0JA0$N>uBV$rI|85$7$^$;$s(B - <span class="version">V3.0 $B!A(B</span></td></tr> + <td>pgpool_statusを削除し、以前の状態を復元しません + <span class="version">V3.0 〜</span></td></tr> <tr><td>-C</td><td>--clear-oidmaps</td> - <td>$B%*%s%a%b%j%/%(%j%-%c%C%7%e$N(B <a href="#MEMQCACHE_OIDDIR">memqcache_oiddir</a> $B$N(B - $B%G%#%l%/%H%j$NCf?H$r>C5n$7$^$9(B - $B!J(B<a href="#MEMQCACHE_METHOD">memqcache_method</a> $B$,(B 'memcached' $B$N$H$-$N$_!#(B - 'shmem' $B$N$H$-$O;XDj$7$J$/$F$b!"I,$:>C5n$5$l$^$9!K!#(B - <span class="version">V3.2 $B!A(B</span></td></tr> + <td>オンメモリクエリキャッシュの <a href="#MEMQCACHE_OIDDIR">memqcache_oiddir</a> の + ディレクトリの中身を消去します + (<a href="#MEMQCACHE_METHOD">memqcache_method</a> が 'memcached' のときのみ。 + 'shmem' のときは指定しなくても、必ず消去されます)。 + <span class="version">V3.2 〜</span></td></tr> <tr><td>-d</td><td>--debug</td> - <td>$B%G%P%C%0%b!<%I$G5/F0$7$^$9(B</td></tr> + <td>デバッグモードで起動します</td></tr> </table> -<h2 id="start_pgpool">pgpool-II $B$NDd;_(B</h2> +<h2 id="start_pgpool">pgpool-II の停止</h2> <p> -pgpool-II$B$NDd;_$O8e=R$N(Bpcp$B%3%^%s%I$G$b$G$-$^$9$,!"(Bpgpool-II$B%3%^%s%I$r;H$&$3$H(B -$B$b$G$-$^$9!#(B +pgpool-IIの停止は後述のpcpコマンドでもできますが、pgpool-IIコマンドを使うこと +もできます。 </p> <pre> pgpool [-f config_file][-F pcp_config_file] [-m {s[mart]|f[ast]|i[mmediate]}] stop @@ -3027,91 +3028,91 @@ pgpool [-f config_file][-F pcp_config_file] [-m {s[mart]|f[ast]|i[mmediate]}] st <table border> <tr><td>-m s[mart]</td><td>--mode s[mart]</td> - <td>$B@\B3Cf$N%/%i%$%"%s%H$,@\B3$r=*$o$k$N$rBT$C$F$+$iDd;_$7$^$9(B($B%G%U%)%k%H(B)</td></tr> + <td>接続中のクライアントが接続を終わるのを待ってから停止します(デフォルト)</td></tr> <tr><td>-m f[ast]</td><td>--mode f[ast]</td> - <td>$B@\B3Cf$N%/%i%$%"%s%H$,@\B3$r=*$o$k$N$rBT$?$:$KD>$A$KDd;_$7$^$9(B</td></tr> + <td>接続中のクライアントが接続を終わるのを待たずに直ちに停止します</td></tr> <tr><td>-m i[mmediate]</td><td>--mode i[mmediate]</td> - <td>-m f$B$HF1$8F0:n$G$9(B</td></tr> + <td>-m fと同じ動作です</td></tr> </table> <p id="pool_status_file"> -pgpool$B$,Dd;_$9$k$H!"(B[logdir]/pgpool_status$B$H$$$&%U%!%$%k$K%P%C%/%(%s%I$N>uBV$r=q$-9~$_$^$9!#(B -$B<!2s(Bpgpool$B$,5/F0$7$?$H$-$K$3$N%U%!%$%k$,B8:_$9$k$H!"%P%C%/%(%s%I$N>uBV$r$=$3$+$iI|85$7$^$9!#(B -$B$3$l$K$h$C$F!"(B +pgpoolが停止すると、[logdir]/pgpool_statusというファイルにバックエンドの状態を書き込みます。 +次回pgpoolが起動したときにこのファイルが存在すると、バックエンドの状態をそこから復元します。 +これによって、 </p> <ol> -<li>$B%P%C%/%(%s%I$,Dd;_$7$F%U%'%$%k%*!<%P(B</li> -<li>pgpool$B7PM3$G@5>o$J(BDB$B$r99?7(B</li> -<li>pgpool$B$rDd;_(B</li> -<li>$BDd;_$7$F$$$?(BDB$B$r:F5/F0(B</li> -<li>pgpool$B$r:F5/F0(B</li> +<li>バックエンドが停止してフェイルオーバ</li> +<li>pgpool経由で正常なDBを更新</li> +<li>pgpoolを停止</li> +<li>停止していたDBを再起動</li> +<li>pgpoolを再起動</li> </ol> <p> -$B$H$$$&%7!<%1%s%9$G!"IT@09g$N$"$k(BDB$B$+$i%l%W%j%1!<%7%g%s>uBV$K0\9T$9$k$3$H$rKI$0$3$H$,$G$-$^$9!#(B +というシーケンスで、不整合のあるDBからレプリケーション状態に移行することを防ぐことができます。 </p> <p> -$B$b$7$b(BDB$B$N>uBV$KIT@09g$,$J$/$J$C$F$$$k!"$"$k$$$O(Bpgpool.conf$B$r=q$-49$($F@_Dj$rJQ$($F$7$^$C$?!"(B -$B$H$$$&$H$-$O(Bpgpool_status$B$r:o=|$9$l$P%P%C%/%(%s%I$N>uBV$NI|85$r9T$$$^$;$s!#(B +もしもDBの状態に不整合がなくなっている、あるいはpgpool.confを書き換えて設定を変えてしまった、 +というときはpgpool_statusを削除すればバックエンドの状態の復元を行いません。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1>pgpool-II$B$N@_Dj%U%!%$%k$N:FFI$_9~$_(B<a name="reload"></a></h1> +<h1>pgpool-IIの設定ファイルの再読み込み<a name="reload"></a></h1> <p> -pgpool-II$B$N@_Dj%U%!%$%k$O!"(Bpgpool-II$B$r:F5/F0$9$k$3$H$J$/FI$_D>$9$3$H$,$G$-$^$9!#(B +pgpool-IIの設定ファイルは、pgpool-IIを再起動することなく読み直すことができます。 </p> <pre> pgpool [-f config_file][-a hba_file][-F pcp_config_file] reload </pre> <table border> -<tr><td>-f config_file</td><td>pgpool-II$B$N@_Dj%U%!%$%k$r;XDj$7$^$9(B</tr> -<tr><td>-a hba_file</td><td>HBA$BG'>Z@_Dj%U%!%$%k$r;XDj$7$^$9(B</tr> -<tr><td>-F pcp_config_file</td><td>pcp$B$N@_Dj%U%!%$%k$r;XDj$7$^$9(B</tr> +<tr><td>-f config_file</td><td>pgpool-IIの設定ファイルを指定します</tr> +<tr><td>-a hba_file</td><td>HBA認証設定ファイルを指定します</tr> +<tr><td>-F pcp_config_file</td><td>pcpの設定ファイルを指定します</tr> </table> <p> -$B@_Dj9`L\$K$h$C$F$O!":FFI$_9~$_$r9T$J$C$F$bH?1G$5$l$J$$$b$N$,$"$k$N$G!"$4Cm0U2<$5$$!#(B -$B$^$?!"@_Dj$NJQ99$O$9$G$K@\B3Cf$N%;%C%7%g%s$K$OH?1G$5$l$^$;$s!#(B -$B<!2s!"%/%i%$%"%s%H$,(Bpgpool-II$B$K@\B3$7$?$H$-$+$iH?1G$5$l$^$9!#(B +設定項目によっては、再読み込みを行なっても反映されないものがあるので、ご注意下さい。 +また、設定の変更はすでに接続中のセッションには反映されません。 +次回、クライアントがpgpool-IIに接続したときから反映されます。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="show-commands"></a>SHOW$B%3%^%s%I(B</h1> -<h2 id="show_commands">$B35MW(B</h2> +<h1><a name="show-commands"></a>SHOWコマンド</h1> +<h2 id="show_commands">概要</h2> <p> -pgpool-II$B$G$O!"(BSHOW$B%3%^%s%I$r;H$C$F>pJs$r;2>H$9$k$3$H$,$G$-$^$9!#(B -SHOW$B$O(BSQL$B%3%^%s%I$G$9$,!"(Bpgpool-II$B$O0lIt$N(BSHOW$B%3%^%s%I$rFH<+$K2r<a$7$F!"(Bpgpool-II$B$,4IM}$9$k>pJs$rJV5Q$7$^$9!#(B -$B0J2<$N$h$&$J$b$N$,$"$j$^$9!#(B +pgpool-IIでは、SHOWコマンドを使って情報を参照することができます。 +SHOWはSQLコマンドですが、pgpool-IIは一部のSHOWコマンドを独自に解釈して、pgpool-IIが管理する情報を返却します。 +以下のようなものがあります。 </p> <table border> -<tr><th><a href="#pool_status">pool_status</a></th><td>$B9=@.>pJs(B</td></tr> +<tr><th><a href="#pool_status">pool_status</a></th><td>構成情報</td></tr> <tr><th><a href="#pool_nodes">pool_nodes</a></th> - <td>DB$B%N!<%I>pJs(B <span class="version">V3.0 $B!A(B</span></td></tr> + <td>DBノード情報 <span class="version">V3.0 〜</span></td></tr> <tr><th><a href="#pool_processes">pool_processes</a></th> - <td>pgpool-II$B%W%m%;%9$NFbIt>pJs(B <span class="version">V3.0 $B!A(B</span></td></tr> + <td>pgpool-IIプロセスの内部情報 <span class="version">V3.0 〜</span></td></tr> <tr><th><a href="#pool_pools">pool_pools</a></th> - <td>$B%3%M%/%7%g%s%W!<%k>pJs(B <span class="version">V3.0 $B!A(B</span></td></tr> + <td>コネクションプール情報 <span class="version">V3.0 〜</span></td></tr> <tr><th><a href="#pool_version">pool_version</a></th> - <td>pgpool-II$B$N%P!<%8%g%s(B <span class="version">V3.0 $B!A(B</span></td></tr> + <td>pgpool-IIのバージョン <span class="version">V3.0 〜</span></td></tr> </table> -<p>"pool_status" SQL $B$O0JA0$+$i$"$j$^$9$,!"B>$N(BSQL$B$O(Bpgpool-II 3.0$B$+$iDI2C$5$l$^$7$?!#(B</p> +<p>"pool_status" SQL は以前からありますが、他のSQLはpgpool-II 3.0から追加されました。</p> <p> -<u>$BCm0U(B</u>: "pool"$B$H$$$&MQ8l$O!"(Bpgpool$B%W%m%;%9$K$h$C$F=jM-$5$l$k(BPostgreSQL$B%;%C%7%g%s$r;X$7$^$9!#(B -pgpool$B$K$h$C$F=jM-$5$l$k%;%C%7%g%sA4BN$G$O$"$j$^$;$s!#(B +<u>注意</u>: "pool"という用語は、pgpoolプロセスによって所有されるPostgreSQLセッションを指します。 +pgpoolによって所有されるセッション全体ではありません。 </p> <h2 id="pool_status">pool_status</h2> -<p>"SHOW pool_status" $B$O@_Dj%Q%i%a!<%?$NL>A0$HCM!"@bL@$rI=<($7$^$9!#=PNO$N0lIt$r<($7$^$9!#(B</p> +<p>"SHOW pool_status" は設定パラメータの名前と値、説明を表示します。出力の一部を示します。</p> <pre> benchs2=# show pool_status; item | value | description @@ -3123,11 +3124,11 @@ benchs2=# show pool_status; pcp_socket_dir | /tmp | PCP socket directory </pre> -<h2 id="pool_nodes">pool_nodes <span class="version">V3.0 $B!A(B</span></h2> -<p>"SHOW pool_nodes"$B$O!"(BDB$B%N!<%I$N%j%9%H$rI=<($7$^$9!#(B -$B%[%9%HL>!"%]!<%HHV9f!">uBV!"=E$_(B($B%m!<%I%P%i%s%9%b!<%I$G1?MQ$7$F$$$k$H$-$K$N$_0UL#$,$"$j$^$9(B)$B!"(B -$B%N!<%I$NLr3d$,I=<($5$l$^$9!#(B -$B>uBV(B(status)$B$N0UL#$K$D$$$F$O!"(B<a href="#pcp_node_info">pcp_node_info$B%j%U%!%l%s%9(B</a>$B$G@bL@$5$l$F$$$^$9!#(B +<h2 id="pool_nodes">pool_nodes <span class="version">V3.0 〜</span></h2> +<p>"SHOW pool_nodes"は、DBノードのリストを表示します。 +ホスト名、ポート番号、状態、重み(ロードバランスモードで運用しているときにのみ意味があります)、 +ノードの役割が表示されます。 +状態(status)の意味については、<a href="#pcp_node_info">pcp_node_infoリファレンス</a>で説明されています。 </p> <pre> benchs2=# show pool_nodes; @@ -3138,23 +3139,23 @@ benchs2=# show pool_nodes; (2 lignes) </pre> -<h2 id="pool_processes">pool_processes <span class="version">V3.0 $B!A(B</span></h2> -<p>"SHOW pool_processes"$B$O!"@\B3BT$A!"$"$k$$$O@\B3Cf(Bpgpool-II$B$N;R%W%m%;%9$N>uBV$rI=<($7$^$9!#(B +<h2 id="pool_processes">pool_processes <span class="version">V3.0 〜</span></h2> +<p>"SHOW pool_processes"は、接続待ち、あるいは接続中pgpool-IIの子プロセスの状態を表示します。 </p> <p> -6$B$D$N%+%i%`$,$"$j$^$9!#(B +6つのカラムがあります。 </p> <ul> - <li>pool_pid $B$O(Bpgpool-II$B%W%m%;%9$N%W%m%;%9(BID$B$G$9!#(B</li> - <li>start_time$B$O$3$N%W%m%;%9$,5/F0$5$l$?;~9o$G$9(B(1970$BG/(B1$B7n(B1$BF|$+$i$N7P2aIC$GI=<($5$l$^$9(B)$B!#(B</li> - <li>database$B$O$3$N%W%m%;%9$,@\B3$7$F$$$k%G!<%?%Y!<%9L>$G$9!#(B</li> - <li>username$B$O$3$N%W%m%;%9$N@\B3$G;HMQ$7$F$$$k%f!<%6L>$G$9!#(B</li> - <li>create_time is$B$O$3$N@\B3$,:n@.$5$l$?;~9o$G$9!#(B</li> - <li>pool_counter $B$O$3$N@\B3$,;HMQ$5$l$?2s?t$G$9!#(B</li> + <li>pool_pid はpgpool-IIプロセスのプロセスIDです。</li> + <li>start_timeはこのプロセスが起動された時刻です(1970年1月1日からの経過秒で表示されます)。</li> + <li>databaseはこのプロセスが接続しているデータベース名です。</li> + <li>usernameはこのプロセスの接続で使用しているユーザ名です。</li> + <li>create_time isはこの接続が作成された時刻です。</li> + <li>pool_counter はこの接続が使用された回数です。</li> </ul> -<p>$BJV5Q9T?t$O>o$K(Bnum_init_children$B$K$J$j$^$9!#(B -$B$^$?!"%G!<%?%Y!<%9L>$J$I$,I=<($5$l$k$N$O!"$=$N%W%m%;%9$K%U%m%s%H%(%s%I$+$i$N@\B3$,$"$k>l9g$K8B$j$^$9!#(B</p> +<p>返却行数は常にnum_init_childrenになります。 +また、データベース名などが表示されるのは、そのプロセスにフロントエンドからの接続がある場合に限ります。</p> <pre> benchs2=# show pool_processes; pool_pid | start_time | database | username | create_time | pool_counter @@ -3167,28 +3168,28 @@ benchs2=# show pool_processes; (5 lines) </pre> -<h2 id="pool_pools">pool_pools <span class="version">V3.0 $B!A(B</span></h2> -<p>"SHOW pool_pools"$B$O!"(Bpgpool-II$B$N%3%M%/%7%g%s%W!<%k$N>uBV$rI=<($7$^$9!#(B +<h2 id="pool_pools">pool_pools <span class="version">V3.0 〜</span></h2> +<p>"SHOW pool_pools"は、pgpool-IIのコネクションプールの状態を表示します。 </p> <p> -11$B$N%+%i%`$,$"$j$^$9!#(B +11のカラムがあります。 </p> <ul> - <li>start_time$B$O$3$N%W%m%;%9$,5/F0$5$l$?;~9o$G$9(B(1970$BG/(B1$B7n(B1$BF|$+$i$N7P2aIC$GI=<($5$l$^$9(B)$B!#(B</li> - <li>pool_pid $B$O(Bpgpool-II$B%W%m%;%9$N%W%m%;%9(BID$B$G$9!#(B</li> - <li>pool_id $B$O%3%M%/%7%g%s%W!<%k(BID$B$G$9!#(B(0$B$+$i(Bmax_pool-1$B$NCM$G$9(B)</li> - <li>backend_id $B$O(BPostgreSQL$B%P%C%/%(%s%I$N<1JL;R$G$9(B(0$B$+$i%P%C%/%(%s%I?t(B-1$B$NCM$G$9(B)</li> - <li>database$B$O$3$N%W%m%;%9$,@\B3$7$F$$$k%G!<%?%Y!<%9L>$G$9!#(B</li> - <li>username$B$O$3$N%W%m%;%9$N@\B3$G;HMQ$7$F$$$k%f!<%6L>$G$9!#(B</li> - <li>create_time is$B$O$3$N@\B3$,:n@.$5$l$?;~9o$G$9!#(B</li> - <li>majorversion $B$H(B minorversion $B$O$3$N@\B3$G;HMQ$5$l$F$$$k%W%m%H%3%k%P!<%8%g%sHV9f$G$9!#(B</li> - <li>pool_counter $B$O$3$N@\B3$,;HMQ$5$l$?2s?t$G$9!#(B</li> - <li>pool_backendpid $B$O(B PostgreSQL $B$N%P%C%/%(%s%I%W%m%;%9$N%W%m%;%9(BID$B$G$9!#(B</li> - <li>pool_connected $B$O??56CM$G!"(B0$B$J$i%U%m%s%H%(%s%I$+$i$N@\B3L5$7!"(B1$B$J$i@\B3$"$j$rI=$7$^$9!#(B</li> + <li>start_timeはこのプロセスが起動された時刻です(1970年1月1日からの経過秒で表示されます)。</li> + <li>pool_pid はpgpool-IIプロセスのプロセスIDです。</li> + <li>pool_id はコネクションプールIDです。(0からmax_pool-1の値です)</li> + <li>backend_id はPostgreSQLバックエンドの識別子です(0からバックエンド数-1の値です)</li> + <li>databaseはこのプロセスが接続しているデータベース名です。</li> + <li>usernameはこのプロセスの接続で使用しているユーザ名です。</li> + <li>create_time isはこの接続が作成された時刻です。</li> + <li>majorversion と minorversion はこの接続で使用されているプロトコルバージョン番号です。</li> + <li>pool_counter はこの接続が使用された回数です。</li> + <li>pool_backendpid は PostgreSQL のバックエンドプロセスのプロセスIDです。</li> + <li>pool_connected は真偽値で、0ならフロントエンドからの接続無し、1なら接続ありを表します。</li> </ul> -<p>$BJV5Q9T?t$O>o$K(B<a href="#NUM_INIT_CHILDREN">num_init_children</a> * <a href="#MAX_POOL">max_pool</a>$B$K$J$j$^$9!#(B +<p>返却行数は常に<a href="#NUM_INIT_CHILDREN">num_init_children</a> * <a href="#MAX_POOL">max_pool</a>になります。 <pre> benchs2=# show pool_pools; pool_pid | start_time | pool_id | backend_id | database | username | create_time | majorversion | minorversion | pool_counter | pool_backendpid | pool_connected @@ -3216,9 +3217,9 @@ benchs2=# show pool_pools; (20 lines) </pre> -<h2 id="pool_version">pool_version <span class="version">V3.0 $B!A(B</span></h2> -<p>"SHOW pool_version" $B$O(Bpgpool-II$B$N%P!<%8%g%s>pJs$rI=<($7$^$9!#(B -$BNc$r<($7$^$9!#(B +<h2 id="pool_version">pool_version <span class="version">V3.0 〜</span></h2> +<p>"SHOW pool_version" はpgpool-IIのバージョン情報を表示します。 +例を示します。 </p> <pre> benchs2=# show pool_version; @@ -3228,9 +3229,9 @@ benchs2=# show pool_version; (1 line) </pre> -<h2 id="pool_cache">pool_cache <span class="version">V3.1 $B!A(B</span></h2> -<p>"SHOW pool_cache" $B$O(B<a href="#memqcache">$B%*%s%a%b%j%/%(%j%-%c%C%7%e(B</a>$B$,M-8z$G$"$k>l9g$K!"%/%(%j%-%c%C%7%e$N%R%C%HN($d!"%-%c%C%7%e%9%H%l!<%8$N>u67$rI=<($7$^$9!#(B -$BNc$r<($7$^$9!#(B +<h2 id="pool_cache">pool_cache <span class="version">V3.1 〜</span></h2> +<p>"SHOW pool_cache" は<a href="#memqcache">オンメモリクエリキャッシュ</a>が有効である場合に、クエリキャッシュのヒット率や、キャッシュストレージの状況を表示します。 +例を示します。 </p> <p> <pre> @@ -3253,140 +3254,140 @@ fragment_cache_entries_size | 0 </p> <ul> -<li>num_cache_hits $B$O!"%-%c%C%7%e$K%R%C%H$7$?8!:w7o?t$rI=<($7$^$9!#(B</li> +<li>num_cache_hits は、キャッシュにヒットした検索件数を表示します。</li> <li> -num_selects $B$O!"%-%c%C%7%e$K%R%C%H$7$J$+$C$?8!:w7o?t$rI=<($7$^$9!#(B -cache_hit_ratio $B$O!"%-%c%C%7%e%R%C%HN($G!"(Bnum_cache_hits/(num_cache_hits+num_selects) -$B$+$i7W;;$5$l$F$$$^$9!#(B +num_selects は、キャッシュにヒットしなかった検索件数を表示します。 +cache_hit_ratio は、キャッシュヒット率で、num_cache_hits/(num_cache_hits+num_selects) +から計算されています。 </li> -<li>num_hash_entries $B0J2<$O!"%-%c%C%7%e%9%H%l!<%8$,6&M-%a%b%j$N;~$@$1M-8z$G$9!#(B</li> +<li>num_hash_entries 以下は、キャッシュストレージが共有メモリの時だけ有効です。</li> <li> -num_hash_entries $B$O!"%-%c%C%7%e$N8!:w%$%s%G%C%/%9$G$"$k%O%C%7%e%F!<%V%k$N%(%s%H%j?t$rI=$7!"(B -pgpool.conf$B$N(B <a href="MEMQCACHE_MAX_NUM_CACHE">memqcache_max_num_cache</a> $B$H0lCW$7$^$9!#(B -$B$3$NCM$,EPO?$G$-$k%-%c%C%7%e7o?t$N:GBgCM$K$J$j$^$9!#(B +num_hash_entries は、キャッシュの検索インデックスであるハッシュテーブルのエントリ数を表し、 +pgpool.confの <a href="MEMQCACHE_MAX_NUM_CACHE">memqcache_max_num_cache</a> と一致します。 +この値が登録できるキャッシュ件数の最大値になります。 </li> -<li>used_hash_entries $B$O!"(Bnum_hash_entries $B$N$&$A!";HMQ:Q$_$N%(%s%H%j?t$G$9!#(B</li> -<li>num_cache_entries $B$O!"%-%c%C%7%eK\BN$NEPO?7o?t$G!"(Bused_hash_entries $B$H0lCW$7$^$9!#(B</li> +<li>used_hash_entries は、num_hash_entries のうち、使用済みのエントリ数です。</li> +<li>num_cache_entries は、キャッシュ本体の登録件数で、used_hash_entries と一致します。</li> <li> -used_cache_enrties_size $B$O!";HMQ:Q$_$N%-%c%C%7%eNN0h$N9g7W%5%$%:$G$9!#(B -$BC10L$O%P%$%H$G$9!#(B +used_cache_enrties_size は、使用済みのキャッシュ領域の合計サイズです。 +単位はバイトです。 </li> <li> -free_cache_entries_size $B$O!"%-%c%C%7%eNN0h$N$&$A!"L$;HMQ$^$?$O:GMxMQ2DG=$JNN0h$N9g7W%5%$%:$G$9!#(B -$BC10L$O%P%$%H$G$9!#(B +free_cache_entries_size は、キャッシュ領域のうち、未使用または最利用可能な領域の合計サイズです。 +単位はバイトです。 </li> <li> -fragment_cache_entries_size $B$O!"6u$-NN0h$G$O$"$k$,!"CGJR2=$7$F$$$FMxMQ$G$-$J$$%-%c%C%7%eNN0h$N9g7W%5%$%:$G$9!#(B -$BC10L$O%P%$%H$G$9!#(B -$BCGJR2=$7$?NN0h$O!"MxMQ$G$-$k%-%c%C%7%eNN0h$r;H$$2L$?$7$?;~$K<+F0E*$K:FMxMQ$G$-$k$h$&$K$J$j$^$9!#(B +fragment_cache_entries_size は、空き領域ではあるが、断片化していて利用できないキャッシュ領域の合計サイズです。 +単位はバイトです。 +断片化した領域は、利用できるキャッシュ領域を使い果たした時に自動的に再利用できるようになります。 </li> </ul> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="online-recovery"></a>$B%*%s%i%$%s%j%+%P%j(B</h1> -<h2>$B%*%s%i%$%s%j%+%P%j35MW(B</h2> +<h1><a name="online-recovery"></a>オンラインリカバリ</h1> +<h2>オンラインリカバリ概要</h2> <p> -$B$3$N>O$G$O!"%l%W%j%1!<%7%g%s%b!<%I$GMxMQ$9$k>l9g$N%*%s%i%$%s%j%+%P%j5!G=(B -$B$K$D$$$F@bL@$7$^$9!#(B -$B%^%9%?!?%9%l!<%V%b!<%I(B(Streaming Replication)$B$G$N%*%s%i%$%s%j%+%P%j$NMxMQJ}K!$K$D$$$F$O!"(B -<a href="#stream">Streaming Replication$B$X$NBP1~(B</a>$B$r$4Mw2<$5$$!#(B -$B%l%W%j%1!<%7%g%s%b!<%I$G(B pgpool $B$,F0:n$7$F$$$k>l9g!"%@%&%s$7$?%N!<%I$N%G!<%?$r:FF14|$5$;$?>e$G!"(B -$B%N!<%I$rI|5"$5$;$k$3$H$,$G$-$^$9!#$3$N5!G=$r!V%*%s%i%$%s%j%+%P%j!W$H8F$S$^$9!#(B +この章では、レプリケーションモードで利用する場合のオンラインリカバリ機能 +について説明します。 +マスタ/スレーブモード(Streaming Replication)でのオンラインリカバリの利用方法については、 +<a href="#stream">Streaming Replicationへの対応</a>をご覧下さい。 +レプリケーションモードで pgpool が動作している場合、ダウンしたノードのデータを再同期させた上で、 +ノードを復帰させることができます。この機能を「オンラインリカバリ」と呼びます。 </p> <p> -$B%*%s%i%$%s%j%+%P%j$r<B;\$9$k$?$a$K$O!"%N!<%I$,@Z$jN%$5$l$F$$$k$H(B -pgpool $B$,8!CN$7$F$$$kI,MW$,$"$j$^$9!#%N!<%I$rF0E*$KDI2C$7$?$$>l9g$K$O(B -pgpool.conf $B$N(B backend_hostname$B$J$I$N%Q%i%a!<%?$rDI2C$7$F$*$-!"(B -$B@_Dj%U%!%$%k$r:FFI$_9~$_$5$;$k$H!"%N!<%I$,@Z$jN%$5$l$?>uBV$G(B pgpool $B$K%N!<%I>pJs$,EPO?$5$l$^$9!#(B +オンラインリカバリを実施するためには、ノードが切り離されていると +pgpool が検知している必要があります。ノードを動的に追加したい場合には +pgpool.conf の backend_hostnameなどのパラメータを追加しておき、 +設定ファイルを再読み込みさせると、ノードが切り離された状態で pgpool にノード情報が登録されます。 </p> <p> -$B$^$?!"%j%+%P%j$9$k%N!<%I$N(B PostgreSQL $B$,$9$G$KF0:nCf$G$"$l$P!"$"$i$+$8$a(B -PostgreSQL $B$r%7%c%C%H%@%&%s$5$;$F$*$$$F$/$@$5$$!#(B +また、リカバリするノードの PostgreSQL がすでに動作中であれば、あらかじめ +PostgreSQL をシャットダウンさせておいてください。 </p> <!-- <p> -<font color="red">$BCm0U(B: $B%*%s%i%$%s%j%+%P%j$r<B9T$9$kA0$K!"%^%9%?%N!<%I(B -($B2TF/Cf$N%N!<%I$N$&$A!"0lHVHV9f$,<c$$%N!<%I(B)$B>e$G$N(Bautovacuum$B$rDd;_$7$F$/$@$5$$!#(B -$B%*%s%i%$%s%j%+%P%jCf$K(Bautovacuum$B$,F0$/$H!"%G!<%?%Y!<%9$NFbMF$,JQ2=$9$k2DG=@-$,$"$k$?$a!"(B -$B%N!<%I4V$NF14|$,$-$A$s$H<h$l$J$/$J$k2DG=@-$,$"$j$^$9!#(B -$B$3$N@)8B$O!"(Brsync$B$J$I$NC1=c$J%3%T!<J}K!$r;H$C$F$$$k>l9g$K$N$_E,MQ$5$l$^$9!#(B -PostgreSQL$B$N(BPITR$B$r;H$C$F$$$k>l9g$OE,MQ$5$l$^$;$s!#(B +<font color="red">注意: オンラインリカバリを実行する前に、マスタノード +(稼働中のノードのうち、一番番号が若いノード)上でのautovacuumを停止してください。 +オンラインリカバリ中にautovacuumが動くと、データベースの内容が変化する可能性があるため、 +ノード間の同期がきちんと取れなくなる可能性があります。 +この制限は、rsyncなどの単純なコピー方法を使っている場合にのみ適用されます。 +PostgreSQLのPITRを使っている場合は適用されません。 </font> </p> --> <p> -pgpool $B$G$O%*%s%i%$%s%j%+%P%j$r(B 2 $BCJ3,$KJ,$1$F<B;\$7$^$9!#(B -pgpool $B$N%/%i%$%"%s%H$+$i$O40A4$J%G!<%?$NF14|$r<h$k$?$a$K<c43$N@\B3BT$A$,H/@8$7$^$9!#(B -$B%j%+%P%j<j=g$G0J2<$NDL$j$G$9!#(B +pgpool ではオンラインリカバリを 2 段階に分けて実施します。 +pgpool のクライアントからは完全なデータの同期を取るために若干の接続待ちが発生します。 +リカバリ手順で以下の通りです。 </p> <ol> - <li>CHECKPOINT $B<B9T(B</li> - <li>$B%U%!!<%9%H%9%F!<%8$N<B;\(B</li> - <li>$B@\B3$,$9$Y$F@ZCG$5$l$k$^$GBT5!(B</li> - <li>CHECKPOINT $B<B9T(B</li> - <li>$B%;%+%s%I%9%F!<%8$N<B;\(B</li> - <li>postmaster $B$N5/F0(B(pgpool_remote_start $B$N<B9T(B)</li> - <li>$B%N!<%I$NI|5"(B</li> + <li>CHECKPOINT 実行</li> + <li>ファーストステージの実施</li> + <li>接続がすべて切断されるまで待機</li> + <li>CHECKPOINT 実行</li> + <li>セカンドステージの実施</li> + <li>postmaster の起動(pgpool_remote_start の実行)</li> + <li>ノードの復帰</li> </ol> <p> -$B%G!<%?F14|$NBh0lCJ3,$r!V%U%!!<%9%H%9%F!<%8!W$H8F$S$^$9!#%U%!!<%9%H%9%F!<%8Cf$K(B1 $B2sL\$N%G!<%?F14|$r9T$$$^$9!#(B -$B%U%!!<%9%H%9%F!<%8Cf$O%G!<%?$N99?7$d;2>H$rJB9T$7$F9T$&$3$H$,$G$-$^$9!#(B +データ同期の第一段階を「ファーストステージ」と呼びます。ファーストステージ中に1 回目のデータ同期を行います。 +ファーストステージ中はデータの更新や参照を並行して行うことができます。 </p> <p> -$B%U%!!<%9%H%9%F!<%8$G=hM}$9$kFbMF$O%f!<%6$,Dj5A$9$k$3$H$,$G$-$^$9!#(B -$B%9%/%j%W%H$G$O(B 3 $B$D$N0z?t$r<u$1<h$k$3$H$,$G$-$^$9!#(B +ファーストステージで処理する内容はユーザが定義することができます。 +スクリプトでは 3 つの引数を受け取ることができます。 </p> <ol> - <li>$B%^%9%?$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</li> - <li>$B%j%+%P%j%N!<%I$N%[%9%HL>(B</li> - <li>$B%j%+%P%j%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</li> + <li>マスタのデータベースクラスタパス</li> + <li>リカバリノードのホスト名</li> + <li>リカバリノードのデータベースクラスタパス</li> </ol> <p> -$B<!$K(B 2 $B2sL\$N%G!<%?F14|$r9T$$$^$9!#$3$l$r!V%;%+%s%I%9%F!<%8!W$H8F$S$^$9!#(B -pgpool $B$G$O%;%+%s%I%9%F!<%8$KF~$kA0$K@\B3Cf$N%/%i%$%"%s%H$,$9$Y$F@\B3$,=*N;$5$l$k$^$GBT$A$^$9!#(B -$B$=$N4V$K@\B3%j%/%(%9%H$,Mh$?>l9g$K$O!"$=$N@\B3$r$9$Y$F%V%m%C%/$7$^$9!#(B +次に 2 回目のデータ同期を行います。これを「セカンドステージ」と呼びます。 +pgpool ではセカンドステージに入る前に接続中のクライアントがすべて接続が終了されるまで待ちます。 +その間に接続リクエストが来た場合には、その接続をすべてブロックします。 </p> <p> -$B%;%+%s%I%9%F!<%8$G=hM}$9$kFbMF$O%f!<%6$,Dj5A$9$k$3$H$,$G$-$^$9!#(B -$B%9%/%j%W%H$G$O(B 3 $B$D$N0z?t$r<u$1<h$k$3$H$,$G$-$^$9!#(B +セカンドステージで処理する内容はユーザが定義することができます。 +スクリプトでは 3 つの引数を受け取ることができます。 </p> <ol> - <li>$B%^%9%?$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</li> - <li>$B%j%+%P%j%N!<%I$N%[%9%HL>(B</li> - <li>$B%j%+%P%j%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B</li> + <li>マスタのデータベースクラスタパス</li> + <li>リカバリノードのホスト名</li> + <li>リカバリノードのデータベースクラスタパス</li> </ol> <p> -$B$9$Y$F$N@\B3$,=*N;$5$l$k$H!"%U%!!<%9%H%9%F!<%80J9_$K99?7$5$l$?%G!<%?$rF14|$9$k$?$a$N(B -$B%;%+%s%I%9%F!<%8$,3+;O$5$l$^$9!#$=$3$G:G=*E*$J%G!<%?$NF14|$r9T$$$^$9!#(B -$B$3$N4V$O%/%i%$%"%s%H$+$i$O(B pgpool $B$X$N@\B3$,BT$?$5$l$k>uBV$K$J$j$^$9!#(B +すべての接続が終了されると、ファーストステージ以降に更新されたデータを同期するための +セカンドステージが開始されます。そこで最終的なデータの同期を行います。 +この間はクライアントからは pgpool への接続が待たされる状態になります。 </p> <p> <font color="red"> -$B$J$*!"%*%s%i%$%s%j%+%P%j$N@)8B;v9`$H$7$F!"J#?t$N%[%9%H$K(B pgpool $B$rG[CV$7$F(B -$B%l%W%j%1!<%7%g%s$5$;$F$$$k>l9g$K$O!"%*%s%i%$%s%j%+%P%j$O@5$7$/F0:n$7$^$;$s!#(B -$B$I$l$+$N(B pgpool $B$K%j%+%P%j%j%/%(%9%H$r=P$7$?;~$K!"B>$N(B pgpool $B$+$i99?7$,EAHB$9$k$H!"(B -$B%G!<%?$rF14|$5$;$k$3$H$,$G$-$J$/(B -$B$J$j$^$9!#(B +なお、オンラインリカバリの制限事項として、複数のホストに pgpool を配置して +レプリケーションさせている場合には、オンラインリカバリは正しく動作しません。 +どれかの pgpool にリカバリリクエストを出した時に、他の pgpool から更新が伝搬すると、 +データを同期させることができなく +なります。 </font> </p> -<h2 id="online_recovery_params">pgpool $B$N@_Dj(B</h2> +<h2 id="online_recovery_params">pgpool の設定</h2> <p> -$B%*%s%i%$%s%j%+%P%j$r@_Dj$9$k$?$a$K$O!"(Bpgpool.conf $B$N0J2<$NCM$r@_Dj$7$F$/$@$5$$!#(B +オンラインリカバリを設定するためには、pgpool.conf の以下の値を設定してください。 </p> <ul> @@ -3397,10 +3398,10 @@ pgpool $B$G$O%;%+%s%I%9%F!<%8$KF~$kA0$K@\B3Cf$N%/%i%$%"%s%H$,$9$Y$F@\B3$,=*N;$5 <li><a href="#RECOVERY_2ND_STAGE_COMMAND">recovery_2nd_stage_command></a></li> </ul> -<h2 id="installing-c-functions">C $B8@8l4X?t$N%$%s%9%H!<%k(B</h2> +<h2 id="installing-c-functions">C 言語関数のインストール</h2> <p> -$B<!$K!"%j%+%P%j$r<B;\$9$k$?$a$N(B PostgreSQL $B$N(B C $B8@8l4X?t$r3F%N!<%I$N(B -template1 $B%G!<%?%Y!<%9$K%$%s%9%H!<%k$7$^$9!#%=!<%9%3!<%I$O(B +次に、リカバリを実施するための PostgreSQL の C 言語関数を各ノードの +template1 データベースにインストールします。ソースコードは </p> <pre> @@ -3408,7 +3409,7 @@ pgpool-II-x.x.x/sql/pgpool-recovery/ </pre> <p> -$B$K$"$j$^$9!#%G%#%l%/%H%j$r0\F0$7!"(Bmake install $B$7$F$/$@$5$$!#(B +にあります。ディレクトリを移動し、make install してください。 </p> <pre> @@ -3417,7 +3418,7 @@ pgpool-II-x.x.x/sql/pgpool-recovery/ </pre> <p> -C $B8@8l4X?t$N%b%8%e!<%k$r%$%s%9%H!<%k$7$?$i!"B3$$$F(B C $B8@8l4X?t$r8F$S$@$9$?$a$N(B SQL $B$r%$%s%9%H!<%k$7$^$9!#(B +C 言語関数のモジュールをインストールしたら、続いて C 言語関数を呼びだすための SQL をインストールします。 </p> <pre> @@ -3425,26 +3426,26 @@ C $B8@8l4X?t$N%b%8%e!<%k$r%$%s%9%H!<%k$7$?$i!"B3$$$F(B C $B8@8l4X?t$r8F$S$@$9 % psql -f pgpool-recovery.sql template1 </pre> -<h2 id="recovery_script">$B%j%+%P%j%9%/%j%W%H$NG[CV(B</h2> +<h2 id="recovery_script">リカバリスクリプトの配置</h2> <p> -$B%G!<%?$rF14|$5$;$k$?$a$N%9%/%j%W%H$H!"%j%b!<%H$+$i(B postmaster $B$r:F5/F0$5$;$k$?$a$N%9%/%j%W%H$r(B -$B3F%N!<%I$N(B $PGDATA $B0J2<$KG[CV$7$^$9!#(B -$B$"$i$+$8$a(Bpgpool-II-x.x.x/sample $B0J2<$K%5%s%W%k%9%/%j%W%H$bMQ0U$7$F$"$j$^$9$N$G;29M$K$7$F$/$@$5$$!#(B -$B$3$3$G$O%5%s%W%k%9%/%j%W%H$r;H$C$F!"(BPITR $B$K$h$k%j%+%P%jJ}K!$H!"(Brsync $B$K$h$k%j%+%P%jJ}K!$r@bL@$7$^$9!#(B +データを同期させるためのスクリプトと、リモートから postmaster を再起動させるためのスクリプトを +各ノードの $PGDATA 以下に配置します。 +あらかじめpgpool-II-x.x.x/sample 以下にサンプルスクリプトも用意してありますので参考にしてください。 +ここではサンプルスクリプトを使って、PITR によるリカバリ方法と、rsync によるリカバリ方法を説明します。 </p> -<h3 id="recovery_pitr">PITR $B$K$h$k%j%+%P%j(B</h3> +<h3 id="recovery_pitr">PITR によるリカバリ</h3> <p> -$B$3$3$G$O(B PostgreSQL 8.2 $B0J9_$G(B PITR $B5!G=$r;H$C$F%j%+%P%j$r$9$k@_DjNc$r@bL@$7$^$9!#(B -PITR $B$K$h$k%j%+%P%j$r$9$k>l9g$K$O$"$i$+$8$a(B PostgreSQL $B$N@_Dj$G(B -$B%m%0$r%"!<%+%$%V$5$;$k$h$&$K$7$F$*$$$F$/$@$5$$!#(B +ここでは PostgreSQL 8.2 以降で PITR 機能を使ってリカバリをする設定例を説明します。 +PITR によるリカバリをする場合にはあらかじめ PostgreSQL の設定で +ログをアーカイブさせるようにしておいてください。 </p> <h4>1st stage</h4> <p> -$B$^$:%U%!!<%9%H%9%F!<%8$G%Y!<%9%P%C%/%"%C%W$r<hF@$7!"%j%+%P%j@h$X%3%T!<$9$k%9%/%j%W%H(B -($B$3$3$G$O%U%!%$%kL>$r(B copy-base-backup $B$H$7$^$9(B)$B$rMQ0U$7$^$9!#(B -$BNc$($P0J2<$N$h$&$J%9%/%j%W%H$G<hF@$9$k$3$H$,$G$-$^$9!#(B +まずファーストステージでベースバックアップを取得し、リカバリ先へコピーするスクリプト +(ここではファイル名を copy-base-backup とします)を用意します。 +例えば以下のようなスクリプトで取得することができます。 </p> <pre> @@ -3462,7 +3463,7 @@ scp pgsql.tar.gz $RECOVERY_TARGET:$RECOVERY_DATA </pre> <p> -$B%Y!<%9%P%C%/%"%C%W<hF@;~$K(B recovery.conf $B$r@8@.$7$F$*$-$^$9!#(B +ベースバックアップ取得時に recovery.conf を生成しておきます。 </p> <pre> restore_command = 'scp master:/data/archive_log/%f %p' @@ -3471,22 +3472,22 @@ restore_command = 'scp master:/data/archive_log/%f %p' <h4>2nd stage</h4> <p> -$B%;%+%s%I%9%F!<%8$G$O:G?7$N>uBV$^$G(B PITR $B$K$h$k%j%+%P%j$r<B;\$G$-$k$h$&$K$9$k$?$a$K!"(B -pgpool_recovery_pitr $B%9%/%j%W%H$r(B$PGDATA $B$K%3%T!<$7$^$9!#(B -$B$3$N%9%/%j%W%H$G$O%H%i%s%6%/%7%g%s%m%0$r6/@)E*$K@Z$jBX$($k$h$&$K$7$^$9!#(B +セカンドステージでは最新の状態まで PITR によるリカバリを実施できるようにするために、 +pgpool_recovery_pitr スクリプトを$PGDATA にコピーします。 +このスクリプトではトランザクションログを強制的に切り替えるようにします。 </p> <p> -$BDL>o!"%H%i%s%6%/%7%g%s%m%0$r@Z$jBX$($k$K$O!"(Bpg_switch_xlog $B4X?t$rMxMQ$7$^$9$,!"(B -$B$3$N4X?t$O!"%"!<%+%$%V%m%0%U%!%$%k$,@8@.$5$l$kA0$K=*N;$7$F$7$^$&2DG=@-$,$"$j$^$9!#(B +通常、トランザクションログを切り替えるには、pg_switch_xlog 関数を利用しますが、 +この関数は、アーカイブログファイルが生成される前に終了してしまう可能性があります。 </p> -<p><span class="version">V3.1 $B!A(B</span> -$B$=$3$G!"$h$j0BA4$K%*%s%i%$%s%j%+%P%j$r9T$&$?$a$K(B -pgpool_switch_xlog $B4X?t$,MQ0U$5$l$F$$$^$9!#(B -pgpool_switch_xlog $B4X?t$N4pK\F0:n$O(B pg_switch_xlog $B4X?t$HF1$8$G$9$,!"(B -$B%H%i%s%6%/%7%g%s%m%0$N@Z$jBX$($K$h$k%"!<%+%$%V%m%0%U%!%$%k$N@8@.$r(B -$BBT$C$F$+$i=*N;$7$^$9!#(B -$B$3$N4X?t$O!"A0=R$N!V(BC$B8@8l4X?t$N%$%s%9%H!<%k!W$r<B;\$9$k$H%$%s%9%H!<%k$5$l!"(B -$B0z?t$K$O%"!<%+%$%V%m%0$N=PNO@h%G%#%l%/%H%j$r;XDj$7$^$9!#(B +<p><span class="version">V3.1 〜</span> +そこで、より安全にオンラインリカバリを行うために +pgpool_switch_xlog 関数が用意されています。 +pgpool_switch_xlog 関数の基本動作は pg_switch_xlog 関数と同じですが、 +トランザクションログの切り替えによるアーカイブログファイルの生成を +待ってから終了します。 +この関数は、前述の「C言語関数のインストール」を実施するとインストールされ、 +引数にはアーカイブログの出力先ディレクトリを指定します。 </p> <p> <pre> @@ -3512,12 +3513,12 @@ psql -p $port -c "SELECT pgpool_switch_xlog('$archdir')" template1 </pre> <p> -$B%9%/%j%W%HCf$N(Bwhile$B%k!<%W$O!"A4%G!<%?%Y!<%9Cf$N%7!<%1%s%9CM$r%H%i%s%6%/%7%g%s%m%0$KEG$-=P$7$^$9!#(B -$B$3$l$K$h$C$F!"%7!<%1%s%9$b@5$7$/%j%+%P%j$5$l$k$h$&$K$J$j$^$9!#(B +スクリプト中のwhileループは、全データベース中のシーケンス値をトランザクションログに吐き出します。 +これによって、シーケンスも正しくリカバリされるようになります。 </p> <p> -$B%9%/%j%W%H$NG[CV$,40N;$7$?$i(B pgpool.conf $B$K@_Dj$7$^$9!#(B +スクリプトの配置が完了したら pgpool.conf に設定します。 </p> <pre> @@ -3526,29 +3527,29 @@ recovery_2nd_stage_command = 'pgpool_recovery_pitr' </pre> <p> -$B$3$l$G(B PITR $B$K$h$k%*%s%i%$%s%j%+%P%j$N=`Hw$,40N;$G$9!#(B +これで PITR によるオンラインリカバリの準備が完了です。 </p> <h4 id="pool_remote_start">pgpool_remote_start</h4> <p> -$B%G!<%?:FF14|8e$K(B postmaster $B$r5/F0$5$;$k%9%/%j%W%H$G$9!#(B -pgpool $B$+$i$O0J2<$N7A<0$G%9%/%j%W%H$r<B9T$7$^$9!#(B +データ再同期後に postmaster を起動させるスクリプトです。 +pgpool からは以下の形式でスクリプトを実行します。 </p> <pre> % pgpool_remote_start remote_host remote_datadir -remote_host: $B%j%+%P%j%N!<%I$N%[%9%HL>(B -remote_datadir: $B%j%+%P%j%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B +remote_host: リカバリノードのホスト名 +remote_datadir: リカバリノードのデータベースクラスタパス </pre> <p> -$B%5%s%W%k%9%/%j%W%H$G$O(B ssh $B7PM3$G(B postmaster $B$r5/F0$7$F$$$^$9!#(B -$B$3$A$i$b$"$i$+$8$a%Q%9%U%l!<%:L5$7$G(B ssh $B7PM3$G%m%0%$%s$G$-$k$h$&$K@_Dj$7$F$*$/I,MW$,$"$j$^$9!#(B +サンプルスクリプトでは ssh 経由で postmaster を起動しています。 +こちらもあらかじめパスフレーズ無しで ssh 経由でログインできるように設定しておく必要があります。 </p> <p> -PITR $B$K$h$k%j%+%P%j$G$"$l$P!"(Bpgpool_remote_start $BFb$G%Y!<%9%P%C%/%"%C%W$rE83+$7!"(B -recovery.conf $B$NFbMF$K$7$?$,$C$F%j%+%P%j$7$?8e$K(Bpostmaster $B$,@\B32DG=>uBV$K$J$j$^$9!#(B +PITR によるリカバリであれば、pgpool_remote_start 内でベースバックアップを展開し、 +recovery.conf の内容にしたがってリカバリした後にpostmaster が接続可能状態になります。 </p> <pre> @@ -3563,47 +3564,47 @@ ssh -T $DEST 'cd /data/; tar zxf pgsql.tar.gz' 2&gt;/dev/null 1&gt;/dev/null &lt ssh -T $DEST $PGCTL -w -D $DESTDIR start 2&gt;/dev/null 1&gt;/dev/null &lt; /dev/null &amp; </pre> -<h3 id="recovery_rsync">rsync $B$K$h$k%j%+%P%j(B </h3> +<h3 id="recovery_rsync">rsync によるリカバリ </h3> <p> -7.4 $B0JA0$N>l9g$O(B PITR $B5!G=$,$"$j$^$;$s!#$^$?!"(B8.0 $B$H(B 8.1 $B$N>l9g$O(B -$B%H%i%s%6%/%7%g%s%m%0$r6/@)E*$K@Z$jBX$($k4X?t$,MQ0U$5$l$F$$$^$;$s!#(B -$B$=$3$G(B PITR $B$r;H$o$:$K(Brsync $B$r;H$C$?%j%+%P%jJ}K!$r@bL@$7$^$9!#(B +7.4 以前の場合は PITR 機能がありません。また、8.0 と 8.1 の場合は +トランザクションログを強制的に切り替える関数が用意されていません。 +そこで PITR を使わずにrsync を使ったリカバリ方法を説明します。 </p> <p> -sample $B%G%#%l%/%H%j$K(B pgpool_recovery $B$H$$$&%U%!%$%k$,$"$j$^$9!#(B -$B%^%9%?$+$iI|5"$5$;$k%N!<%I$X$N%G!<%?$NJ*M}%3%T!<$r9T$&%9%/%j%W%H$G$9!#(B -pgpool $B$+$i$O0J2<$N7A<0$G%9%/%j%W%H$r<B9T$7$^$9!#(B +sample ディレクトリに pgpool_recovery というファイルがあります。 +マスタから復帰させるノードへのデータの物理コピーを行うスクリプトです。 +pgpool からは以下の形式でスクリプトを実行します。 </p> <pre> % pgpool_recovery datadir remote_host remote_datadir -datadir: $B%^%9%?$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B -remote_host: $B%j%+%P%j%N!<%I$N%[%9%HL>(B -remote_datadir: $B%j%+%P%j%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B +datadir: マスタのデータベースクラスタパス +remote_host: リカバリノードのホスト名 +remote_datadir: リカバリノードのデータベースクラスタパス </pre> <p> -$B%5%s%W%k%9%/%j%W%H$G$O(B rsync $B$r;H$C$FJ*M}%3%T!<$r$7$F$$$^$9!#$b$7(B -rsync $B$r;H$&>l9g$O!"%Q%9%U%l!<%:L5$7$G(B ssh $B7PM3$G%m%0%$%s$G$-$k$h$&$K(B -$B$"$i$+$8$a@_Dj$7$F$*$/I,MW$,$"$j$^$9!#(B +サンプルスクリプトでは rsync を使って物理コピーをしています。もし +rsync を使う場合は、パスフレーズ無しで ssh 経由でログインできるように +あらかじめ設定しておく必要があります。 </p> <p> -rsync$B$K4X$9$kCm5-(B: +rsyncに関する注記: </p> <ul> - <li>-c (or --checksum) $B%*%W%7%g%s$rIU$1$J$$$H!"%U%!%$%k$,3N<B$KE>Aw$5$l$J$$>l9g$,$"$j$^$9!#(B</li> - <li>-z (or --compress)$B%*%W%7%g%s$ODcB.$J%M%C%H%o!<%/$G$O8z2L$,$"$j$^$9$,!"(B - 100M$B0J>e$N9bB.$J%M%C%H%o!<%/$G$O$+$($C$F(BCPU$BIi2Y$rA}$d$7!"7k2LE*$KCY$/$J$k$3$H$,$"$j$^$9!#(B - $B9bB.%M%C%H%o!<%/$G$O!"$3$N%*%W%7%g%s$r;HMQ$7$J$$$3$H$r$*4+$a$7$^$9!#(B + <li>-c (or --checksum) オプションを付けないと、ファイルが確実に転送されない場合があります。</li> + <li>-z (or --compress)オプションは低速なネットワークでは効果がありますが、 + 100M以上の高速なネットワークではかえってCPU負荷を増やし、結果的に遅くなることがあります。 + 高速ネットワークでは、このオプションを使用しないことをお勧めします。 </li> - <li>rsync $B$N?7$7$$%P!<%8%g%s(B(3.0.5)$B$G$O!"(B50%$B$b@-G=$,NI$/$J$C$?$H$$$&Js9p$,(B - pgpool-general$B%a!<%j%s%0%j%9%H$G$"$j$^$7$?!#(B + <li>rsync の新しいバージョン(3.0.5)では、50%も性能が良くなったという報告が + pgpool-generalメーリングリストでありました。 </li> </ul> <p> -pgpool_recovery $B$r;H$&>l9g$O(B pgpool.conf $B$K0J2<$N9T$rDI2C$7$F$/$@$5$$!#(B +pgpool_recovery を使う場合は pgpool.conf に以下の行を追加してください。 </p> <pre> @@ -3611,39 +3612,39 @@ recovery_1st_stage_command = 'pgpool_recovery' recovery_2nd_stage_command = 'pgpool_recovery' </pre> -<h2 id="perform_online_recovery">$B%j%+%P%j$N<B9T(B</h2> +<h2 id="perform_online_recovery">リカバリの実行</h2> <p> -$B0J>e$G%*%s%i%$%s%j%+%P%j$N=`Hw$,@0$$$^$7$?!#(B -$B%*%s%i%$%s%j%+%P%j$r<B9T$9$k$K$O(B <a href="#pcp_recovery_node">pcp_recovery_node</a> $B%3%^%s%I$r;H$&$+!"(B -pgpool $B4IM}%D!<%k$+$i<B9T$7$F$/$@$5$$!#(B +以上でオンラインリカバリの準備が整いました。 +オンラインリカバリを実行するには <a href="#pcp_recovery_node">pcp_recovery_node</a> コマンドを使うか、 +pgpool 管理ツールから実行してください。 </p> <p> -$BCm0UE@$H$7$F!"(B<a href="#pcp_recovery_node">pcp_recovery_node</a> $B$r<B9T$9$k:]$K!"%?%$%`%"%&%H$rD9$/$7$F(B -$B$/$@$5$$!#(BpgpoolAdmin $B$+$i<B9T$9$k>l9g$O(B pgmgt.conf.php $BFb$N(B -_PGPOOL2_PCP_TIMEOUT $B$rBg$-$/$7$F$/$@$5$$!#(B +注意点として、<a href="#pcp_recovery_node">pcp_recovery_node</a> を実行する際に、タイムアウトを長くして +ください。pgpoolAdmin から実行する場合は pgmgt.conf.php 内の +_PGPOOL2_PCP_TIMEOUT を大きくしてください。 </p> -<h2 id="minorup_w_online_recovery">$B%*%s%i%$%s%j%+%P%j$rMxMQ$7$?(BPostgreSQL$B$N%^%$%J!<%P!<%8%g%s%"%C%W(B</h2> -<h3>$B%l%W%j%1!<%7%g%s%b!<%I$N>l9g(B</h3> +<h2 id="minorup_w_online_recovery">オンラインリカバリを利用したPostgreSQLのマイナーバージョンアップ</h2> +<h3>レプリケーションモードの場合</h3> <p> -$B%l%W%j%1!<%7%g%s%b!<%I$G(Bpgpool-II$B$,F0:n$7$F$$$k>l9g$O!"(B -$B%*%s%i%$%s$G3F%N!<%I$N(BPostgreSQL$B$r%P!<%8%g%s%"%C%W$G$-$^$9!#(B -$B$?$@$7!"%N!<%I$N@Z$jN%$7;~$HDI2C;~$K!"(Bpgpool-II$B$K@\B3$7$F$$$k$9$Y$F$N(B -$B$9$Y$F$N%;%C%7%g%s$,@ZCG$5$l$k$N$GCm0U$7$F$/$@$5$$!#(B -$B$^$?!"%*%s%i%$%s%j%+%P%j$,MxMQ$G$-$k%P!<%8%g%s%"%C%W$O%^%$%J!<%P!<%8%g%s%"%C%W$N$_$G!"(B -$B%@%s%W(B/$B%j%9%H%"$,ITMW$J%j%j!<%9$K8B$j$^$9!#(B +レプリケーションモードでpgpool-IIが動作している場合は、 +オンラインで各ノードのPostgreSQLをバージョンアップできます。 +ただし、ノードの切り離し時と追加時に、pgpool-IIに接続しているすべての +すべてのセッションが切断されるので注意してください。 +また、オンラインリカバリが利用できるバージョンアップはマイナーバージョンアップのみで、 +ダンプ/リストアが不要なリリースに限ります。 </p> <p> -$B$O$8$a$K!">e5-$N!V%*%s%i%$%s%j%+%P%j$N35MW!W$r;29M$K3F%N!<%I$G%*%s%i%$%s%j%+%P%j$,MxMQ$G$-$k$h$&$K=`Hw$7$^$9!#(B +はじめに、上記の「オンラインリカバリの概要」を参考に各ノードでオンラインリカバリが利用できるように準備します。 </p> <p> -PostgreSQL$B$N%P!<%8%g%s%"%C%W$O!"%^%9%?0J30$N%N!<%I$+$i9T$$!":G8e$K%^%9%?%N!<%I$r%P!<%8%g%s%"%C%W$7$^$9!#(B -$B$=$3$G!"$^$:%P!<%8%g%s%"%C%W$r9T$&%^%9%?0J30$N#1$D$N%N!<%I$N(BPostgreSQL$B$rDd;_$7$^$9!#(B -pgpool-II$B$,(BPostgreSQL$B$NDd;_$r8!CN$9$k$H!"0J2<$N$h$&$J%m%0$r=PNO$7$F=LB`1?E>$K0\9T$7$^$9!#(B -$B$=$N:]!"(Bpgpool-II$B$K@\B3$7$F$$$k$9$Y$F$N%;%C%7%g%s$O0lC6@ZCG$5$l$^$9!#(B +PostgreSQLのバージョンアップは、マスタ以外のノードから行い、最後にマスタノードをバージョンアップします。 +そこで、まずバージョンアップを行うマスタ以外の1つのノードのPostgreSQLを停止します。 +pgpool-IIがPostgreSQLの停止を検知すると、以下のようなログを出力して縮退運転に移行します。 +その際、pgpool-IIに接続しているすべてのセッションは一旦切断されます。 </p> <pre> 2010-07-27 16:32:29 LOG: pid 10215: set 1 th backend down status @@ -3653,227 +3654,479 @@ pgpool-II$B$,(BPostgreSQL$B$NDd;_$r8!CN$9$k$H!"0J2<$N$h$&$J%m%0$r=PNO$7$F=LB` </pre> <p> -$BDd;_$7$?%N!<%I$N(BPostgreSQL$B$r%P!<%8%g%s%"%C%W$7$^$9!#(B -$B%P!<%8%g%s%"%C%W$O!"?7$7$$%P!<%8%g%s$N(BPostgreSQL$B$r8E$$%P!<%8%g%s$N%$%s%9%H!<%k@h$K>e=q$-$7$F$b9=$$$^$;$s$,!"(B -$BLdBj$,5/$-$?;~$K85$N%P!<%8%g%s$KLa$;$k$h$&$K%$%s%9%H!<%k@h$rJQ$($F$*$/$3$H$r$*4+$a$7$^$9!#(B +停止したノードのPostgreSQLをバージョンアップします。 +バージョンアップは、新しいバージョンのPostgreSQLを古いバージョンのインストール先に上書きしても構いませんが、 +問題が起きた時に元のバージョンに戻せるようにインストール先を変えておくことをお勧めします。 </p> <p> -$B?7$7$$%P!<%8%g%s$N(BPostgreSQL$B$r8E$$%P!<%8%g%s$HJL$N>l=j$K%$%s%9%H!<%k$7$?>l9g!"(B -$B%j%+%P%j%9%/%j%W%H$rJT=8$9$k$3$H$J$/$=$N$^$^;HMQ$9$k$K$O!"%7%s%\%j%C%/%j%s%/$J$I$r;HMQ$7$F%$%s%9%H!<%k@h$N%Q%9$r0JA0$H9g$o$;$kI,MW$,$"$j$^$9!#(B -$B>e=q$-%$%s%9%H!<%k$7$?>l9g$O0J2<$N(BC$B8@8l4X?t$r%$%s%9%H!<%k$9$k$^$G$NA`:n$OITMW$G$9!#(B -$B$9$0$K%*%s%i%$%s%j%+%P%j$,<B9T$G$-$^$9!#(B +新しいバージョンのPostgreSQLを古いバージョンと別の場所にインストールした場合、 +リカバリスクリプトを編集することなくそのまま使用するには、シンボリックリンクなどを使用してインストール先のパスを以前と合わせる必要があります。 +上書きインストールした場合は以下のC言語関数をインストールするまでの操作は不要です。 +すぐにオンラインリカバリが実行できます。 </p> <p> -$B8E$$%P!<%8%g%s$N(BPostgreSQL$B$N%$%s%9%H!<%k@h%G%#%l%/%H%jL>$rJQ99$7$^$9!#(B -$B0J2<$O!"(BPostgreSQL$B$,(B/usr/local/pgsql$B$K%$%s%9%H!<%k$5$l$F$$$?$H2>Dj$7$?0lNc$G$9!#(B +古いバージョンのPostgreSQLのインストール先ディレクトリ名を変更します。 +以下は、PostgreSQLが/usr/local/pgsqlにインストールされていたと仮定した一例です。 </p> <pre> $ mv /usr/local/pgsql /usr/local/pgsql-old </pre> <p> -$B?7$7$$%P!<%8%g%s$N(BPostgreSQL$B$N%$%s%9%H!<%k@h$K%7%s%\%j%C%/%j%s%/$r:n@.$7$^$9!#(B -$B$3$l$K$h$j!":#$^$G$I$*$j$N%Q%9$G?7$7$$%P!<%8%g%s$N(BPostgreSQL$B$,;HMQ$G$-$k$h$&$K$J$j$^$9!#(B -$B0J2<$O!"?7$7$$%P!<%8%g%s$N(BPostgreSQL$B$,(B/usr/local/pgsql-new$B$K%$%s%9%H!<%k$5$l$F$$$k$H2>Dj$7$?0lNc$G$9!#(B +新しいバージョンのPostgreSQLのインストール先にシンボリックリンクを作成します。 +これにより、今までどおりのパスで新しいバージョンのPostgreSQLが使用できるようになります。 +以下は、新しいバージョンのPostgreSQLが/usr/local/pgsql-newにインストールされていると仮定した一例です。 </p> <pre> $ ln -s /usr/local/pgsql-new /usr/local/pgsql </pre> <p> -$B%G!<%?%Y!<%9%/%i%9%?%G%#%l%/%H%j$,(BPostgreSQL$B$N%$%s%9%H!<%k@h%G%#%l%/%H%j$N2<0L$K$"$k>l9g$O!"(B -$BF1$8%Q%9$G%G!<%?%Y!<%9%/%i%9%?$K%"%/%;%9$G$-$k$h$&$K%7%s%\%j%C%/%j%s%/$r:n@.$9$k$+%3%T!<$7$^$9!#(B -$B0J2<$O!"%7%s%\%j%C%/%j%s%/$r:n@.$9$kNc$G$9!#(B +データベースクラスタディレクトリがPostgreSQLのインストール先ディレクトリの下位にある場合は、 +同じパスでデータベースクラスタにアクセスできるようにシンボリックリンクを作成するかコピーします。 +以下は、シンボリックリンクを作成する例です。 </p> <pre> $ ln -s /usr/local/pgsql-old/data /usr/local/pgsql/data </pre> <p> -$B?7$7$$%P!<%8%g%s$N(BPostgreSQL$B$K!"%*%s%i%$%s%j%+%P%jMQ$N4X?t$r(B -$B!V(BC$B8@8l4X?t$N%$%s%9%H!<%k!W$r;29M$K%$%s%9%H!<%k$7$^$9!#(B -$B%*%s%i%$%s%j%+%P%j$O!"%G!<%?%Y!<%9%/%i%9%?$r%3%T!<$7$^$9$N$G!":G8e$N(Bpsql$B$r;HMQ$7$?4X?t$N:n@.$OITMW$G$9!#(B -make install$B$r<B9T$7$F$/$@$5$$!#(B +新しいバージョンのPostgreSQLに、オンラインリカバリ用の関数を +「C言語関数のインストール」を参考にインストールします。 +オンラインリカバリは、データベースクラスタをコピーしますので、最後のpsqlを使用した関数の作成は不要です。 +make installを実行してください。 </p> <p> -$B:G8e$K%*%s%i%$%s%j%+%P%j$r<B9T$7$F!"#1$D$N%N!<%I$N%P!<%8%g%s%"%C%W$,40N;$7$^$9!#(B -$B%*%s%i%$%s%j%+%P%j$O!"(Bpcp_recovery_node$B%3%^%s%I$r<B9T$9$k$+(BpgpoolAdmin$B$G9T$$$^$9!#(B +最後にオンラインリカバリを実行して、1つのノードのバージョンアップが完了します。 +オンラインリカバリは、pcp_recovery_nodeコマンドを実行するかpgpoolAdminで行います。 </p> <p> -$B0J>e$N<j=g$r%^%9%?0J30$N%N!<%I$G7+$jJV$7!":G8e$K%^%9%?%N!<%I$G9T$($P!"(B -$BA4BN$N(BPostgreSQL$B$N%^%$%J!<%P!<%8%g%s%"%C%W$O40N;$G$9!#(B +以上の手順をマスタ以外のノードで繰り返し、最後にマスタノードで行えば、 +全体のPostgreSQLのマイナーバージョンアップは完了です。 </p> -<h3>Streaming Replication$B$rMxMQ$7$F$$$k>l9g(B</h3> +<h3>Streaming Replicationを利用している場合</h3> <p> -$B%^%9%?!<%9%l!<%V%b!<%I$G(BStreaming Replication$B$rMxMQ$7$F$$$k>l9g$O!"(B -$B%*%s%i%$%s$G%9%?%s%P%$$N(BPostgreSQL$B$r%^%$%J!<%P!<%8%g%s%"%C%W$G$-$^$9!#(B +マスタースレーブモードでStreaming Replicationを利用している場合は、 +オンラインでスタンバイのPostgreSQLをマイナーバージョンアップできます。 </p> <p> -$B%9%?%s%P%$$N(BPostgreSQL$B$r%^%$%J!<%P!<%8%g%s%"%C%W$9$k<j=g$O!">e5-$N%l%W%j%1!<%7%g%s%b!<%I$N<j=g$HF1$8$G$9!#(B -$B$?$@$7!"(Brecovery_1st_stage_command$B$H(Brecovery_2nd_stage_command$B$N@_Dj$J$I$O!"(B -$B!V(BStreaming Replication$B$G$N%*%s%i%$%s%j%+%P%j!W$r;29M$K$7$F$/$@$5$$!#(B +スタンバイのPostgreSQLをマイナーバージョンアップする手順は、上記のレプリケーションモードの手順と同じです。 +ただし、recovery_1st_stage_commandとrecovery_2nd_stage_commandの設定などは、 +「Streaming Replicationでのオンラインリカバリ」を参考にしてください。 </p> <p> -$B%W%i%$%^%j$N(BPostgreSQL$B$N%^%$%J!<%P!<%8%g%s%"%C%W$O!"%*%s%i%$%s$G$O$G$-$^$;$s!#(B -pgpool-II$B$NDd;_$,I,MW$K$J$j$^$9!#(B -$B%W%i%$%^%j$N(BPostgreSQL$B$b%P!<%8%g%s%"%C%W$NJ}K!<+BN$O!"%9%?%s%P%$$HF1MM$G$9!#(B -$B%W%i%$%^%j$N(BPostgreSQL$B$N%P!<%8%g%s%"%C%W$O0J2<$N<j=g$G9T$$$^$9!#(B +プライマリのPostgreSQLのマイナーバージョンアップは、オンラインではできません。 +pgpool-IIの停止が必要になります。 +プライマリのPostgreSQLもバージョンアップの方法自体は、スタンバイと同様です。 +プライマリのPostgreSQLのバージョンアップは以下の手順で行います。 <ol> -<li>pgpool-II$B$rDd;_(B -<li>$B%W%i%$%^%j$N(BPostgreSQL$B$rDd;_(B -<li>$B%W%i%$%^%j$N(BPostgreSQL$B$r%P!<%8%g%s%"%C%W(B -<li>$B%W%i%$%^%j$N(BPostgreSQL$B$r5/F0(B -<li>pgpool-II$B$r5/F0(B +<li>pgpool-IIを停止 +<li>プライマリのPostgreSQLを停止 +<li>プライマリのPostgreSQLをバージョンアップ +<li>プライマリのPostgreSQLを起動 +<li>pgpool-IIを起動 </ol> </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="backup"></a>$B%P%C%/%"%C%W(B</h1> +<h1><a name="backup"></a>バックアップ</h1> <p> -$B%P%C%/%(%s%I$H%7%9%F%`(BDB$B$N(BPostgreSQL$B$N%P%C%/%"%C%W$O!"C1BN$N(BPostgreSQL$B$HF1MM$K!"(B -$BJ*M}%P%C%/%"%C%W!"O@M}%P%C%/%"%C%W(B(pg_dump, pg_dumpall)$B!"(BPITR$B$,;HMQ$G$-$^$9!#(B -$B$?$@$7!"O@M}%P%C%/%"%C%W$H(BPITR$B$NA`:n$O!"(Bpgpool-II$B$r7PM3$;$:$K(BPostgreSQL$B$KBP$7$FD>@\9T$C$F$/$@$5$$!#(B -$B$3$l$O!"(B<a href="#LOAD_BALANCE_MODE">load_balance_mode</a>$B$d(B<a href="#REPLICATE_SELECT">replicate_select</a>$B$J$I$N(B -$B@_Dj$K$h$k%P%C%/%"%C%W$N<:GT$rHr$1$k$?$a$G$9!#(B +バックエンドとシステムDBのPostgreSQLのバックアップは、単体のPostgreSQLと同様に、 +物理バックアップ、論理バックアップ(pg_dump, pg_dumpall)、PITRが使用できます。 +ただし、論理バックアップとPITRの操作は、pgpool-IIを経由せずにPostgreSQLに対して直接行ってください。 +これは、<a href="#LOAD_BALANCE_MODE">load_balance_mode</a>や<a href="#REPLICATE_SELECT">replicate_select</a>などの +設定によるバックアップの失敗を避けるためです。 </p> -<h2 id="backup_rep_or_ms_mode">$B%l%W%j%1!<%7%g%s%b!<%I!"%^%9%?!<%9%l!<%V%b!<%I(B</h2> +<h2 id="backup_rep_or_ms_mode">レプリケーションモード、マスタースレーブモード</h2> <p> -$B%l%W%j%1!<%7%g%s%b!<%I$H%^%9%?!<%9%l!<%V%b!<%I$G(Bpgpool-II$B$,F0:n$7$F$$$k>l9g$O!"(B -$B%/%i%9%?$r9=@.$7$F$$$k$$$:$l$+$N%N!<%I$G%P%C%/%"%C%W$r9T$$$^$9!#(B +レプリケーションモードとマスタースレーブモードでpgpool-IIが動作している場合は、 +クラスタを構成しているいずれかのノードでバックアップを行います。 </p> <p> -$B%^%9%?!<%9%l!<%V%b!<%I$GHsF14|$N%l%W%j%1!<%7%g%s$r9T$C$F$$$k>l9g$G!"$+$D!"(B -$B:G?7$N%P%C%/%"%C%W$r<hF@$7$?$$>l9g$O!"%^%9%?%N!<%I$G%P%C%/%"%C%W$7$F$/$@$5$$!#(B +マスタースレーブモードで非同期のレプリケーションを行っている場合で、かつ、 +最新のバックアップを取得したい場合は、マスタノードでバックアップしてください。 </p> <p> -$B%P%C%/%"%C%W;~$NCm0UE@$H$7$F!"(BPostgreSQL$B$KBP$7$F(Bpg_dump$B%3%^%s%I$J$I$r<B9T$9$k$H!"(B -ACCESS SHARE$B%b!<%I$N%m%C%/$,$+$+$j$^$9!#(B -$B$=$N$?$a!"(BACCESS SHARE$B%b!<%I$H6%9g$9$k(BACCESS EXCLUSIVE$B%m%C%/$,I,MW$K$J$k%3%^%s%I(B -$B!J(BALTER TABLE$B!"(BDROP TABLE$B!"(BTRUNCATE$B!"(BREINDEX$B!"(BCLUSTER$B$*$h$S(BVACUUM FULL$B$J$I!K$O!"%m%C%/BT$A$,H/@8$7$^$9!#(B -$B$3$l$O!"HsF14|$N%l%W%j%1!<%7%g%s$G!"%9%l!<%V%N!<%I$KBP$7$F%P%C%/%"%C%W$r9T$C$F$$$k>l9g$b!"(B -$B%^%9%?$,1F6A$r<u$1$k$3$H$,$"$j$^$9$N$GCm0U$7$F$/$@$5$$!#(B +バックアップ時の注意点として、PostgreSQLに対してpg_dumpコマンドなどを実行すると、 +ACCESS SHAREモードのロックがかかります。 +そのため、ACCESS SHAREモードと競合するACCESS EXCLUSIVEロックが必要になるコマンド +(ALTER TABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTERおよびVACUUM FULLなど)は、ロック待ちが発生します。 +これは、非同期のレプリケーションで、スレーブノードに対してバックアップを行っている場合も、 +マスタが影響を受けることがありますので注意してください。 </p> -<h2 id="backup_parallel">$B%Q%i%l%k%b!<%I(B</h2> +<h2 id="backup_parallel">パラレルモード</h2> <p> -$B%Q%i%l%k%b!<%I$G(Bpgpool-II$B$,F0:n$7$F$$$k>l9g!"%/%i%9%?A4BN$N%G!<%?$,0l4S@-$N$"$k>uBV$G%P%C%/%"%C%W$r<hF@$9$k$K$O!"(B -$B%"%W%j%1!<%7%g%s!"$^$?$O(Bpgpool-II$B$N0l;~E*$JDd;_$,I,MW$K$J$j$^$9!#(B +パラレルモードでpgpool-IIが動作している場合、クラスタ全体のデータが一貫性のある状態でバックアップを取得するには、 +アプリケーション、またはpgpool-IIの一時的な停止が必要になります。 </p> <p> -$BO@M}%P%C%/%"%C%W$rMxMQ$9$k>l9g$O!"%"%W%j%1!<%7%g%s!"$^$?$O(Bpgpool-II$B$rDd;_$7!"(B -$B$9$Y$F$N%N!<%I$G(Bpg_dump, pg_dumpall$B%3%^%s%I$r<B9T$7$^$9!#(B -$B$=$7$F!"$9$Y$F$N%N!<%I$G%@%s%W$,=*N;$7$?$i!"%"%W%j%1!<%7%g%s!"$^$?$O(Bpgpool-II$B$r5/F0$7$F$/$@$5$$!#(B +論理バックアップを利用する場合は、アプリケーション、またはpgpool-IIを停止し、 +すべてのノードでpg_dump, pg_dumpallコマンドを実行します。 +そして、すべてのノードでダンプが終了したら、アプリケーション、またはpgpool-IIを起動してください。 </p> <p> -PITR$B$rMxMQ$9$k>l9g$O!"$^$:3F%N!<%I$N%7%9%F%`$N;~9o$,$[$\0lCW$7$F$$$k$3$H$r3NG'$7$F$/$@$5$$!#(B -$B$=$7$F!";vA0$K3F%N!<%I$G%"!<%+%$%V%m%0$N@_Dj$r9T$$!"%Y!<%9%P%C%/%"%C%W$r<hF@$7$^$9!#(B -$B%Y!<%9%P%C%/%"%C%W$,=*N;$7$?$i!"%"%W%j%1!<%7%g%s!"$^$?$O(Bpgpool-II$B$r0l;~E*$KDd;_$7$^$9!#(B -$BDd;_8e!"$=$N;~9o$H<!$K5/F0$7$?;~9o$r5-O?$7$^$9!#(B -$B$3$N0l;~E*$JDd;_$K$h$C$F!"%/%i%9%?A4BN$N%G!<%?$,0l4S@-$N$"$k>uBV$rJ]$C$?4|4V$,$G$-$^$9!#(B -$B%Y!<%9%P%C%/%"%C%W$H%"!<%+%$%V%m%0$r;HMQ$7$F3F%N!<%I$r%j%9%H%"$9$k>l9g$O!"(B -$B0l;~Dd;_4|4V$N??$sCf$"$?$j$N;~9o$r(Brecovery.conf$B$N(Brecovery_target_time$B$K;XDj$7$?$&$($G!"%j%+%P%j$r9T$C$F$/$@$5$$!#(B +PITRを利用する場合は、まず各ノードのシステムの時刻がほぼ一致していることを確認してください。 +そして、事前に各ノードでアーカイブログの設定を行い、ベースバックアップを取得します。 +ベースバックアップが終了したら、アプリケーション、またはpgpool-IIを一時的に停止します。 +停止後、その時刻と次に起動した時刻を記録します。 +この一時的な停止によって、クラスタ全体のデータが一貫性のある状態を保った期間ができます。 +ベースバックアップとアーカイブログを使用して各ノードをリストアする場合は、 +一時停止期間の真ん中あたりの時刻をrecovery.confのrecovery_target_timeに指定したうえで、リカバリを行ってください。 </p> -<h2 id="backup_system_db">$B%7%9%F%`(BDB$B$N%P%C%/%"%C%W(B</h2> +<h2 id="backup_system_db">システムDBのバックアップ</h2> <p> -$B%Q%i%l%k%/%(%j%b!<%I!"$^$?$O%/%(%j%-%c%C%7%e$r;HMQ$7$F$$$k>l9g$O!"%7%9%F%`(BDB$B$b%P%C%/%"%C%W$9$kI,MW$,$"$j$^$9!#(B -pgpool.conf$B$N(B <a href="#SYSTEM_DBNAME">system_db_dbname</a> $B$K@_Dj$7$?%G!<%?%Y!<%9$r%P%C%/%"%C%W$7$F$/$@$5$$!#(B +パラレルクエリモード、またはクエリキャッシュを使用している場合は、システムDBもバックアップする必要があります。 +pgpool.confの <a href="#SYSTEM_DBNAME">system_db_dbname</a> に設定したデータベースをバックアップしてください。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="deploy"></a>pgpool-II$B$NG[CV$K$D$$$F(B</a></h1> +<h1><a name="deploy"></a>pgpool-IIの配置について</a></h1> <p> -pgpool-II$B$O!"FHN)$7$?%5!<%P$KG[CV$9$k$3$H$b$G$-$^$9$7!"%"%W%j%1!<%7%g%s%5!<%P$HF15o$5$;$k$3$H$b$G$-$^$9$7!"(B -$B$=$NB>$NG[CV$b9M$($i$l$^$9!#(B -$B$3$3$G$O$=$l$>$l$NG[CVJ}K!$r>R2p$7!"$=$l$>$l$NFCD'!"%a%j%C%H!"%G%a%j%C%H$r8!F$$7$^$9!#(B +pgpool-IIは、独立したサーバに配置することもできますし、アプリケーションサーバと同居させることもできますし、 +その他の配置も考えられます。 +ここではそれぞれの配置方法を紹介し、それぞれの特徴、メリット、デメリットを検討します。 </p> <dl> -<dt>$B@lMQ$N%5!<%P$KG[CV(B +<dt>専用のサーバに配置 <dd> <p> - pgpool-II$B$rJ*M}E*$KFHN)$7$?@lMQ$N%5!<%P$KG[CV$9$kJ}K!$G$9!#(B - $BJ,$+$j$d$9$$J}K!$G$9$7!"B>$N%5!<%P%=%U%H%&%'%"$N1F6A$r<u$1$J$$$N$G(Bpgpool-II$B$r$b$C$H$b0BA4$K1?1D$G$-$^$9$,!"(B - $B%5!<%PAuCV$r(B1$BBfM>7W$KA}$d$9I,MW$,$"$k$N$,7gE@$G$9!#(B - $B$^$?!"$=$N%5!<%P$,C10l>c32E@$K$J$j$^$9(B(pgpool-II$B$,C10l>c32E@$K$J$k$3$H$r2sHr$9$k$K$O!"(B - $B8e=R$N(Bpgpool-HA$B$rJ;MQ$7$^$9(B)$B!#(B + pgpool-IIを物理的に独立した専用のサーバに配置する方法です。 + 分かりやすい方法ですし、他のサーバソフトウェアの影響を受けないのでpgpool-IIをもっとも安全に運営できますが、 + サーバ装置を1台余計に増やす必要があるのが欠点です。 + また、そのサーバが単一障害点になります(pgpool-IIが単一障害点になることを回避するには、 + 後述のpgpool-HAを併用します)。 </p> </dd> -<dt>Web$B%5!<%P$d%"%W%j%1!<%7%g%s%5!<%P$HF15o(B +<dt>Webサーバやアプリケーションサーバと同居 <dd> <p> - Apache$B!"(BJBoss$B!"(BTomcat$B$J$I$N(BWeb$B%5!<%P$d%"%W%j%1!<%7%g%s%5!<%P$,2TF/$7$F$$$k%5!<%P$K(B - pgpool-II$B$rF15o$5$;$kJ}K!$G$9!#(B - $B$3$NJ}K!$G$O!"(BWeb$B%5!<%P$d%"%W%j%1!<%7%g%s%5!<%P$H(Bpgpool-II$B$NDL?.$,%m!<%+%k%^%7%sFb$K$J$k$N$G!"(B - $B%=%1%C%HDL?.$,%^%7%s4V$GDL?.$9$k$h$j$b9bB.$K$J$k%a%j%C%H$,$"$j$^$9!#(B - $B$^$?!"J#?t$N(BWeb$B%5!<%P!?%"%W%j%1!<%7%g%s%5!<%P$,$"$l$P!"<+A3$HC10l>c32E@$r2sHr$G$-$k$h$&$K$J$j$^$9!#(B - ($B$3$N>l9g!"J#?t$N(Bpgpool-II$B$N@_Dj$OF1$8$K$7$F$/$@$5$$(B)$B!#(B - $B$J$*!"J#?t$N(Bpgpool-II$B$,F0:n$7$F$$$k%1!<%9$G$O0J2<$NE@$KCm0U$7$F$/$@$5$$!#(B + Apache、JBoss、TomcatなどのWebサーバやアプリケーションサーバが稼働しているサーバに + pgpool-IIを同居させる方法です。 + この方法では、Webサーバやアプリケーションサーバとpgpool-IIの通信がローカルマシン内になるので、 + ソケット通信がマシン間で通信するよりも高速になるメリットがあります。 + また、複数のWebサーバ/アプリケーションサーバがあれば、自然と単一障害点を回避できるようになります。 + (この場合、複数のpgpool-IIの設定は同じにしてください)。 + なお、複数のpgpool-IIが動作しているケースでは以下の点に注意してください。 </p> <ul> - <li>pgpool-II$B$H(BDB$B%5!<%P$N4V$N%M%C%H%o!<%/$,IT0BDj$@$H!"(Bpgpool-II$B$+$i8+$F(BDB$B%N!<%I(B#1$B$,%@%&%s!"(B - $BB>$N(Bpgpool-II$B$+$i8+$F@5>o!"$H$$$&$h$&$J>uBV$K$J$C$F$7$^$&$3$H$,$"$j$^$9!#(B - $B%M%C%H%o!<%/$rFs=E2=$9$k$J$I$7$F!"%M%C%H%o!<%/>c32$,5/$-$J$$$h$&$K$7$F$/$@$5$$!#(B + <li>pgpool-IIとDBサーバの間のネットワークが不安定だと、pgpool-IIから見てDBノード#1がダウン、 + 他のpgpool-IIから見て正常、というような状態になってしまうことがあります。 + ネットワークを二重化するなどして、ネットワーク障害が起きないようにしてください。 </li> - <li>$B%l%W%j%1!<%7%g%s%b!<%I$G!"%*%s%i%$%s%j%+%P%j<B9TCf$O!"0l$D$N(Bpgpool-II$B$@$1;D$7$F(B - $BB>$N(Bpgpool-II$B$rMn$7$F$/$@$5$$!#(B - $B$5$b$J$$$H!"%j%+%P%j8e$N7k2L$K@09g@-$,$J$/$J$k2DG=@-$,$"$j$^$9!#(B - $B%^%9%?!<!?%9%l!<%V%b!<%I(B+Streaming Replication$B%b!<%I$G$O!"F1;~$KJ#?t$N(Bpgpool-II$B$G(B - $B%*%s%i%$%s%j%+%P%j$r<B9T$7$J$$8B$j!"LdBj$"$j$^$;$s!#(B + <li>レプリケーションモードで、オンラインリカバリ実行中は、一つのpgpool-IIだけ残して + 他のpgpool-IIを落してください。 + さもないと、リカバリ後の結果に整合性がなくなる可能性があります。 + マスター/スレーブモード+Streaming Replicationモードでは、同時に複数のpgpool-IIで + オンラインリカバリを実行しない限り、問題ありません。 </li> </ul> </dd> -<dt>DB$B%5!<%P$HF15o(B +<dt>DBサーバと同居 <dd> <p> - PostgreSQL$B$N2TF/$7$F$$$k(BDB$B%5%P$HF15o$5$;$kJ}K!$G$9!#(B - $B$3$NJ}K!$G$O!"(Bpgpool-II$B$,C10l>c32E@$K$J$k$3$H$,$J$/!"M>7W$J%5!<%P$rDI2C$9$kI,MW$b$J$$E@$,M%$l$F$$$^$9$,!"(B - $B%"%W%j%1!<%7%g%s$,$I$N(BDB$B%5!<%P$K@\B3$9$k$N$+$r<+$iH=CG$9$kI,MW$,$"$k$N$,7gE@$G$9!#(B - $B$3$NLdBj$r2r7h$9$k$K$O!"(Bpgpool-HA$B$HAH$_9g$o$;$F2>A[(BIP$B$rMxMQ$7$^$9!#(B + PostgreSQLの稼働しているDBサバと同居させる方法です。 + この方法では、pgpool-IIが単一障害点になることがなく、余計なサーバを追加する必要もない点が優れていますが、 + アプリケーションがどのDBサーバに接続するのかを自ら判断する必要があるのが欠点です。 + この問題を解決するには、pgpool-HAと組み合わせて仮想IPを利用します。 </p> </dd> </dl> -<h2 id="pgpool_ha">pgpool-HA$B$K$D$$$F(B</h2> +<h2 id="pgpool_ha">pgpool-HAについて</h2> <p> -pgpool-HA$B$O!"(Bheartbeat$B$J$I$rMxMQ$7$F(Bpgpool-II$B$rFs=E2=$7!"(Bpgpool-II$B<+BN$N2DMQ@-$r>e$2$k%=%U%H%&%'%"$G$9!#(B -pgpool-II$B$HF1MM!"(Bpgpool$B%W%m%8%'%/%H$N%5%V%W%m%8%'%/%H$G$"$j!"(Bpgpool$B$N3+H/%5%$%H$G(BOSS$B$H$7$F8x3+$5$l$F$$$^$9!#(B +pgpool-HAは、heartbeatなどを利用してpgpool-IIを二重化し、pgpool-II自体の可用性を上げるソフトウェアです。 +pgpool-IIと同様、pgpoolプロジェクトのサブプロジェクトであり、pgpoolの開発サイトでOSSとして公開されています。 </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1><a name="troubleshooting"></a>$B%H%i%V%k%7%e!<%F%#%s%0(B</h1> +<h1 id="watchdog">Watchdog <span class="version">V3.2 ~</span></h1> <p> -$B$3$N>O$G$O!"(Bpgpool-II$B$r1?MQCf$KD>LL$7$d$9$$>c32$H!"$=$NBP:vJ}K!$r%1!<%9JL$K@bL@$7$^$9!#(B +watchdog プロセスは pgpool-II 本体から起動される、高可用性を目的としたプロセスです。 +以下の機能を提供します。 +</p> +<dl> +<dt>pgpool サービスの生死監視</dt> + <dd> + <p> + watchdog は pgpool のプロセスではなく、サービスの応答を監視します。 + 監視対象の pgpool から PostgreSQL に問い合わせを行い、その応答をチェックします。 + </p> + <p> + また watchdog は、pgpool から上位のサーバ(アプリケーションサーバなど)への接続も監視します。 + 上位サーバから PostgreSQL への接続・応答を pgpool のサービスとして生死監視します。 + </p> + </dd> + +<dt>watchdog プロセスの相互監視</dt> + <dd> + <p> + 各 watchdog はお互いの監視対象のサーバの情報を交換します。 + これにより、pgpool サーバの情報を最新に保てるだけでなく、各 watchdog プロセスの相互監視を行っています。 + </p> + </dd> + +<dt>障害発生検知時のアクティブ、スタンバイ切り替え</dt> + <dd> + <p> + pgpool のサービスに障害を検知した場合、watchdog は他の watchdog に障害検知を通知します。 + 故障した pgpool がアクティブの場合、他の watchdog は新しいアクティブを投票で決め、 + アクティブ・スタンバイの切り替えを行います。 + </p> + </dd> + +<dt>サーバ切り替えと連動した仮想 IP アドレスの自動付け替え</dt> + <dd> + <p> + スタンバイが新しいアクティブに昇格する際、新アクティブ機の watchdog は + アクティブ用の仮想IPインターフェースを起動します。 + </p> + <p> + 一方、旧アクティブ機の watchdog はアクティブ用仮想 IP インターフェースを停止します。 + これにより、サーバが切り替わった後もアクティブは同じ IP アドレスでサービスを継続することができます。 + </p> + </dd> + +<dt>サーバ復旧時、スタンバイ機としての自動登録</dt> + <dd> + <p> + 障害機の復旧や新規サーバを追加する場合、watchdog はサーバの情報を他の watchdog に通知し、 + 他の watchdog からはアクティブや他のサーバの情報を受け取ります。 + これにより追加したサーバはスタンバイ機として自動的に追加されます。 + </p> + </dd> +</dl> + + +<h2>サーバ構成</h2> +<p> +watchdogプロセスを含むpgpool-IIサーバは以下の図のようなシステム構成をとります。 +</p> + +<p><img src="wd-ja.jpg" alt="watchdog server composition" hight="70%" width="70%"></p> + +<h2 id="start_watchdog">watchdog の起動と停止</h2> +<p> +watchdog プロセスは pgpool-II から自動的に起動・停止されますので、固有の起動・停止コマンドはありません。 +しかし、watchdog プロセスは仮想IPインターフェースの起動・停止を行いますので、 +pgpool-II の起動は <font color="red">root 権限で</font> 行う必要があります。 +</p> +<p> +なお、他の pgpool および接続先の PostgreSQL が全て起動するのを待ってから、生死監視を開始します。 +</p> + +<h2 id="config_watchdog">pgpool.conf の設定</h2> +<p> +watchdog プロセスの設定項目は pgpool.conf に記述します。 +pgpool.conf.sample ファイルの WATCHDOG セクションにサンプルを記述していますので、参照してください。 +watchdog プロセスは以下の項目すべてを指定する必要があります。 +</p> + +<h3>基本設定セクション</h3> + +<h4>全般</h4> +<dl> +<dt><a name="USE_WATCHDOG"></a>use_watchdog <span class="version">V3.2 ~</span></dt> + <dd> + <p> + watchdog を有効にするには on にします。デフォルトは off です。 + </p> + </dd> +</dl> + +<h4>上位サーバへの接続</h4> +<p> +pgpool あるいは PostgreSQL のサービス提供先(DB クライアント)のサーバを、上位サーバと呼びます。 +pgpoolが生きていて PostgreSQLと繋がっている場合でも、 +上位サーバとのリンクが切れていれば「サービス」を継続できません。 +そのため、watchdog は上位サーバとのリンクが繋がっているかどうかも監視します。 +</p> + +<dl> +<dt><a name="TRUSTED_SERVERS"></a>trusted_servers <span class="version">V3.2 ~</span></dt> + <dd> + <p> + 上位接続を確認するための信頼できるサーバリストです。 + ping の応答が得られる必要があります。 + "hostA,hostB,hostC ..." のようにカンマで区切って複数のサーバを指定できます。 + </p> + <p> + 指定がない場合は上位サーバへのネットワーク到達監視をしません。 + </p> + </dd> + +<dt><a name="PING_PATH"></a>ping_path <span class="version">V3.2 ~</span></dt> + <dd> + <p> + 上位サーバへの接続監視に利用する ping コマンドのパスです。 + "/bin" のようにパスだけを指定します。 + </p> + </dd> +</dl> + +<h4>pgpool-II の死活監視</h4> + +<dl> +<dt><a name="WD_INTERVAL"></a>wd_interval <span class="version">V3.2 ~</span></dt> + <dd> + <p> + pgpool-II への生存監視の間隔(秒)です。 + (1 以上の数値) + </p> + </dd> + +<dt><a name="WD_LIFE_POINT"></a>wd_life_point <span class="version">V3.2 ~</span></dt> + <dd> + <p> + pgpool-II の生死監視で応答が得られなかった場合のリトライ回数です。 + (1 以上の数値) + </p> + </dd> + +<dt><a name="WD_LIFECHECK_QUERY"></a>wd_lifecheck_query <span class="version">V3.2 ~</span></dt> + <dd> + <p> + pgpool-II の死活監視のために発行されるクエリです。 + デフォルトは "SELECT 1" です。 + </p> + </dd> + +</dl> + +<h4>仮想 IP</h4> + +<dl> +<dt><a name="DELEGATE_IP"></a>delegate_IP <span class="version">V3.2 ~</span></dt> + <dd> + <p> + (アプリケーションサーバなど)外部からの接続される pgpool-II の仮想 IP アドレスです。 + スタンバイからアクティブに切り替わる際、pgpool はこの仮想 IP を引き継ぎます。 + </p> + </dd> + +<dt><a name="IFCONFIG_PATH"></a>ifconfig_path <span class="version">V3.2 ~</span></dt> + <dd> + <p> + IP アドレス切り替えに利用するコマンドのパスです。 + "/sbin" のようにパスだけを指定します。 + </p> + </dd> + +<dt><a name="IF_UP_CMD"></a>if_up_cmd <span class="version">V3.2 ~</span></dt> + <dd> + <p> + 仮想 IP を起動するために実行するコマンドです。 + "ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0" + のようにコマンドとパラメータを指定します。 + $_IP_$ は <a href="#DELEGATE_IP">delegate_IP</a> で指定された IP アドレスに置換されます。 + </p> + </dd> + +<dt><a name="IF_DOWN_CMD"></a>if_down_cmd <span class="version">V3.2 ~</span></dt> + <dd> + <p> + 仮想IPを停止するために実行するコマンドです。 + "ifconfig eth0:0 down" + のようにコマンドとパラメータを指定します。 + </p> + </dd> + +<dt><a name="ARPING_PATH"></a>arping_path <span class="version">V3.2 ~</span></dt> + <dd> + <p> + IP アドレス切り替え後に ARP リクエストを送信するコマンドのパスです。 + "/usr/sbin" のようにパスだけを指定します。 + </p> + </dd> + +<dt><a name="ARPING_CMD"></a>arping_cmd <span class="version">V3.2 ~</span></dt> + <dd> + <p> + IPアドレス切り替え後にARPリクエストを送信するコマンドです。 + "arping -U $_IP_$ -w 1" + のようにコマンドとパラメータを指定します。 + $_IP_$ は <a href="#DELEGATE_IP">delegate_IP</a> で指定された IP アドレスに置換されます。 + </p> + </dd> + +</dl> + +<h3>監視対象サーバ指定セクション</h3> +<dl> +<dt><a name="WD_PORT"></a>wd_port <span class="version">V3.2 ~</span></dt> + <dd> + <p> + watchdog プロセスが相互監視を受信する為のポート番号です。 + </p> + </dd> + +<dt><a name="OTHER_PGPOOL_HOSTNAME"></a>other_pgpool_hostname<font color="red">0</font> <span class="version">V3.2 ~</span></dt> + <dd> + <p> + 監視対象のpgpool-IIサーバのホスト名を指定します。 + 数値の部分は監視対象サーバの番号です。 + 監視対象のサーバ毎に 0 からの連番にします。 + </p> + </dd> + +<dt><a name="OTHER_PGPOOL_PORT"></a>other_pgpool_port<font color="red">0</font> <span class="version">V3.2 ~</span></dt> + <dd> + <p> + 監視対象のpgpool-IIサーバのpgpool用のポート番号を指定します。 + 数値の部分は監視対象サーバの番号です。 + 監視対象のサーバ毎に 0 からの連番にします。 + </p> + </dd> + +<dt><a name="OTHER_WD_PORT"></a>other_wd_port<font color="red">0</font> <span class="version">V3.2 ~</span></dt> + <dd> + <p> + 監視対象のpgpool-IIサーバのwatchdog用のポート番号を指定します + 数値の部分は監視対象サーバの番号です。 + 監視対象のサーバ毎に 0 からの連番にします。 + </p> + </dd> +</dl> + +<p class="top_link"><a href="#Top">△ back to top</a></p> + +<!-- ================================================================================ --> + +<h1><a name="troubleshooting"></a>トラブルシューティング</h1> +<p> +この章では、pgpool-IIを運用中に直面しやすい障害と、その対策方法をケース別に説明します。 </p> <dl> <dt id="health_check_failed">health check failed</dt> <dd> <p> - $B%X%k%9%A%'%C%/$G(Bpgpool-II$B$,(BDB$B%N!<%I$N>c32$r8!=P$7$^$7$?!#(B + ヘルスチェックでpgpool-IIがDBノードの障害を検出しました。 </p> <pre> 2010-07-23 16:42:57 ERROR: pid 20031: health check failed. 1 th host foo at port 5432 is down @@ -3883,10 +4136,10 @@ pgpool-II$B$HF1MM!"(Bpgpool$B%W%m%8%'%/%H$N%5%V%W%m%8%'%/%H$G$"$j!"(Bpgpool 2010-07-23 16:42:58 LOG: pid 20031: failover done. shutdown host foo(5432) </pre> <p> - $B$3$N%m%0$O!"(BDB$B%N!<%I(B1($B%[%9%HL>(B foo)$B$,%@%&%s$7$F@Z$jN%$5$l!"(B - $B?7$7$/(BDB$B%N!<%I(B0$B$,%^%9%?$H$7$F07$o$l=P$7$?$3$H$r<($7$F$$$^$9!#(B - DB$B%N!<%I(B1$B$r%A%'%C%/$7!"0[>o860x$r<h$j=|$$$?8e$K!"2DG=$G$"$l$P%*%s%i%$%s%j%+%P%j5!G=$r;H$C(B - $B$F(BDB$B%N!<%I(B1$B$rI|5"$5$;$F$/$@$5$$!#(B + このログは、DBノード1(ホスト名 foo)がダウンして切り離され、 + 新しくDBノード0がマスタとして扱われ出したことを示しています。 + DBノード1をチェックし、異常原因を取り除いた後に、可能であればオンラインリカバリ機能を使っ + てDBノード1を復帰させてください。 </p> </dd> @@ -3896,45 +4149,45 @@ pgpool-II$B$HF1MM!"(Bpgpool$B%W%m%8%'%/%H$N%5%V%W%m%8%'%/%H$G$"$j!"(Bpgpool 2010-07-26 18:43:24 LOG: pid 24161: ProcessFrontendResponse: failed to read kind from frontend. frontend abnormally exited </pre> <p> - pgpool-II$B$+$i8+$F%/%i%$%"%s%H$,FMA3%;%C%7%g%s$r@ZCG$7$?:]$K$3$N$h$&$J%m%0$,;D$j$^$9!#(B - $B860x$H$7$F$O!"%"%W%j%1!<%7%g%s$N%P%0!"%"%W%j%1!<%7%g%s$,6/@)=*N;$5$l$?!"(B - $B$d%M%C%H%o!<%/$N0l;~E*$J>c32$,9M$($i$l$^$9!#(B - $B$3$N%m%0$,=P$F$b!"(BDB$B$,2u$l$k$H$+0l4S@-$,$J$/$J$k$h$&$JLdBj$O5/$-$^$;$s$,!"(B - $B7QB3$7$F$3$N%m%0$,=PNO$5$l$k$h$&$G$"$l$P!"%"%W%j%1!<%7%g%s$d%M%C%H%o!<%/$N>c32$rD4::$9$k$3$H$r$*$9$9$a$7$^$9!#(B + pgpool-IIから見てクライアントが突然セッションを切断した際にこのようなログが残ります。 + 原因としては、アプリケーションのバグ、アプリケーションが強制終了された、 + やネットワークの一時的な障害が考えられます。 + このログが出ても、DBが壊れるとか一貫性がなくなるような問題は起きませんが、 + 継続してこのログが出力されるようであれば、アプリケーションやネットワークの障害を調査することをおすすめします。 </p> </dd> -<dt id="kind_mismatch">kind mismatch$B%(%i!<(B</dt> +<dt id="kind_mismatch">kind mismatchエラー</dt> <dd> <p> - $B%l%W%j%1!<%7%g%s%b!<%I$G1?MQ$7$F$$$k>l9g$K=P$k$3$H$,$"$k%(%i!<$G$9!#(B + レプリケーションモードで運用している場合に出ることがあるエラーです。 </p> <pre> 2010-07-22 14:18:32 ERROR: pid 9966: kind mismatch among backends. Possible last query was: "FETCH ALL FROM c;" kind details are: 0[T] 1[E: cursor "c" does not exist] </pre> <p> - pgpool-II$B$O!"(BSQL$B%3%^%s%I$r3F(BDB$B%N!<%I$KAw?.$7$?$i!"3F(BDB$B%N!<%I$+$iF1$8%l%9%]%s%9$,JV$C$F$/$k$3$H$r4|BT$7$^$9!#(B - $B$3$N%(%i!<$O!"0[$J$k%l%9%]%s%9$,JV$C$F$-$?$3$H$r<($7$^$9!#(B - Possible last query was:$B$N$"$H$K!"$3$N%(%i!<$rJV$9860x$H$J$C$?Ld$$9g$o$;$N(BSQL$BJ8$,I=<($5$l$^$9!#(B - $B$=$N$"$H$G!"3F(BDB$B%N!<%I$+$i$N%l%9%]%s%9$N<oN`$H!"%l%9%]%s%9$,%(%i!<$N>l9g$O!"(B - PostgreSQL$B$N%(%i!<%a%C%;!<%8$,I=<($5$l$^$9!#(B - $B$3$3$G$O!"(B"0[T]"$B$K$h$j!"(B0$BHVL\$N(BDB$B%N!<%I$,(B"T"($B9T>pJs$N3+;O(B)$B$H$$$&1~Ez$rJV$7$?$3$H!"(B - $B0lJ}(B"1[E"$B$G!"(BDB$B%N!<%I(B1$B$,%(%i!<$rJV$7$?$H$3$H!"$=$N%(%i!<%a%C%;!<%8$O(B - $B!V(Bcursor "c" does not exist$B!W$G$"$C$?$3$H$,$o$+$j$^$9!#(B + pgpool-IIは、SQLコマンドを各DBノードに送信したら、各DBノードから同じレスポンスが返ってくることを期待します。 + このエラーは、異なるレスポンスが返ってきたことを示します。 + Possible last query was:のあとに、このエラーを返す原因となった問い合わせのSQL文が表示されます。 + そのあとで、各DBノードからのレスポンスの種類と、レスポンスがエラーの場合は、 + PostgreSQLのエラーメッセージが表示されます。 + ここでは、"0[T]"により、0番目のDBノードが"T"(行情報の開始)という応答を返したこと、 + 一方"1[E"で、DBノード1がエラーを返したとこと、そのエラーメッセージは + 「cursor "c" does not exist」であったことがわかります。 <p> - $BCm0U(B: $B$3$N%(%i!<$O!"%^%9%?!<%9%l!<%V%b!<%I$G$b=P$k$3$H$,$"$j$^$9!#(B - $B$?$H$($P!"(BSET$B%3%^%s%I$O!"3F%;%C%7%g%s$N>uBV$rF1$8$K$9$k$?$a$K!"4pK\E*$K$9$Y$F$N(BDB$B%N!<%I$KAw?.$5$l$k$+$i$G$9!#(B + 注意: このエラーは、マスタースレーブモードでも出ることがあります。 + たとえば、SETコマンドは、各セッションの状態を同じにするために、基本的にすべてのDBノードに送信されるからです。 </p> <p> - $B%G!<%?%Y!<%9$rD4$Y$F860x$rFCDj$7!"$b$7(BDB$B$NF14|$,Jx$l$F$$$k$h$&$G$"$l$P!"(B - $B%*%s%i%$%s%j%+%P%j$r;H$C$F@5$7$$%G!<%?$HF14|$5$;$F$/$@$5$$!#(B + データベースを調べて原因を特定し、もしDBの同期が崩れているようであれば、 + オンラインリカバリを使って正しいデータと同期させてください。 </p> </dd> <dt id="difference_of_number">pgpool detected difference of the number of inserted, updated or deleted tuples</dt> <dd> <p> - $B%l%W%j%1!<%7%g%s%b!<%I$K$*$$$F!"(Bpgpool-II$B$,!"(BDB$B%N!<%I4V$G(BINSERT/UPDATE/DELETE$B$,JV$97k2L9T$N0c$$$r8!=P$7$^$7$?!#(B + レプリケーションモードにおいて、pgpool-IIが、DBノード間でINSERT/UPDATE/DELETEが返す結果行の違いを検出しました。 </p> <pre> 2010-07-22 11:49:28 ERROR: pid 30710: pgpool detected difference of the number of inserted, updated or deleted tuples. Possible last query was: "update t1 set i = 1;" @@ -3942,366 +4195,366 @@ pgpool-II$B$HF1MM!"(Bpgpool$B%W%m%8%'%/%H$N%5%V%W%m%8%'%/%H$G$"$j!"(Bpgpool 2010-07-22 11:49:28 LOG: pid 30710: ReadyForQuery: Affected tuples are: 0 1 </pre> <p> - $B$3$NNc$G$O!"(Bupdate t1 set i = 1$B$K$h$C$F99?7$5$l$?9T?t$,!"(BDB$B%N!<%I$G0[$J$C$F$$$^$9!#(B - $B$^$?!"<!$N9T$G$O!"(BDB$B%N!<%I(B1$B$r@Z$jN%$7$?$3$H!"99$K(BDB$B%N!<%I(B0$B$G$N7k2L9T?t$,(B0$B$@$C$?$N$KBP$7$F!"(BDB$B%N!<%I(B1$B$G$O!"(B1$B9T$@$C$?$3$H$rI=$7$F$$$^$9!#(B + この例では、update t1 set i = 1によって更新された行数が、DBノードで異なっています。 + また、次の行では、DBノード1を切り離したこと、更にDBノード0での結果行数が0だったのに対して、DBノード1では、1行だったことを表しています。 </p> <p> - $B@5$7$/$J$$%G!<%?$r;}$C$F$$$k$H;W$o$l$k(BDB$B%N!<%I$rDd;_$7!"%*%s%i%$%s%j%+%P%j$r;H$C$F(B - $B@5$7$$%G!<%?$HF14|$5$;$F$/$@$5$$!#(B + 正しくないデータを持っていると思われるDBノードを停止し、オンラインリカバリを使って + 正しいデータと同期させてください。 </p> </dd> </dl> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1>$B@)8B;v9`(B<a name="restriction"></a></h1> +<h1>制限事項<a name="restriction"></a></h1> <p> -<h2>PostgreSQL$B$N5!G=(B</h2> +<h2>PostgreSQLの機能</h2> <ul> - <li>pg_terminate_backend()$B$G%P%C%/%(%s%I$r=*N;$5$;$k$H%U%'%$%k%*!<%P$7$F$7$^$$$^$9!#(B - $B$3$l$O!"(BPostgreSQL$B$,(Bpostmaster$B$r%7%c%C%H%@%&%s$7$?$H$-$HF1$8%a%C%;!<%8$r(Bpgpool$B$KAw$k$?$a$G$9!#(B - $B:#$N$H$3$mBP1~J}K!$O$J$$$N$G!"$3$N4X?t$r;H$o$J$$$h$&$K$7$F$/$@$5$$!#(B + <li>pg_terminate_backend()でバックエンドを終了させるとフェイルオーバしてしまいます。 + これは、PostgreSQLがpostmasterをシャットダウンしたときと同じメッセージをpgpoolに送るためです。 + 今のところ対応方法はないので、この関数を使わないようにしてください。 </li> </ul> -<h2><a name="md5"></a>$BG'>Z!&%"%/%;%9@)8fJ}<0(B</h2> +<h2><a name="md5"></a>認証・アクセス制御方式</h2> <p> <ul> - <li>$B%l%W%j%1!<%7%g%s%b!<%I$^$?%^%9%?(B/$B%9%l!<%V%b!<%I;~$K$O(Btrust, reject, clear - text password, pam, $BG'>ZJ}<0$@$1$,MxMQ$G$-$^$9!#(B - crypt$BG'>Z$OMxMQ$G$-$^$;$s!#(B - md5$BG'>Z$K4X$7$F$O!"(BPostgreSQL$B$K3:Ev%f!<%6$r(Bmd5$BG'>ZIU$G(BPostgreSQL$B$KEPO?$7!"(B - $B<!$K(Bpgpool$B$KIUB0$9$k(Bpg_md5$B%3%^%s%I$r;H$C$F!"(Bpool_passwd$B$H$$$&G'>Z%U%!%$%k$r:n@.$9$k$3$H$K$h$j(B - $BMxMQ$G$-$k$h$&$K$J$j$^$9!#(B + <li>レプリケーションモードまたマスタ/スレーブモード時にはtrust, reject, clear + text password, pam, 認証方式だけが利用できます。 + crypt認証は利用できません。 + md5認証に関しては、PostgreSQLに該当ユーザをmd5認証付でPostgreSQLに登録し、 + 次にpgpoolに付属するpg_md5コマンドを使って、pool_passwdという認証ファイルを作成することにより + 利用できるようになります。 <ol> - <li>DB$B%f!<%6$N%"%+%&%s%H$G%m%0%$%s$7!"(B"pg_md5 --md5auth $B%Q%9%o!<%I(B" - $B$^$?$O(B "pg_md5 --md5auth --username=$B%f!<%6L>(B $B%Q%9%o!<%I(B" $B$r<B9T$7$^$9!#(B + <li>DBユーザのアカウントでログインし、"pg_md5 --md5auth パスワード" + または "pg_md5 --md5auth --username=ユーザ名 パスワード" を実行します。 </li> - <li>md5$B$K$h$j0E9f2=$5$l$?%f!<%6L>$H%Q%9%o!<%I$,(Bpool_passwd$B$KEPO?$5$l$^$9!#(B - pool_passwd$B$,$^$@B8:_$7$J$1$l$P!"(Bpgpool.conf$B$HF1$8%G%#%l%/%H%jFb$K:n@.$5$l$^$9!#(B + <li>md5により暗号化されたユーザ名とパスワードがpool_passwdに登録されます。 + pool_passwdがまだ存在しなければ、pgpool.confと同じディレクトリ内に作成されます。 </li> - <li>pool_passwd$B$N%U%)!<%^%C%H$O!"(B"$B%f!<%6L>(B:$B%Q%9%o!<%I(B"$B$H$J$C$F$$$^$9!#(B + <li>pool_passwdのフォーマットは、"ユーザ名:パスワード"となっています。 </li> - <li>pool_hba.conf$B$K(Bmd5$BG'>Z$N%(%s%H%j$r:n@.$7$^$9!#(B - pool_hba.conf$B$K$D$$$F$O!"(B<a href="#hba">$B%/%i%$%"%s%HG'>Z(B(HBA)$B$N$?$a$N(Bpool_hba.conf$B@_DjJ}K!(B</a> - $B$r;2>H$7$F$/$@$5$$!#(B + <li>pool_hba.confにmd5認証のエントリを作成します。 + pool_hba.confについては、<a href="#hba">クライアント認証(HBA)のためのpool_hba.conf設定方法</a> + を参照してください。 </li> - <li>$BCm0U;v9`(B: pool_passwd$B$KEPO?$9$k%Q%9%o!<%I$O!"(BPostgreSQL$B$KEPO?$7$?%Q%9%o!<%I$H(B - $B40A4$KF1$8$G$J$1$l$P$J$j$^$;$s!#(B + <li>注意事項: pool_passwdに登録するパスワードは、PostgreSQLに登録したパスワードと + 完全に同じでなければなりません。 </li> - <li>pool_passwd$B$H(BPostgreSQL$B$N(Bmd5$B%Q%9%o!<%I$rJQ99$7$?$i!"(Bpgpool reload $B$r<B9T$7$F$/$@$5$$!#(B - pgpool-II 3.1$B$^$?$O$=$l$h$j$b0JA0$N%P!<%8%g%s$G$O!"(Bpgpool-II$B$N:F5/F0$,I,MW$G$9!#(B + <li>pool_passwdとPostgreSQLのmd5パスワードを変更したら、pgpool reload を実行してください。 + pgpool-II 3.1またはそれよりも以前のバージョンでは、pgpool-IIの再起動が必要です。 </li> </ol> - <li>$B$=$l0J30$N%b!<%I$G$O!"(Btrust, reject, clear text password, pam, crypt, md5$BG'>ZJ}<0$@$1$,MxMQ$G$-$^$9!#(B + <li>それ以外のモードでは、trust, reject, clear text password, pam, crypt, md5認証方式だけが利用できます。 </li> </ul> -<h2 id="temp_table_in_master_slave_mode">$B0l;~%F!<%V%k$N07$$(B</h2> +<h2 id="temp_table_in_master_slave_mode">一時テーブルの扱い</h2> <p> -$B@)8BBP>](B:$B%^%9%?!<%9%l!<%V%b!<%I(B +制限対象:マスタースレーブモード </p> <p> -$B0l;~%F!<%V%k$N:n@.!"99?7$O>o$K%^%9%?(B(primary)$B$G9T$J$o$l$^$9!#(B -$B0l;~%F!<%V%k$N8!:w$b!"(Bpgpool-II 3.0$B0J9_$G$O!"%^%9%?$G9T$J$o$l$k$N$G!"(B -$B0l;~%F!<%V%k$r;H$C$F$$$k$+$I$&$+$r0U<1$9$kI,MW$O$"$j$^$;$s!#(B -$B$?$@$7!"J8;zNs$H$7$F0l;~%F!<%V%kL>$r(BSELECT$B$NCf$G;H$C$F$$$k>l9g$O0l;~%F!<%V%k$+$I$&$+$N3NG'$N$7$h$&$,$J$$$N$G!"(B -$BIi2YJ,;6$5$l$F$7$^$$!"$=$N0l;~%F!<%V%k$,8+$D$+$i$J$$$+!"(B -$B$b$7$/$OF1$8L>A0$NJL$N%F!<%V%k$r8!:w$7$F$7$^$&$3$H$K$J$j$^$9!#(B -$B$=$N$h$&$JLd$$9g$o$;$OHr$1$k$+!"(B/*NO LOADB ALNCE*/$B$N%3%a%s%H$rA^F~$7$F$/$@$5$$!#(B +一時テーブルの作成、更新は常にマスタ(primary)で行なわれます。 +一時テーブルの検索も、pgpool-II 3.0以降では、マスタで行なわれるので、 +一時テーブルを使っているかどうかを意識する必要はありません。 +ただし、文字列として一時テーブル名をSELECTの中で使っている場合は一時テーブルかどうかの確認のしようがないので、 +負荷分散されてしまい、その一時テーブルが見つからないか、 +もしくは同じ名前の別のテーブルを検索してしまうことになります。 +そのような問い合わせは避けるか、/*NO LOADB ALNCE*/のコメントを挿入してください。 </p> <pre> SELECT 't1'::regclass::oid; </pre> <p> -$B$A$J$_$K!"(Bpsql$B$N(B\d$B%3%^%s%I$N$h$&$K!"%7%9%F%`%+%?%m%0$rLd$$9g$o$;$kCf$G(B -$BJ8;zNs$H$7$F$N%F!<%V%kL>$r;H$C$F$$$k>l9g$O!"(Bpgpool-II 3.0$B0J9_$G$O%^%9%?$G8!:w$,9T$J$o$l$k$N$G!"LdBj$K$J$j$^$;$s!#(B -$B$J$<$J$i!"%7%9%F%`%+%?%m%0$X$N8!:w$O>o$K%^%9%?$G9T$J$o$l$k$+$i$G$9!#(B +ちなみに、psqlの\dコマンドのように、システムカタログを問い合わせる中で +文字列としてのテーブル名を使っている場合は、pgpool-II 3.0以降ではマスタで検索が行なわれるので、問題になりません。 +なぜなら、システムカタログへの検索は常にマスタで行なわれるからです。 </p> -<h2 id="caution_in_replication_mode">$B%l%W%j%1!<%7%g%s%b!<%I$GCm0U$,I,MW$J4X?t$J$I(B</h2> +<h2 id="caution_in_replication_mode">レプリケーションモードで注意が必要な関数など</h2> <p> -pgpool-II$B$G$OF1$8Ld$$9g$o$;$rAw$C$F$b0[$J$k7k2L$rJV$9$h$&$J%G!<%?!"(B -$B$?$H$($PMp?t$d%H%i%s%6%/%7%g%s(BID$B!"(BOID$B$N$h$&$J$b$N$K4X$7$F$O%l%W%j%1!<%7%g%s$O$7$^$9$,!"(B -2$BBf$N%[%9%H$G$^$C$?$/F1$8CM$,%3%T!<$5$l$kJ]>Z$O$"$j$^$;$s!#(B +pgpool-IIでは同じ問い合わせを送っても異なる結果を返すようなデータ、 +たとえば乱数やトランザクションID、OIDのようなものに関してはレプリケーションはしますが、 +2台のホストでまったく同じ値がコピーされる保証はありません。 </p> <p> -$B%7%j%"%k7?$K4X$7$F$O!"(Binsert_lock$B$rM-8z$K$7$F$*$1$P%F!<%V%k%m%C%/$rMxMQ$7$FF14|$,<h$i$l$^$9!#(B -$B%7!<%1%s%9$r07$&4X?t$r(BSELECT setval()$B!"(BSELECT nextval()$B$G8F$S=P$7$F$$$k>l9g$O(B -$B<+F0E*$K%l%W%j%1!<%7%g%s$5$l$k$N$GF14|$,<h$l$^$9!#(B +シリアル型に関しては、insert_lockを有効にしておけばテーブルロックを利用して同期が取られます。 +シーケンスを扱う関数をSELECT setval()、SELECT nextval()で呼び出している場合は +自動的にレプリケーションされるので同期が取れます。 </p> <p> -pgpool-II 2.3$B0J9_$G$O!"%F!<%V%k$N%G%U%)%k%HCM$G$NMxMQ$b4^$a!"(B -CURRENT_TIMESTAMP, CURRENT_DATE, now()$B$O!"<+F0E*$K%^%9%?B&$+$i<hF@$7$?;~9oCM$KCV$-49$($k$3$H$K$h$C$F(B -$B%l%W%j%1!<%7%g%s$G$-$k$h$&$K$J$C$F$$$^$9!#(B -$B$?$@$7!"0J2<$NE@$KCm0U$7$F$/$@$5$$!#(B +pgpool-II 2.3以降では、テーブルのデフォルト値での利用も含め、 +CURRENT_TIMESTAMP, CURRENT_DATE, now()は、自動的にマスタ側から取得した時刻値に置き換えることによって +レプリケーションできるようになっています。 +ただし、以下の点に注意してください。 </p> <ul> <li> - pgpool-II 3.1$B$h$jA0$N%P!<%8%g%s$G$O(BDEFAULT$B$K%?%$%`%9%?%s%W$rJV$9<0$,(B - $B4^$^$l$F$$$k$+$I$&$+$NH=Dj$O@53N$G$O$"$j$^$;$s!#Nc$($P(B + pgpool-II 3.1より前のバージョンではDEFAULTにタイムスタンプを返す式が + 含まれているかどうかの判定は正確ではありません。例えば <pre> CREATE TABLE rel1( d1 date DEFAULT CURRENT_DATE + 1 ) </pre> - $B$N$h$&$J$b$N$b8=:_$N%?%$%`%9%?%s%W$H$7$F=q$-49$($r9T$$$^$9!#(B - pgpool-II 3.1$B0J9_$G$O!"3HD%%W%m%H%3%k$H(BPREPARE$B0J30$N>l9g$K$3$NE@$,2~A1$5$l$F$*$j!"(B - $B>e5-$NNc$K$"$k$h$&$JNc$b@5$7$/=hM}$5$l$^$9(B($B$D$^$j!"%G%U%)%k%HCM$H$7$FL@F|$NF|IU$,%;%C%H$5$l$^$9(B)$B!#(B + のようなものも現在のタイムスタンプとして書き換えを行います。 + pgpool-II 3.1以降では、拡張プロトコルとPREPARE以外の場合にこの点が改善されており、 + 上記の例にあるような例も正しく処理されます(つまり、デフォルト値として明日の日付がセットされます)。 </p> <p> - $B$J$*!"Ns$NDj5A$,!"(B + なお、列の定義が、 </p> <pre> foo bigint default (date_part('epoch'::text,('now'::text)::timestamp(3) with time zone) * (1000)::double precision) </pre> <p> - $B$N$h$&$K!"%G!<%?7?$,F|IU!";~9o0J30$K$J$C$F$$$k>l9g$O=q$-49$($O9T$J$$$^$;$s!#(B + のように、データ型が日付、時刻以外になっている場合は書き換えは行ないません。 </p> </li> -<li>INSERT ... SELECT$B$G$O!"Ns$N(BDEFAULT$B$KBP$9$k=q$-49$($r9T$$$^$;$s!#Nc$($P!"(B +<li>INSERT ... SELECTでは、列のDEFAULTに対する書き換えを行いません。例えば、 <pre> CREATE TABLE rel1( c1 int, c2 timestamp default now() ) </pre> - $B$N;~!"(B + の時、 <pre> INSERT INTO rel1(c1) VALUES(1) </pre> - $B$O(B + は <pre> INSERT INTO rel1(c1, c2) VALUES(1, '2009-01-01 23:59:59.123456+09') </pre> - $B$N$h$&$K=q$-49$($i$l$^$9$,(B + のように書き換えられますが <pre> INSERT INTO rel1(c1) SELECT 1 </pre> - $B$O=q$-49$($i$l$^$;$s!#(B + は書き換えられません。 </li> </ul> <p> -PostgreSQL 8.2$B$+$=$l$h$jA0$N(BPostgreSQL$B$r$*;H$$$N>l9g!"(B -CREATE TEMP TABLE$B$G:n@.$5$l$?%F!<%V%k$O%U%m%s%H%(%s%I$,%;%C%7%g%s$r=*N;$7$F$b:o=|$5$l$^$;$s!#(B -$B$3$l$O!"%3%M%/%7%g%s%W!<%k$N8z2L$G%P%C%/%(%s%I$+$i8+$k$H%;%C%7%g%s$,7QB3$7$F$$$k$h$&$K8+$($k$+$i$G$9!#(B -$B%;%C%7%g%s$N=*N;;~$KL@<(E*$K(BDROP TABLE$B$9$k$+!"%H%i%s%6%/%7%g%s%V%m%C%/$NCf$G(B -CREATE TEMP TABLE ... ON COMMIT DROP$B$r$*;H$$2<$5$$!#(B +PostgreSQL 8.2かそれより前のPostgreSQLをお使いの場合、 +CREATE TEMP TABLEで作成されたテーブルはフロントエンドがセッションを終了しても削除されません。 +これは、コネクションプールの効果でバックエンドから見るとセッションが継続しているように見えるからです。 +セッションの終了時に明示的にDROP TABLEするか、トランザクションブロックの中で +CREATE TEMP TABLE ... ON COMMIT DROPをお使い下さい。 </p> <p> -PostgreSQL 8.3$B0J9_$G$O!"(Breset_query_list$B$K(BDISCARD ALL$B$r;XDj$9$l$P<+F0E*$K:o=|$5$l$k$N$GLdBj$"$j$^$;$s!#(B +PostgreSQL 8.3以降では、reset_query_listにDISCARD ALLを指定すれば自動的に削除されるので問題ありません。 </p> -<h2 id="ng_queries">$B%/%(%j$K$D$$$F(B</h2> +<h2 id="ng_queries">クエリについて</h2> <p> -pgpool-II $B$G$O07$&$3$H$,$G$-$J$$%/%(%j$K$D$$$F@bL@$7$^$9!#(B +pgpool-II では扱うことができないクエリについて説明します。 </p> -<h3 id="ng_multibyte_chars">$B%^%k%A%P%$%HJ8;z$K$D$$$F(B</h3> +<h3 id="ng_multibyte_chars">マルチバイト文字について</h3> <p> -$B@)8BBP>](B:$BA4%b!<%I(B +制限対象:全モード </p> <p> -$B8=:_$N<BAu$G$O!"%^%k%A%P%$%HJ8;z$NJQ49=hM}$r9T$$$^$;$s!#(B -$B%/%i%$%"%s%H%(%s%3!<%G%#%s%0!"%P%C%/%(%s%I%N!<%I$N%5!<%P%(%s%3!<%G%#%s%0!"%7%9%F%`(BDB -$B$N%5!<%P%(%s%3!<%G%#%s%0$r0lCW$5$;$k$h$&$K$7$F$/$@$5$$!#(B +現在の実装では、マルチバイト文字の変換処理を行いません。 +クライアントエンコーディング、バックエンドノードのサーバエンコーディング、システムDB +のサーバエンコーディングを一致させるようにしてください。 </p> -<h3 id="ng_multi_statement">$B%^%k%A%9%F!<%H%a%s%H(B</h3> +<h3 id="ng_multi_statement">マルチステートメント</h3> <p> -$B@)8BBP>](B:$BA4%b!<%I(B +制限対象:全モード </p> <p> -$B%^%k%A%9%F!<%H%a%s%H(B(';' $B$G6h@Z$C$FJ#?t$NJ8$r$^$H$a$?(B SQL)$B$r(B pgpool $B$,(B -$B@5$7$/=hM}$9$k$3$H$,$G$-$^$;$s!#I,$:J8$rJ,$1$FAw?.$7$F$/$@$5$$!#(B +マルチステートメント(';' で区切って複数の文をまとめた SQL)を pgpool が +正しく処理することができません。必ず文を分けて送信してください。 </p> <p> -$B$J$*!"(Bpsql $B$r;H$C$F(B pgpool $B$K@\B3$7$?>l9g$O!"(Bpsql $BFbIt$G%^%k%A%9%F!<%H%a%s%H$rJ,2r$7!"(B -1 $B$D$:$DAw?.$9$k$N$G!"<B:]$K$OLdBj$K$J$j$^$;$s!#(B +なお、psql を使って pgpool に接続した場合は、psql 内部でマルチステートメントを分解し、 +1 つずつ送信するので、実際には問題になりません。 </p> -<h3 id="ng_extended_protocol">$B3HD%Ld$$9g$o$;%W%m%H%3%k(B</h3> +<h3 id="ng_extended_protocol">拡張問い合わせプロトコル</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -JDBC $B%I%i%$%P$J$I$N$h$&$J3HD%Ld$$9g$o$;%W%m%H%3%k$K$OBP1~$7$F$$$^$;$s!#(B -$BI,$:4J0WLd$$9g$o$;%W%m%H%3%k$r;HMQ$7$F$/$@$5$$!#(B +JDBC ドライバなどのような拡張問い合わせプロトコルには対応していません。 +必ず簡易問い合わせプロトコルを使用してください。 </p> <h3 id="ng_select">SELECT</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -postgresql.conf $B$N(B add_missing_from$B@_DjCM$r(B off ($B%G%U%)%k%HCM(B)$B$K@_Dj$7$F$/$@$5$$!#(B -add_missing_from $B@_DjCM$,(B on $B$N;~$K;H$($k%/%(%j$O@5$7$/(Bpgpool$B$G=hM}$5$l$J$$2DG=@-(B -$B$,$"$j$^$9!#(B +postgresql.conf の add_missing_from設定値を off (デフォルト値)に設定してください。 +add_missing_from 設定値が on の時に使えるクエリは正しくpgpoolで処理されない可能性 +があります。 </p> <h3 id="ng_insert">INSERT</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -$B%G!<%?J,3d$r$7$F$$$k%F!<%V%k$KBP$7$F(BINSERT $B$r9T$&:]$K$O!"J,3d%k!<%k$H$J$kCM$r(B DEFAULT $B$K$O$G$-$^$;$s!#(B -$BNc$($P%F!<%V%k(B t $B$K(B x $B$H$$$&%+%i%`$,$"$j!"(Bx $B$,J,3d%k!<%k$NBP>]%+%i%`$@$C$?>l9g$K$O!"(B +データ分割をしているテーブルに対してINSERT を行う際には、分割ルールとなる値を DEFAULT にはできません。 +例えばテーブル t に x というカラムがあり、x が分割ルールの対象カラムだった場合には、 </p> <pre> INSERT INTO t(x) VALUES (DEFAULT); </pre> <p> -$B$O$G$-$^$;$s!#$^$?!"J,3d%k!<%k$H$J$kCM$,4X?t8F$S=P$7$N>l9g$b(B -$BBP1~$7$F$$$^$;$s!#(B +はできません。また、分割ルールとなる値が関数呼び出しの場合も +対応していません。 </p> <pre> INSERT INTO t(x) VALUES (func()); </pre> <p> -$BI,$:L@<(E*$KCM$rM?$($kI,MW$,$"$j$^$9!#(B +必ず明示的に値を与える必要があります。 </p> <p> -$B$^$?!"(BSELECT INTO $B$d(B INSERT INTO ... SELECT $B$H$$$&7A<0$b%5%]!<%H$7$F$$$^$;$s!#(B +また、SELECT INTO や INSERT INTO ... SELECT という形式もサポートしていません。 </p> <h3 id="ng_update">UPDATE</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -$BJ,3d%k!<%k$H$J$k%+%i%`$r99?7$9$k$HJ,3d%k!<%k$K=>$C$?%G!<%?$N@09g@-$,Jx(B -$B$l$k2DG=@-$,$"$j$^$9!#(Bpgpool-II $B$G$OFC$K%G!<%?$N:FG[CV$H$$$&$3$H$O9T$$(B -$B$^$;$s!#(B +分割ルールとなるカラムを更新すると分割ルールに従ったデータの整合性が崩 +れる可能性があります。pgpool-II では特にデータの再配置ということは行い +ません。 </p> <p> -$B$b$7@)Ls0cH?$J$I$K$h$j0lIt$N%N!<%I$G%(%i!<$K$J$C$?>l9g$K%m!<%k%P%C%/$9(B -$B$k$3$H$O$G$-$^$;$s!#(B +もし制約違反などにより一部のノードでエラーになった場合にロールバックす +ることはできません。 </p> <p> -WHERE $B6g$K%G!<%?J,3d$r9T$C$?%F!<%V%k$r;2>H$9$k%5%V%/%(%j$d4X?t8F$S=P$7$,$"$k>l9g$K$O@5$7$/F0$+$J$$2DG=@-$,(B -$B$"$j$^$9!#(B +WHERE 句にデータ分割を行ったテーブルを参照するサブクエリや関数呼び出しがある場合には正しく動かない可能性が +あります。 </p> <pre> -$BNc!'(BUPDATE branches set bid = 100 where bid = (select max(bid) from beances); +例:UPDATE branches set bid = 100 where bid = (select max(bid) from beances); </pre> <h3 id="ng_select_for_update">SELECT ... FOR UPDATE</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -WHERE $B6g$K%G!<%?J,3d$r9T$C$?%F!<%V%k$r;2>H$9$k%5%V%/%(%j$d4X?t8F$S=P$7$,$"$k>l9g$K$O@5$7$/F0$+$J$$2DG=@-$,(B -$B$"$j$^$9!#(B +WHERE 句にデータ分割を行ったテーブルを参照するサブクエリや関数呼び出しがある場合には正しく動かない可能性が +あります。 <pre> -$BNc!'(BSELECT * FROM branches where bid = (select max(bid) from beances) FOR UPDATE; +例:SELECT * FROM branches where bid = (select max(bid) from beances) FOR UPDATE; </pre> </p> <h3 id="ng_copy">COPY</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -COPY BINARY $B$K$OBP1~$7$F$$$^$;$s!#$^$?!"%U%!%$%k$+$i$N%3%T!<$K$bBP1~$7$F$$$^$;$s!#(B -COPY FROM STDIN $B$H(B COPY TO STDOUT $B$N$_BP1~$7$F$$$^$9!#(B +COPY BINARY には対応していません。また、ファイルからのコピーにも対応していません。 +COPY FROM STDIN と COPY TO STDOUT のみ対応しています。 </p> -<h3 id="ng_create_table">ALTER/CREATE TABLE $B$K$D$$$F(B</h3> +<h3 id="ng_create_table">ALTER/CREATE TABLE について</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -pgpool $B$K>pJs$r99?7$5$;$k$?$a$K$O!"(Bpgpool $B$r:F5/F0$9$kI,MW$,$"$j$^$9!#(B +pgpool に情報を更新させるためには、pgpool を再起動する必要があります。 </p> -<h3 id="ng_transaction">$B%H%i%s%6%/%7%g%s(B</h3> +<h3 id="ng_transaction">トランザクション</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -$B%H%i%s%6%/%7%g%sCf$KH/9T$5$l$k(B SELECT $B$O(B dblink $B$r7PM3$9$k>l9g$K$OJL%H(B -$B%i%s%6%/%7%g%s$K$J$j$^$9!#0J2<$KNc$r<($7$^$9!#(B +トランザクション中に発行される SELECT は dblink を経由する場合には別ト +ランザクションになります。以下に例を示します。 </p> <pre> BEGIN; INSERT INTO t(a) VALUES (1); -SELECT * FROM t ORDER BY a; &lt;-- $B>e$N(B INSERT $B$7$?CM$O8+$($J$$(B +SELECT * FROM t ORDER BY a; &lt;-- 上の INSERT した値は見えない END; </pre> <p> -$B$^$?@)Ls0cH?$J$I$K$h$j0lIt$N%N!<%I$G%(%i!<$K$J$C$?>l9g$K%m!<%k%P%C%/$9$k$3$H$O$G$-$^$;$s!#(B +また制約違反などにより一部のノードでエラーになった場合にロールバックすることはできません。 </p> <h3 id="ng_view">View/Rule</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -View $B$d(B Rule $B$O3F%N!<%I$KF1$8FbMF$,Dj5A$5$l$^$9!#(B +View や Rule は各ノードに同じ内容が定義されます。 </p> <pre> CREATE VIEW sample AS SELECT * FROM a, b where a.i = b.i </pre> <p> -$B>e5-$N$h$&$J(B $B%F!<%V%k7k9g$r4^$s$@(BVIEW$B$O!"(Ba $B$H(B b $B$OF1$8%N!<%IFb$G$N$_7k9g=hM}$r9T$$!"(B -$B3F%N!<%I$+$i$N<B9T7k2L$rE}9g$7$^$9!#%N!<%I$r$^$?$,$C$?(B JOIN $B$r9T$&(B View $B$r:n@.$9$k$3$H$O$G$-$^$;$s!#(B -Rule $B$K$D$$$F$bF1MM$K$J$j$^$9!#(B +上記のような テーブル結合を含んだVIEWは、a と b は同じノード内でのみ結合処理を行い、 +各ノードからの実行結果を統合します。ノードをまたがった JOIN を行う View を作成することはできません。 +Rule についても同様になります。 </p> <p> -$B$?$@$7!"%G!<%?J,3d$7$?%F!<%V%k$rF1$8%N!<%IFb$G$N$_7k9g$7$?$$>l9g$K!"(BVIEW$B$r:n@.$9$k$3$H$O2DG=$G$9!#(B -$B$3$N>l9g$K$O(BVIEW$B$r(Bpgpool_catalog.dist_def$B%F!<%V%k$K(BVIEW$B$rEPO?$7$F$*$-$^$9!#(B +ただし、データ分割したテーブルを同じノード内でのみ結合したい場合に、VIEWを作成することは可能です。 +この場合にはVIEWをpgpool_catalog.dist_defテーブルにVIEWを登録しておきます。 </p> <p> -$B$^$?!"(Bpgpool_catalog.dist_def$B%F!<%V%k$N(Bcol_name$B$H(Bdist_def_func$B$K$O!"(B -VIEW$B$GDj5A$7$?%+%i%`$H(BVIEW$B$KBP$7$F(BINSERT$B$,H/9T$5$l$?>l9g$K(B -$B2?=h$N%N!<%I$K%/%(%j$rLd$$9g$o$;$k$N$+$r7hDj$9$k4X?t$rEPO?$7$F$/$@$5$$!#(B +また、pgpool_catalog.dist_defテーブルのcol_nameとdist_def_funcには、 +VIEWで定義したカラムとVIEWに対してINSERTが発行された場合に +何処のノードにクエリを問い合わせるのかを決定する関数を登録してください。 </p> -<h3 id="ng_fuction">$B4X?t(B/$B%H%j%,$K$D$$$F(B</h3> +<h3 id="ng_fuction">関数/トリガについて</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -$B4X?t$O3F%N!<%I$KF1$8FbMF$,Dj5A$5$l$^$9!#4X?tFb$G(B JOIN $B$dB>$N%N!<%I$N%G!<%?A`:n$r9T$&$3$H$O$G$-$^$;$s!#(B +関数は各ノードに同じ内容が定義されます。関数内で JOIN や他のノードのデータ操作を行うことはできません。 </p> -<h3 id="ng_natural_join">Natural Join $B$K$D$$$F(B</h3> +<h3 id="ng_natural_join">Natural Join について</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -Natural Join $B$OMxMQ$G$-$^$;$s!#(BON $B7k9g>r7o$^$?$O!"(BUSING($B7k9g%+%i%`(B) $B$rL@<(E*$K(B -$B;XDj$9$kI,MW$,$"$j$^$9!#(B +Natural Join は利用できません。ON 結合条件または、USING(結合カラム) を明示的に +指定する必要があります。 </p> -<h3 id="ng_using">USING $B6g$K$D$$$F(B</h3> +<h3 id="ng_using">USING 句について</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -JOIN $B9=J8$NCf$GMxMQ$5$l$k(B USING $B6g$O%/%(%j$N=q$-49$(=hM}$K$h$C$F(B ON $B6g$KJQ49$5$l$^$9!#(B -$B$=$N$?$a!"%?!<%2%C%H%j%9%H$K(B "*" $B$rMxMQ$9$kLd$$9g$o$;$r9T$&>l9g$K$O!"F1$8NsL>$,=PNO$5$l$^$9!#(B +JOIN 構文の中で利用される USING 句はクエリの書き換え処理によって ON 句に変換されます。 +そのため、ターゲットリストに "*" を利用する問い合わせを行う場合には、同じ列名が出力されます。 </p> -<h3 id="ng_dead_lock">$B%G%C%I%m%C%/$K$D$$$F(B</h3> +<h3 id="ng_dead_lock">デッドロックについて</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -$B%N!<%I4V$r$^$?$,$k%G%C%I%m%C%/$r8!=P$9$k$3$H$,$G$-$^$;$s!#(B +ノード間をまたがるデッドロックを検出することができません。 </p> <pre> -$BNc!'(Baccounts$B%F!<%V%k$O0J2<$N%k!<%k$GJ,3d$5$l$F$$$k!#(B - aid &lt;= 100000 $B%N!<%I(B 0 - aid &gt;= 100000 $B%N!<%I(B 1 +例:accountsテーブルは以下のルールで分割されている。 + aid &lt;= 100000 ノード 0 + aid &gt;= 100000 ノード 1 A) BEGIN; B) BEGIN; @@ -4311,162 +4564,162 @@ JOIN $B9=J8$NCf$GMxMQ$5$l$k(B USING $B6g$O%/%(%j$N=q$-49$(=hM}$K$h$C$F(B ON B) SELECT * FROM accounts WHERE aid = 100001 FOR UPDATE; </pre> <p> -$B$3$N>l9g!"C10l$N%N!<%I$G$O%G%C%I%m%C%/$r8!CN$G$-$J$$$?$a!"(Bpgpool $B$OBT(B -$B$?$5$l$?>uBV$K$J$j$^$9!#$3$N8=>]$O(B SELECT FOR UPDATE $B0J30$K$b9T%m%C%/(B -$B$r3MF@$9$k%/%(%j$GH/@8$9$k2DG=@-$,$"$j$^$9!#(B +この場合、単一のノードではデッドロックを検知できないため、pgpool は待 +たされた状態になります。この現象は SELECT FOR UPDATE 以外にも行ロック +を獲得するクエリで発生する可能性があります。 </p> <p> -$B$^$?!"$"$k%N!<%I$G%G%C%I%m%C%/$,H/@8$7$?>l9g$O!"3F%N!<%I$N%H%i%s%6%/%7%g(B -$B%s$N>uBV$,0[$J$k>u67$K$J$j$^$9!#$=$N$?$a!"%G%C%I%m%C%/$r8!CN$7$?;~E@$G(B -$B0J2<$N%m%0$r=PNO$7$F(B pgpool $B$O3:Ev$N%W%m%;%9$r=*N;$5$;$^$9!#(B +また、あるノードでデッドロックが発生した場合は、各ノードのトランザクショ +ンの状態が異なる状況になります。そのため、デッドロックを検知した時点で +以下のログを出力して pgpool は該当のプロセスを終了させます。 <pre> pool_read_kind: kind does not match between master(84) slot[1] (69) </pre> -<h3 id="ng_schema">$B%9%-!<%^$K$D$$$F(B</h3> +<h3 id="ng_schema">スキーマについて</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -public $B0J30$N%9%-!<%^$KB0$9$h$&$J%*%V%8%'%/%H$N;2>H$OI,$:(B +public 以外のスキーマに属すようなオブジェクトの参照は必ず </p> <pre> -$B%9%-!<%^(B.$B%*%V%8%'%/%H(B +スキーマ.オブジェクト </pre> <p> -$B$H;XDj$9$k$h$&$K$7$F$/$@$5$$!#(B +と指定するようにしてください。 </p> <pre> set search_path = xxx </pre> <p> -$B$r;XDj$7!"%9%-!<%^L>$r>JN,$9$k$H!"(Bpgpool $B$,$I$NJ,;6%k!<%k$rE,MQ$9$k$+(B -$BH=CG$G$-$^$;$s!#(B +を指定し、スキーマ名を省略すると、pgpool がどの分散ルールを適用するか +判断できません。 </p> -<h3 id="ng_relname">$B%F!<%V%kL>!"%+%i%`L>$K$D$$$F(B</h3> +<h3 id="ng_relname">テーブル名、カラム名について</h3> <p> -$B@)8BBP>](B:$B%Q%i%l%k%b!<%I(B +制限対象:パラレルモード </p> <p> -pool_$B$G;O$^$k%F!<%V%k!"%+%i%`L>$O;H$($^$;$s!#%/%(%j=q$-49$($N:]$KFbIt=hM}$G;HMQ$7$^$9!#(B +pool_で始まるテーブル、カラム名は使えません。クエリ書き換えの際に内部処理で使用します。 </p> -<h2 id="caution_system_db">$B%7%9%F%`(B DB</h2> +<h2 id="caution_system_db">システム DB</h2> -<h3>$BJ,3d%k!<%k(B</h3> +<h3>分割ルール</h3> <p> -pgpool-II $B$G$OJ,3d%k!<%k$NBP>]$N%+%i%`$O(B 1 $B$D$N$_$H$7$^$9!#(Bx $B$H(B y $B$N(B -OR $B>r7o$J$I$H$$$C$?$b$N$K$OBP1~$7$F$$$^$;$s!#(B +pgpool-II では分割ルールの対象のカラムは 1 つのみとします。x と y の +OR 条件などといったものには対応していません。 </p> -<h2>$B%S%k%I$KI,MW$J4D6-(B</h2> +<h2>ビルドに必要な環境</h2> <h3>libpq</h3> <p> -pgpool-II $B$G$O(B libpq $B$r%j%s%/$7$^$9!#(Blibpq $B$N%P!<%8%g%s$O(B 2.0 $B$N>l9g!"(B -configure $B$K<:GT$7$^$9!#I,$:(B libpq 3.0 $B0J9_(B(PostgreSQL 7.4$B0J9_(B) $B$r%j%s%/$9$k$h(B -$B$&$K$7$F$/$@$5$$!#$^$?!"(BSystemDB $B$N%P!<%8%g%s$b(B PostgreSQL 7.4 $B0J9_$,(B -$BI,?\$K$J$j$^$9!#(B +pgpool-II では libpq をリンクします。libpq のバージョンは 2.0 の場合、 +configure に失敗します。必ず libpq 3.0 以降(PostgreSQL 7.4以降) をリンクするよ +うにしてください。また、SystemDB のバージョンも PostgreSQL 7.4 以降が +必須になります。 </p> -<h2 id="caution_query_cache">$B%/%(%j%-%c%C%7%e(B</h2> +<h2 id="caution_query_cache">クエリキャッシュ</h2> <p> -$B8=:_$N%/%(%j%-%c%C%7%e$N<BAu$G$O!"%-%c%C%7%e$NL58z2=$r<jF0$G9T$&I,MW$,$"$j$^$9!#(B +現在のクエリキャッシュの実装では、キャッシュの無効化を手動で行う必要があります。 </p> </p> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1>$B%j%U%!%l%s%9(B<a name="reference"></a></h1> -<h2>PCP$B%3%^%s%I%j%U%!%l%s%9(B</h2> +<h1>リファレンス<a name="reference"></a></h1> +<h2>PCPコマンドリファレンス</h2> -<h3 id="pcp_command">PCP$B%3%^%s%I0lMw(B</h3> +<h3 id="pcp_command">PCPコマンド一覧</h3> <p> -pgpool-II$B$rA`:n$9$k(BUNIX$B%3%^%s%I$H$7$F!"0J2<$N$b$N$,$"$j$^$9!#(B +pgpool-IIを操作するUNIXコマンドとして、以下のものがあります。 </p> <table border> <tr><th><a href="#pcp_node_count">pcp_node_count</a></th> - <td>$B%N!<%I?t$r<hF@$9$k(B</td></tr> + <td>ノード数を取得する</td></tr> <tr><th><a href="#pcp_node_info">pcp_node_info</a></th> - <td>$B%N!<%I>pJs$r<hF@$9$k(B</td></tr> + <td>ノード情報を取得する</td></tr> <tr><th><a href="#pcp_proc_count">pcp_proc_count</a></th> - <td>$B%W%m%;%90lMw$r<hF@$9$k(B</td></tr> + <td>プロセス一覧を取得する</td></tr> <tr><th><a href="#pcp_proc_info">pcp_proc_info</a></th> - <td>$B%W%m%;%9>pJs$r<hF@$9$k(B</td></tr> + <td>プロセス情報を取得する</td></tr> <tr><th><a href="#pcp_pool_status">pcp_pool_status</a></th> - <td>pgpool.conf $B$N%Q%i%a!<%?@_DjCM$r<hF@$9$k(B <span class="version">V3.1 $B!A(B</span></td></tr> + <td>pgpool.conf のパラメータ設定値を取得する <span class="version">V3.1 〜</span></td></tr> <tr><th><a href="#pcp_systemdb_info">pcp_systemdb_info</a></th> - <td>$B%7%9%F%`(BDB$B>pJs$r<hF@$9$k(B</td></tr> + <td>システムDB情報を取得する</td></tr> <tr><th><a href="#pcp_detach_node">pcp_detach_node</a></th> - <td>$B%N!<%I$r@Z$jN%$9(B</td></tr> + <td>ノードを切り離す</td></tr> <tr><th><a href="#pcp_attach_node">pcp_attach_node</a></th> - <td>$B%N!<%I$rI|5"$5$;$k(B</td></tr> + <td>ノードを復帰させる</td></tr> <tr><th><a href="#pcp_promote_node">pcp_promote_node</a></th> - <td>$B%N!<%I$r%^%9%?!<$K>:3J$5$;$k(B <span class="version">V3.1 $B!A(B</span></td></tr> + <td>ノードをマスターに昇格させる <span class="version">V3.1 〜</span></td></tr> <tr><th><a href="#pcp_stop_pgpool">pcp_stop_pgpool</a></th> - <td>pgpool-II$B$rDd;_$5$;$k(B</td></tr> + <td>pgpool-IIを停止させる</td></tr> <tr><th><a href="#pcp_recovery_node">pcp_recovery_node</a></th> - <td>$B%^%9%?%N!<%I$r;H$C$F%N!<%I$N%G!<%?$r:FF14|!"%N!<%I5/F0$5$;$k(B</td></tr> + <td>マスタノードを使ってノードのデータを再同期、ノード起動させる</td></tr> </table> -<h2 id="pcp_comand_args">$B6&DL0z?t(B</h2> +<h2 id="pcp_comand_args">共通引数</h2> <p> - $BA4$F$N%3%^%s%I$K$O6&DL$9$k0z?t$,$"$j$^$9!#$3$l$O@\B3$9$k(Bpgpool-II$B$N>pJs$dG'>Z(B - $B>pJs$J$I$G$9!#(B + 全てのコマンドには共通する引数があります。これは接続するpgpool-IIの情報や認証 + 情報などです。 <pre> ex) $ pcp_node_count [-d] 10 localhost 9898 postgres hogehoge -$BBh0l0z?t(B - $B%?%$%`%"%&%HCM(B - $BIC?t$G%?%$%`%"%&%HCM$r;XDj$7$^$9!#$3$N;~4VFb$K(Bpgpool-II$B$+$i1~(B - $BEz$,$J$$>l9g$O%3%M%/%7%g%s$r@ZCG$7$F=*N;$7$^$9!#$J$*!"(B - $B$3$N%*%W%7%g%s$O(B 2.1 $B$+$i$OL5;k$9$k$h$&$K$J$C$F$$$^$9!#(B -$BBhFs0z?t(B - pgpool-II$B$,2TF0$7$F$$$k%[%9%HL>(B -$BBh;00z?t(B - PCP$B%]!<%HHV9f(B -$BBh;M0z?t(B - PCP$B%f!<%6L>(B -$BBh8^0z?t(B - PCP$B%Q%9%o!<%I(B +第一引数 - タイムアウト値 + 秒数でタイムアウト値を指定します。この時間内にpgpool-IIから応 + 答がない場合はコネクションを切断して終了します。なお、 + このオプションは 2.1 からは無視するようになっています。 +第二引数 - pgpool-IIが稼動しているホスト名 +第三引数 - PCPポート番号 +第四引数 - PCPユーザ名 +第五引数 - PCPパスワード -$B%*%W%7%g%s0z?t$H$7$F!"(B-d$B$,$"$j$^$9!#(B-d$B$,;XDj$5$l$k$H%G%P%C%0>pJs$r=PNO$7$^$9!#(B +オプション引数として、-dがあります。-dが指定されるとデバッグ情報を出力します。 </pre> <p> -PCP$B%f!<%6L>$H%Q%9%o!<%I$O(B ./configure $B;~$K(B --prefix $B$G;XDj$7$?(B -'$B%$%s%9%H!<%k%G%#%l%/%H%j(B/etc' $B$K$"$k(B pcp.conf $BFb$K5-=R$5$l$F$$$k$b$N$r;XDj$7$^$9!#(B -pcp.conf $B%U%!%$%k$N>l=j$,%G%U%)%k%H0J30$N>l=j$K$"$k>l9g!"(B -pgpool $B$N(B-F $B%*%W%7%g%s$G$=$N0LCV$r;XDj$9$k$3$H$,$G$-$^$9!#(B -$B%Q%9%o!<%I$O%3%^%s%I$KEO$9;~E@$G(Bmd5$B2=$5$l$F$$$kI,MW$O$"$j$^$;$s!#(B +PCPユーザ名とパスワードは ./configure 時に --prefix で指定した +'インストールディレクトリ/etc' にある pcp.conf 内に記述されているものを指定します。 +pcp.conf ファイルの場所がデフォルト以外の場所にある場合、 +pgpool の-F オプションでその位置を指定することができます。 +パスワードはコマンドに渡す時点でmd5化されている必要はありません。 </p> -<h2>$B%3%^%s%I72(B</h2> +<h2>コマンド群</h2> <p> -$BA4$F$N%3%^%s%I$O!"<B9T$7$?7k2L$,I8=`=PNO$KI=<($5$l$^$9!#(B +全てのコマンドは、実行した結果が標準出力に表示されます。 </p> <h3 id="pcp_node_count">pcp_node_count</h3> <pre> -$B=q<0!'(B +書式: pcp_node_count _timeout_ _host_ _port_ _userid_ _passwd_ </pre> <p> -pgpool-II$B$N(B pgpool.conf $B$GDj5A$5$l$?%N!<%I$NAm?t$rI=<($7$^$9!#@Z$jN%$5$l$F$$$k%N!<%I$N6hJL$O$7$^$;$s!#(B +pgpool-IIの pgpool.conf で定義されたノードの総数を表示します。切り離されているノードの区別はしません。 </p> <h3><a name="pcp_node_info"></a>pcp_node_info</h3> <pre> -$B=q<0!'(B +書式: pcp_node_info _timeout_ _host_ _port_ _userid_ _passwd_ _nodeid_ </pre> <p> -pgpool-II$B$N(B pgpool.conf $B$GDj5A$5$l$?%N!<%I$N>pJs$rI=<($7$^$9!#=PNO7k2L$O0J2<$NNc$NDL$j$G$9!#(B +pgpool-IIの pgpool.conf で定義されたノードの情報を表示します。出力結果は以下の例の通りです。 </p> <pre> @@ -4474,45 +4727,45 @@ ex) $ pcp_node_info 10 localhost 9898 postgres hogehoge 0 host1 5432 1 1073741823.500000 -$B7k2L$O0J2<$N=g$NDL$j$G$9!#(B -1. $B%N!<%I$N%[%9%HL>(B -2. $B%N!<%I$N%]!<%HHV9f(B -3. $B%9%F!<%?%9(B -4. $B%m!<%I%P%i%s%9%&%'%$%H(B - -$B%9%F!<%?%9$O(B[0..3]$B$^$G$N?t;z$GI=$o$5$l$^$9!#3F?t;z$N0UL#$O!'(B -0 - $B=i4|2=;~$N$_$KI=$o$l$k!#(BPCP$B%3%^%s%I$GI=<($5$l$k$3$H$O$J$$!#(B -1 - $B%N!<%I2TF/Cf!#@\B3L5$7(B -2 - $B%N!<%I2TF/Cf!#@\B3M-$j(B -3 - $B%N!<%I%@%&%s(B +結果は以下の順の通りです。 +1. ノードのホスト名 +2. ノードのポート番号 +3. ステータス +4. ロードバランスウェイト + +ステータスは[0..3]までの数字で表わされます。各数字の意味は: +0 - 初期化時のみに表われる。PCPコマンドで表示されることはない。 +1 - ノード稼働中。接続無し +2 - ノード稼働中。接続有り +3 - ノードダウン </pre> <p> -$B%m!<%I%P%i%s%9%&%'%$%H$O(BNormalize$B$5$l$?%U%)!<%^%C%H$G=PNO$5$l$^$9!#(B +ロードバランスウェイトはNormalizeされたフォーマットで出力されます。 </p> <p> -$BDj5A$5$l$F$$$J$$%N!<%I(BID$B$r;XDj$9$k$H(BBackendError$B$HI=<($5$l!"=*N;%3!<%I(B12$B$G=*N;$7$^$9!#(B +定義されていないノードIDを指定するとBackendErrorと表示され、終了コード12で終了します。 </p> <h3 id="pcp_proc_count">pcp_proc_count</h3> <p> <pre> -$B=q<0!'(B +書式: pcp_proc_count _timeout_ _host_ _port_ _userid_ _passwd_ </pre> <p> -pgpool-II$B$N;R%W%m%;%9$N%W%m%;%9(BID$B$r0lMwI=<($7$^$9!#J#?t$"$k>l9g$O6uGrJ8;z$G6h@Z$i$l$^$9!#(B +pgpool-IIの子プロセスのプロセスIDを一覧表示します。複数ある場合は空白文字で区切られます。 </p> <h3 id="pcp_proc_info">pcp_proc_info</h3> <p> <pre> -$B=q<0!'(B +書式: pcp_proc_info _timeout_ _host_ _port_ _userid_ _passwd_ _processid_ </pre> <p> -pgpool-II$B$N;R%W%m%;%9>pJs$rI=<($7$^$9!#=PNO7k2L$O0J2<$NNc$NDL$j$G$9!#(B +pgpool-IIの子プロセス情報を表示します。出力結果は以下の例の通りです。 </p> <pre> ex) @@ -4520,30 +4773,30 @@ $ pcp_proc_info 10 localhost 9898 postgres hogehoge 3815 postgres_db postgres 1150769932 1150767351 3 0 1 14067 1 postgres_db postgres 1150769932 1150767351 3 0 1 14068 1 -$B7k2L$O0J2<$N=g$NDL$j$G$9!#(B -1. $B@\B3$7$F$$$k%G!<%?%Y!<%9L>(B -2. $B@\B3$7$F$$$k%f!<%6L>(B -3. $B%W%m%;%9%9%?!<%H;~9o(B -4. $B%3%M%/%7%g%s:n@.;~9o(B -5. $B%W%m%H%3%k%a%8%c!<%P!<%8%g%s(B -6. $B%W%m%H%3%k%^%$%J!<%P!<%8%g%s(B -7. $B%3%M%/%7%g%s;HMQ2s?t(B -8. PostgreSQL$B%P%C%/%(%s%I%W%m%;%9(BID -9. $B%U%m%s%H%(%s%I$+$i@\B3$,$"$k>l9g$O(B1$B!"$=$&$G$J$1$l$P(B0 - -$B%3%M%/%7%g%s$,%P%C%/%(%s%I$KBP$7$FD%$i$l$F$$$J$$>l9g!"%G!<%?$OI=<($5$l$^$;$s!#(B -$B%3%M%/%7%g%s>pJs$,J#?t$"$k>l9g!"J#?t9T$K(B1$B9T(B1$B%3%M%/%7%g%s>pJs$GI=<($5$l$^$9!#(B -$B;~9o$O(BEPOCH$B%?%$%`$+$i$NIC?t$GI=$o$5$l$^$9!#(B - -$BDj5A$5$l$F$$$J$$%W%m%;%9(BID$B$r;XDj$9$k$H(BBackendError$B$HI=<($5$l!"(B<a href="#exit_status">$B=*N;%3!<%I(B12</a>$B$G=*N;$7$^$9!#(B +結果は以下の順の通りです。 +1. 接続しているデータベース名 +2. 接続しているユーザ名 +3. プロセススタート時刻 +4. コネクション作成時刻 +5. プロトコルメジャーバージョン +6. プロトコルマイナーバージョン +7. コネクション使用回数 +8. PostgreSQLバックエンドプロセスID +9. フロントエンドから接続がある場合は1、そうでなければ0 + +コネクションがバックエンドに対して張られていない場合、データは表示されません。 +コネクション情報が複数ある場合、複数行に1行1コネクション情報で表示されます。 +時刻はEPOCHタイムからの秒数で表わされます。 + +定義されていないプロセスIDを指定するとBackendErrorと表示され、<a href="#exit_status">終了コード12</a>で終了します。 </pre> -<h3 id="pcp_pool_status">pcp_pool_status <span class="version">V3.1 $B!A(B</span></h3> +<h3 id="pcp_pool_status">pcp_pool_status <span class="version">V3.1 〜</span></h3> <pre> -$B=q<0(B: +書式: pcp_pool_status _timeout_ _host_ _port_ _userid_ _passwd_ </pre> -<p>pgpool.conf $B$N%Q%i%a!<%?@_DjCM$r<hF@$7$^$9!#=PNO7k2L$O0J2<$NDL$j$G$9!#(B</p> +<p>pgpool.conf のパラメータ設定値を取得します。出力結果は以下の通りです。</p> <pre> $ pcp_pool_status 10 localhost 9898 postgres hogehoge name : listen_addresses @@ -4566,11 +4819,11 @@ desc : PCP port # to bind <h3 id="pcp_systemdb_info">pcp_systemdb_info</h3> <pre> -$B=q<0!'(B +書式: pcp_systemdb_info _timeout_ _host_ _port_ _userid_ _passwd_ </pre> -<p>pgpool-II$B$N%7%9%F%`(BDB$B>pJs$rI=<($7$^$9!#=PNO7k2L$O0J2<$NDL$j$G$9!#(B</p> +<p>pgpool-IIのシステムDB情報を表示します。出力結果は以下の通りです。</p> <pre> $ pcp_systemdb_info 10 localhost 9898 postgres hogehoge @@ -4579,258 +4832,258 @@ yamaguti public accounts aid 4 aid bid abalance filler integer integer integer c yamaguti public branches bid 3 bid bbalance filler integer integer character(84) dist_def_branches yamaguti public tellers bid 4 tid bid tbalance filler integer integer integer character(84) dist_def_tellers -$B$^$:0l9TL\$K%7%9%F%`(BDB$B$N>pJs$,I=<($5$l$^$9!#7k2L$O0J2<$N=g$NDL$j$G$9!#(B - -1. $B%[%9%HL>(B -2. $B%]!<%HHV9f(B -3. $B%f!<%6L>(B -4. $B%Q%9%o!<%I!#6u$N>l9g$O(B''$B$GI=<($5$l$^$9!#(B -5. $B%9%-!<%^L>(B -6. $B%G!<%?%Y!<%9L>(B -7. $BJ,;6Dj5A4X?t$N?t(B - -$BFs9TL\0J9_$OJ,;6Dj5A$,I=<($5$l$^$9!#J#?t$NDj5A$,$"$k>l9g$O!"0l$D$NDj5A$K$D$-(B -$B0l9TI=<($5$l$^$9!#7k2L$O0J2<$N=g$NDL$j$G$9!#(B - -1. $BJ,;6BP>]$N%G!<%?%Y!<%9L>(B -2. $BJ,;6BP>]$N%9%-!<%^L>(B -3. $BJ,;6BP>]$N%F!<%V%kL>(B -4. $BJ,;6%-!<%+%i%`L>(B -5. $BJ,;6BP>]%F!<%V%kCf$N%+%i%`?t(B -6. $B%+%i%`L>%j%9%H(B(5.$B$N%+%i%`?tJ,I=<($5$l$^$9(B) -7. $B%+%i%`7?%j%9%H(B(5.$B$N%+%i%`?tJ,I=<($5$l$^$9(B) -8. $BJ,;6Dj5A4X?tL>(B - -$B%7%9%F%`(BDB$B$,Dj5A$5$l$F$$$J$$(B(pgpool-II$B%b!<%I$G$J$$!"$+$D%/%(%j%-%c%C%7%e$,%*(B -$B%U$N(B)$B>l9g$K<B9T$9$k$H!"(BBackendError$B$HI=<($5$l!"=*N;%3!<%I(B12$B$G=*N;$7$^$9!#(B +まず一行目にシステムDBの情報が表示されます。結果は以下の順の通りです。 + +1. ホスト名 +2. ポート番号 +3. ユーザ名 +4. パスワード。空の場合は''で表示されます。 +5. スキーマ名 +6. データベース名 +7. 分散定義関数の数 + +二行目以降は分散定義が表示されます。複数の定義がある場合は、一つの定義につき +一行表示されます。結果は以下の順の通りです。 + +1. 分散対象のデータベース名 +2. 分散対象のスキーマ名 +3. 分散対象のテーブル名 +4. 分散キーカラム名 +5. 分散対象テーブル中のカラム数 +6. カラム名リスト(5.のカラム数分表示されます) +7. カラム型リスト(5.のカラム数分表示されます) +8. 分散定義関数名 + +システムDBが定義されていない(pgpool-IIモードでない、かつクエリキャッシュがオ +フの)場合に実行すると、BackendErrorと表示され、終了コード12で終了します。 </pre> <h3 id="pcp_detach_node">pcp_detach_node</h3> <pre> -$B=q<0!'(B +書式: pcp_detach_node [-g] _timeout_ _host_ _port_ _userid_ _passwd_ _nodeid_ -pgpool-II$B$N%N!<%I$r@Z$jN%$7$^$9!#(B --g$B$r;XDj$9$k$H!"$9$Y$F$N%/%i%$%"%s%H$,@\B3$r=*N;$9$k$^$G%N!<%I$rI|5"$7$^$;$s!#(B -($B$?$@$7!"(Bclient_idle_limit_in_recovery $B$,(B -1 $B$"$k$$$O!"(Brecovery_timeout $B$,@_Dj$5$l$F$$$k>l9g$r=|$/(B) +pgpool-IIのノードを切り離します。 +-gを指定すると、すべてのクライアントが接続を終了するまでノードを復帰しません。 +(ただし、client_idle_limit_in_recovery が -1 あるいは、recovery_timeout が設定されている場合を除く) </pre> <h3 id="pcp_attach_node">pcp_attach_node</h3> <pre> -$B=q<0!'(B +書式: pcp_attach_node _timeout_ _host_ _port_ _userid_ _passwd_ _nodeid_ -pgpool-II$B$N%N!<%I$rI|5"$5$;$^$9!#(B +pgpool-IIのノードを復帰させます。 </pre> -<h3 id="pcp_promote_node">pcp_promote_node <span class="version">V3.1 $B!A(B</span></h3> +<h3 id="pcp_promote_node">pcp_promote_node <span class="version">V3.1 〜</span></h3> <pre> -$B=q<0(B: +書式: pcp_promote_node [-g] _timeout_ _host_ _port_ _userid_ _passwd_ _nodeid_ -pgpool-II$B$N%N!<%I$r%^%9%?!<$K>:3J$5$;$^$9!#$3$l$O!"%^%9%?!<%9%l!<%V%b!<%I$G%9%H%j!<%_%s%0(B -$B%l%W%j%1!<%7%g%s9=@.$N>l9g$N$_;HMQ$G$-$^$9!#(B --g$B$r;XDj$9$k$H!"$9$Y$F$N%/%i%$%"%s%H$,@\B3$r=*N;$9$k$^$G%N!<%I$r%^%9%?!<$K>:3J$7$^$;$s!#(B -($B$?$@$7!"(Bclient_idle_limit_in_recovery $B$,(B -1 $B$"$k$$$O!"(Brecovery_timeout $B$,@_Dj$5$l$F$$$k>l9g$r=|$/(B) +pgpool-IIのノードをマスターに昇格させます。これは、マスタースレーブモードでストリーミング +レプリケーション構成の場合のみ使用できます。 +-gを指定すると、すべてのクライアントが接続を終了するまでノードをマスターに昇格しません。 +(ただし、client_idle_limit_in_recovery が -1 あるいは、recovery_timeout が設定されている場合を除く) </pre> </p> <h3 id="pcp_stop_pgpool">pcp_stop_pgpool</h3> <pre> -$B=q<0!'(B +書式: pcp_stop_pgpool _timeout_ _host_ _port_ _userid_ _passwd_ _mode_ -pgpool-II$B$r;XDj$5$l$?%b!<%I$G%7%c%C%H%@%&%s$7$^$9!#;XDj$G$-$k%b!<%I$O0J2<$NDL(B -$B$j$G$9!#(B +pgpool-IIを指定されたモードでシャットダウンします。指定できるモードは以下の通 +りです。 -s - smart $B%b!<%I(B -f - fast $B%b!<%I(B -i - immediate $B%b!<%I(B +s - smart モード +f - fast モード +i - immediate モード -pgpool-II$B$,5/F0$7$F$$$J$$>l9g$O(BConnectionError$B$HI=<($5$l!"=*N;%3!<%I(B8$B$G=*N;$7(B -$B$^$9!#(B +pgpool-IIが起動していない場合はConnectionErrorと表示され、終了コード8で終了し +ます。 -$B"((B $B8=:_$O(B fast $B%b!<%I$H(B immediate $B%7%c%C%H%@%&%s$N=hM}$K6hJL$O$"$j(B - $B$^$;$s!#L?Na$rAw$C$?;~E@$G%/%i%$%"%s%H$,$$$k!&$$$J$$$K4X$o$i$:(B - $B%7%c%C%H%@%&%s=hM}$rB(:B$K9T$$$^$9!#(B +※ 現在は fast モードと immediate シャットダウンの処理に区別はあり + ません。命令を送った時点でクライアントがいる・いないに関わらず + シャットダウン処理を即座に行います。 </pre> </p> <h3 id="pcp_recovery_node">pcp_recovery_node</h3> <pre> -$B=q<0!'(B +書式: pcp_recovery_node _timeout_ _host_ _port_ _userid_ _passwd_ _nodeid_ -pgpool-II$B$N%N!<%I$r%G!<%?$r:FF14|$5$;$?>e$GI|5"$5$;$^$9!#(B +pgpool-IIのノードをデータを再同期させた上で復帰させます。 </pre> </p> -<h2 id="exit_status">$B=*N;%9%F!<%?%9(B</h2> +<h2 id="exit_status">終了ステータス</h2> <p> -PCP$B%3%^%s%I$O@5>o$K=hM}$r=*N;$7$?>l9g!"%9%F!<%?%9(B'0'$B$G=*N;$7$^$9!#%(%i!<$,5/(B -$B$-$?>l9g$O0J2<$N%9%F!<%?%9$K$h$j=*N;$7$^$9!#(B +PCPコマンドは正常に処理を終了した場合、ステータス'0'で終了します。エラーが起 +きた場合は以下のステータスにより終了します。 </p> <table border> <tr><th>UNKNOWNERR</th> - <td>1</td><td>$BITL@$J%(%i!<(B</td></tr> + <td>1</td><td>不明なエラー</td></tr> <tr><th>EOFER</th> - <td>2</td><td>EOF$B%(%i!<(B</td></tr> + <td>2</td><td>EOFエラー</td></tr> <tr><th>NOMEMERR</th> - <td>3</td><td>$B%a%b%jITB-(B</td></tr> + <td>3</td><td>メモリ不足</td></tr> <tr><th>READERR</th> - <td>4</td><td>$B%5!<%P$+$i$N%G!<%?FI$_9~$_%(%i!<(B</td></tr> + <td>4</td><td>サーバからのデータ読み込みエラー</td></tr> <tr><th>WRITEERR</th> - <td>5</td><td>$B%5!<%P$X$N%G!<%?=q$-9~$_%(%i!<(B</td></tr> + <td>5</td><td>サーバへのデータ書き込みエラー</td></tr> <tr><th>TIMEOUTERR</th> - <td>6</td><td>$B%?%$%`%"%&%H(B</td></tr> + <td>6</td><td>タイムアウト</td></tr> <tr><th>INVALERR</th> - <td>7</td><td>PCP$B%3%^%s%I$X$NIT@5$J%*%W%7%g%s(B</td></tr> + <td>7</td><td>PCPコマンドへの不正なオプション</td></tr> <tr><th>CONNERR</th> - <td>8</td><td>$B%5!<%P@\B3%(%i!<(B</td></tr> + <td>8</td><td>サーバ接続エラー</td></tr> <tr><th>NOCONNERR</th> - <td>9</td><td>$B@\B3$,B8:_$7$J$$(B</td></tr> + <td>9</td><td>接続が存在しない</td></tr> <tr><th>SOCKERR</th> - <td>10</td><td>$B%=%1%C%H%(%i!<(B</td></tr> + <td>10</td><td>ソケットエラー</td></tr> <tr><th>HOSTERR</th> - <td>11</td><td>$B%[%9%HL>2r7h%(%i!<(B</td></tr> + <td>11</td><td>ホスト名解決エラー</td></tr> <tr><th>BACKENDERR</th> - <td>12</td><td>$B%5!<%P$G$N(BPCP$B=hM}%(%i!<!#B8:_$7$J$$%W%m%;%9(BID$B$N>pJs$r<hF@$7$h$&$H$7$?>l9g$J$I(B</td></tr> + <td>12</td><td>サーバでのPCP処理エラー。存在しないプロセスIDの情報を取得しようとした場合など</td></tr> <tr><th>AUTHERR</th> - <td>13</td><td>$BG'>Z%(%i!<(B</td></tr> + <td>13</td><td>認証エラー</td></tr> </table> -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> +<p class="top_link"><a href="#Top">△ back to top</a></p> <!-- ================================================================================ --> -<h1>$BFbIt>pJs(B<a name="internal"></a></h1> +<h1>内部情報<a name="internal"></a></h1> <p> -pgpool-II$B%P!<%8%g%s(B 2.0 $B0J9_$G$O!"(B1.x $B%P!<%8%g%s$HHf$YBgI}$J2~NI$,2C$($i$l$F$$$^$9!#(B -1.x $B%P!<%8%g%s$N>pJs$H$O8_49@-$,$J$$$N$GCm0U$7$F$/$@$5$$!#(B +pgpool-IIバージョン 2.0 以降では、1.x バージョンと比べ大幅な改良が加えられています。 +1.x バージョンの情報とは互換性がないので注意してください。 </p> -<h2 id="parallel_execute_engine">$B%Q%i%l%k<B9T%(%s%8%s(B</h2> +<h2 id="parallel_execute_engine">パラレル実行エンジン</h2> <p> -pgpool-II$B$K$O%Q%i%l%k<B9T%(%s%8%s$,AH$_9~$^$l$F$$$^$9!#(B +pgpool-IIにはパラレル実行エンジンが組み込まれています。 </p> <p> -$B$3$N%(%s%8%s$O!"%Q%i%l%k%b!<%I$N$H$-$K!"3F%N!<%I$KF1$8%/%(%j$rLd$$9g(B -$B$o$;!"%N!<%I$N1~Ez=g$K7k2L$r%U%m%s%H%(%s%I$KAw?.$9$k%(%s%8%s$N$3$H$r(B -$B;X$7$^$9!#(B +このエンジンは、パラレルモードのときに、各ノードに同じクエリを問い合 +わせ、ノードの応答順に結果をフロントエンドに送信するエンジンのことを +指します。 </p> -<h2 id="rewrite_query">$B%/%(%j=q$-49$((B</h2> +<h2 id="rewrite_query">クエリ書き換え</h2> <p> -$B%Q%i%l%k%b!<%I$G(Bpgpool-II$B$,9T$&%/%(%j=q$-49$($K$D$$$F@bL@$7$^$9!#(B +パラレルモードでpgpool-IIが行うクエリ書き換えについて説明します。 </p> <p> -$B%Q%i%l%k%b!<%I$G$O!"%/%i%$%"%s%H$,Aw?.$7$?8!:w7O(B(SELECT$B=hM}(B)$B$NLd$$9g$o$;$O!"(B -$BBg$-$/J,$1$F0J2<$N(B 2 $B$D$N=hM}$r9T$$$^$9!#(B +パラレルモードでは、クライアントが送信した検索系(SELECT処理)の問い合わせは、 +大きく分けて以下の 2 つの処理を行います。 </p> <ol> - <li>$B%/%(%j$N2r@O(B</li> - <li>$B%/%(%j$N=q$-49$((B</li> + <li>クエリの解析</li> + <li>クエリの書き換え</li> </ol> <p> -$B$3$l$i#2$D$N=hM}$K$D$$$F=g$K@bL@CW$7$^$9!#(B +これら2つの処理について順に説明致します。 </p> -<h3 id="analyze_query">$B%/%(%j$N2r@O(B</h3> -<h4>$B$O$8$a$K(B</h4> +<h3 id="analyze_query">クエリの解析</h3> +<h4>はじめに</h4> <p> -$B%/%i%$%"%s%H$,Aw?.$7$?8!:w7O$NLd$$9g$o$;$O!"(BSQL$B%Q!<%5$rDL$7$F$+$i%7%9%F%`(BDB$B$KEPO?$5$l$F$$$k>pJs$r(B -$B$b$H$K%/%(%j2r@O$r9T$$$^$9!#%/%(%j$N2r@O$K$O<B9T%9%F!<%?%9$NA+0\$GI>2A$7$F$$$^$9!#(B +クライアントが送信した検索系の問い合わせは、SQLパーサを通してからシステムDBに登録されている情報を +もとにクエリ解析を行います。クエリの解析には実行ステータスの遷移で評価しています。 </p> <p> -$B$3$3$G<B9T%9%F!<%?%9$H$$$&$N$O!"$"$k%G!<%?$N=89g$,2?=h$G<hF@$^$?$O=hM}$G$-$k$N$+H=CG$9$k$b$N$G$9!#(B -$BNc$($P!"(Bpgpool_catalog.dist_def$B%F!<%V%k$KEPO?$5$l$F$$$k%F!<%V%k$N%G!<%?=89gA4BN$O!"(B -$B%G!<%?$,J,3d$5$l$F$$$k$N$G$9$Y$F$N%N!<%I$+$i<hF@$9$kI,MW$,$"$j$^$9!#(B -$B5U$K!"(Bpgpool_catalog.replicate_def$B%F!<%V%k$KEPO?$5$l$F$$$k%F!<%V%k$N%G!<%?=89gA4BN$O!"(B -$B$9$Y$F$N%N!<%I$+$i<hF@$9$k$N$G$O$J$/!"$$$:$l$+$N%N!<%I(B -$B$+$i<hF@$9$l$P==J,$G$9!#(B +ここで実行ステータスというのは、あるデータの集合が何処で取得または処理できるのか判断するものです。 +例えば、pgpool_catalog.dist_defテーブルに登録されているテーブルのデータ集合全体は、 +データが分割されているのですべてのノードから取得する必要があります。 +逆に、pgpool_catalog.replicate_defテーブルに登録されているテーブルのデータ集合全体は、 +すべてのノードから取得するのではなく、いずれかのノード +から取得すれば十分です。 </p> <p> -$B$3$3$G<B9T%9%F!<%?%9$H$$$&$N$O!"$"$k%G!<%?$N=89g$,2?=h$G<hF@$^$?$O=hM}$G$-$k$N$+H=CG$9$k$b$N$G$9!#(B -$B$3$3$G$9$Y$F$N%N!<%I$G=hM}$9$kI,MW$,$"$k>uBV$r(B P $B>uBV!"0l$D$N%N!<%I$G=hM}$9$kI,MW$,$"$k>uBV$r(B -L $B>uBV$H$7$FDj5A$7$^$9!#(B +ここで実行ステータスというのは、あるデータの集合が何処で取得または処理できるのか判断するものです。 +ここですべてのノードで処理する必要がある状態を P 状態、一つのノードで処理する必要がある状態を +L 状態として定義します。 </p> <p> -$B$3$3$G<B9T%9%F!<%?%9$H$$$&$N$O!"$"$k%G!<%?$N=89g$,2?=h$G<hF@$^$?$O=hM}$G$-$k$N$+H=CG$9$k$b$N$G$9!#(B -$B$b$&0l$D!"FCJL$J>uBV$H$7$F(B S $B>uBV$,$"$j$^$9!#(B -$B$3$l$O!"$9$Y$F$N%N!<%I$+$i<hF@$7$?A4%G!<%?$KBP$7$F=hM}$r9T$C$?$H$-$N>uBV$N$3$H$r<($7$^$9!#(B +ここで実行ステータスというのは、あるデータの集合が何処で取得または処理できるのか判断するものです。 +もう一つ、特別な状態として S 状態があります。 +これは、すべてのノードから取得した全データに対して処理を行ったときの状態のことを示します。 </p> <p> -$B$3$3$G<B9T%9%F!<%?%9$H$$$&$N$O!"$"$k%G!<%?$N=89g$,2?=h$G<hF@$^$?$O=hM}$G$-$k$N$+H=CG$9$k$b$N$G$9!#(B -$BNc$($P!"%=!<%H=hM}$G$9!#(Bpgpool_catalog.dist_def$B%F!<%V%k$KEPO?$5$l$F$$$k(B -$B%F!<%V%k$N%G!<%?$KBP$9$k%=!<%H=hM}$O!"$9$Y$F$N%N!<%I$+$i%G!<%?$r<hF@$7$?8e$K<B9T$9$kI,MW$,$"$j$^$9!#(B +ここで実行ステータスというのは、あるデータの集合が何処で取得または処理できるのか判断するものです。 +例えば、ソート処理です。pgpool_catalog.dist_defテーブルに登録されている +テーブルのデータに対するソート処理は、すべてのノードからデータを取得した後に実行する必要があります。 </p> <p> -$B8!:w7O%/%(%j$O!"0J2<$N=hM}=g$K2r@O$5$l!"<B9T%9%F!<%?%9$,A+0\$7$F$$$-$^$9!#(B -$B<B9T%9%F!<%?%9$,A+0\$7$F$$$/2aDx$G(B S $B>uBV$H$J$k$H!"0J9_$N=hM}$OI,$:(B S $B>uBV$H$J$j$^$9!#(B -$B$=$7$F:G8e$N(BSELECT$B$N:G=*<B9T%9%F!<%?%9$N>uBV$K$h$j!"2?=h$N(BDB$B$G=hM}$5$l$k$+$,7hDj$7$^$9!#(B +検索系クエリは、以下の処理順に解析され、実行ステータスが遷移していきます。 +実行ステータスが遷移していく過程で S 状態となると、以降の処理は必ず S 状態となります。 +そして最後のSELECTの最終実行ステータスの状態により、何処のDBで処理されるかが決定します。 <ol> - <li> UNION$B!"(BEXTRACT$B!"(BINTERCECT$B$,MxMQ$5$l$F$$$k$+$I$&$+(B</li> - <li> FROM $B6g$N<B9T%9%F!<%?%9(B</li> - <li> TARGETLIST $B$K$h$k<B9T%9%F!<%?%9$NJQ2=(B</li> - <li> WHERE $B6g(B $B$K$k<B9T%9%F!<%?%9$NJQ2=(B</li> - <li> GROUP BY $B6g$K$h$k<B9T%9%F!<%?%9$NJQ2=(B</li> - <li> HAVING $B6g$K$h$k<B9T%9%F!<%?%9$NJQ2=(B</li> - <li> ORDER BY $B6g$K$h$k<B9T%9%F!<%?%9$NJQ2=(B</li> - <li> LIMIT OFFSET $B=R8l$K<B9T%9%F!<%?%9$NJQ2=(B</li> - <li> SELECT$B$N:G=*<B9T%9%F!<%?%9$N<hF@(B</li> + <li> UNION、EXTRACT、INTERCECTが利用されているかどうか</li> + <li> FROM 句の実行ステータス</li> + <li> TARGETLIST による実行ステータスの変化</li> + <li> WHERE 句 にる実行ステータスの変化</li> + <li> GROUP BY 句による実行ステータスの変化</li> + <li> HAVING 句による実行ステータスの変化</li> + <li> ORDER BY 句による実行ステータスの変化</li> + <li> LIMIT OFFSET 述語に実行ステータスの変化</li> + <li> SELECTの最終実行ステータスの取得</li> </ol> <p> -SELECT$B$N:G=*<B9T%9%F!<%?%9$H=hM}$5$l$k>l=j$H$N4X78$O!"0J2<$NDL$j$G$9!#(B +SELECTの最終実行ステータスと処理される場所との関係は、以下の通りです。 </p> <table border> -<tr class="header"><th>$B<B9T%9%F!<%?%9(B</th><th>$B=hM}$5$l$k>l=j(B</th></tr> -<tr><th>L</th><td>$B$$$:$l$+$N%N!<%I$KLd$$9g$o$;$r9T$&(B</td></tr> -<tr><th>P</th><td>$B$9$Y$F$N%N!<%IF1$8Ld$$9g$o$;$r9T$$!"%Q%i%l%k<B9T%(%s%8%s$rDL$7$F%/%i%$%"%s%H$KJV5Q(B</td></tr> -<tr><th>S</th><td>$B%7%9%F%`(BDB$B$G=hM}$r9T$C$?8e$K%/%i%$%"%s%H$KJV5Q(B</td></tr> +<tr class="header"><th>実行ステータス</th><th>処理される場所</th></tr> +<tr><th>L</th><td>いずれかのノードに問い合わせを行う</td></tr> +<tr><th>P</th><td>すべてのノード同じ問い合わせを行い、パラレル実行エンジンを通してクライアントに返却</td></tr> +<tr><th>S</th><td>システムDBで処理を行った後にクライアントに返却</td></tr> </td></tr> </table> <p> -$B$^$?%5%V%/%(%j$KBP$7$F$b>e5-$N%k!<%k$,E,1~$5$l$^$9!#(B -$B0J2<$NC1=c$J%/%(%j$G$O!"(Bp1-table$B$,%7%9%F%`(BDB$B$N(Bpgpool_catalog.dist_def$B%F!<%V%k$KEPO?$5$l$F$$$k>l9g!"(B -$B$D$^$j%G!<%?$NJ,3d$,(B -$B9T$o$l$F$$$k>l9g$K$O!"%5%V%/%(%j$N:G=*<B9T%9%F!<%?%9$,(B P $B$H$J$j!"(B -$B$=$N7k2L%5%V%/%(%j$N8F$S=P$785$G$"$k(B SELECT $B$N<B9T%9%F!<%?%9$b(B P $B$H$J$j$^$9!#(B +またサブクエリに対しても上記のルールが適応されます。 +以下の単純なクエリでは、p1-tableがシステムDBのpgpool_catalog.dist_defテーブルに登録されている場合、 +つまりデータの分割が +行われている場合には、サブクエリの最終実行ステータスが P となり、 +その結果サブクエリの呼び出し元である SELECT の実行ステータスも P となります。 </p> <pre> SELECT * FROM (SELECT * FROM P1-table) as P2-table; </pre> <p> -$B<!$K6qBNE*$K<B9T%9%F!<%?%9$,$I$N$h$&$KA+0\$9$k$N$+@bL@$7$^$9!#(B -$B$^$:(B2. From$B6g$N<B9T%9%F!<%?%9(B $B$+$i@bL@$7$^$9!#(B +次に具体的に実行ステータスがどのように遷移するのか説明します。 +まず2. From句の実行ステータス から説明します。 </p> -<h4>FROM $B6g$N<B9T%9%F!<%?%9(B</h4> +<h4>FROM 句の実行ステータス</h4> <p> -$B8!:w7O%/%(%j(B(SELECT)$B$O(B FROM $B6g$K$h$j%G!<%?$N=89g$rDj5A$7$^$9!#(B -FROM$B6g$+$i9=@.$;$l$k%G!<%?=89g$O(B P $B>uBV(B, L $B>uBV!"$^$?$O(B S $B>uBV$r<h$j$^$9!#(B -FROM$B6g$K;XDj$7$F$$$k%F!<%V%k$,0l$D$N>l9g$K$O!"C1=c$K%F!<%V%k$N<B9T%9%F!<%?%9$,(B -FROM$B6g$+$i9=@.$5$l$k%G!<%?=89gA4BN$N<B9T%9%F!<%?%9$H$J$j$^$9!#(B -FROM$B6g$KJ#?t$N%F!<%V%k!"Kt$O%5%V%/%(%j$,$"$k>l9g(B -$B$K$O!"7k9gJ}K!$K$h$C$F0J2<$N$h$&$K<B9T%9%F!<%?%9$,7hDj$7$^$9!#(B +検索系クエリ(SELECT)は FROM 句によりデータの集合を定義します。 +FROM句から構成せれるデータ集合は P 状態, L 状態、または S 状態を取ります。 +FROM句に指定しているテーブルが一つの場合には、単純にテーブルの実行ステータスが +FROM句から構成されるデータ集合全体の実行ステータスとなります。 +FROM句に複数のテーブル、又はサブクエリがある場合 +には、結合方法によって以下のように実行ステータスが決定します。 </p> <table border> <tr class="header"> -<th>$B7k9gJ}<0(B</th> +<th>結合方式</th> <th colspan="3">LEFT OUTER JOIN</th> <th colspan="3">RIGHT OUTER JOIN</th> <th colspan="3">FULL OUTER JOIN</th> -<th colspan="3">$B$=$NB>(B</th> +<th colspan="3">その他</th> </tr> -<tr class="center"><th>$B:8!@1&(B</th> +<tr class="center"><th>左\右</th> <td> P </td><td> L </td><td> S </td><td> P </td><td> L </td><td> S </td><td> P </td><td> L </td><td> S </td><td> P </td><td> L </td><td> S </td> </tr> <tr class="center"><th> P </th> @@ -4845,128 +5098,128 @@ FROM$B6g$KJ#?t$N%F!<%V%k!"Kt$O%5%V%/%(%j$,$"$k>l9g(B </table> <p> -$B0J2<$NNc$G$O!"(BP1-table$B$,(B P $B>uBV$N%F!<%V%k$G(BL1-table,L2-table$B$,(B L $B>uBV$N%F!<%V%k$@$H$7$^$9!#(B -$B$9$k$H>e5-$NI=$K$h$j!"(BP1-table ($B:8(B)$B$H(BL1-table ($B1&(B) $B$,7k9g$7(B P $B>uBV$H$J$j!"(B -$B$5$i$K(B P $B>uBV$H(B L $B>uBV$N(BL2-table$B$,7k9g$7$F(BFROM$B6g$N<B9T%9%F!<%?%9$O(B P $B>uBV$H$J$j$^$9!#(B +以下の例では、P1-tableが P 状態のテーブルでL1-table,L2-tableが L 状態のテーブルだとします。 +すると上記の表により、P1-table (左)とL1-table (右) が結合し P 状態となり、 +さらに P 状態と L 状態のL2-tableが結合してFROM句の実行ステータスは P 状態となります。 <pre> SELECT * FROM P1-table,L1-table,L2-table; </pre> </p> -<h4>TARGETLIST $B$H(B WHERE$B6g$N<B9T%9%F!<%?%9(B</h4> +<h4>TARGETLIST と WHERE句の実行ステータス</h4> <p> -$B4pK\E*$J%/%(%j$G$O!"(BFROM $B6g$HF1$8<B9T%9%F!<%?%9$r7Q>5$7$^$9!#(B -$B$7$+$7!"(BTARGETLIST $B$H(B WHERE$B6g$N<B9T%9%F!<%?%9$O!"0J2<$N>l9g$KJQ2=$7$^$9!#(B +基本的なクエリでは、FROM 句と同じ実行ステータスを継承します。 +しかし、TARGETLIST と WHERE句の実行ステータスは、以下の場合に変化します。 </p> <ol> - <li>$B%5%V%/%(%j$,$"$k>l9g(B</li> - <li>FROM$B6g$,(B P $B>uBV$N>l9g!"$+$D!"(BTARGETLIST$B$K=8Ls4X?t!"(BDISTINCT$B$,$"$k>l9g(B </li> - <li>FROM$B6g$GDj5A$7$?%F!<%V%k(B($B%G!<%?=89g(B)$B$KB8:_$7$J$$%+%i%`$,;H$o$l$F$$$k>l9g(B</li> + <li>サブクエリがある場合</li> + <li>FROM句が P 状態の場合、かつ、TARGETLISTに集約関数、DISTINCTがある場合 </li> + <li>FROM句で定義したテーブル(データ集合)に存在しないカラムが使われている場合</li> </ol> <p> -$B%5%V%/%(%j$N:G=*<B9T%9%F!<%?%9$,(B P $B>uBV!"$^$?$O!"(BS $B>uBV$N>l9g$K$O!"(B -TARGETLIST$B!"(BWHERE$B6g$N<B9T%9%F!<%?%9$O!"(BS $B>uBV$H$J$j$^$9!#(B -$B2<5-$NNc$G$O!"%5%V%/%(%j$G;H$o$l$F$$$k%F!<%V%k$,!"(BP $B>uBV$N>l9g$K$O!"(B -$B%5%V%/%(%j$N:G=*<B9T%9%F!<%?%9$O(BP $B>uBV$H$J$j$^$9!#(B -$B$=$N$?$a(B L1-table$B$N<B9T%9%F!<%?%9$K0MB8$;$:$K!"(BWHERE$B6g$N<B9T%9%F!<%?%9$O(B S$B>uBV$H$J$j!"(B -$B$3$N%/%(%j$N<B9T>l=j$O%7%9%F%`(BDB$B$H$J$j$^$9!#(B +サブクエリの最終実行ステータスが P 状態、または、S 状態の場合には、 +TARGETLIST、WHERE句の実行ステータスは、S 状態となります。 +下記の例では、サブクエリで使われているテーブルが、P 状態の場合には、 +サブクエリの最終実行ステータスはP 状態となります。 +そのため L1-tableの実行ステータスに依存せずに、WHERE句の実行ステータスは S状態となり、 +このクエリの実行場所はシステムDBとなります。 </p> <pre> SELECT * FROM L1-table WHERE L1-table.column IN (SELECT * FROM P1-table); </pre> <p> -FROM $B6g$,(B P $B>uBV$N>l9g!"$+$D!"(BTARGETLIST$B$K=8Ls4X?t$,$"$k>l9g$O!"(B -$B%G!<%?$r<hF@8e$K=87W$9$kI,MW$,$"$k$?$a!"(BS$B>uBV$KA+0\$7$^$9!#(B -$B$^$?!"FCDj$N>r7o$N2<$G$O!"=8Ls4X?t$K$h$k:GE,2=$,9T$o$l$^$9!#(B +FROM 句が P 状態の場合、かつ、TARGETLISTに集約関数がある場合は、 +データを取得後に集計する必要があるため、S状態に遷移します。 +また、特定の条件の下では、集約関数による最適化が行われます。 </p> <p> -FROM$B6g$GDj5A$7$?%F!<%V%k!"%5%V%/%(%j$K$OB8:_$7$J$$%+%i%`$,(BWHERE$B6g$K;H$o$l$F$$$k>l9g$,$"$j$^$9!#(B -$B$3$l$O0J2<$N$h$&$JAj4X%5%V%/%(%jFb$GH/@8$7$^$9!#(B +FROM句で定義したテーブル、サブクエリには存在しないカラムがWHERE句に使われている場合があります。 +これは以下のような相関サブクエリ内で発生します。 </p> <pre> SELECT * FROM L1-table WHERE L1-table.col1 IN (SELECT * FROM P1-table WHERE P1-table.col = L1-table.col1); </pre> -<p>$B>e5-$N%5%V%/%(%j$K;H$o$l$F$$$k(B L1-table.col1$B$O!"(BL1-table$B$r30It;2>H$7$F$$$^$9!#(B -$B$3$N>l9g$K%5%V%/%(%j$N(BWHERE$B6g$N<B9T%9%F!<%?%9$O(B S $B>uBV$H$J$j$^$9!#(B +<p>上記のサブクエリに使われている L1-table.col1は、L1-tableを外部参照しています。 +この場合にサブクエリのWHERE句の実行ステータスは S 状態となります。 -<h4>GROUP BY $B6g!"(BHAVING $B6g!"(BORDER BY $B6g!"(BLIMIT OFFSET $B=R8l$N<B9T%9%F!<%?%9(B</h4> +<h4>GROUP BY 句、HAVING 句、ORDER BY 句、LIMIT OFFSET 述語の実行ステータス</h4> <p> -WHERE$B6g$N<B9T%9%F!<%?%9$,(B P $B>uBV$N>l9g$K!"(BGROUP BY , HAVING $B6g!"(BORDER BY $B6g!"(B -LIMIT OFFSET $B=R8l$,$"$k$H(BS$B>uBV$KA+0\$7$^$9!#(B -GROUP BY$B6g$,B8:_$7$J$$%/%(%j$O(BWHERE$B6g$N<B9T%9%F!<%?%9$r7Q>5$7$^$9!#(B -$B$^$?!"(BHAVING$B6g$,L5$$>l9g$K$O(BGROUP BY $B6g$N<B9T%9%F!<%?%9$r7Q>5$7$^$9!#(B -ORDER BY $B6g!"(BLIMIT OFFSET $B=R8l$bF1MM$G$9!#(B +WHERE句の実行ステータスが P 状態の場合に、GROUP BY , HAVING 句、ORDER BY 句、 +LIMIT OFFSET 述語があるとS状態に遷移します。 +GROUP BY句が存在しないクエリはWHERE句の実行ステータスを継承します。 +また、HAVING句が無い場合にはGROUP BY 句の実行ステータスを継承します。 +ORDER BY 句、LIMIT OFFSET 述語も同様です。 </p> <p> -UNION$B!"(BEXTRACT$B!"(BINTERSECT$B$,;H$o$l$F$$$k>l9g(B +UNION、EXTRACT、INTERSECTが使われている場合 </p> <p> -UNION$B!"(BEXTRAT$B!"(BINTERSECT$B$,;H$C$F$$$k%/%(%j$O:8B&$N(BSELECT$BJ8$H1&B&$N(BSELECT$BJ8$N:G=*<B9T%9%F!<%?%9$K0MB8$7$^$9!#(B -$B:8B&$H1&B&$N(BSELECT$BJ8$N:G=*<B9T%9%F!<%?%9$,6&$K(B L $B>uBV$N;~$K$O!"(BL $B>uBV$H$J$j$^$9!#(B +UNION、EXTRAT、INTERSECTが使っているクエリは左側のSELECT文と右側のSELECT文の最終実行ステータスに依存します。 +左側と右側のSELECT文の最終実行ステータスが共に L 状態の時には、L 状態となります。 </p> <p> -$B$^$?!":8B&$H1&B&$N(BSELECT$BJ8$N:G=*<B9T%9%F!<%?%9$,6&$K(B P $B>uBV!"$+$D(BUNION ALL$B$N>l9g$K$O(B P $B>uBV$H$J$j$^$9!#(B -$B$=$NB>$NAH$_9g$o$;$N>l9g$K$O!"(BS$B>uBV$H$J$j$^$9!#(B +また、左側と右側のSELECT文の最終実行ステータスが共に P 状態、かつUNION ALLの場合には P 状態となります。 +その他の組み合わせの場合には、S状態となります。 </p> -<h4>SELECT$B$N:G=*<B9T%9%F!<%?%9$N<hF@(B</h4> +<h4>SELECTの最終実行ステータスの取得</h4> <p> -$B<B9T%9%F!<%?%9$,$9$Y$F(B L $B>uBV$N>l9g$K$O(BL$B>uBV!"$9$Y$F(B P $B>uBV$N>l9g$K$O!"(BP $B>uBV$H$J$j$^$9!#(B -$B$=$l0J30$O!"(BS $B>uBV$H$J$j$^$9!#(B +実行ステータスがすべて L 状態の場合にはL状態、すべて P 状態の場合には、P 状態となります。 +それ以外は、S 状態となります。 </p> <p> -L $B>uBV$N>l9g$K$O!"(Bpgpool.conf$B$N(Bloadbalance_mode$B$,(Btrue$B$N>l9g$K$OIi2YJ,;6$5$l!"(B -$B$=$l0J30$N>l9g$K$O(BMASTER$B$KLd$$9g$o$;$r9T$$$^$9!#(B +L 状態の場合には、pgpool.confのloadbalance_modeがtrueの場合には負荷分散され、 +それ以外の場合にはMASTERに問い合わせを行います。 </p> <p> -$B$^$?!"(BP $B>uBV$N>l9g$K$O!"%Q%i%l%k<B9T%(%s%8%s$r;H$C$FJBNs=hM}$,9T$o$l$^$9!#(B -S $B>uBV$N>l9g$K$O!"<!$N%U%'!<%:$G$"$k%/%(%j=q$-49$($r9T$$$^$9!#(B +また、P 状態の場合には、パラレル実行エンジンを使って並列処理が行われます。 +S 状態の場合には、次のフェーズであるクエリ書き換えを行います。 </p> -<h3 id="step_rewrite_query">$B%/%(%j=q$-49$((B</h3> +<h3 id="step_rewrite_query">クエリ書き換え</h3> <p> -$B%/%(%j$N2r@O%U%'!<%:$G<hF@$7$?<B9T%9%F!<%?%9$r;H$C$F%/%(%j$N=q$-49$($r9T$$$^$9!#(B -$BNc$H$7$F(B P $B>uBV$N(B P1-table $B$H(B L $B>uBV$N(B L1-table $B$r;H$C$?%/%(%j$G@bL@$7$^$9!&(B +クエリの解析フェーズで取得した実行ステータスを使ってクエリの書き換えを行います。 +例として P 状態の P1-table と L 状態の L1-table を使ったクエリで説明します・ </p> <pre> SELECT P1-table.col, L1-table.col FROM P1-table,L1-table where P1-table.col = L1-table.col order by P1-table.col; </pre> <p> -$B$3$N%/%(%j$G$O(B ORDER BY $B6g$,$"$k$?$a(B S $B>uBV$H$J$j!"(BFROM$B6g!"(BWHERE$B6g!"(BTARGETLIST$B$O(B P $B>uBV$H$J$j$^$9!#(B -$B$3$N$h$&$J%/%(%j$G$O0J2<$N$h$&$K=q$-49$($i$l$^$9!#(B +このクエリでは ORDER BY 句があるため S 状態となり、FROM句、WHERE句、TARGETLISTは P 状態となります。 +このようなクエリでは以下のように書き換えられます。 </p> <pre> SELECT P1-table.col, L1-table.col FROM -$B!!!!!!(Bdblink(select pool_parallel(SELECT P1-table.col, L1-table.col FROM P1-table,L1-table where P1-table.col = L1-table.col)) +   dblink(select pool_parallel(SELECT P1-table.col, L1-table.col FROM P1-table,L1-table where P1-table.col = L1-table.col)) order by P1-table.col; </pre> <p> -$B$3$3$G(Bdblink$B$O(Bpgpool-II$B$KLd$$9g$o$;$rAw?.$7$^$9!#(B -$B$^$?!"(Bpool_parallel$B$O0z?t$N%/%(%j$r%Q%i%l%k<B9T%(%s%8%s$r$K$o$?$94X?t$G$9!#(B -$B$J$*!">e5-$O$"$/$^$G%$%a!<%8$G$"$j<B:]$K<B9T2DG=$J%/%(%j$G$O$"$j$^$;$s!#(B +ここでdblinkはpgpool-IIに問い合わせを送信します。 +また、pool_parallelは引数のクエリをパラレル実行エンジンをにわたす関数です。 +なお、上記はあくまでイメージであり実際に実行可能なクエリではありません。 </p> <p> -$B>e5-$NNc$N$h$&$K!"(BFROM$B6g!"(BWHERE$B6g!"(BTARGETLIST$B$,$9$Y$F(B P $B>uBV$N>l9g$K$O!"(B -FROM$B6g!"(BWHERE$B6g!"(BTARGETLIST$B$r$^$H$a$FJBNs=hM}$r9T$$$^$9!#(B +上記の例のように、FROM句、WHERE句、TARGETLISTがすべて P 状態の場合には、 +FROM句、WHERE句、TARGETLISTをまとめて並列処理を行います。 <p> -$B<!$NNc$r8+$F$_$^$9!#(B +次の例を見てみます。 </p> <pre> SELECT L1-table.col FROM L1-table WHERE L1-table.col % 2 = 0 AND L1-table.col IN (SELECT P1-table FROM P1-table) ; </pre> <p> -$B$3$NNc$G$O!"(BFROM $B6g$O(B L $B>uBV!"(BTARGETLIST$B$b(B L $B>uBV!"(BWHERE$B6g$O(B P $B>uBV$N%5%V%/%(%j$r;}$C$F$$$k$?$a(B S $B>uBV$H$J$j$^$9!#(B -$B$3$l$O0J2<$N$h$&$K=q$-49$($,9T$o$l$^$9!#(B +この例では、FROM 句は L 状態、TARGETLISTも L 状態、WHERE句は P 状態のサブクエリを持っているため S 状態となります。 +これは以下のように書き換えが行われます。 </p> <pre> SELECT L1-table.col FROM dblink(SELECT loadbalance(SELECT L1-table.col FROM L1-table WHERE L1-table.col % 2 = 0 AND TRUE)) @@ -4979,26 +5232,26 @@ SELECT L1-table.col FROM dblink(SELECT loadbalance(SELECT L1-table.col FROM L1-t ) ; </pre> <p> -$B$3$3$G!"(Bpool_loadbalance$B$O%/%(%j$r$$$:$l$+$N%N!<%I$KAw?.$9$k4X?t$G$9!#(B +ここで、pool_loadbalanceはクエリをいずれかのノードに送信する関数です。 </p> -<h4>$B=8Ls$K$h$k%/%(%j=q$-49$((B</h4> +<h4>集約によるクエリ書き換え</h4> <p> -$B=87W$r9T$&%/%(%j(B($B=8Ls4X?t!"(BGROUP BY )$B$O3F%N!<%I$K7W;;$5$;!"%7%9%F%`(BDB$B$G:F=87W$r9T$&$3$H$K$h$j!"(B -$B%7%9%F%`(BDB$B$NIi2Y$r8:$i$7%Q%U%)!<%^%s%9$b8~>e$7$^$9!#(B +集計を行うクエリ(集約関数、GROUP BY )は各ノードに計算させ、システムDBで再集計を行うことにより、 +システムDBの負荷を減らしパフォーマンスも向上します。 </p> <p> -$B$^$:!":G=i$K(Bpgpool-II$B$,<B:]$K9T$&%/%(%j$N=q$-49$($r8+$F$_$^$9!#(B +まず、最初にpgpool-IIが実際に行うクエリの書き換えを見てみます。 </p> <p> -FROM $B6g$,(B P $B>uBV$G(B count(*) $B$r;H$C$?%/%(%j$O!"0J2<$N$h$&$K=q$-49$($,9T$o$l$^$9!#(B +FROM 句が P 状態で count(*) を使ったクエリは、以下のように書き換えが行われます。 </p> <pre> select count(*) from P1-table; --&gt; $B%/%(%j=q$-49$((B +-&gt; クエリ書き換え SELECT sum(pool_c$1) as count @@ -5008,1118 +5261,1669 @@ FROM </pre> <p> -$B3F%N!<%I$G(Bcount(*) $B$r7W;;$7$?8e$K!"%7%9%F%`(BDB$B$G=87W(B(sum)$B$r$9$k$3$H$K$h(B -$B$j!"L\E*$,C#@.$G$-$^$9!#(B +各ノードでcount(*) を計算した後に、システムDBで集計(sum)をすることによ +り、目的が達成できます。 </p> <p> -$B>e5-$N$h$&$J%/%(%j=q$-49$($,9T$o$l$k>r7o$O0J2<$N>l9g$G$9!#(B +上記のようなクエリ書き換えが行われる条件は以下の場合です。 </p> <ol> - <li>FROM $B6g$,(BP $B>uBV(B</li> - <li>$B%?!<%2%C%H%j%9%H$K=8Ls4X?t(B(count, sum, min, max,avg$B$N$_BP1~(B),GROUP BY$B$K;XDj$7$?%+%i%`$,;H$o$l$F$$$k(B</li> - <li>WHERE $B6g$,(BP $B>uBV(B</li> - <li>HAVING $B6g(B $B$K;H$o$l$F$$$k=8Ls4X?t(B(count, sum, min, max,avg$B$N$_BP1~(B), - FROM$B6g$GDj5A$5$l$F$$$k%+%i%`(B,GROUP BY$B$K;XDj$7$?%+%i%`$N$_;H$o$l$F$$$k!#(B</li> + <li>FROM 句がP 状態</li> + <li>ターゲットリストに集約関数(count, sum, min, max,avgのみ対応),GROUP BYに指定したカラムが使われている</li> + <li>WHERE 句がP 状態</li> + <li>HAVING 句 に使われている集約関数(count, sum, min, max,avgのみ対応), + FROM句で定義されているカラム,GROUP BYに指定したカラムのみ使われている。</li> </ol> <pre> -$BNc(B) +例) select P1-table.col,L1-table.col,count(*),avg(P1-table.col) from P1-table,L1-table wehre P1-table.col %2 = 0 group by P1-table.col,L1-table.coli having count(*) < 100 </pre> -<h3 id="caution_in_parallel_mode">$B%Q%i%l%k%b!<%I$NCm0U;v9`(B</h3> +<h3 id="caution_in_parallel_mode">パラレルモードの注意事項</h3> <p> -$B%Q%i%l%k%b!<%I$G$O!"%/%(%j$N2r@O$N:]$K%+%i%`L>$H%?%$%W$,I,MW$K$J$j$^$9!#(B -$B$=$N$?$a!"%5%V%/%(%j$N(BTARGETLIST$B$K<0!"4X?t$r;H$C$F$$$k>l9g$K$OJLL>$H7?L>$r%-%c%9%H$G$D$1$kI,MW$,$"$j$^$9!#(B -$B<0!"4X?t$K7?$N%-%c%9%H$,$J$$>l9g$K$O!"(Btext$B7?$H$7$F=hM}$5$l$^$9$N$GCm0U$7$F$/$@$5$$!#(B +パラレルモードでは、クエリの解析の際にカラム名とタイプが必要になります。 +そのため、サブクエリのTARGETLISTに式、関数を使っている場合には別名と型名をキャストでつける必要があります。 +式、関数に型のキャストがない場合には、text型として処理されますので注意してください。 </p> <p> -$B$J$*!"=8Ls4X?t$N>l9g$G$+$D=8Ls$K$h$k%/%(%j=q$-49$($,9T$o$l$k>l9g$K$O!"(Bcount$B$O(Bbigint$B7?!"(Bsum$B$O(Bnumeric$B7?$H$J$j$^$9!#(B -min,max$B$N>l9g$K$O!"0z?t$,F|IU7?$N>l9g$K$OF|IU7?$H$7$F7W;;$5$l!"$=$l0J30$O(Bnumeric$B$H$7$F7W;;$5$l$^$9!#(B -avg$B$O(Bsum/count$B$H$7$F=hM}$5$l$^$9!#(B +なお、集約関数の場合でかつ集約によるクエリ書き換えが行われる場合には、countはbigint型、sumはnumeric型となります。 +min,maxの場合には、引数が日付型の場合には日付型として計算され、それ以外はnumericとして計算されます。 +avgはsum/countとして処理されます。 </p> -<h3 id="performance_parallel_mode">$B%Q%i%l%k%b!<%I$N%Q%U%)!<%^%s%9$K$D$$$F(B</h3> +<h3 id="performance_parallel_mode">パラレルモードのパフォーマンスについて</h3> <p> <p> -SELECT$B$N:G=*<B9T%9%F!<%?%9$H%Q%U%)!<%^%s%9$N$*$*$h$=$NL\0B$O0J2<$N$H$*$j$G$9!#(B +SELECTの最終実行ステータスとパフォーマンスのおおよその目安は以下のとおりです。 </p> <table border> -<tr class="header"><th>$B<B9T%9%F!<%?%9(B</th><th>$B%Q%U%)!<%^%s%9(B</th></tr> -<tr><th>L</th><td>$B%Q%i%l%k%/%(%j$rMxMQ$7$J$$$N$G(Bpgpool-II$B$N%*!<%P!<%X%C%I$r=|$-!"C1BN%N!<%I$H$N@-G=Nt2=$O$J$$(B</td></tr> -<tr><th>P</th><td>$BJBNs=hM}$r9T$&$N$G9bB.!"FC$K%7!<%1%s%7%c%k%9%-%c%s$N>l9g$K$O8z2L$,$G$k!#$^$?!"%G!<%?$rJ,3d$9$k$3$H$G%F!<%V%k%5%$%:(B(/1$BBf(B)$B$,>.$5$/$J$k$3$H$K$h$j%-%c%C%7%e$K>h$j$d$9$/$J$k(B </td></tr> -<tr><th>S</th><td>$B=8Ls$K$h$k%/%(%j=q$-49$($,9T$o$l$k$H9bB.(B</td></tr> -</td></tr> +<tr class="header"><th>実行ステータス</th><th>パフォーマンス</th></tr> +<tr><th>L</th><td>パラレルクエリを利用しないのでpgpool-IIのオーバーヘッドを除き、単体ノードとの性能劣化はない</td></tr> +<tr><th>P</th><td>並列処理を行うので高速、特にシーケンシャルスキャンの場合には効果がでる。また、データを分割することでテーブルサイズ(/1台)が小さくなることによりキャッシュに乗りやすくなる </td></tr> +<tr><th>S</th><td>集約によるクエリ書き換えが行われると高速</td></tr> </table> -</p> - -<!-- ================================================================================ --> - -<h1 id="tutorial">$B%A%e!<%H%j%"%k(B</h1> -<p> -pgpool-II$B$N%A%e!<%H%j%"%k$O(B<a href="tutorial-ja.html">$B$3$3(B<a/>$B$K$"$j$^$9!#@'Hs$4Mw2<$5$$!#(B -</p> - -<p class="top_link"><a href="#Top">$B"$(B back to top</a></p> - <!-- ================================================================================ --> -<h1>$B%j%j!<%9%N!<%H(B<a name="release"></a></h1> +<h1 id="release"d>リリースノート</h1> -<h2><a name="release3.1.0"></a>3.1.0 (hatsuiboshi) 2011/09/08</h2> -<h3>$B35MW(B</h3> +<h2><a name="release3.2.0"></a>3.2.0 (namameboshi) 2012/07/xx</h2> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$O(B3.1$B7ONs$N:G=i$NHG$G!"(B3.0$B7O$+$i$N!V%a%8%c!<%P!<%8%g%s%"%C%W!W$K$"$?$j$^$9!#(B +このバージョンは 3.2 系列の最初の版で、3.1 系からの「メジャーバージョンアップ」にあたります。 </p> -<h3>$B8_49@-$N$J$$JQ99(B</h3> -<p> +<h3>互換性のない変更</h3> + <ul> - <li><a href="#INSERT_LOCK">insert_lock</a> $B$N%m%C%/J}K!$rJQ99$7$^$7$?!#(B(Kitagawa) - <p> - $B0JA0$N(Binsert_lock$B$O!"%7!<%1%s%9%F!<%V%k$KBP$7$F9T%m%C%/$r9T$$$^$7$?$,!"(B - $B8=:_$O!"(Bpgpool_catalog.insert_lock$B%F!<%V%k$KBP$7$F9T%m%C%/$r9T$$$^$9!#(B - $B$=$NM}M3$O!"%7!<%1%s%9%F!<%V%k$KBP$9$k%m%C%/$,FbIt%(%i!<$r0z$-5/$3$9$?$a!"(B - PostgreSQL$B$N%3%"3+H/<T$,$=$l$r5v2D$7$J$$$3$H$r7hDj$7$?$?$a$G$9!#(B - </p> - <p> - $B$7$?$,$C$F!"(Bpgpool-II$B7PM3$G%"%/%;%9$9$k$9$Y$F$N%G!<%?%Y!<%9$K(Binsert_lock$B%F!<%V%k$r(B - $B$"$i$+$8$a:n@.$7$F$*$/I,MW$,$"$j$^$9!#(B - $B$b$7!"(Binsert_lock$B%F!<%V%k$,B8:_$7$J$$>l9g$O!"A^F~BP>]$N%F!<%V%k$KBP$7$F%m%C%/$r9T$$$^$9!#(B - $B$3$l$O!"(Bpgpool-II 2.2$B$H(B2.3$B%7%j!<%:$N(Binsert_lock$B$HF1$8F0:n$G$9!#(B - </p> - <p> - $B$^$?!"2a5n$N%P!<%8%g%s$H8_49@-$N$"$k(Binsert_lock$B$r;HMQ$7$?$$>l9g$O!"(B - <a href="#install">configure$B%*%W%7%g%s(B</a>(--enable-sequence-lock,--enable-table-lock)$B$G(B - $B@_Dj$G$-$^$9!#(B - </p> - <li><a href="#BACKEND_SOCKET_DIR">backend_socket_dir</a> $B%Q%i%a!<%?$rGQ;_$7$^$7$?!#(B - <p> - $B$=$NBe$o$j$K!"(B<a href="#BACKEND_HOSTNAME">backend_hostname</a> $B$,(B'/'$B$G;O$^$k$J$i$P!"(B - $B$=$l$r(BUNIX$B%I%a%$%s$X$N%Q%9$H$_$J$7$^$9!#(B - backend_hostname$B$,6u$J$i$P!"%G%U%)%k%H$N(BUNIX$B%I%a%$%s%Q%9(B(/tmp)$B$,;H$o$l$^$9!#(B - $B$3$l$O!"(Blibpq$B%$%s%?%U%'!<%9$N5,Ls$K=>$$$^$9!#(B - </p> - <p> - $B%Q%C%A$O(BJehan-Guillaume (ioguix) de Rorthais$B$5$s$+$iD:$-$^$7$?!#(B - </p> - <li>$B%U%'%$%k%*!<%P!<;~$K(Bpgpool_walrecrunning()$B$r;HMQ$;$:!"(B - $B%W%i%$%^%j%N!<%I$X$N>:3J$,40N;$9$k$^$GBT$D$h$&$K$J$j$^$7$?!#(B(Kitagawa) - <p> - $B4X?t$r;HMQ$7$J$$M}M3$O%W%i%$%^%j%N!<%I$r3N<B$K8+$D$1$k$3$H$,$G$-$J$$$?$a$G$9!#(B - $B$7$+$7!"$3$N=$@5$K$O%W%i%$%^%j%N!<%I$,8=$l$J$$$H$-$K(B <a href="#RECOVERY_TIMEOUT">recovery_timeout</a> $B$N4V(B - pgpool-II$B$,BT$C$F$7$^$&LdBj$,$^$@;D$C$F$$$^$9!#(B - </p> - <li>PostgreSQL DB$B%N!<%I>pJs$r=PNO$9$k(B <a href="#pool_nodes">pool_nodes</a> $B$K(B - $B!V%N!<%I(BID$B!W$rDI2C$7$^$7$?!#(B(Jean-Paul Argudo) - <li>$B%7!<%1%s%94X?t(B(nextval, setval)$B$N07$$$r(B - <a href="BLACK_FUNCTION_LIST">black/white_function_list</a>$B$N@_Dj$K40A4$K=>$&$h$&$KJQ99$7$^$7$?!#(B - $B0JA0!"$=$l$i$O>o$K=q$-9~$_4X?t$H$7$F07$o$l$F$$$^$7$?!#(B(Kitagawa) +<li>メモリベースのメモリキャッシュ機能を追加したため、旧来のメモリキャッシュ機能は削除しました。 + <ul> + <li>これにともない、enable_query_cache パラメータを削除しました。</li> + </ul> +</li> </ul> -</p> -<h3>$B?75!G=(B</h3> -<p> +<h3>新機能</h3> + <ul> - <li><a href="#LOG_DESTINATION">syslog</a> $B$KBP1~$7$^$7$?!#(B - $B%Q%C%A$O(BGilles Darold$B$5$s$+$iD:$-!"(BGuillaume Lelarge$B$5$s$,%l%S%e!<$HJT=8$r$7$^$7$?!#(B - <li>PostgreSQL 9.0$B$GF3F~$5$l$?(Bapplication_name$B$KBP1~$7$^$7$?!#(B(Tatsuo) +<li><a href="#memqcache">メモリベースのクエリキャッシュ</a>を追加しました。 + (Tatsuo Ishii, Nozomi Anzai, Yugo Nagata) +<p>オリジナルは Masanori Yamazaki さんが作成し、開発グループで改良しました。</p> + +<dl> +<dt>概要</dt> <p> - $B%3%M%/%7%g%s$,:FMxMQ$5$l$?$H$-$K!"%9%?!<%H%"%C%W%Q%1%C%H$N(Bapplication_name$B$r%P%C%/%(%s%I$XAw?.$7!"(B - $B%i%a!<%?%9%F!<%?%9$r%U%m%s%H%(%s%I$KJV$7$^$9!#(B + メモリ上にキャッシュが置かれるので高速であるばかりでなく、データが更新されると自動的にキャッシュが無効になり、 + pgpool-II の再起動の必要がありません。 </p> - <li>pgpool-II$BFbIt$G;HMQ$9$k%7%9%F%`%+%?%m%0%-%c%C%7%e$NM-8z;~4V$r!"(B - $BICC10L$G;XDj$G$-$k@_Dj9`L\(Brelcache_expire$B$,DI2C$5$l$^$7$?!#(B(Tatsuo) <p> - $B$3$l$K$h$j!"(BALTER TABLE$B$K$h$C$F%F!<%V%kDj5A$,JQ99$5$l$?:]$K!"(B - $B$b$O$dM-8z$G$J$$7k2L$rMxMQ$7$F$7$^$&%j%9%/$,7Z8:$5$l$^$9!#(B + オンメモリクエリキャッシュは、問い合わせの SELECT 文(拡張問い合わせの場合は更にバインドパラメータ)と + 検索結果をペアで記録し、2 回目以降に同じ SELECT 文が発行された場合に、キャッシュから結果を返します。 + 通常の SELECT 文処理と違って、PostgreSQL にアクセスしないだけでなく、 + pgpool 内部の SQL パース処理などを経由しないため、非常に高速です。 </p> - <li><a href="#FOLLOW_MASTER_COMMAND">follow_master_command</a> $B%Q%i%a!<%?$rDI2C$7$^$7$?!#(B <p> - $B$3$N%Q%i%a!<%?$K$O!"%^%9%?!<%9%l!<%V%b!<%I$N%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s9=@.$K$*$$$F(B - $B%^%9%?%N!<%I$,%U%'%$%k%*!<%P!<$7$?8e$K<B9T$5$l$k%3%^%s%I$r;XDj$7$^$9!#(B + 反面、キャッシュにヒットしない場合は通常の SELECT 文の処理に加えてキャッシュ処理のオーバヘッドが生じるので、 + かえって遅くなります。また、あるテーブルが更新された場合、そのテーブルを参照している + すべてのキャッシュが自動削除されるため(自動削除しない設定も可能)、 + 更新処理が多いシステムではオンメモリクエリキャッシュを有効にしていることでかえって遅くなります。 + キャッシュのヒット率が 70% 以下の場合は、オンメモリクエリキャッシュの設定を有効にしないほうが良いでしょう。 </p> + +<dt>キャッシュストレージの選択</dt> + <dd> + <p> + メモリキャッシュのストレージには、共有メモリと memcached のどちらかを選択することができます + (併用はできません)。 + </p> + <ul> + <li>共有メモリを使用するクエリキャッシュは高速で、memcached の立ち上げも必要なく、手軽に利用できます。 + ただし、共有メモリサイズの上限によって保存できるキャッシュの量に制限があります。 + </li> + <li>memcached をキャッシュストレージに使用する場合は、ネットワークアクセスのオーバヘッドがあるものの、 + 比較的自由にキャッシュメモリの大きさを設定できます。 + </li> + </ul> + </dd> + +<dt>制限事項</dt> + <dd> + <ul> + <li> + オンメモリクエリキャッシュでは、テーブルに変更があると、関連するキャッシュを自動的に削除して + 古いデータが返却されないようにする機能があります。 + このため、pgpool は常に UPDATE や INSERT や ALTER TABLE などのコマンドが発行されたかどうかを + モニタしています。<br> + しかし、トリガ、外部キーや DROP TABLE CASCADE などの働きによって暗黙的にテーブルが更新されたことは + pgpool-II からはわからないため、この機能が働きません。<br> + この問題を回避するためには、 memqcache_expire を使って一定時間経過したキャッシュを削除するようにするか、 + <a href="#BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list</a> を使って、該当テーブルが + キャッシュされないようにしてください。 + </li> + + <li> + 複数の pgpool-II を動かす環境で共有メモリを使ったオンメモリクエリキャッシュを使用すると、 + ある pgpool-II 経由でテーブルが更新された時に、他の pgpool-II のキャッシュが削除されず、 + 古いデータを読みだしてしまうことがあります。<br> + このような環境では、キャッシュストレージに memcached を使ってください。 + </li> + </ul> + </dd> + +<dt>新しいパラメータ</dt> + <dd> + <ul> + <li>メモリキャッシュ全般に関するパラメータ + <a href="#MEMORY_CACHE_ENABLED">memory_cache_enabled</a>、 + <a href="#MEMQCACHE_METHOD">memqcache_method</a>、 + <a href="#MEMQCACHE_EXPIRE">memqcache_expire</a>、 + <a href="#MEMQCACHE_MAXCACHE">memqcache_maxcache</a>、 + <a href="#MEMQCACHE_OIDDIR">memqcache_oiddir</a> を追加しました。(Tatsuo Ishii)</li> + + <li>共有メモリを使ったメモリキャッシュに関するパラメータ + <a href="#MEMQCACHE_TOTAL_SIZE">memqcache_total_size</a>、 + <a href="#MEMQCACHE_MAX_NUM_CACHE">memqcache_max_num_cache</a>、 + <a href="#MEMQCACHE_CACHE_BLOCK_SIZE">memqcache_cache_block_size</a> を追加しました。 + (Tatsuo Ishii)</li> + + <li>memcached を使ったメモリキャッシュに関するパラメータ + <a href="#MEMQCACHE_MEMCACHED_HOST">memqcache_memcached_host</a>、 + <a href="#MEMQCACHE_MEMCACHED_PORT">memqcache_memcached_port</a> を追加しました。 + (Tatsuo Ishii) + </li> + + <li>リレーションキャッシュに関するパラメータ + <a href="#RELCACHE_EXPIRE">relcache_expire</a>、 + <a href="#RELCACHE_SIZE">relcache_size</a> を追加しました。(Tatsuo Ishii)</li> + + <li>一時テーブルかどうかをチェックするフラグ <a href="#CHECK_TEMP_TABLE">check_temp_table</a> パラメータを + 追加しました。(Tatsuo Ishii) + </li> + + <li>テーブル、一時テーブル、ビューのキャッシュ可否を指定するパラメータ、 + <a href="#WHITE_MEMQCACHE_TABLE_LIST">white_memqcache_table_list</a>、 + <a href="#BLACK_MEMQCACHE_TABLE_LIST">black_memqcache_table_list</a> を追加しました。 + (Nozomi Anzai)</li> + + <li><a href="#MEMQCACHE_AUTO_CACHE_INVALIDATION">memqcache_auto_cache_invalidation</a> + パラメータを追加しました。(Yugo Nagata) + <p> + true であれば、DDL/DML/DCL が発行されたら <a href="#MEMQCACHE_EXPIRE">memqcache_expire</a> を待たずに + クエリキャッシュを削除します。 + </p> + </li> + + <li><a href="#pool_cache">SHOW pool_cache</a> を追加しました。クエリキャッシュのヒット率や、 + キャッシュストレージの状況を表示します。(Tatsuo Ishii)</li> + + <li><a href="#install">configure</a> に --with-memcached オプションを追加しました。(Tatsuo Ishii)</li> + + <li><a href="#start">pgpool コマンド</a> に "-C, --clear-oidmaps" オプションを追加しました。 + (Nozomi Anzai) + <p> + memcached を使ったメモリキャッシュを行なっている pgpool が -C つきで起動・再起動したときは、 + oid マップを削除せず再利用します。 + </p> + </li> + </ul> + </dd> + </dl> +</li> + +<li><a href="#watchdog">Watchdog 機能</a> を追加しました。(Atsushi Mitani, Yugo Nagata) +<p>Atsushi Mitani が作成し、Yugo Nagata がテストしました。</p> + +<dl> +<dt>概要</dt> + <dd> <p> - $B%Q%C%A$O(BGilles Darold$B$5$s$+$iD:$-$^$7$?!#(B + watchdog プロセスは pgpool-II 本体から起動される、高可用性を目的としたプロセスです。以下の機能を提供します。 </p> - <li><a href="#pcp_promote_node">pcp_promote_node</a> $B%3%^%s%I$rDI2C$7$^$7$?!#(B + + <dl> + <dt>pgpool サービスの生死監視</dt> + <dd> + <p> + watchdog は、pgpool のプロセスではなくサービスの応答を監視します。 + 監視対象の pgpool から PostgreSQL に問い合わせを行ない、その応答をチェックします。 + </p> + <p> + また watchdog は、pgpool から上位のサーバ(アプリケーションサーバなど)への接続も監視します。 + 上位サーバから PostgreSQL への接続・応答を pgpool のサービスとして生死監視します。 + </p> + </dd> + + <dt>watchdog プロセスの相互監視</dt> + <dd> + <p> + 各 watchdog はお互いの監視対象のサーバの情報を交換します。 + これにより、pgpool サーバの情報を最新に保てるだけでなく、 + 各 watchdog プロセスの相互 監視を行なっています。 + </p> + </dd> + + <dt>障害発生検知時のアクティブ、スタンバイ切り替え</dt> + <dd> + <p> + pgpool のサービスに障害を検知した場合、watchdog は他の watchdog に障害検知を通知します。 + 故障した pgpool がアクティブの場合、他の watchdog は新しいアクティブを投票で決め、 + アクティブ・スタンバイの切り替えを行ないます。 + </p> + </dd> + + <dt>サーバ切り替えと連動した仮想 IP アドレスの自動付け替え</dt> + <dd> + <p> + スタンバイが新しいアクティブに昇格する際、新アクティブ機の watchdog は + アクティブ用の仮想 IP インターフェースを起動します。 + 一方、旧アクティブ機の watchdog はアクティブ用仮想 IP インターフェースを停止します。 + </p> + <p> + これにより、サーバが切り替わった後もアクティブは同じ IP アドレスでサービスを継続することができます。 + </p> + </dd> + + <dt> サーバ復旧時、スタンバイ機としての自動登録</dt> + <dd> + <p> + 障害機の復旧や新規サーバを追加する場合、watchdog はサーバの情報を他のwatchdog に通知し、 + 他の watchdog からはアクティブや他のサーバの情報を受け取ります。 + </p> + <p> + これにより追加したサーバはスタンバイ機として自動的に追加されます。 + </p> + </dd> + </dl> + + </dd> + +<dt>新しいパラメータ</dt> + <dd> + <ul> + <li>watchdog を使用するかどうかを指定するパラメータ + <a href="#USE_WATCHDOG">use_watchdog</a> 追加しました。(Atsushi Mitani)</li> + + <li> + pgpool-II の死活監視に関するパラメータ + <a href="#WD_INTERVAL">wd_interval</a>、 + <a href="#WD_LIFE_POINT">wd_life_point</a>、 + <a href="#WD_LIFECHECK_QUERY">wd_lifecheck_query</a> + を追加しました。(Atsushi Mitani) + </li> + + <li> + アプリケーションサーバなど上部サーバへの接続に関するパラメータ + <a href="#TRUETED_SERVERS">trusted_servers</a>、 + <a href="$PING_PATH">ping_path</a> を追加しました。(Atsushi Mitani) + </li> + + <li> + watchdog の相互死活監視に関するパラメータ + <a href="#WD_PORT">wd_port</a>、 + <a href="#OTHER_WD_PORT">other_wd_port</a>、 + <a href="#OTHER_PGPOOL_HOSTNAME">other_pgpool_hostname</a>、 + <a href="#OTHER_PGPOOL_PORT">other_pgpool_port</a> + を追しました。 (Atsushi Mitani) + </li> + + <li> + 仮想 IP に関するパラメータ + <a href="#DELEGATE_IP">delegate_IP</a>、 + <a href="#IFCONFIG_PATH">ifconfig_path</a>、 + <a href="#IF_UP_CMD">if_up_cmd</a>、 + <a href="#IF_DOWN_CMD">if_down_cmd</a>、 + <a href="#ARPING_PATH">arping_path</a>、 + <a href="ARPING_CMD">arping_cmd</a> を追加しました。(Atsushi Mitani) + </li> + + </ul> + </dd> +</dl> + +</li> +</ul> + +<h3>改良</h3> +<ul> +<li>HP-UX や AIX のような vsyslog を持たないプラットフォームもサポートするようにしました。(Tatsuo Ishii)</li> + +<li>ヘルスチェックで、リトライ回数とリトライ間隔秒数を指定できるようにしました。 + このために、<a href="#HEALTH_CHECK_MAX_RETRIES">health_check_max_retries</a> と + <a href="#HEALTH_CHECK_RETRY_DELAY">health_check_retry_delay</a> というパラメータを新設しています。(Tatsuo Ishii) + <p>パッチは Matt Solnit さんが作成しました。</p> + <blockquote> + Subject: [Pgpool-hackers] Health check retries (patch)<br> + From: Matt Solnit<br> + Date: Fri, 18 Nov 2011 16:28:44 -0500 + </blockquote> +</li> + +<li>クエリの解析に失敗したとき、クライアントの IP とポート番号をログに書き出すようにしました。(Tatsuo Ishii) + <p> + これは、<a href="#LOG_CONNECTIONS">log_connections</a> を有効にしていなくても、 + 問題のあるクエリを発行したのがどのクライアントかを知るのに有用です。 + 特にログ出力の多く忙しい Webシステムで役立ちます。 + </p> +</li> + +<li>pool_process_query() が無限ループする場合があったのを修正しました。(Tatsuo Ishii) <p> - $B$3$N%3%^%s%I$O(Bpgpool-II$B$KBP$7$F?7$7$$%^%9%?%N!<%I$X$N>:3J$r9T$$$^$9!#(B - $B$3$l$O!"%^%9%?!<%9%l!<%V%b!<%I$N%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s9=@.$N$_$G;HMQ$G$-$^$9!#(B + これは、以下がそろったときに起こる可能性がありました。 </p> + <ul> + <li>クエリが実行中でない</li> + <li>マスタ以外のノードがデータを保持している</li> + </ul> + + <p>以下で報告されました。</p> + <blockquote> + Subject: <a href="http://www.pgpool.net/pipermail/pgpool-general/2011-December/000042.html">[pgpool-general: 43]</a> + Re: [Pgpool-general] seemingly hung pgpool process consuming 100% CPU<br> + From: Lonni J Friedman<br> + Date: Tue, 6 Dec 2011 16:23:41 -0800 + </blockquote> +</li> + +<li><a href="#pool_nodes">SHOW pool_nodes</a> に role の列を足しました。 + この列には Primary か Standbyかが出力されます。(Tatsuo Ishii)</li> + +<li>PostgreSQL 9.2 に対応しました。(Tatsuo Ishii)</li> + +<li><a href="#pool_status">SHOW pool_status</a> の出力結果に、 + <a href="#BACKEND_DATA_DIRECTORY">backend_data_directory</a>, + <a href="#SSL_CA_CERT">ssl_ca_cert</a>, + <a href="#SSL_CA_CERT_DIR">ssl_ca_cert_dir</a> がなかったので追加しました。 + また、pgpool.conf の順にソートしました。(Nozomi Anzai) +</li> + +<li>pgpool.conf のサンプルファイルで、system db に関するパラメータをコメントアウトしました。(Nozomi Anzai)</li> + +<li><a href="#failover">failover/failback/followmaster コマンド</a> に新しいパラメータを追加しました。(Tatsuo Ishii) +<pre>%r: new master port number +%R: new master database cluster path +</pre> +</li> + +<li>md5 認証のパスワードを変更が reload でできるようにしました。(Tatsuo Ishii) + <p> + これまでは pgpool-II を再起動する必要がありました。 + このパッチは Gurjeet Singh さんが作成しました。 + </p> +</li> + +<li>マニュアルの見た目を改善しました。また、パラメータ名などページ内リンクを増やしました。(Nozomi Anzai)</li> + +</ul> + +<h3>バグ修正</h3> + +<ul> +<li>Raw モードでのメモリリークを修正しました。(Tatsuo Ishii)</li> + +<li>Raw モードでのフェイルオーバ・フェイルバックを修正しました。(Tatsuo Ishii) + <ul> + <li>対象ノードがマスタでないときに、フェイルオーバしませんでした。</li> + <li>ノードが接続受付状態でないとき、どのノードをマスタにするか選定できませんでした。</li> + </ul> +</li> + +<li>connect() 中にヘルスチェックのリトライができるようにしました。(Tatsuo Ishii) <p> - $B%Q%C%A$O(BGilles Darold$B$5$s$+$iD:$-$^$7$?!#(B + これは、システムがセキュリティ上の理由で接続先に接続できなかったという + メッセージを返さないように設定されているときに、sigalarm がブロックされているという報告によります。 + 変更の一部は Stevo Slavic さんが提供しました。 </p> - <li><a href="#pcp_pool_status">pcp_pool_status</a> $B%3%^%s%I$rDI2C$7$^$7$?!#(B - $B$^$?!"BP1~$9$k(BC API$B$bDI2C$5$l$F$$$^$9!#(B + + <blockquote> + Subject: <a href="http://www.sraoss.jp/pipermail/pgpool-general/2012-January/000131.html">[pgpool-general: 131]</a> + Healthcheck timeout not always respected<br> + From: From: Stevo Slavic<br> + Date: Tue, 10 Jan 2012 21:16:01 +0100 + </blockquote> +</li> + +<li>各ノードにおいて、トランザクション状態によって COMMIT / ABORT するかどうかを判定できるように、 + pool_send_and_wait() を修正しました。(Tatsuo Ishii) <p> - $B%Q%C%A$O(BJehan-Guillaume (ioguix) de Rorthais$B$5$s$+$iD:$-$^$7$?!#(B + マルチステートメントが送信されたとき、明示的なトランザクション内にあるプ + ライマリか、明示的なトランザクション内でないスタンバイで発生する可能性が + ありました。 </p> - <li>$B%P%C%/%(%s%I$4$H$N%Q%i%a!<%?(B&quot;<a href="#BACKEND_FLAG">backend_flag</a>&quot;$B$rDI2C$7$^$7$?!#(B(Tatsuo) + <p>これは、[pgpool-general-jp: 1049] で報告されました。</p> + + <blockquote> + Subject: + <a href="http://www.sraoss.jp/pipermail/pgpool-general-jp/2012-April/001048.html">[pgpool-general-jp: 1049]</a> + COMMITでエラー<br> + From: 稲村暢亮<br> + Date: Mon, 30 Apr 2012 13:48:48 +0900 + </blockquote> +</li> + +<li>Solaris でのロードバランスを修正しました。(Tatsuo Ishii) + <p>Solaris での random() 関数の仕様のために問題があったため、rand() に変更しました。</p> + <p>この事象は [pgpool-general: 396] で報告されました。</p> + + <blockquote> + <a href="http://www.sraoss.jp/pipermail/pgpool-general/2012-April/000397.html">[pgpool-general: 396]</a> + strange load balancing issue in Solaris<br> + From: Aravinth<br> + Date: Sat, 28 Apr 2012 07:26:58 +0530 + </blockquote> +</li> + +<li>パラレルモードでないとき、<a href="#pcp_systemdb_info">pcp_systemdb_info</a> コマンドが + segfault してたのを修正しました。(Nozomi Anzai)</li> + +<li>"unnamed prepared statment does not exist" というエラーが出るのを修正しました。(Tatsuo Ishii) <p> - $B$3$l$O!"%P%C%/%(%s%I$4$H$NF0:n$r@)8f$7$^$9!#(B - $B:#$O(B&quot;ALLOW_TO_FAILOVER&quot;$B$^$?$O(B&quot;DISALLOW_TO_FAILOVER&quot;$B$,;XDj$G$-$^$9!#(B + このエラーは pgpool が内部的に発行しているクエリで発生し、 + クライアントが発行する unnamed ステートメントを破壊していました。 </p> - <li><a href="#HEALTH_CHECK_PASSWORD">health_check_password</a> $B%Q%i%a!<%?$rDI2C$7$^$7$?(B(Nicolas Thauvin) - <li><a href="#SR_CHECK_PERIOD">sr_check_period</a>$B!"(B<a href="#SR_CHECK_USER">sr_check_user</a>$B!"(B - <a href="#SR_CHECK_PASSWORD">sr_check_password</a> $B%Q%i%a!<%?$rDI2C$7$^$7$?!#(B(Tatsuo) - <p>$B$3$l$i$O!"%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s$NCY1d%A%'%C%/$H%W%i%$%^%j%N!<%I$N7hDj$K;HMQ$5$l$^$9!#(B</p> - <li>pg_md5$B%3%^%s%I$K(B--username($B$^$?$O(B-u)$B%*%W%7%g%s$rDI2C$7$^$7$?!#(B(Nicolas Thauvin) <p> - $B$3$l$O!"(BUNIX$B%"%+%&%s%H$r;}$?$J$$%f!<%6$N4IM}$r2DG=$K$7$^$9!#(B - $BF|K\8l%I%-%e%a%s%H$O(BTatsuo Ishii$B$5$s$,=$@5$7$^$7$?!#(B + 拡張問い合わせクエリが実行されたときには、内部的に発行するクエリのステートメントとポータルに + 名前をつけるようにしました。 </p> - <li>pgpool_adm$B4X?t$r(Bpgpool_adm/$B$KDI2C$7$^$7$?!#(B(Jehan-Guillaume (ioguix) de Rorthais) - <p>$B$3$l$i$O!"(Bpcp$B%3%^%s%I$N$h$&$KF0:n$9$k(BC$B8@8l$G=q$+$l$?%f!<%6Dj5A4X?t$G$9!#(B</p> - <li>$B4JBN;zCf9q8lHG$N%I%-%e%a%s%H$rDI2C$7$^$7$?(B(Huang Jian, Sun Peng) - <li>$B4X?t$r%"%s%$%s%9%H!<%k$9$k$?$a$N(BSQL$B%U%!%$%k$r(Bsql/$B$KDI2C$7$^$7$?(B(Nicolas Thauvin) - <li>$B%^%9%?!<%9%l!<%V%b!<%I$K$*$$$F!"(Bunlogged$B%F!<%V%k$KBP$9$k(BSELECT$B$O!"(B - $B>o$K%^%9%?!<(B(primary)$B$G<B9T$5$l$k$h$&$K$J$j$^$7$?(B(Kitagawa) +</li> + +<li>ホットスタンバイモードでクエリ衝突が起きたときにハングアップするのを修正しました。(Yugo Nagata) + <p>これは、以下の手順で再現します。</p> +<pre>(S1) BEGIN; +(S1) SELECT * FROM t; +(S2) DELETE FROM t; +(S2) VACUUM t; +</pre> +</li> + </ul> -</p> -<h3>$B%P%0=$@5(B</h3> +<hr> + +<h2><a name="release3.1.2"></a>3.1.3 (hatsuiboshi) 2012/01/31</h2> +<h3>概要</h3> <p> +このバージョンは3.1.2に対するバグ修正リリースです。 +</p> +<h3>バグ修正</h3> <ul> - <li>$B%9%?%s%P%$%N!<%I$G(BJDBC$B%I%i%$%P$N%+!<%=%k$,;HMQ$G$-$J$$%P%0$r=$@5$7$^$7$?!#(B(Kitagawa) - <p> - $B$3$N=$@5$K$h$C$F!"%^%9%?!<%9%l!<%V%b!<%I$G$O%H%i%s%6%/%7%g%s%3%^%s%I$,(B - $B$9$Y$F$N%N!<%I$KAw$i$l$k$h$&$K$J$j$^$9!#(B - </p> - <li>$B6u$N%/%(%j$N=hM}$K4X$9$k%P%0$r=$@5$7$^$7$?!#(B(Kitagawa) - <p> - $B6u$N%/%(%j$O(BSELECT$B%/%(%j$HF1$807$$$K$J$j$^$9!#(B - $B$3$N=$@5$O!"6u$N%/%(%j$N$"$H$N%m!<%I%P%i%s%9$r2DG=$K$7$^$9(B - </p> - <li>$B%+%i%`Dj5A$,(B&quot;DEFAULT nextval(('&quot;x_seq&quot;'::text)::regclass)&quot;$B$N$h$&$K$J$C$F$$$F$b(B - <a href="#INSERT_LOCK">insert_lock</a> $B$,@5$7$/F0:n$9$k$h$&$K=$@5$7$^$7$?(B(Kitagawa) - <li>$B%U%'%$%k%*!<%P!<Cf$O%(%i!<%a%C%;!<%8$r=PNO$9$k$h$&$K(B<a href="#pcp_attach_node">pcp_attach_node</a> - $B%3%^%s%I$r=$@5$7$^$7$?(B(Kitagawa) - <li>$B3HD%Ld$$9g$o$;%W%m%H%3%k$G(Bpgpool-II$B$,%/%(%j$r2r@O$G$-$J$$$H$-$K=PNO$5$l$k%m%0%a%C%;!<%8$,(B - $B%/%(%j$rI=<($9$k$h$&=$@5$7$^$7$?(B(Kitagawa) - <li>pgpool-II$B%^%K%e%"%k$N(B <a href="#BACKEND_WEIGHT">backend_weight</a> $B$K4X$9$k@bL@$r=$@5$7$^$7$?!#(B - $B$=$l$O!"(Bpgpool.conf$B$N:FFI$_9~$_$GJQ99$G$-$^$9(B(Tatsuo) - <li>$B1Q8l$N%A%e!<%H%j%"%k%I%-%e%a%s%HFb$NI=8=$N2~A1$H=$@5$r9T$$$^$7$?!#(B - $B=$@5$NDs0F$O(BHuang Jian$B$5$s$K$h$k$b$N$G$9(B(Tatsuo) - <li>raw$B%b!<%I$G%N!<%I$rI|5"$5$;$?$H$-$K%N!<%I$N>uBV$,99?7$5$l$J$$%P%0$r=$@5$7$^$7$?(B(Guillaume Lelarge) - <li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s%b!<%I$K$*$1$k%l%W%j%1!<%7%g%sCY1d$N7W;;$,4V0c$C$F$$$?$N$r=$@5$7$^$7$?(B(Tatsuo) - <li>$B%U%'%$%k%*!<%P!<$N%m%0%a%C%;!<%8$K$*$1$k8m$C$?4X?tL>(B - &quot;notice_backend_error&quot;$B$r!"@5$7$$$b$N(B&quot;degenerate_backend_set&quot;$B$KCV$-49$($^$7$?(B(Tatsuo) - <li>pgpool.conf$B2r@O8e$NITMW$J%m%0=PNO$r:o=|$7$^$7$?(B(Tatsuo) - <li>$B%P%C%/%(%s%I$r?75,DI2C$7$?8e$K5/$3$jF@$k(Bpgpool/worker$B;R%W%m%;%9$N%/%i%C%7%e$r=$@5$7$^$7$?!#(B - $B=$@5$O(BGurjeet Singh$B$5$s$NDs0F$K$h$k$b$N$G$9(B(Tatsuo) - <li>FOR SHARE/UPDATE$B6g$N$"$k%5%V%/%(%j$r4^$`(BSELECT$B$,%9%l!<%V(B(standby)$B$KAw$i$l$k%P%0$r=$@5$7$^$7$?(B(Tatsuo) - <li>PREPARE$BJ8$G%G%U%)%k%HCM$N%?%$%`%9%?%s%W=q$-49$($K<:GT$9$k%P%0$r=$@5$7$^$7$?!#(B - $B$3$l$O0JA0$OF0:n$7$F$$$^$7$?$,!"(B3.0$B$GF0:n$7$J$/$J$C$F$$$^$7$?(B(Kitagawa) - <li>getopt_long()$B$,$J$$4D6-$G(Bpcp$B%3%^%s%I$N%3%s%Q%$%k$,<:GT$9$k$N$r=$@5$7$^$7$?(B(Tatsuo) - <li>raw$B%b!<%I!"(B<a href="#ENABLE_HBA">enable_hba</a>$B$,L58z!"%P%C%/%(%s%I$,(B2$BBf0J>e$N>l9g$K(B - pgpool$B;R%W%m%;%9$,%/%i%C%7%e$9$k$N$r=$@5$7$^$7$?(B(Kitagawa) - <li>$B%a%b%j%j!<%/$r$$$/$D$+=$@5$7$^$7$?(B(Kitagawa) -</ul> +<li>m4 ファイルを追加しました。これにより古い OS で起こるコンパイルの問題を回避できます。(Tatsuo Ishii)</li> +<li>フェールオーバを適切に処理するよう detect_postmaster_down_error() 関数を修正しました。(Tatsuo Ishii)<br> +<p> +以前はバックエンドソケットの読み込みに失敗することがありました。 </p> - -<h3>$B2~NI(B</h3> +</li> +<li>シグナル割り込みによって、セマフォが解放されないままプロセスが終了することがあるバグを +修正しました。(Tatsuo Ishii) +</li> +<li>reset_query 時のメモリリークを修正しました。 (Tatsuo Ishii)</li> +<li>pool_ssl_read() 関数が大きいサイズのデータを読み込めるよう修正しました。(Tatsuo Ishii) <p> -<ul> - <li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s9=@.$G$N%*%s%i%$%s%j%+%P%j$K$*$$$F!"(B - $B%j%+%P%j=*N;;~$K;R%W%m%;%9$r:F5/F0$7$J$$$h$&$K$7$^$7$?!#(B - $B$=$N$?$a!"4{B8$N%;%C%7%g%s$O%*%s%i%$%s%j%+%P%jCf$b7QB3$9$k$3$H$,$G$-$^$9(B(Tatsuo) -<li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s%b!<%I$K$*$$$F!"(B<a href="#pcp_attache_node">pcp_attache_node</a> $B$,(B - $B4{B8$N%;%C%7%g%s$r@ZCG$7$J$/$J$j$^$7$?!#(B - $B$[$+$N%b!<%I$G$O0MA3$H$7$F%;%C%7%g%s$,@ZCG$5$l$^$9(B(Tatsuo)$B!#(B - <li>PostgreSQL 9.0$B$N%Q!<%5$r0\?"$7$^$7$?!#(B - $B$3$l$K$h$j(BPostgreSQL 9.0$B$G?7$7$/F3F~$5$l$?0EL[$N%$%s%G%C%/%9L>$r;HMQ$7$?(B - CREATE INDEX$B$,<B9T$G$-$k$h$&$K$J$j$^$7$?!#%Q%C%A$O@PED$5$s$+$iD:$-$^$7$?!#(B - <li><a href="#BLACK_FUNCTION_LIST">black_function_list</a> $B$H(B - <a href="#WHITE_FUNCTION_LIST">white_function_list</a>$B%Q%i%a!<%?$K@55,I=8=$,;H$($k$h$&$K$J$j$^$7$?!#(B - $B%Q%C%A$O(BGilles Darold$B$5$s$+$iD:$-!"(BGuillaume Lelarge$B$5$s$,%l%S%e!<$7$^$7$?!#(B - <li>$BFI$_$d$9$$$h$&$K(Bpgpool.conf$B$N%5%s%W%k%U%!%$%k$r:F9=@.$7$^$7$?(B(Gleu) - <li>pgpool-II$B%^%K%e%"%k$N$9$Y$F$N%Q%i%a!<%?$K(B&lsaquo;a name=&quot;...&quot;&rsaquo;$B%?%0$r(B - $BDI2C$7$^$7$?(B(Haruka Takatsuka) - <li>pgpool-II$B%^%K%e%"%k$N%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s$K$*$1$k%*%s%i%$%s%j%+%P%j$N@bL@$r2~A1$7$^$7$?(B(Tatsuo) - <li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s%b!<%I$K$*$1$k%l%W%j%1!<%7%g%sCY1d$r%A%'%C%/$9$k$?$a$N(B - $B4X?t$rJQ99$7$^$7$?!#(B(Tatsuo) - <p> - $B8=:_!"(Bpgpool$B$O(Bpg_last_xlog_receive_location()$B$NBe$o$j$K(Bpg_last_xlog_replay_location()$B$r;HMQ$7$^$9!#(B - $B=$@5$O(BAnton Yuzhaninov$B$5$s$NDs0F$K$h$k$b$N$G$9(B - </p> - <li>$B%+%i%`$N%G%U%)%k%HCM$KG$0U$N<0$r;XDj$7$F$b%?%$%`%9%?%s%W=q$-49$($,F0:n$9$k$h$&$K$7$^$7$?!#(B(Tatsuo) - <p> - $B0JA0$O!"(Bnow()$B$,4^$^$l$F$$$k$b$N$r8!CN$9$k$H!"C1=c$K$=$l$r(Bnow()$B$GCV$-49$($F$^$7$?!#(B - $B$3$l$O!"%G%U%)%k%HCM$N8m$C$?=q$-49$($r0z$-5/$3$7$^$9!#(B - $BNc$($P!"(Btimezone('utc'::text, now())$B$G$9!#(B - </p> - <p> - $B$7$+$7!"$3$l$O4J0W%W%m%H%3%k$N$_$X$NE,MQ$G$"$k$3$H$KCm0U$7$F$/$@$5$$!#(B - $B3HD%%W%m%H%3%k(B($BNc$($P(BJava, PHP PDO)$B$^$?$O!"(BSQL$B$N(B&quot;PREPARE&quot;$B$K$O$^$@E,MQ$5$l$F$$$^$;$s(B - </p> - <li>$B%l%W%j%1!<%7%g%sCY1d$N%A%'%C%/$K<:GT$7$?$H$-$K=PNO$5$l$k%(%i!<%a%C%;!<%8$r2~NI$7$^$7$?(B(Nicolas Thauvin) - <li>$B%(%i!<%a%C%;!<%8(B&quot;do_md5: read_password_packet failed&quot;$B$r%G%P%C%0%l%Y%k$K$7$^$7$?(B(Kitagawa) - <li>pgpool-regclass()$B$r(BPostgreSQL 9.1$B$G%3%s%Q%$%k$G$-$k$h$&$K$7$^$7$?(B(Tatsuo) - <li>$B1Q8lHG$HF|K\8lHG$N(Bpgpool-II$B%^%K%e%"%k$r99?7!"F14|$7$^$7$?(B(Tatsuo) -</ul> +以下の報告によるものです。<br> +<a href="http://www.pgpool.net/pipermail/pgpool-general/2012-March/000299.html%22"> +http://www.pgpool.net/pipermail/pgpool-general/2012-March/000299.html</a> </p> - -<h2>3.0.4 (umiyameboshi) 2011/06/01</h2> -<h3>$B35MW(B</h3> +</li> +<li>syslog を有効にしたときに起こるデッドロックを修正しました。(Tatsuo Ishii) <p> -$B$3$N%P!<%8%g%s$G$O!"(B3.0.3$B$K$*$1$kMM!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B +このバグは以下で報告され、パッチは Gilles Darold さんにより提供頂きました。<br> +<a href="http://www.pgpool.net/mantisbt/view.php?id=9"> +http://www.pgpool.net/mantisbt/view.php?id=9</a> </p> - -<h3>$B8_49@-$N$J$$JQ99(B</h3> +</li> +<li>マスター・スレーブモードで複数の文を扱えるように修正しました。(Tatsuo Ishii) <p> -<ul> - <li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s$K$*$$$F!"(B<a href="#DELAY_THRESHOLD">delay_threshold</a> $B$,(B - 0$B$^$?$O%X%k%9%A%'%C%/$,L58z$J$i$P!"CY1d%A%'%C%/$O<B;\$5$l$^$;$s!#(B - $B$3$l$O(Bpgpool-II$B%^%K%e%"%kDL$j$NF0:n$G$9$,!"$3$l$^$G$O%X%k%9%A%'%C%/$,L58z$N>l9g$b(B - $BCY1d%A%'%C%/$,<B;\$5$l$F$$$^$7$?(B(Guillaume Lelarge) -</ul> +以前は BEGIN, END 等を用いた複数文からなるクエリはエラーとなっていました。 </p> - -<h3>$B%P%0=$@5(B</h3> +</li> +<li>マスタサーバがダウンした際に、子プロセスが NULL ポインタを参照しようとするバグを修正しました。(Tatsuo Ishii) <p> -<ul> - <li>pgpool-regclass()$B$r(BPostgreSQL 8.0$B0J9_$G%3%s%Q%$%k$G$-$k$h$&$K=$@5$7$^$7$?!#(B7.4$B$O$^$@%(%i!<$,=P$^$9(B(Tatsuo) - <li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s9=@.$G(B/*NO LOAD BALANCE*/$B%3%a%s%H$r;HMQ$7$?$H$-$K(B - $B%O%s%0%"%C%W$9$k2DG=@-$r=$@5$7$^$7$?(B(Kitagawa) - <li>Flush(H)$B%a%C%;!<%8$d(BCloseComplete(C)$B%a%C%;!<%8$r<u?.$7$?$H$-$N%O%s%0%"%C%W$r=$@5$7$^$7$?(B(Kitagawa) - <li>pgpool-II$B$,%P%C%/%(%s%I$K@\B38e!"(BRedyForQuery(Z)$B%a%C%;!<%8$r<u?.$9$k%?%$%_%s%0$K$h$C$F5/$3$jF@$k(B - $B%O%s%0%"%C%W$r=$@5$7$^$7$?(B(Kitagawa) - <li><a href="#RECOVERY_1ST_STAGE_COMMAND">recovery_1st_stage_command</a> $B$H(B - <a href="#RECOVERY_2ND_STAGE_COMMAND">recovery_2nd_stage_command</a> $B%Q%i%a!<%?$N@bL@$rDI2C$7$^$7$?(B(Tatsuo) - <li>pgpool-II$BFbIt$G;HMQ$9$k%7%9%F%`%+%?%m%0%-%c%C%7%e$N%5%$%:$r(B32$B$+$i(B128$B$KA}$d$7$^$7$?!#(B - $B$3$l$O(B&quot;unnamed prepared statement does not exist&quot;$B%(%i!<$r7Z8:$9$k8z2L$,$"$j$^$9!#(B(Tatsuo, Kitagawa) - <li>pcp_connect()$B4X?t$GFs=E(Bfree()$B$r9T$&%P%0$r=$@5$7$^$7$?!#(B - $B%Q%C%A$O(BJehan-Guillaume (ioguix) de Rorthais$B$5$s$+$iD:$-$^$7$?(B(Tatsuo) - <li>PQfinish()$B4X?t$r8m$C$F;HMQ$7$F$$$k(Bstart_recoery()$B$N%P%0$r=$@5$7$^$7$?(B(Tatsuo) - <li>$B%/%i%$%"%s%H$N%"%$%I%k;~4V$,(B <a href="#CLIENT_IDLE_LIMIT">client_idle_limit</a> $B$KC#$7$?$H$-$K!"(B - $B%U%m%s%H%(%s%I$KAw?.$5$l$k@5$7$/$J$$%(%i!<%a%C%;!<%8$r=$@5$7$^$7$?(B(Tatsuo) - <li>pool_status$B$N!V(Bbackend status$B!WJQ?t$NL>A0$r@5$7$/=$@5$7$^$7$?!#(B - $B%9%Z!<%9$r(B'_'$B$KCV$-49$($^$7$?(B(Guillaume Lelarge) - <li>md5$BG'>ZJ}<0$r:NMQ$7$F%G!<%b%s$H$7$F<B9T$7$?$H$-$N%O%s%0%"%C%W$r=$@5$7$^$7$?!#(B - $B%Q%C%A$O!"(BNicolas Thauvin$B$5$s$+$iD:$-$^$7$?(B(Tatsuo) - <li>$B3HD%Ld$$9g$o$;%W%m%H%3%k$G(BSQL$BJ8$,=PNO$5$l$k$h$&$K!"(B - <a href="#LOG_PER_NODE_STATEMENT">log_per_node_statement</a>$B$r=$@5$7$^$7$?!#(B - $B$3$l$O0JA0$OF0:n$7$F$$$^$7$?$,!"(B3.0$B$GF0:n$7$J$/$J$C$F$$$^$7$?(B(Kitagawa) -</ul> +このバグは以下で報告されました。<br> +<a href="http://www.pgpool.net/mantisbt/view.php?id=51"> +http://www.pgpool.net/mantisbt/view.php?id=51</a> </p> - -<h3>$B2~NI(B</h3> +</li> +<li>マスターノードIDの初期値が正しく設定されるように pool_start_query() 関数を修正しました。(Tatsuo Ishii) <p> -<ul> - <li>$B%5%s%W%k$N@_Dj%U%!%$%k$N(B <a href="#BLACK_FUNCTION_LIST">black_function_list</a> $B$K(B - currval()$B$H(Blastval()$B$rDI2C$7$^$7$?!#(B - $B$b$7$=$l$i$,%m!<%I%P%i%s%9$5$l$k$H!"(Bnextval()$B$d(Bsetval()$B$N7k2L$,%9%l!<%V$KH?1G$5$l$kA0$K(B - currval()$B$^$?$O(Blastval()$B$,8F$P$l$k$3$H$,$"$j$^$9(B(Tatsuo) -</ul> +このバグのためにセグメントフォルトが発生することがありました。 </p> - -<h2><a name="release3.0.3"></a>3.0.3 (umiyameboshi) 2011/02/23</h2> -<h3>$B35MW(B</h3> +</li> +<li>pool_setall_node_to_be_sent() 関数において BACKEND_INFO マクロの代わりに +private_backend_status 変数を利用するよう修正しました。(Tatsuo Ishii) <p> -$B$3$N%P!<%8%g%s$G$O!"(B3.0.1$B$K$*$1$kMM!9$J%P%0$,=$@5$5$l$F$$$^$9(B -(pgpool-II 3.0.2$B$N%j%j!<%9$O%Q%C%1!<%8%s%0$NLdBj$G%-%c%s%;%k$5$l$^$7$?(B)$B!#(B +これは状況により BACKEND_INFO が利用できなくなる場合があったためです。(Tatsuo Ishii) </p> - -<h3>$B8_49@-$N$J$$JQ99(B</h3> +</li> +<li>子プロセスがレプリケーション遅延チェック要求を送り続けることがあるバグを修正しました。(Tatsuo Ishii) <p> -<ul> - <li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s%b!<%I$r;HMQ$9$k>l9g$K!"(BPostgreSQL$B%5!<%P$K(B - C$B4X?t!V(Bpgpool_walrecrunning()$B!W$r%$%s%9%H!<%k$9$k$3$H$,?d>)$5$l$^$9(B($B8e=R(B)$B!#(B - $B$3$N>l9g!"?7$7$$JQ?t!V(B%P$B!W$,%*%s%i%$%s%j%+%P%j$N%9%/%j%W%H$GMxMQ$G$-$k$h$&$K$J$j$^$9!#(B - $B$3$N4X?t$r%$%s%9%H!<%k$7$J$$>l9g$O!"=>Mh$HF1$8F0:n$K$J$j$^$9(B(Tatsuo) - <li>raw$B%b!<%I$G(BDB$B%N!<%I$,$R$H$D$@$1$N>l9g!"(BDB$B%N!<%I$KLdBj$,H/@8$9$k$H%@%&%s>uBV$K$J$j$^$9$,!"(B - DB$B%N!<%I$,I|5l$7$?$i(Bpgpool$B$N:F5/F0$J$7$K(BDB$B%N!<%I$r;HMQ$G$-$k$h$&$K$7$^$7$?!#(B - $B$3$NJQ99$O(B3.0$B$K4^$^$l$F$$$^$7$?$,!"F0:n$7$F$$$^$;$s$G$7$?(B(Tatsuo, Kitagawa) -</ul> +以前はフェイルオーバ時にレプリケーション遅延をチェックする worker プロセスを限定した条件でしか +起動していませんでしたが、これは間違いで、常に再起動する必要があります。 +</p> +</li> +<li>デバッグメッセージにヌル文字が含まれないように修正しました。 +ヌル文字が含まれるログは、バイナリファイルであると認識されることがあります。(Toshihiro Kitagawa)</li> +<li>以下の場合に parser memory をリストアするよう SimpleQuery() 関数を修正しました。 +<ol> +<li>組み込み show コマンド使用時</li> +<li>パラレルクエリモード</li> +<li>クエリキャッシュ使用時</li> +</ol> +さもないと、後で不正な palloc を発生する障害が起きるからです。(Tatsuo Ishii) +</li> +<li>PREPARE 文でエラーが起きた際に発生するハングアップを修正しました。(Toshihiro Kitagagwa) +<p> +Tominari Katsumata さんの報告に基づきます。 </p> +</li> +<li>doc/pgpool-fr.html を Makefile.am に追加しました。 +これはフランス語のドキュメントを追加した際に、追加し忘れたものです。(Tatsuo Ishii)</li> +<li>デーモンモードで syslog を有効にしている際に md5 認証で発生するハングアップを修正しました。(Yugo Nagata)</li> +</ul> -<h3>$B%P%0=$@5(B</h3> +<h2><a name="release3.1.2"></a>3.1.2 (hatsuiboshi) 2012/01/31</h2> +<h3>概要</h3> <p> +このバージョンは3.1.1に対するバグ修正リリースです。 +</p> +<h3>バグ修正</h3> <ul> - <li>$B%Q%9%o!<%IG'>Z$K$*$1$k0\?"@-$rB;$J$&%3!<%I$r=$@5$7$^$7$?!#(B - $B$3$l$O(BFreeBSD$B%f!<%6$+$i$N%P%0Js9p$K4p$E$-$^$9(B(Tatsuo) - <li><a href="#INSERT_LOCK">insert_lock</a> $B$,%f!<%6%F!<%V%k$NA49T$r%m%C%/$9$k%P%0$r(B - $B=$@5$7$^$7$?(B(Tatsuo, Kitagawa) - <li>$B%f!<%6L>$ND9$5$,(B32$B%P%$%H$N$H$-$K(Bpgpool$B;R%W%m%;%9$,%/%i%C%7%e$9$k(B - $B%Q%9%o!<%IG'>Z$N%P%0$r=$@5$7$^$7$?(B(Tatsuo) - <li>raw$B%b!<%I$^$?$O%P%C%/%(%s%I%N!<%I?t$,(B1$B$N$H$-$K!"(Bpgpool$B;R%W%m%;%9$,%/%i%C%7%e$9$k(B - md5$BG'>Z$N%P%0$r=$@5$7$^$7$?!#%Q%C%A$O(BRob Shepherd$B$5$s$+$iD:$-$^$7$?(B(Tatsuo) - <li>$B0JA0$+$i$"$C$?G[Ns$HJ#9g7?$KBP$9$k%?%$%`%9%?%s%W=q$-49$($N%P%0$r=$@5$7$^$7$?!#(B - $B%Q%C%A$O(BAkio Ishida$B$5$s$+$iD:$-$^$7$?(B(Tatsuo) - <li><a href="#DEBUG_LEVEL">debug_level</a> $B%Q%i%a!<%?$,F0:n$7$J$$%P%0$r=$@5$7$^$7$?!#(B - $B%Q%C%A$O(BGilles Darold$B$5$s$+$iD:$-$^$7$?(B(Tatsuo) - <li>$B%U%'%$%k%*!<%P!<Cf$K5/$3$j$&$k(Bpgpool$B;R%W%m%;%9$N%/%i%C%7%e$r=$@5$7$^$7$?(B(Kitagawa) - <li>$B%f!<%6$,%9%-!<%^L>$NIU$$$?4X?t$r8F$s$@$H$-$K(B <a href="#WHITE_FUNCTION_LIST">white/black_function_list</a> $B$,(B - $B@5$7$/F0:n$9$k$h$&$K=$@5$7$^$7$?(B(Tatsuo) - <li>$B%3%M%/%7%g%s%-%c%C%7%e$K$h$C$F(BDROP DATABASE$B$,<:GT$9$k%P%0$r=$@5$7$^$7$?(B(Kitagawa) - <li>raw$B%b!<%I$G%U%'%$%k%*!<%P$,<:GT$9$k%P%0$r=$@5$7$^$7$?(B(Kitagawa) - <li>1$B%;%C%7%g%s$G4J0WLd$$9g$o$;%W%m%H%3%k$H3HD%Ld$$9g$o$;%W%m%H%3%k$NN>J}$,;H$o$l$?$H$-$K5/$3$j$&$k(B - pgpool$B;R%W%m%;%9$N=*N;$r=$@5$7$^$7$?(B(Kitagawa) - <li>$B3HD%Ld$$9g$o$;%W%m%H%3%k$r;HMQCf$K%(%i!<$,H/@8$9$k$H5/$3$j$&$k%O%s%0%"%C%W$r=$@5$7$^$7$?(B(Kitagawa) - <li>PG_TRY/CATCH$B$r;HMQ$7$J$$$h$&$K(Bpgpool-regclass()$B$r=$@5$7$^$7$?!#(B(Tatsuo) - <p> - PG_TRY/CATCH$B$O!";~!9%P%C%/%(%s%I$,!V(BPANIC: ERRORDATA_STACK_SIZE exceeded.$B!W$H$$$&%a%C%;!<%8$H$H$b$K(B - $B=*N;$9$k$N$G0BA4$G$J$$$h$&$K8+$($^$9!#(B - </p> - <li>JDBC$B%I%i%$%P$,%^%9%?%N!<%I$K2?EY$b(BBEGIN$B$rH/9T$9$k%m!<%I%P%i%s%9$N%P%0$r=$@5$7$^$7$?(B(Kitagawa) - <li><a href="#FAILBACK_COMMAND">failback_command</a> $B$H(B - <a href="#FAIL_OVER_ON_BACKEND_ERROR">fail_over_on_backend_error</a> $B$,(B - $B@5$7$$CM$rI=<($9$k$h$&$K(B <a href="#pool_status">pool_status</a> $B$r=$@5$7$^$7$?(B(Kitagawa) - <li><a href="#pool_status">pool_status</a> $B$+$i(B <a href="#RECOVERY_PASSWORD">recovery_password</a> $B$H(B - <a href="#SYSTEM_DB_PASSWORD">system_db_password</a> $B$r:o=|$7$^$7$?(B(Kitagawa) - <li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s%b!<%I$G%U%'%$%k%*!<%P$r<B9TCf$K!"(B - $B%P%C%/%(%s%I$N%m%0$K!V(Bunexpected EOF on client connection$B!W$,=P$J$$$h$&$K=$@5$7$^$7$?(B(Tatsuo) - <li>$B%P%C%/%(%s%I$,$9$Y$F%@%&%s$7$?>l9g$KH/@8$9$k(Bpgpool$B$N%/%i%C%7%e$r=$@5$7$^$7$?(B(Tatsuo) - <li>$B%l%W%j%1!<%7%g%sCY1d%A%'%C%/$,%P%C%/%(%s%I$H$N1JB3E*$J@\B3$r9T$o$J$$$h$&$K=$@5$7$^$7$?!#(B(Tatsuo) - <p> - $B$3$l$O!"%l%W%j%1!<%7%g%sCY1d%A%'%C%/$N4V$G(BDB$B%N!<%I$N%@%&%s$H%"%C%W$,5/$-$?>l9g$K1JB3E*$J@\B3$,(B - $BIT@5$K$J$k2DG=@-$,$"$k$?$a$G$9!#(B - </p> - <li>$B1Q8l%I%-%e%a%s%H$r=q$-D>$7$F%l%S%e!<$7$^$7$?(B(Marc Cousin, Gleu) - <li>$B0J2<$N>r7o$rK~$?$9$H$-(B SELECT $B%/%(%j$,%^%9%?%N!<%I$KAw?.$5$l$J$$%P%0$r=$@5$7$^$7$?(B(Kitagawa) - <ul> - <li>$B%^%9%?!<%9%l!<%V%b!<%I$G$"$k(B - <li>$B3HD%Ld$$9g$o$;%W%m%H%3%k$r;HMQ$7$F$$$k(B - <li>$BL@<(E*$K%H%i%s%6%/%7%g%s$r3+;O$7$F$$$k(B - <li>$B99?7%/%(%j$r<B9T$7$?8e$G$"$k(B - </ul> - <li>$B%9%H%j!<%_%s%0%l%W%j%1!<%7%g%s%b!<%IMxMQ;~$N%*%s%i%$%s%j%+%P%j$K$*$$$F!"(B - $B0J2<$N%7%J%j%*$,$&$^$/F0:n$7$J$$LdBj$r=$@5$7$^$7$?!#(B - $B0J2<$N%7%J%j%*$G$O!"%N!<%I(B0$B$r:G=i$N%W%i%$%^%j%5!<%P!"%N!<%I(B1$B$r:G=i$N%9%?%s%P%$%5!<%P$H$7$^$9!#(B - <ol> - <li>$B%N!<%I(B0$B%W%i%$%^%j%5!<%P$,%@%&%s$7!"%N!<%I(B1$B%9%?%s%P%$%5!<%P$,?7$7$$%W%i%$%^%j%5!<%P$K$J$k(B - <li>$B%N!<%I(B0$B$N5l%W%i%$%^%j%5!<%P$O!"%*%s%i%$%s%j%+%P%j$G?7%9%?%s%P%$%5!<%P$K$J$k(B - <li>$B$3$N$H$-(Bpgpool-II$B$O!"%N!<%I(B0$B$N?7%9%?%s%P%$%5!<%P$r!"%W%i%$%^%j%5!<%P$H$_$J$7$F$7$^$&(B - </ol> - $B$3$l$O!"@8$-$F$$$k%N!<%IHV9f$N0lHV<c$$%5!<%P$r%W%i%$%^%j%5!<%P$H8+$J$7$F$$$?$?$a$G$9!#(B - pgpool-II 3.0.3$B$G$O!"(Bpgpool_walrecrunning()$B$r;H$C$F!"<B:]$K$=$N%N!<%I$,%W%i%$%^%j%5!<%P$+$I$&$+(B - $BH=Dj$9$k$?$a!"$3$N$h$&$JLdBj$O5/$-$^$;$s!#(B - $B$3$N5!G=$r$&$^$/;H$&$?$a$K!"%*%s%i%$%s%j%+%P%j$N%9%/%j%W%H$G(B - %P($B8E$$%W%i%$%^%j%N!<%IHV9f(B)$B$,MxMQ$G$-$k$h$&$K$J$C$F$$$^$9!#(B - $B$J$*!"(Bpgpool_walrecrunning()$B$,%$%s%9%H!<%k$5$l$F$$$J$$>l9g$O!">e$NLdBj$O2r>C$5$l$:!"(B - 3.0.1$B$HF1MM$NF0:n$K$J$j$^$9!#(B -</ul> +<li>トランザクション隔離レベルの処理で、READ UNCOMMITTED と REPEATABLE READ が解釈できていませんでしたが、 +これを修正しました。(Tatsuo Ishii)</li> +<li>以下のスレッドで報告されている無限ループを修正しました。(Tatsuo Ishii) +<p> +<a href="http://www.pgpool.net/pipermail/pgpool-general/2011-December/000099.html"> +http://www.pgpool.net/pipermail/pgpool-genral/2011-December/000099.html</a><br> +プライマリからから受け取ったバッファが空である一方で、スタンバイのどれかが +受け取ったバッファが空でないとき、pgpool へのパケットが送られてしまう、 +という可能性が考慮されていませんでした。 </p> + <p> + この事象は例えば、postgresql.conf を再読み込みしたときに発生することがありました。 + </p> + <p> + この修正では、スタンバイからしか受け取れなかったバッファは無視するようにしました。 + </p> +</li> +</ul> -<h3>$B2~NI(B</h3> +<h2><a name="release3.1.1"></a>3.1.1 (hatsuiboshi) 2011/12/06</h2> +<h3>概要</h3> <p> +このバージョンは3.1に対するバグ修正リリースです。 +</p> + +<h3>バグ修正</h3> <ul> - <li>$B%9%F!<%?%9%U%!%$%k$rFI$s$G$$$k$H$-$K!"FCDj$N%P%C%/%(%s%I$,%@%&%s>uBV$J$i$P(B - $B%m%0$r=PNO$9$k$h$&$K$7$^$7$?(B(Tatsuo) - <li>pgpool$B$,<B9T$7$?%/%(%j$G%(%i!<$,H/@8$7$?>l9g$K!"%(%i!<%a%C%;!<%8$r=PNO$9$k$h$&$K$7$^$7$?(B(Tatsuo) - <li>sql$B%G%#%l%/%H%j$K<gMW$J(BMakefile$B$rDI2C$7$^$7$?(B(Tatsuo) +<li><a href="#BLACK_FUNCTION_LIST">black_functon_list</a> と + <a href="#WHITE_FUNCTION_LIST">white_function_list</a> の読み込み処理で + メモリ破壊を起こすバグを修正しました(Tatsuo Ishii)。 +</li> +<li>check_replication_time_lag の誤ったエラーメッセージを修正しました(Tatsuo Ishii)。 + <p> + ストリーミングレプリケーションの遅れのチェックのために PostgreSQL に接続できなかった時に + 誤ったメッセージを出していました。 + 3.1以降では <a href="#HEALTH_CHECK_USER">health_check_user</a> はこの目的のために使われていないので、 + これは誤りです。 + </p> +</li> +<li>メモリーリークを修正しました(Toshihiro Kitagawa)。 + <p>これは、基本的に3.0.5(commit 19a4ea9215da0b61728741fc0da2271958b09238)で行われた修正と同じものです。</p> +</li> +<li>strncpy()を使った修正を多数行いました(Tatsuo Ishii)。 + <p>strncpy()が使われている箇所が複数あり、そこではコピー長とバッファサイズが同じであるケースが + 考慮されていません。 + このため、コピー後の文字列がNULL終端されていない可能性があり、多くの問題を後で引き起こすことになります。 + この問題を修正するために、ほとんどの箇所をstrlcpy()で置き換えました。</p> +</li> +<li>可能な場合にはキャッシュされたバックエンドの状態情報を更新するようにしました(Tatsuo Ishii)。 + <p> + これにより、Jeff Frostから以下のメールで報告された問題が解決されました。 + すなわち、 follow_master_command が正しくバックエンドの状態を読み取れない問題です。 + </p> +<pre>Subject: [Pgpool-general] diagnosing BackendError from pcp_recovery_node +To: pgpool-general@pgfoundry.org +Date: Wed, 05 Oct 2011 15:15:07 -0700 +</pre> +</li> +<li>Windows環境でのみ必要なPGDLLIMPORTIを削除しました。 + <p> + これはgccを使わない環境で問題を引き起こします。 + パッチはIbrar Ahmedさんが提供しました。 + </p> +</li> </ul> + +<h2><a name="release3.1.0"></a>3.1.0 (hatsuiboshi) 2011/09/08</h2> +<h3>概要</h3> +<p> +このバージョンは3.1系列の最初の版で、3.0系からの「メジャーバージョンアップ」にあたります。 </p> +<h3>互換性のない変更</h3> +<p> +</p><ul> + <li><a href="#INSERT_LOCK">insert_lock</a> のロック方法を変更しました。(Toshihiro Kitagawa) + <p> + 以前のinsert_lockは、シーケンステーブルに対して行ロックを行いましたが、 + 現在は、pgpool_catalog.insert_lockテーブルに対して行ロックを行います。 + その理由は、シーケンステーブルに対するロックが内部エラーを引き起こすため、 + PostgreSQLのコア開発者がそれを許可しないことを決定したためです。 + </p> + <p> + したがって、pgpool-II経由でアクセスするすべてのデータベースにinsert_lockテーブルを + あらかじめ作成しておく必要があります。 + もし、insert_lockテーブルが存在しない場合は、挿入対象のテーブルに対してロックを行います。 + これは、pgpool-II 2.2と2.3シリーズのinsert_lockと同じ動作です。 + </p> + <p> + また、過去のバージョンと互換性のあるinsert_lockを使用したい場合は、 + <a href="#install">configureオプション</a>(--enable-sequence-lock,--enable-table-lock)で + 設定できます。 + </p> + </li><li><a href="#BACKEND_SOCKET_DIR">backend_socket_dir</a> パラメータを廃止しました。 + <p> + その代わりに、<a href="#BACKEND_HOSTNAME">backend_hostname</a> が'/'で始まるならば、 + それをUNIXドメインへのパスとみなします。 + backend_hostnameが空ならば、デフォルトのUNIXドメインパス(/tmp)が使われます。 + これは、libpqインタフェースの規約に従います。 + </p> + <p> + パッチはJehan-Guillaume (ioguix) de Rorthaisさんから頂きました。 + </p> + </li><li>フェイルオーバー時にpgpool_walrecrunning()を使用せず、 + プライマリノードへの昇格が完了するまで待つようになりました。(Toshihiro Kitagawa) + <p> + 関数を使用しない理由はプライマリノードを確実に見つけることができないためです。 + しかし、この修正にはプライマリノードが現れないときに <a href="#RECOVERY_TIMEOUT">recovery_timeout</a> の間 + pgpool-IIが待ってしまう問題がまだ残っています。 + </p> + </li><li>PostgreSQL DBノード情報を出力する <a href="#pool_nodes">pool_nodes</a> に + 「ノードID」を追加しました。(Jean-Paul Argudo) + </li><li>シーケンス関数(nextval, setval)の扱いを + <a href="BLACK_FUNCTION_LIST">black/white_function_list</a>の設定に完全に従うように変更しました。 + 以前、それらは常に書き込み関数として扱われていました。(Toshihiro Kitagawa) +</li></ul> +<p></p> + +<h3>新機能</h3> +<p> +</p><ul> + <li><a href="#LOG_DESTINATION">syslog</a> に対応しました。 + パッチはGilles Daroldさんから頂き、Guillaume Lelargeさんがレビューと編集をしました。 + </li><li>PostgreSQL 9.0で導入されたapplication_nameに対応しました。(Tatsuo Ishii) + <p> + コネクションが再利用されたときに、スタートアップパケットのapplication_nameをバックエンドへ送信し、 + ラメータステータスをフロントエンドに返します。 + </p> + </li><li>pgpool-II内部で使用するシステムカタログキャッシュの有効時間を、 + 秒単位で指定できる設定項目relcache_expireが追加されました。(Tatsuo Ishii) + <p> + これにより、ALTER TABLEによってテーブル定義が変更された際に、 + もはや有効でない結果を利用してしまうリスクが軽減されます。 + </p> + </li><li><a href="#FOLLOW_MASTER_COMMAND">follow_master_command</a> パラメータを追加しました。 + <p> + このパラメータには、マスタースレーブモードのストリーミングレプリケーション構成において + マスタノードがフェイルオーバーした後に実行されるコマンドを指定します。 + </p> + <p> + パッチはGilles Daroldさんから頂きました。 + </p> + </li><li><a href="#pcp_promote_node">pcp_promote_node</a> コマンドを追加しました。 + <p> + このコマンドはpgpool-IIに対して新しいマスタノードへの昇格を行います。 + これは、マスタースレーブモードのストリーミングレプリケーション構成のみで使用できます。 + </p> + <p> + パッチはGilles Daroldさんから頂きました。 + </p> + </li><li><a href="#pcp_pool_status">pcp_pool_status</a> コマンドを追加しました。 + また、対応するC APIも追加されています。 + <p> + パッチはJehan-Guillaume (ioguix) de Rorthaisさんから頂きました。 + </p> + </li><li>バックエンドごとのパラメータ"<a href="#BACKEND_FLAG">backend_flag</a>"を追加しました。(Tatsuo Ishii) + <p> + これは、バックエンドごとの動作を制御します。 + 今は"ALLOW_TO_FAILOVER"または"DISALLOW_TO_FAILOVER"が指定できます。 + </p> + </li><li><a href="#HEALTH_CHECK_PASSWORD">health_check_password</a> パラメータを追加しました(Nicolas Thauvin) + </li><li><a href="#SR_CHECK_PERIOD">sr_check_period</a>、<a href="#SR_CHECK_USER">sr_check_user</a>、 + <a href="#SR_CHECK_PASSWORD">sr_check_password</a> パラメータを追加しました。(Tatsuo Ishii) + <p>これらは、ストリーミングレプリケーションの遅延チェックとプライマリノードの決定に使用されます。</p> + </li><li>pg_md5コマンドに--username(または-u)オプションを追加しました。(Nicolas Thauvin) + <p> + これは、UNIXアカウントを持たないユーザの管理を可能にします。 + 日本語ドキュメントはTatsuo Ishiiさんが修正しました。 + </p> + </li><li>pgpool_adm関数をpgpool_adm/に追加しました。(Jehan-Guillaume (ioguix) de Rorthais) + <p>これらは、pcpコマンドのように動作するC言語で書かれたユーザ定義関数です。</p> + </li><li>簡体字中国語版のドキュメントを追加しました(Huang Jian, Sun Peng) + </li><li>関数をアンインストールするためのSQLファイルをsql/に追加しました(Nicolas Thauvin) + </li><li>マスタースレーブモードにおいて、unloggedテーブルに対するSELECTは、 + 常にマスター(primary)で実行されるようになりました(Toshihiro Kitagawa) +</li></ul> +<p></p> + +<h3>バグ修正</h3> +<p> +</p><ul> + <li>スタンバイノードでJDBCドライバのカーソルが使用できないバグを修正しました。(Toshihiro Kitagawa) + <p> + この修正によって、マスタースレーブモードではトランザクションコマンドが + すべてのノードに送られるようになります。 + </p> + </li><li>空のクエリの処理に関するバグを修正しました。(Toshihiro Kitagawa) + <p> + 空のクエリはSELECTクエリと同じ扱いになります。 + この修正は、空のクエリのあとのロードバランスを可能にします + </p> + </li><li>カラム定義が"DEFAULT nextval(('"x_seq"'::text)::regclass)"のようになっていても + <a href="#INSERT_LOCK">insert_lock</a> が正しく動作するように修正しました(Toshihiro Kitagawa) + </li><li>フェイルオーバー中はエラーメッセージを出力するように<a href="#pcp_attach_node">pcp_attach_node</a> + コマンドを修正しました(Toshihiro Kitagawa) + </li><li>拡張問い合わせプロトコルでpgpool-IIがクエリを解析できないときに出力されるログメッセージが + クエリを表示するよう修正しました(Toshihiro Kitagawa) + </li><li>pgpool-IIマニュアルの <a href="#BACKEND_WEIGHT">backend_weight</a> に関する説明を修正しました。 + それは、pgpool.confの再読み込みで変更できます(Tatsuo Ishii) + </li><li>英語のチュートリアルドキュメント内の表現の改善と修正を行いました。 + 修正の提案はHuang Jianさんによるものです(Tatsuo Ishii) + </li><li>rawモードでノードを復帰させたときにノードの状態が更新されないバグを修正しました(Guillaume Lelarge) + </li><li>ストリーミングレプリケーションモードにおけるレプリケーション遅延の計算が間違っていたのを修正しました(Tatsuo Ishii) + </li><li>フェイルオーバーのログメッセージにおける誤った関数名 + "notice_backend_error"を、正しいもの"degenerate_backend_set"に置き換えました(Tatsuo Ishii) + </li><li>pgpool.conf解析後の不要なログ出力を削除しました(Tatsuo Ishii) + </li><li>バックエンドを新規追加した後に起こり得るpgpool/worker子プロセスのクラッシュを修正しました。 + 修正はGurjeet Singhさんの提案によるものです(Tatsuo Ishii) + </li><li>FOR SHARE/UPDATE句のあるサブクエリを含むSELECTがスレーブ(standby)に送られるバグを修正しました(Tatsuo Ishii) + </li><li>PREPARE文でデフォルト値のタイムスタンプ書き換えに失敗するバグを修正しました。 + これは以前は動作していましたが、3.0で動作しなくなっていました(Toshihiro Kitagawa) + </li><li>getopt_long()がない環境でpcpコマンドのコンパイルが失敗するのを修正しました(Tatsuo Ishii) + </li><li>rawモード、<a href="#ENABLE_HBA">enable_hba</a>が無効、バックエンドが2台以上の場合に + pgpool子プロセスがクラッシュするのを修正しました(Toshihiro Kitagawa) + </li><li>メモリリークをいくつか修正しました(Toshihiro Kitagawa) +</li></ul> +<p></p> + +<h3>改良</h3> +<p> +</p><ul> + <li>ストリーミングレプリケーション構成でのオンラインリカバリにおいて、 + リカバリ終了時に子プロセスを再起動しないようにしました。 + そのため、既存のセッションはオンラインリカバリ中も継続することができます(Tatsuo Ishii) +</li><li>ストリーミングレプリケーションモードにおいて、<a href="#pcp_attache_node">pcp_attache_node</a> が + 既存のセッションを切断しなくなりました。 + ほかのモードでは依然としてセッションが切断されます(Tatsuo Ishii)。 + </li><li>PostgreSQL 9.0のパーサを移植しました。 + これによりPostgreSQL 9.0で新しく導入された暗黙のインデックス名を使用した + CREATE INDEXが実行できるようになりました。パッチは石田さんから頂きました。 + </li><li><a href="#BLACK_FUNCTION_LIST">black_function_list</a> と + <a href="#WHITE_FUNCTION_LIST">white_function_list</a>パラメータに正規表現が使えるようになりました。 + パッチはGilles Daroldさんから頂き、Guillaume Lelargeさんがレビューしました。 + </li><li>読みやすいようにpgpool.confのサンプルファイルを再構成しました(Gleu) + </li><li>pgpool-IIマニュアルのすべてのパラメータに‹a name="..."›タグを + 追加しました(Haruka Takatsuka) + </li><li>pgpool-IIマニュアルのストリーミングレプリケーションにおけるオンラインリカバリの説明を改善しました(Tatsuo Ishii) + </li><li>ストリーミングレプリケーションモードにおけるレプリケーション遅延をチェックするための + 関数を変更しました。(Tatsuo Ishii) + <p> + 現在、pgpoolはpg_last_xlog_receive_location()の代わりにpg_last_xlog_replay_location()を使用します。 + 修正はAnton Yuzhaninovさんの提案によるものです + </p> + </li><li>カラムのデフォルト値に任意の式を指定してもタイムスタンプ書き換えが動作するようにしました。(Tatsuo Ishii) + <p> + 以前は、now()が含まれているものを検知すると、単純にそれをnow()で置き換えてました。 + これは、デフォルト値の誤った書き換えを引き起こします。 + 例えば、timezone('utc'::text, now())です。 + </p> + <p> + しかし、これは簡易プロトコルのみへの適用であることに注意してください。 + 拡張プロトコル(例えばJava, PHP PDO)または、SQLの"PREPARE"にはまだ適用されていません + </p> + </li><li>レプリケーション遅延のチェックに失敗したときに出力されるエラーメッセージを改良しました(Nicolas Thauvin) + </li><li>エラーメッセージ"do_md5: read_password_packet failed"をデバッグレベルにしました(Toshihiro Kitagawa) + </li><li>pgpool-regclass()をPostgreSQL 9.1でコンパイルできるようにしました(Tatsuo Ishii) + </li><li>英語版と日本語版のpgpool-IIマニュアルを更新、同期しました(Tatsuo Ishii) +</li></ul> +<p></p> + +<h2>3.0.4 (umiyameboshi) 2011/06/01</h2> +<h3>概要</h3> +<p> +このバージョンでは、3.0.3における様々なバグが修正されています。 +</p> + +<h3>互換性のない変更</h3> +<p> +</p><ul> + <li>ストリーミングレプリケーションにおいて、<a href="#DELAY_THRESHOLD">delay_threshold</a> が + 0またはヘルスチェックが無効ならば、遅延チェックは実施されません。 + これはpgpool-IIマニュアル通りの動作ですが、これまではヘルスチェックが無効の場合も + 遅延チェックが実施されていました(Guillaume Lelarge) +</li></ul> +<p></p> + +<h3>バグ修正</h3> +<p> +</p><ul> + <li>pgpool-regclass()をPostgreSQL 8.0以降でコンパイルできるように修正しました。7.4はまだエラーが出ます(Tatsuo Ishii) + </li><li>ストリーミングレプリケーション構成で/*NO LOAD BALANCE*/コメントを使用したときに + ハングアップする可能性を修正しました(Toshihiro Kitagawa) + </li><li>Flush(H)メッセージやCloseComplete(C)メッセージを受信したときのハングアップを修正しました(Toshihiro Kitagawa) + </li><li>pgpool-IIがバックエンドに接続後、RedyForQuery(Z)メッセージを受信するタイミングによって起こり得る + ハングアップを修正しました(Toshihiro Kitagawa) + </li><li><a href="#RECOVERY_1ST_STAGE_COMMAND">recovery_1st_stage_command</a> と + <a href="#RECOVERY_2ND_STAGE_COMMAND">recovery_2nd_stage_command</a> パラメータの説明を追加しました(Tatsuo Ishii) + </li><li>pgpool-II内部で使用するシステムカタログキャッシュのサイズを32から128に増やしました。 + これは"unnamed prepared statement does not exist"エラーを軽減する効果があります。(Tatsuo Ishii, Toshihiro Kitagawa) + </li><li>pcp_connect()関数で二重free()を行うバグを修正しました。 + パッチはJehan-Guillaume (ioguix) de Rorthaisさんから頂きました(Tatsuo Ishii) + </li><li>PQfinish()関数を誤って使用しているstart_recoery()のバグを修正しました(Tatsuo Ishii) + </li><li>クライアントのアイドル時間が <a href="#CLIENT_IDLE_LIMIT">client_idle_limit</a> に達したときに、 + フロントエンドに送信される正しくないエラーメッセージを修正しました(Tatsuo Ishii) + </li><li>pool_statusの「backend status」変数の名前を正しく修正しました。 + スペースを'_'に置き換えました(Guillaume Lelarge) + </li><li>md5認証方式を採用してデーモンとして実行したときのハングアップを修正しました。 + パッチは、Nicolas Thauvinさんから頂きました(Tatsuo Ishii) + </li><li>拡張問い合わせプロトコルでSQL文が出力されるように、 + <a href="#LOG_PER_NODE_STATEMENT">log_per_node_statement</a>を修正しました。 + これは以前は動作していましたが、3.0で動作しなくなっていました(Toshihiro Kitagawa) +</li></ul> +<p></p> + +<h3>改良</h3> +<p> +</p><ul> + <li>サンプルの設定ファイルの <a href="#BLACK_FUNCTION_LIST">black_function_list</a> に + currval()とlastval()を追加しました。 + もしそれらがロードバランスされると、nextval()やsetval()の結果がスレーブに反映される前に + currval()またはlastval()が呼ばれることがあります(Tatsuo Ishii) +</li></ul> +<p></p> + +<h2><a name="release3.0.3"></a>3.0.3 (umiyameboshi) 2011/02/23</h2> +<h3>概要</h3> +<p> +このバージョンでは、3.0.1における様々なバグが修正されています +(pgpool-II 3.0.2のリリースはパッケージングの問題でキャンセルされました)。 +</p> + +<h3>互換性のない変更</h3> +<p> +</p><ul> + <li>ストリーミングレプリケーションモードを使用する場合に、PostgreSQLサーバに + C関数「pgpool_walrecrunning()」をインストールすることが推奨されます(後述)。 + この場合、新しい変数「%P」がオンラインリカバリのスクリプトで利用できるようになります。 + この関数をインストールしない場合は、従来と同じ動作になります(Tatsuo Ishii) + </li><li>rawモードでDBノードがひとつだけの場合、DBノードに問題が発生するとダウン状態になりますが、 + DBノードが復旧したらpgpoolの再起動なしにDBノードを使用できるようにしました。 + この変更は3.0に含まれていましたが、動作していませんでした(Tatsuo Ishii, Toshihiro Kitagawa) +</li></ul> +<p></p> + +<h3>バグ修正</h3> +<p> +</p><ul> + <li>パスワード認証における移植性を損なうコードを修正しました。 + これはFreeBSDユーザからのバグ報告に基づきます(Tatsuo Ishii) + </li><li><a href="#INSERT_LOCK">insert_lock</a> がユーザテーブルの全行をロックするバグを + 修正しました(Tatsuo Ishii, Toshihiro Kitagawa) + </li><li>ユーザ名の長さが32バイトのときにpgpool子プロセスがクラッシュする + パスワード認証のバグを修正しました(Tatsuo Ishii) + </li><li>rawモードまたはバックエンドノード数が1のときに、pgpool子プロセスがクラッシュする + md5認証のバグを修正しました。パッチはRob Shepherdさんから頂きました(Tatsuo Ishii) + </li><li>以前からあった配列と複合型に対するタイムスタンプ書き換えのバグを修正しました。 + パッチはAkio Ishidaさんから頂きました(Tatsuo Ishii) + </li><li><a href="#DEBUG_LEVEL">debug_level</a> パラメータが動作しないバグを修正しました。 + パッチはGilles Daroldさんから頂きました(Tatsuo Ishii) + </li><li>フェイルオーバー中に起こりうるpgpool子プロセスのクラッシュを修正しました(Toshihiro Kitagawa) + </li><li>ユーザがスキーマ名の付いた関数を呼んだときに <a href="#WHITE_FUNCTION_LIST">white/black_function_list</a> が + 正しく動作するように修正しました(Tatsuo Ishii) + </li><li>コネクションキャッシュによってDROP DATABASEが失敗するバグを修正しました(Toshihiro Kitagawa) + </li><li>rawモードでフェイルオーバが失敗するバグを修正しました(Toshihiro Kitagawa) + </li><li>1セッションで簡易問い合わせプロトコルと拡張問い合わせプロトコルの両方が使われたときに起こりうる + pgpool子プロセスの終了を修正しました(Toshihiro Kitagawa) + </li><li>拡張問い合わせプロトコルを使用中にエラーが発生すると起こりうるハングアップを修正しました(Toshihiro Kitagawa) + </li><li>PG_TRY/CATCHを使用しないようにpgpool-regclass()を修正しました。(Tatsuo Ishii) + <p> + PG_TRY/CATCHは、時々バックエンドが「PANIC: ERRORDATA_STACK_SIZE exceeded.」というメッセージとともに + 終了するので安全でないように見えます。 + </p> + </li><li>JDBCドライバがマスタノードに何度もBEGINを発行するロードバランスのバグを修正しました(Toshihiro Kitagawa) + </li><li><a href="#FAILBACK_COMMAND">failback_command</a> と + <a href="#FAIL_OVER_ON_BACKEND_ERROR">fail_over_on_backend_error</a> が + 正しい値を表示するように <a href="#pool_status">pool_status</a> を修正しました(Toshihiro Kitagawa) + </li><li><a href="#pool_status">pool_status</a> から <a href="#RECOVERY_PASSWORD">recovery_password</a> と + <a href="#SYSTEM_DB_PASSWORD">system_db_password</a> を削除しました(Toshihiro Kitagawa) + </li><li>ストリーミングレプリケーションモードでフェイルオーバを実行中に、 + バックエンドのログに「unexpected EOF on client connection」が出ないように修正しました(Tatsuo Ishii) + </li><li>バックエンドがすべてダウンした場合に発生するpgpoolのクラッシュを修正しました(Tatsuo Ishii) + </li><li>レプリケーション遅延チェックがバックエンドとの永続的な接続を行わないように修正しました。(Tatsuo Ishii) + <p> + これは、レプリケーション遅延チェックの間でDBノードのダウンとアップが起きた場合に永続的な接続が + 不正になる可能性があるためです。 + </p> + </li><li>英語ドキュメントを書き直してレビューしました(Marc Cousin, Gleu) + </li><li>以下の条件を満たすとき SELECT クエリがマスタノードに送信されないバグを修正しました(Toshihiro Kitagawa) + <ul> + <li>マスタースレーブモードである + </li><li>拡張問い合わせプロトコルを使用している + </li><li>明示的にトランザクションを開始している + </li><li>更新クエリを実行した後である + </li></ul> + </li><li>ストリーミングレプリケーションモード利用時のオンラインリカバリにおいて、 + 以下のシナリオがうまく動作しない問題を修正しました。 + 以下のシナリオでは、ノード0を最初のプライマリサーバ、ノード1を最初のスタンバイサーバとします。 + <ol> + <li>ノード0プライマリサーバがダウンし、ノード1スタンバイサーバが新しいプライマリサーバになる + </li><li>ノード0の旧プライマリサーバは、オンラインリカバリで新スタンバイサーバになる + </li><li>このときpgpool-IIは、ノード0の新スタンバイサーバを、プライマリサーバとみなしてしまう + </li></ol> + これは、生きているノード番号の一番若いサーバをプライマリサーバと見なしていたためです。 + pgpool-II 3.0.3では、pgpool_walrecrunning()を使って、実際にそのノードがプライマリサーバかどうか + 判定するため、このような問題は起きません。 + この機能をうまく使うために、オンラインリカバリのスクリプトで + %P(古いプライマリノード番号)が利用できるようになっています。 + なお、pgpool_walrecrunning()がインストールされていない場合は、上の問題は解消されず、 + 3.0.1と同様の動作になります。 +</li></ul> +<p></p> + +<h3>改良</h3> +<p> +</p><ul> + <li>ステータスファイルを読んでいるときに、特定のバックエンドがダウン状態ならば + ログを出力するようにしました(Tatsuo Ishii) + </li><li>pgpoolが実行したクエリでエラーが発生した場合に、エラーメッセージを出力するようにしました(Tatsuo Ishii) + </li><li>sqlディレクトリに主要なMakefileを追加しました(Tatsuo Ishii) +</li></ul> +<p></p> + <h2><a name="release3.0.2"></a>3.0.2(umiyameboshi) 2011/02/17</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$OLdBj$,$"$C$?$?$a$K!"%j%j!<%9$,<h$j>C$5$l$^$7$?!#(B +このバージョンは問題があったために、リリースが取り消されました。 </p> <h2><a name="release3.0.1"></a>3.0.1 (umiyameboshi) 2010/10/19</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B3.0$B$K$*$1$kMM!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B +このバージョンでは、3.0における様々なバグが修正されています。 </p> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <p> -<ul> - <li>$BG'>Z$5$l$k%5!<%P$,J#?t$"$k>l9g$K%/%i%C%7%e$9$k(Bmd5$BG'>Z$N%P%0$r=$@5$7$^$7$?(B(Tatsuo) - <li>$B3HD%Ld$$9g$o$;%W%m%H%3%k$K$*$$$F!"9=J8%(%i!<$N%/%(%j$r<B9T$7$?$H$-$K(B - $B;R%W%m%;%9$,%/%i%C%7%e$9$k%P%0$r=$@5$7$^$7$?(B(Kitagawa) - <li>$B%]!<%?%k>pJs$N%O%s%I%j%s%0$K$*$1$k;R%W%m%;%9$,=*N;$9$k%P%0$r=$@5$7$^$7$?(B(Kitagawa) - <li>$B3HD%Ld$$9g$o$;%W%m%H%3%k$K$*$$$F!"$R$H$D$N%N!<%I$KAw?.$5$l$?%/%(%j$,%(%i!<$r5/$3$7$?$H$-$K(B - $B%O%s%0%"%C%W$9$k%P%0$r=$@5$7$^$7$?(B(Kitagawa) - <li>$B1Q8l%I%-%e%a%s%H$N8m?"$r=$@5$7$^$7$?!#(BAsaf Ohaion$B$5$s$N%Q%C%A$r<h$j9~$_$^$7$?(B(Tatsuo) -</ul> -</p> +</p><ul> + <li>認証されるサーバが複数ある場合にクラッシュするmd5認証のバグを修正しました(Tatsuo Ishii) + </li><li>拡張問い合わせプロトコルにおいて、構文エラーのクエリを実行したときに + 子プロセスがクラッシュするバグを修正しました(Toshihiro Kitagawa) + </li><li>ポータル情報のハンドリングにおける子プロセスが終了するバグを修正しました(Toshihiro Kitagawa) + </li><li>拡張問い合わせプロトコルにおいて、ひとつのノードに送信されたクエリがエラーを起こしたときに + ハングアップするバグを修正しました(Toshihiro Kitagawa) + </li><li>英語ドキュメントの誤植を修正しました。Asaf Ohaionさんのパッチを取り込みました(Tatsuo Ishii) +</li></ul> +<p></p> <h2><a name="release3.0"></a>3.0 (umiyameboshi) 2010/09/10</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$O(B3.0$B7ONs$N:G=i$NHG$G!"(B2.2$B7O$d(B2.3$B7O$+$i$N!V%a%8%c!<%P!<%8%g%s%"%C%W!W$K$"$?$j$^$9!#(B -PostgreSQL 9.0$B$N?75!G=$G$"$k(BStreaming Replication/Hot Standby$B9=@.$KBP1~$9$k$J$I!"(B -$BB?$/$N5!G=$,DI2C$5$l$k$H6&$K!"FbIt9=B$$,@0M}$5$l$F8+DL$7$,NI$/$J$C$FJ]<i@-$,8~>e$7$F$$$^$9!#(B +このバージョンは3.0系列の最初の版で、2.2系や2.3系からの「メジャーバージョンアップ」にあたります。 +PostgreSQL 9.0の新機能であるStreaming Replication/Hot Standby構成に対応するなど、 +多くの機能が追加されると共に、内部構造が整理されて見通しが良くなって保守性が向上しています。 </p> <p> -$B%^%9%?!<%9%l!<%V%b!<%IA4HL$GB?$/$N2~A1$,$J$5$l$F$$$^$9!#(B -<ul> - <li>$BL@<(E*$J%H%i%s%6%/%7%g%sFb$N(BSELECT$B$,Ii2YJ,;6$G$-$k$h$&$K$J$j$^$7$?(B - <li>$BITI,MW$J(BDB$B%N!<%I$K(Bparse/bind$B%a%C%;!<%8$,Aw$i$l$J$/$J$j%m%C%/6%9g$,8:$j$^$7$?(B - <li>$BITI,MW$JFbIt%H%i%s%6%/%7%g%s$N5/F0$,$J$/$J$j!"%*!<%P%X%C%I$,7Z8:$7$F$$$^$9(B - <li>$B0l;~%F!<%V%k$r0U<1$;$:$K0BA4$K;H$($k$h$&$K$J$j$^$7$?(B - <li>$B=q$-9~$_$rH<$&4X?t8F$S=P$7$r9T$J$&(BSELECT$B$r%^%9%?!<(B(primay)$B$G$N$_<B9T$9$k$h$&$K@)8f$G$-$k$h$&$K$J$j$^$7$?(B -</ul> -</p> +マスタースレーブモード全般で多くの改善がなされています。 +</p><ul> + <li>明示的なトランザクション内のSELECTが負荷分散できるようになりました + </li><li>不必要なDBノードにparse/bindメッセージが送られなくなりロック競合が減りました + </li><li>不必要な内部トランザクションの起動がなくなり、オーバヘッドが軽減しています + </li><li>一時テーブルを意識せずに安全に使えるようになりました + </li><li>書き込みを伴う関数呼び出しを行なうSELECTをマスター(primay)でのみ実行するように制御できるようになりました +</li></ul> +<p></p> <p> -$B%l%W%j%1!<%7%g%s%b!<%I$K$*$$$F$b!"=q$-9~$_$rH<$&4X?t8F$S=P$7$r9T$J$&(BSELECT$B$rIi2YJ,;6$9$k$+$I$&$+$N@)8f$G$-$k$h$&$K$J$k$J$I$N2~NI$,2C$($i$l$F$$$^$9!#(B +レプリケーションモードにおいても、書き込みを伴う関数呼び出しを行なうSELECTを負荷分散するかどうかの制御できるようになるなどの改良が加えられています。 </p> -<h3>$B?75!G=(B</h3> +<h3>新機能</h3> <p> -<ul> - <li>PostgreSQL 9.0$B$N?75!G=$G$"$k(BStreaming Replication/Hot Standby(SR+HS)$B9=@.$KBP1~$7$^$7$?(B(Tatsuo, Kitagawa)$B!#(B +</p><ul> + <li>PostgreSQL 9.0の新機能であるStreaming Replication/Hot Standby(SR+HS)構成に対応しました(Tatsuo Ishii, Toshihiro Kitagawa)。 <p> - pgpool-II$B$O4pK\E*$K$O(Bmaster/slave mode$B$H$7$FF0:n$7$^$9$,!"$=$N:]$K(B - "<a href="#MASTER_SLAVE_SUB_MODE">master_slave_sub_mode</a>" $B$H$$$&(B - $B?7$7$$@_Dj9`L\$K(B"stream"$B$r@_Dj$9$k$3$H$K$h$j!"(BSR+HS$B9=@.$K:GE,$JF0:n$r$7$^$9!#(B - $B$?$H$($P!"99?7%/%(%j$O(BPrimary$B%5!<%P$K$N$_Aw?.$7!"(BSELECT$B$O(BPrimary$B$H(BStandby$B%5!<%P$KIi2YJ,;6$9$k$3$H$,2DG=$G$9!#(B + pgpool-IIは基本的にはmaster/slave modeとして動作しますが、その際に + "<a href="#MASTER_SLAVE_SUB_MODE">master_slave_sub_mode</a>" という + 新しい設定項目に"stream"を設定することにより、SR+HS構成に最適な動作をします。 + たとえば、更新クエリはPrimaryサーバにのみ送信し、SELECTはPrimaryとStandbyサーバに負荷分散することが可能です。 </p> <p> - $B$=$N$[$+!"(BStandby$B%5!<%P$r%*%s%i%$%s%j%+%P%j$GI|5l$7$?$j!"(BPrimary$B$H(BStandby$B$N%l%W%j%1!<%7%g%sF14|$r4F;k$7!"(B - $BCY$l$,Bg$-$$$h$&$J$i(BPrimary$B$K$N$_(BSELECT$B$rAw?.$5$;$k$h$&$K$9$k$3$H$b2DG=$G$9!#(B + そのほか、Standbyサーバをオンラインリカバリで復旧したり、PrimaryとStandbyのレプリケーション同期を監視し、 + 遅れが大きいようならPrimaryにのみSELECTを送信させるようにすることも可能です。 </p> <p> - $B>\:Y$O(B<a href="#stream">Streaming Replication$B$X$NBP1~(B"</a>$B$r$4Mw2<$5$$!#(B + 詳細は<a href="#stream">Streaming Replicationへの対応"</a>をご覧下さい。 </p> <ul> - <li>$B%*%s%i%$%s%j%+%P%j$,(BStreaming Replication$BBP1~$GF0:n$7$F$$$k(Bmaster/slave$B%b!<%I$KBP1~$7$^$7$?(B(Tatsuo) + <li>オンラインリカバリがStreaming Replication対応で動作しているmaster/slaveモードに対応しました(Tatsuo Ishii) - <li>Streaming Replication$B%b!<%IMQ$N?7$7$$@_Dj9`L\(B "<a href="#DELAY_THRESHOLD">delay_threshold</a>" $B$,DI2C$5$l!"(B - $B%l%W%j%1!<%7%g%s$NCY$l$,4F;k$G$-$k$h$&$K$J$j$^$7$?!#(B - $BCY1d$,B?$$>l9g$K$O!"Ii2YJ,;6$7$J$$$h$&$K$9$k$3$H$,$G$-$^$9(B(Tatsuo) + </li><li>Streaming Replicationモード用の新しい設定項目 "<a href="#DELAY_THRESHOLD">delay_threshold</a>" が追加され、 + レプリケーションの遅れが監視できるようになりました。 + 遅延が多い場合には、負荷分散しないようにすることができます(Tatsuo Ishii) - <li><a href="#pool_status">show pool_status</a> $B$G!"(BStreaming Replication$B$K$*$1$k(B - $B%l%W%j%1!<%7%g%s$NCY1d$,3NG'$G$-$k$h$&$K$J$j$^$7$?(B(Tatsuo) + </li><li><a href="#pool_status">show pool_status</a> で、Streaming Replicationにおける + レプリケーションの遅延が確認できるようになりました(Tatsuo Ishii) - <li>Streaming Replication$B$K$*$1$k%l%W%j%1!<%7%g%s$NCY1d$N%m%0$r@)8f$9$k?7$7$$@_Dj9`L\(B - "<a href="#LOG_STANDBY_DELAY">log_standby_delay</a>" $B$,DI2C$5$l$^$7$?(B(Tatsuo) + </li><li>Streaming Replicationにおけるレプリケーションの遅延のログを制御する新しい設定項目 + "<a href="#LOG_STANDBY_DELAY">log_standby_delay</a>" が追加されました(Tatsuo Ishii) -</ul> +</li></ul> - <li><a href="#INSERT_LOCK">insert_lock</a> $B$,M-8z$G!"%F!<%V%k$K%7%j%"%k7?$,4^$^$l$F$$$k>l9g!"(B - $B%F!<%V%k%m%C%/$G$O$J$/!"3:Ev%7!<%1%s%9$r9T%m%C%/$9$k$h$&$K$7$^$7$?!#(B(Tatsuo) + </li><li><a href="#INSERT_LOCK">insert_lock</a> が有効で、テーブルにシリアル型が含まれている場合、 + テーブルロックではなく、該当シーケンスを行ロックするようにしました。(Tatsuo Ishii) <p> - $B0JA0$O%F!<%V%k%m%C%/$r$7$F$$$^$7$?$,!"(Bauto vacuum$B$H%m%C%/$,>WFM$7$?$j$7$F(B - $B@-G=$,Dc2<$9$kLdBj$,$"$j$^$7$?!#(B + 以前はテーブルロックをしていましたが、auto vacuumとロックが衝突したりして + 性能が低下する問題がありました。 </p> - <li>$B?7$7$$(B"SHOW"$B%3%^%s%I$,DI2C$5$l$^$7$?!#$9$J$o$A!"(B<a href="#pool_nodes">pool_nodes</a>, + </li><li>新しい"SHOW"コマンドが追加されました。すなわち、<a href="#pool_nodes">pool_nodes</a>, <a href="#pool_processes">pool_processes</a>, <a href="#pool_pools">pool_pools</a>, - <a href="#pool_version">pool_version</a> $B$G$9(B(Guillaume Lelarge) + <a href="#pool_version">pool_version</a> です(Guillaume Lelarge) - <li><a href="#pcp_proc_info">pcp_proc_info</a> $B%3%^%s%I$N=PNO7k2L$K!"(B - PostgreSQL$B%P%C%/%(%s%I%W%m%;%9$N%W%m%;%9(BID$B$H%U%m%s%H%(%s%I$+$i$N@\B3$,$"$k$+$I$&$+$,DI2C$5$l$^$7$?(B(Tatsuo) + </li><li><a href="#pcp_proc_info">pcp_proc_info</a> コマンドの出力結果に、 + PostgreSQLバックエンドプロセスのプロセスIDとフロントエンドからの接続があるかどうかが追加されました(Tatsuo Ishii) - <li>$B4X?t8F$S=P$7$rH<$&(BSELECT$B$r@)8f$9$k@_Dj9`L\(B <a href="#WHITE_FUNCTION_LIST">white_function_list</a> $B$H(B - <a href="#BLACK_FUNCTION_LIST">back_function_list</a> $B$,DI2C$5$l$^$7$?(B(Tatsuo) + </li><li>関数呼び出しを伴うSELECTを制御する設定項目 <a href="#WHITE_FUNCTION_LIST">white_function_list</a> と + <a href="#BLACK_FUNCTION_LIST">back_function_list</a> が追加されました(Tatsuo Ishii) - <li>$B%^%9%?!<%9%l!<%V%b!<%I$K$*$$$F!"%7%9%F%`%+%?%m%0$r8!:w$9$k(BSELECT$B$O!"@09g@-$rJ]$D$?$a$K(B - $B>o$K%^%9%?!<(B(primary)$B$G<B9T$5$l$k$h$&$K$J$j$^$7$?(B(Tatsuo) + </li><li>マスタースレーブモードにおいて、システムカタログを検索するSELECTは、整合性を保つために + 常にマスター(primary)で実行されるようになりました(Tatsuo Ishii) - <li>$B%^%9%?!<%9%l!<%V%b!<%I$K$*$$$F!"0l;~%F!<%V%k$r8!:w$9$k(BSELECT$B$O!"@09g@-$rJ]$D$?$a$K(B - $B>o$K%^%9%?!<(B(primary)$B$G<B9T$5$l$k$h$&$K$J$j$^$7$?(B(Tatsuo) + </li><li>マスタースレーブモードにおいて、一時テーブルを検索するSELECTは、整合性を保つために + 常にマスター(primary)で実行されるようになりました(Tatsuo Ishii) - <li>$B%^%9%?%9%l!<%V%b!<%I$G!"L@<(E*$J%H%i%s%6%/%7%g%sFb$G<B9T$5$l$J$$99?7%/%(%j$K$*$$$F!"(B - $B<+F0E*$K%H%i%s%6%/%7%g%s$r3+;O$9$k$3$H$r;_$a$^$7$?!#(B(Tatsuo) + </li><li>マスタスレーブモードで、明示的なトランザクション内で実行されない更新クエリにおいて、 + 自動的にトランザクションを開始することを止めました。(Tatsuo Ishii) <p> - $B$3$l$OITI,MW$G$7$?!#$3$l$K$h$C$F!"%Q%U%)!<%^%s%9$,8~>e$7$F$$$^$9!#(B + これは不必要でした。これによって、パフォーマンスが向上しています。 </p> - <li>$B%^%9%?%9%l!<%V%b!<%I$G!"L@<(E*$J%H%i%s%6%/%7%g%sFb$G<B9T$5$l$k(BSELECT$B%3%^%s%I$,(B - $BIi2YJ,;6$G$-$k$h$&$K$J$j$^$7$?(B(Tatsuo, Kitagawa) + </li><li>マスタスレーブモードで、明示的なトランザクション内で実行されるSELECTコマンドが + 負荷分散できるようになりました(Tatsuo Ishii, Toshihiro Kitagawa) - <li>$B%^%9%?%9%l!<%V%b!<%I$G!"I,MW$J(BDB$B%N!<%I$K$N$_%3%^%s%I$,Aw$i$l$k$h$&$K$J$j$^$7$?!#(B(Tatsuo, Kitagawa) + </li><li>マスタスレーブモードで、必要なDBノードにのみコマンドが送られるようになりました。 + (Tatsuo Ishii, Toshihiro Kitagawa) <p> - $B$3$l$K$h$j!"$?$H$($P%Q!<%9%3%^%s%I$,ITI,MW$J(BDB$B%N!<%I$K$*$$$F$b(B - $B%m%C%/$r<h$C$F$7$^$&$h$&$J$3$H$,$J$/$J$j$^$7$?!#(B + これにより、たとえばパースコマンドが不必要なDBノードにおいても + ロックを取ってしまうようなことがなくなりました。 </p> - <li>pgpool$B$N5/F0;~$K!"%9%F!<%?%9%U%!%$%k$rL5;k$9$k%*%W%7%g%s$,DI2C$5$l$^$7$?(B(Tatsuo) + </li><li>pgpoolの起動時に、ステータスファイルを無視するオプションが追加されました(Tatsuo Ishii) - <li>PostgreSQL 9.0$B$N(BVACUUM$B$N?7$7$$=q<0$r(Bpgpool-II$B$N%Q!<%5$,%5%]!<%H$7$^$7$?(B(Tatsuo) + </li><li>PostgreSQL 9.0のVACUUMの新しい書式をpgpool-IIのパーサがサポートしました(Tatsuo Ishii) - <li>$B%U%'%$%k%*!<%P(B/$B%U%'%$%k%P%C%/%3%^%s%I$G!"(B"%H"$B$H$$$&FC<lJQ?t$,MxMQ$G$-$k$h$&$K$J$j$^$7$?!#(B - $B$3$l$O!"?7$7$$%^%9%?!<%N!<%I$N%[%9%HL>$rI=$7$^$9(B(Tatsuo) + </li><li>フェイルオーバ/フェイルバックコマンドで、"%H"という特殊変数が利用できるようになりました。 + これは、新しいマスターノードのホスト名を表します(Tatsuo Ishii) - <li><a href="#FAILOVER_IF_AFFECTED_TUPLES_MISMATCH">failover_if_affected_tuples_mismatch</a> $B$H$$$&@_(B - $BDj9`L\$,DI2C$5$l$^$7$?(B(Tatsuo) + </li><li><a href="#FAILOVER_IF_AFFECTED_TUPLES_MISMATCH">failover_if_affected_tuples_mismatch</a> という設 + 定項目が追加されました(Tatsuo Ishii) <p> - $B=>Mh!"%l%W%j%1!<%7%g%s%b!<%I$G(BINSERT/UPDATE/DELETE$B$N7k2L9T?t$,0[$J$k$H!"(B - $B%H%i%s%6%/%7%g%s$r%"%\!<%H$7$F%;%C%7%g%s$r6/@)@ZCG$7$F$$$^$7$?!#(B - failover_if_affected_tuples_mismatch $B$r(B true$B$K@_Dj$9$k$H!"$3$N8=>]$,5/$-$?$H$-$K!"(B - $BIT0lCW$N$"$C$?(BDB$B%N!<%I$r@Z$jJ|$7$F=LB`1?E>$KF~$k$h$&$K$J$j$^$9!#(B + 従来、レプリケーションモードでINSERT/UPDATE/DELETEの結果行数が異なると、 + トランザクションをアボートしてセッションを強制切断していました。 + failover_if_affected_tuples_mismatch を trueに設定すると、この現象が起きたときに、 + 不一致のあったDBノードを切り放して縮退運転に入るようになります。 </p> - <li>$B%l%W%j%1!<%7%g%s%b!<%I$G(BDB$B%N!<%I4V$G(BINSERT/UPDATE/DELETE$B$N7k2L9T?t$NIT0lCW$,8!=P$5$l$?:]$K!"(B - DB$B%N!<%I$K$*$1$k7k2L9T?t$,%m%0$K5-O?$5$l$k$h$&$K$J$j$^$7$?(B(Tatsuo) + </li><li>レプリケーションモードでDBノード間でINSERT/UPDATE/DELETEの結果行数の不一致が検出された際に、 + DBノードにおける結果行数がログに記録されるようになりました(Tatsuo Ishii) - <li>$B%l%W%j%1!<%7%g%s%b!<%I$H%^%9%?%9%l!<%V%b!<%I$G!"(Bmd5$BG'>Z$,%5%]!<%H$5$l$^$7$?(B(Tatsuo) + </li><li>レプリケーションモードとマスタスレーブモードで、md5認証がサポートされました(Tatsuo Ishii) - <li>$B%*%s%i%$%s%j%+%P%j$G!"6/@)E*$K%U%m%s%H%(%s%I$X$N@\B3$r@ZCG$7$F(B - $BD>$A$K%;%+%s%I%9%F!<%8$KF~$k$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#(B(Tatsuo) + </li><li>オンラインリカバリで、強制的にフロントエンドへの接続を切断して + 直ちにセカンドステージに入ることができるようになりました。(Tatsuo Ishii) <p> - $B$=$N$?$a$K$O!"(B<a href="#CLIENT_IDLE_LIMIT_IN_RECOVERY">client_idle_limit_in_recovery</a> $B$K(B - -1 $B$r@_Dj$7$^$9!#(B + そのためには、<a href="#CLIENT_IDLE_LIMIT_IN_RECOVERY">client_idle_limit_in_recovery</a> に + -1 を設定します。 </p> - <li>RAW$B%b!<%I$K$*$$$F!"(BDB$B%N!<%I$,(B1$B8D$@$1$7$+B8:_$7$J$$>uBV$G(BDB$B$,%(%i!<$r5/$7$?$?$a$K(B - DB$B%N!<%I$r@Z$jJ|$7$?$"$H$G(BDB$B%N!<%I$,2sI|$7$?>l9g$K!"(Bpgpool-II$B$r:F5/F0$9$k$3$H$K$J$7$K(B - DB$B%N!<%I$rMxMQ$G$-$k$h$&$K$J$j$^$7$?(B(Tatsuo) + </li><li>RAWモードにおいて、DBノードが1個だけしか存在しない状態でDBがエラーを起したために + DBノードを切り放したあとでDBノードが回復した場合に、pgpool-IIを再起動することになしに + DBノードを利用できるようになりました(Tatsuo Ishii) - <li>pcp$B%3%^%s%I$K$*$$$F!"%m%s%0%*%W%7%g%s$,%5%]!<%H$5$l$^$7$?(B(Guillaume Lelarge) + </li><li>pcpコマンドにおいて、ロングオプションがサポートされました(Guillaume Lelarge) - <li><a href="#DEBUG_LEVEL">debug_level</a> $B$H$$$&@_Dj9`L\$,DI2C$5$l!"(B - pgpool.conf$B$N:FFI$_9~$_$K$h$C$F%G%P%C%0%a%C%;!<%8$N=PNO$r%*%s!?%*%U$G$-$k$h$&$K$J$j$^$7$?(B(Tatsuo) + </li><li><a href="#DEBUG_LEVEL">debug_level</a> という設定項目が追加され、 + pgpool.confの再読み込みによってデバッグメッセージの出力をオン/オフできるようになりました(Tatsuo Ishii) - <li>pgpool.conf$B$G!"(Bpostgresql.conf$B$HF1$8??56CMI=8=$,MxMQ$G$-$k$h$&$K$J$j$^$7$?!#(B - $B=>Mh$O!"(Btrue/false, 1/0$B$7$+;H$($^$;$s$G$7$?(B(Kitagawa) + </li><li>pgpool.confで、postgresql.confと同じ真偽値表現が利用できるようになりました。 + 従来は、true/false, 1/0しか使えませんでした(Toshihiro Kitagawa) - <li>$B%*%s%i%$%s%j%+%P%j$N%;%+%s%I%9%F!<%8$r$h$j0BA4$K<B9T$9$k$?$a$K!"(B - C$B8@8l4X?t(B <a href="#recovery_pitr">pgpool_switch_xlog</a> $B$rDI2C$7$^$7$?(B(Kitagawa) + </li><li>オンラインリカバリのセカンドステージをより安全に実行するために、 + C言語関数 <a href="#recovery_pitr">pgpool_switch_xlog</a> を追加しました(Toshihiro Kitagawa) - <li>$B0[$J$k%9%-!<%^$KF1$8L>A0$N%F!<%V%k$,B8:_$9$k>l9g$K5/$-$kIT6q9g$r2sHr$9$k$?$a$K!"(B - C$B8@8l4X?t(Bpgpool_regclass$B$rDI2C$7$^$7$?(B(Tatsuo) + </li><li>異なるスキーマに同じ名前のテーブルが存在する場合に起きる不具合を回避するために、 + C言語関数pgpool_regclassを追加しました(Tatsuo Ishii) -</ul> -</p> +</li></ul> +<p></p> -<h3>$B8_49@-$N$J$$JQ99(B</h3> +<h3>互換性のない変更</h3> <p> -<ul> -<li><a href="#REPLICATE_SELECT">replicate_select</a> $B$H(B <a href="#LOAD_BALANCE_MODE">load_balance_mode</a> $B$r(B - $B6&$K(Btrue$B$K@_Dj$7$?>l9g!"%H%i%s%6%/%7%g%s%V%m%C%/$N30B&$G<B9T$5$l$k(BSELECT$BJ8$O!"(B - replicate_select$B$K=>$&$h$&$K$J$j$^$7$?!#(B - $B0JA0$O!"(Bload_balance_mode$B$K=>$&$h$&$K$J$C$F$$$^$7$?!#(B +</p><ul> +<li><a href="#REPLICATE_SELECT">replicate_select</a> と <a href="#LOAD_BALANCE_MODE">load_balance_mode</a> を + 共にtrueに設定した場合、トランザクションブロックの外側で実行されるSELECT文は、 + replicate_selectに従うようになりました。 + 以前は、load_balance_modeに従うようになっていました。 <p> - $B$b$7%/%i%$%"%s%H$,$3$NF0:n$rMxMQ$7$F$$$k>l9g$O!"(Breplicate_select$B$r(Bfalse$B$K$7$F(B - <a href="#BLACK_FUNCTION_LIST">back_function_list</a> $B$r@_Dj$9$k$3$H$GF1$8F0:n$r<B8=$G$-$^$9!#(B + もしクライアントがこの動作を利用している場合は、replicate_selectをfalseにして + <a href="#BLACK_FUNCTION_LIST">back_function_list</a> を設定することで同じ動作を実現できます。 </p> </li> </ul> -</p> +<p></p> <p> -<h3>$B%P%0=$@5(B</h3> -</p> +</p><h3>バグ修正</h3> +<p></p> <p> -<ul> +</p><ul> - <li>$B7?$,;~9o%G!<%?0J30$NNs$N>l9g!"%G%U%)%k%HCM$K(Bnow()$B$,4^$^$l$F$$$F$b=q$-49$($r9T$J$o$J$$$h$&$K$7$^$7$?!#(B(Tatsuo) + <li>型が時刻データ以外の列の場合、デフォルト値にnow()が含まれていても書き換えを行なわないようにしました。(Tatsuo Ishii) <p> - $B:#$^$G$OL5>r7o$K=q$-49$($r9T$J$C$F$$$?$?$a!"=q$-49$($N7k2L!"(BINSERT$BJ8$J$I$,%(%i!<$K$J$C$F$$$^$7$?!#(B + 今までは無条件に書き換えを行なっていたため、書き換えの結果、INSERT文などがエラーになっていました。 </p> - <li>$B%?%$%`%9%?%s%W$N=q$-49$(=hM}BP>]$H$J$k%F!<%V%k$N%9%-!<%^$,L5;k$5$l$J$$$h$&$K$7$^$7$?!#(B(Tatsuo) + </li><li>タイムスタンプの書き換え処理対象となるテーブルのスキーマが無視されないようにしました。(Tatsuo Ishii) <p> - $B$?$@$7!"$3$N5!G=$rM-8z$K$9$k$?$a$K$O!"IUB0$N%f!<%6Dj5A4X?t(B"pgpool_regclass"$B$N%$%s%9%H!<%k$,I,MW$G$9!#(B - $B$3$N4X?t$,%$%s%9%H!<%k$5$l$F$$$J$$>l9g$O!"0MA3$H$7$F%9%-!<%^$,L5;k$5$l$F$7$^$$$^$9!#(B + ただし、この機能を有効にするためには、付属のユーザ定義関数"pgpool_regclass"のインストールが必要です。 + この関数がインストールされていない場合は、依然としてスキーマが無視されてしまいます。 </p> - <li>pcp$B%3%^%s%I$N%?%$%`%"%&%H$N07$$$K$*$1$k%P%0$,=$@5$5$l$^$7$?(B(Tatsuo) + </li><li>pcpコマンドのタイムアウトの扱いにおけるバグが修正されました(Tatsuo Ishii) - <li>SSL$B$,M-8z$J>uBV$G!"BgNL$N%G!<%?DL?.$,5/$k$H%O%s%0$9$kLdBj$,=$@5$5$l$^$7$?(B(Tatsuo) + </li><li>SSLが有効な状態で、大量のデータ通信が起るとハングする問題が修正されました(Tatsuo Ishii) - <li>DB$B%N!<%I$,(B1$B8D$@$1$7$+B8:_$7$J$$>uBV$G(BDB$B$,%(%i!<$r5/$7$?$?:]$K!"(B - $B4V0c$C$?(BDB$B%N!<%I$,%U%'%$%k%*!<%P$9$k%P%0$r=$@5$7$^$7$?(B(Tatsuo) + </li><li>DBノードが1個だけしか存在しない状態でDBがエラーを起したた際に、 + 間違ったDBノードがフェイルオーバするバグを修正しました(Tatsuo Ishii) - <li>$B%*%s%i%$%s%j%+%P%j;~$N(Bpostmaster$B$N5/F0%A%'%C%/$K$*$1$k%P%0$r=$@5$7$^$7$?!#(B(Tatsuo) + </li><li>オンラインリカバリ時のpostmasterの起動チェックにおけるバグを修正しました。(Tatsuo Ishii) <p> - $B:#$^$G$O(Bpostmaster$B$X$N:G=i$N@\B3$,<:GT$9$k$H!"@\B3$rL58B$K7+$jJV$9$h$&$K$J$C$F$$$^$7$?(B + 今まではpostmasterへの最初の接続が失敗すると、接続を無限に繰り返すようになっていました </p> -</ul> -</p> +</li></ul> +<p></p> <h2><a name="release2.3.3"></a>2.3.3 (tomiteboshi) 2010/04/23</h2> -<h3>$B35MW(B</h3> -<p>$B$3$N%P!<%8%g%s$G$O!"(B2.3.2.2 $B0JA0$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B</p> +<h3>概要</h3> +<p>このバージョンでは、2.3.2.2 以前の色々なバグが修正されています。</p> -<h3>$B8_49@-$N$J$$JQ99(B</h3> +<h3>互換性のない変更</h3> <ul> -<li>$B$3$N%P!<%8%g%s$+$i!"(Bpgpool $B$,0JA0$h$jB?$/$N6&M-%a%b%j$r;H$&$h$&$K$J$C$?$N$GCm0U$7$F$/$@$5$$!#(B +<li>このバージョンから、pgpool が以前より多くの共有メモリを使うようになったので注意してください。 <p> - $B$3$l$K$h$kLdBj$,(B pgpool $B$N5/F0;~$KH/@8$7$?>l9g$O!"(Bpgpool $B$N%m%0$r8+$F$/$@$5$$!#(B - "could not create shared memory segment: Cannot allocate memory" $B$H$$$C$?%a%C%;!<%8$,$"$l$P!"(B - $B%7%9%F%`$N6&M-%a%b%j$rA}$d$7$F$/$@$5$$!#(B + これによる問題が pgpool の起動時に発生した場合は、pgpool のログを見てください。 + "could not create shared memory segment: Cannot allocate memory" といったメッセージがあれば、 + システムの共有メモリを増やしてください。 </p> </li> - <li>$B%Q%i%l%k%b!<%I$,!"%l%W%j%1!<%7%g%s%b!<%I$+%m!<%I%P%i%s%9%b!<%I$,M-8z$G$J$$$H(B - $B;H$($J$$$h$&$K$J$j$^$7$?!#(B(Kitagawa) + <li>パラレルモードが、レプリケーションモードかロードバランスモードが有効でないと + 使えないようになりました。(Toshihiro Kitagawa) <p> - pgpool-II $B$G$O$:$C$H!"%l%W%j%1!<%7%g%s%b!<%I$+%m!<%I%P%i%s%9%b!<%I$,M-8z$G$J$$$H$-(B - $B%Q%i%l%k%b!<%I$O@5$7$/F0:n$7$F$$$^$;$s$G$7$?!#(B + pgpool-II ではずっと、レプリケーションモードかロードバランスモードが有効でないとき + パラレルモードは正しく動作していませんでした。 </p> </li> -<li><a href="#INSERT_LOCK">insert_lock</a> $B$N%G%U%)%k%HCM$r(B false $B$KJQ99$7$^$7$?!#(B(Tatsuo) +<li><a href="#INSERT_LOCK">insert_lock</a> のデフォルト値を false に変更しました。(Tatsuo Ishii) <p> - $B$3$l$O!"%^%9%?!&%9%l!<%V%b!<%I$G$O(B true $B$K$7$F$bL50UL#$J$?$a$G$9!#(B - Fujii Masao $B$5$s$N;XE&$K$h$j=$@5$7$^$7$?!#(B + これは、マスタ・スレーブモードでは true にしても無意味なためです。 + Fujii Masao さんの指摘により修正しました。 </p> </li> </ul> -<h3>$B?7$7$/DI2C$7$?%I%-%e%a%s%H(B</h3> +<h3>新しく追加したドキュメント</h3> <ul> -<li>README.online-recovery $B$rDI2C$7$^$7$?!#$3$N%I%-%e%a%s%H$K$O!"%*%s%i%$%s%j%+%P%j$NFbItE*$J$3$H$,=q$$$F$"$j$^$9!#(B</li> +<li>README.online-recovery を追加しました。このドキュメントには、オンラインリカバリの内部的なことが書いてあります。</li> </ul> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <ul> -<li>$B;R%W%m%;%9$,(B segfault $B$r5/$3$9(B pgpool-II 1.0 $B$+$iD9$$4VB8:_$7$?%P%0$r=$@5$7$^$7$?!#(B - $B$3$l$O!"?F%W%m%;%9$,(B shmem $B%5%$%:$N7W;;$r4V0c$($F$$$?$3$H$K5/0x$7$^$9!#(B - $B%P%02r@O(B(Kitagawa)$B!"%Q%C%A:n@.(B(Tatsuo)</li> +<li>子プロセスが segfault を起こす pgpool-II 1.0 から長い間存在したバグを修正しました。 + これは、親プロセスが shmem サイズの計算を間違えていたことに起因します。 + バグ解析(Toshihiro Kitagawa)、パッチ作成(Tatsuo Ishii)</li> -<li>$B%I%-%e%a%s%H$K%Q%i%l%k%b!<%IMQ$N0J2<$N@)Ls$rDI5-$7$^$7$?!#(B(Kitagawa) +<li>ドキュメントにパラレルモード用の以下の制約を追記しました。(Toshihiro Kitagawa) <ul> - <li>- NATURAL JOIN $B$O;H$($^$;$s!#(B</li> - <li>- USING $B6g$,!"%/%(%j=q$-49$(=hM}$K$h$C$F(B ON $B6g$KJQ49$5$l$^$9!#(B</li> + <li>- NATURAL JOIN は使えません。</li> + <li>- USING 句が、クエリ書き換え処理によって ON 句に変換されます。</li> </ul> </li> -<li>$B%Q%i%l%k%b!<%I$N$H$-!"(BUSING $B6g$r4^$`(B JOIN $B9=J8$N=q$-49$($GH/@8$9$k2DG=@-$,$"$C$?(B - $B%/%i%C%7%e$r=$@5$7$^$7$?!#(B(Kitagawa)<br> +<li>パラレルモードのとき、USING 句を含む JOIN 構文の書き換えで発生する可能性があった + クラッシュを修正しました。(Toshihiro Kitagawa)<br> <p> - $B$3$N=$@5$K$h$j!"0J2<$N$h$&$J(B JOIN $B9=J8$,;H$($k$h$&$K$J$j$^$9!#(B<br> - $BNc!'(B - </p><pre> -SELECT * FROM a JOIN b USING (aid) JOIN c USING (cid); + この修正により、以下のような JOIN 構文が使えるようになります。<br> + 例: + </p><pre>SELECT * FROM a JOIN b USING (aid) JOIN c USING (cid); SELECT * FROM a JOIN b USING (aid) JOIN c USING (cid) JOIN d USING</pre> </li> -<li>$B%Q%i%l%k%/%(%j$G!"J,;6%-!<Ns$NA0$K(B current_time $B$r4^$`(B INSERT $BJ8$N%Q!<%9$,$G$-$k$h$&$K=$@5$7$^$7$?!#(B</li> +<li>パラレルクエリで、分散キー列の前に current_time を含む INSERT 文のパースができるように修正しました。</li> -<li>SimpleForwardToBackend() $B$r=$@5$7$^$7$?!#(B(Kitagawa) +<li>SimpleForwardToBackend() を修正しました。(Toshihiro Kitagawa) <p> - $B$3$l$K$h$j!"3HD%%W%m%H%3%k$r;H$C$?%/%i%$%"%s%H$,(B bind $B%(%i!<$N$h$&$J%(%i!<$rH/@8$5$;$?$H$-$K!"(B - pgpool $B$,%P%C%/%(%s%I$N1~Ez$rBT$AB3$1$J$/$J$j$^$9!#(B - $B$3$N%P%0$O!"%^%9%?!&%9%l!<%V%b!<%I!"(Braw $B%b!<%I!"%3%M%/%7%g%s%W!<%k%b!<%I$GH/@8$7$F$$$^$7$?!#(B + これにより、拡張プロトコルを使ったクライアントが bind エラーのようなエラーを発生させたときに、 + pgpool がバックエンドの応答を待ち続けなくなります。 + このバグは、マスタ・スレーブモード、raw モード、コネクションプールモードで発生していました。 </p> <p> - $B$3$l$r=$@5$7$?$3$H$K$h$C$F!"%3%^%s%I$,%(%i!<$K$J$C$?$"$H!"%(%i!<$r2sI|$5$;$k$?$a$K(B - SYNC $B%a%C%;!<%8$rAw$k$h$&$K$J$j$^$9!#(B + これを修正したことによって、コマンドがエラーになったあと、エラーを回復させるために + SYNC メッセージを送るようになります。 </p> </li> -<li>select() $B$r<B9TCf$N(B pgpool $B;R%W%m%;%9$,!"(BSIGINT/SIGQUIT $B%7%0%J%k$rL5;k$9$k$h$&$K=$@5$7$^$7$?!#(B -$B%7%0%J%k$,Aw$i$l$F$b(B pgpool $B$O(B select() $B$r:F<B9T$7$h$&$H$9$k$N$G!"7k2LE*$K%7%0%J%k$,L5;k$5$l$^$9!#(B(Tatsuo)</li> +<li>select() を実行中の pgpool 子プロセスが、SIGINT/SIGQUIT シグナルを無視するように修正しました。 +シグナルが送られても pgpool は select() を再実行しようとするので、結果的にシグナルが無視されます。(Tatsuo Ishii)</li> -<li>connect_inet_domain_socket_by_port/connect_unix_domain_socket_by_port $B$,(B - SIGTERM/SIGINT/SIGQUIT $B%7%0%J%k$r<u$1<h$C$F$$$J$$$+%A%'%C%/$9$k$h$&$K=$@5$7$^$7$?!#(B - Daniel Codina $B$5$s$+$i$N%P%0Js9p$K4p$E$-$^$9!#(B(Tatsuo)</li> +<li>connect_inet_domain_socket_by_port/connect_unix_domain_socket_by_port が + SIGTERM/SIGINT/SIGQUIT シグナルを受け取っていないかチェックするように修正しました。 + Daniel Codina さんからのバグ報告に基づきます。(Tatsuo Ishii)</li> -<li>"kind mismatch" $B$H$$$&%(%i!<%a%C%;!<%8$r@8@.$9$k:]$K%/%i%C%7%e$9$k2DG=@-$,$"$C$?$N$G!"$3$l$r=$@5$7$^$7$?!#(B - $B0JA0$OLdBj$J$+$C$?$N$G$9$,!"(B2.3.2$B$G%(%s%P%0$7$^$7$?!#(B(Tatsuo)</li> +<li>"kind mismatch" というエラーメッセージを生成する際にクラッシュする可能性があったので、これを修正しました。 + 以前は問題なかったのですが、2.3.2でエンバグしました。(Tatsuo Ishii)</li> -<li>$B%X%k%9%A%'%C%/$K$*$1$k%P%0$r=$@5$7$^$7$?!#(B(Tatsuo) +<li>ヘルスチェックにおけるバグを修正しました。(Tatsuo Ishii) <p> - $B%3!<%I$,H4$1$?$J$I$G%M%C%H%o!<%/>c32$,H/@8$7$?$H$-$K!"(Bconnect() $B$r8F$s$G$$$k4V$O(B - $B%X%k%9%A%'%C%/$,9T$J$o$l$F$$$^$;$s$G$7$?!#(B - $B$3$l$O!"(Bconnect() $B$,(B ALARM $B%7%0%J%k$K$h$C$F3d$j9~$^$l$?:]$K!"(B - connect_unix_domain_socket() / connect_inet_domain_socket() $B$,:F;n9T$7$F$$$?$?$a$G$9!#(B - $B$3$N=$@5$G$O!">e5-$N4X?t$KBP$7$F:F;n9T$r%3%s%H%m!<%k$9$k$h$&$J0z?t$rDI2C$7$F$$$^$9!#(B + コードが抜けたなどでネットワーク障害が発生したときに、connect() を呼んでいる間は + ヘルスチェックが行なわれていませんでした。 + これは、connect() が ALARM シグナルによって割り込まれた際に、 + connect_unix_domain_socket() / connect_inet_domain_socket() が再試行していたためです。 + この修正では、上記の関数に対して再試行をコントロールするような引数を追加しています。 </p> <p> - $B$3$l$O!"(BDaniel Codina $B$5$s$N%P%0Js9p$HJ,@O$K4p$E$/=$@5$G$9!#(B + これは、Daniel Codina さんのバグ報告と分析に基づく修正です。 </p> </li> -<li>2.3.2.2 $B$G!"(BSimpleForwardToBackend $B$G$N%?%$%`%9%?%s%W$N=q$-49$($K$*$$$F%(%s%P%0$7$F$$$?$N$G!"(B - $B$3$l$r=$@5$7$^$7$?!#(B(Tatsuo) +<li>2.3.2.2 で、SimpleForwardToBackend でのタイムスタンプの書き換えにおいてエンバグしていたので、 + これを修正しました。(Tatsuo Ishii) <p> - $B$3$l$O!"%P%0%H%i%C%/(B #1010771 $B$K$"$k(B Peter Pramberge $B$5$s$i$NJs9p$K4p$E$-$^$9!#(B + これは、バグトラック #1010771 にある Peter Pramberge さんらの報告に基づきます。 </p> </li> -<li>$B%Q%i%l%k%/%(%j$K$*$1$k(B "*" $B$N=q$-49$($r=$@5$7$^$7$?!#(B - sho $B$5$s$+$iDs6!$$$?$@$$$?%Q%C%A$r<h$j9~$_$^$7$?!#(B(Kitagawa)</li> +<li>パラレルクエリにおける "*" の書き換えを修正しました。 + sho さんから提供いただいたパッチを取り込みました。(Toshihiro Kitagawa)</li> -<li>connect_inet_domain_socket_by_port() $B$G%(%i!<%a%C%;!<%8$r=PNO$9$k:]$K!"(B - strerror() $B$G$O$J$/(B hstrerror() $B$r;H$&$h$&$K=$@5$7$^$7$?!#(B (Tatsuo)</li> +<li>connect_inet_domain_socket_by_port() でエラーメッセージを出力する際に、 + strerror() ではなく hstrerror() を使うように修正しました。 (Tatsuo Ishii)</li> </ul> <h2><a name="release2.3.2.2"></a>2.3.2.2 (tomiteboshi) 2010/02/22</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.3.x$B$K$*$1$kMM!9$J%P%0$r=$@5$7$F$$$^$9!#(B -$B$H$/$K%?%$%`%9%?%s%W$N=q$-49$(;~$N%/%i%C%7%e$r4^$`CWL?E*$J%P%0$,=$@5$5$l$F$$$k$N$G!"(B -$B$9$Y$F$N(B2.3$B%f!<%6$OAa5^$K%"%C%W%0%l!<%I$9$k$3$H$r$*4+$a$7$^$9!#(B +このバージョンでは、2.3.xにおける様々なバグを修正しています。 +とくにタイムスタンプの書き換え時のクラッシュを含む致命的なバグが修正されているので、 +すべての2.3ユーザは早急にアップグレードすることをお勧めします。 </p> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <p> -<ul> - <li>$B%?%$%`%9%?%s%W%G!<%?$r4^$`3HD%%W%m%H%3%kLd$$9g$o$;$G!"(B - "message: invalid string in message"$B$N%(%i!<$r=P$7$F%H%i%s%6%/%7%g%s$,=*N;$7$F$7$^$&(B - $B%P%0$r=$@5$7$^$7$?(B(Tatsuo) - <li>$B%?%$%`%9%?%s%W%G!<%?$r4^$`3HD%%W%m%H%3%kLd$$9g$o$;$G!"(Bbind$B;~$K(BNULL$B$r4^$`%Q%i%a!<%?$,B8:_$9$k$H(B - pgpool$B$,%/%i%C%7%e$9$k%P%0$r=$@5$7$^$7$?(B(Tatsuo) - <li>pgpool_status$B>e$G$9$Y$F$N%N!<%I$,%@%&%s$N$H$-$K$O$3$l$rL58z$H$7!"(Bi - $B!V(Ball node down$B>I8u72!W$,5/$-$J$$$h$&$K$7$^$7$?(B(Tatsuo) -</ul> -</p> +</p><ul> + <li>タイムスタンプデータを含む拡張プロトコル問い合わせで、 + "message: invalid string in message"のエラーを出してトランザクションが終了してしまう + バグを修正しました(Tatsuo Ishii) + </li><li>タイムスタンプデータを含む拡張プロトコル問い合わせで、bind時にNULLを含むパラメータが存在すると + pgpoolがクラッシュするバグを修正しました(Tatsuo Ishii) + </li><li>pgpool_status上ですべてのノードがダウンのときにはこれを無効とし、 + 「all node down症候群」が起きないようにしました(Tatsuo Ishii) +</li></ul> +<p></p> <h2><a name="release2.3.2.1"></a>2.3.2.1 (tomiteboshi) 2010/02/11</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.3.x$B$K$*$$$F!"%(%i!<$H$J$k$h$&$J(BSQL$B$r<B9T$9$k$H(B -pgpool$B$X$N%;%C%7%g%s$,@ZCG$5$l$k%P%0$r=$@5$7$F$$$^$9(B(Akio Ishida)$B!#(B +このバージョンでは、2.3.xにおいて、エラーとなるようなSQLを実行すると +pgpoolへのセッションが切断されるバグを修正しています(Akio Ishida)。 </p> <h2><a name="release2.3.2"></a>2.3.2 (tomiteboshi) 2010/02/07</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.3.1$B$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B -$BFC$K!"%?%$%`%9%?%s%W$N=q$-49$(5!G=$N%P%0$,=$@5$5$l$F$$$k$N$G!"(B2.3, 2.3.1$B%f!<%6$O$J$k$Y$/Aa$/(B -2.3.2$B$K%"%C%W%0%l!<%I$9$k$3$H$r$*4+$a$7$^$9!#(B +このバージョンでは、2.3.1の色々なバグが修正されています。 +特に、タイムスタンプの書き換え機能のバグが修正されているので、2.3, 2.3.1ユーザはなるべく早く +2.3.2にアップグレードすることをお勧めします。 </p> <p> -$B$^$?!"(B2.3.2$B$G$O(BSSL$B%5%]!<%H!"%i!<%8%*%V%8%'%/%H$N%l%W%j%1!<%7%g%s5!G=$,DI2C$5$l$F$$$^$9!#(B +また、2.3.2ではSSLサポート、ラージオブジェクトのレプリケーション機能が追加されています。 </p> -<h3>$B2~NIE@(B</h3> +<h3>改良点</h3> <p> -<ul> - <li>$B%U%m%s%H%(%s%I$H(Bpgpool-II$B!"(Bpgpool-II$B$H(BPostgreSQL$B$N4V$N(BSSL$BDL?.$,%5%]!<%H$5$l$^$7$?(B(Sean Finney) - <li>$B%i!<%8%*%V%8%'%/%H$N%l%W%j%1!<%7%g%s$,%5%]!<%H$5$l$^$7$?(B(Tatsuo) - <li>$B%X%k%9%A%'%C%/$H%*%s%i%$%s%j%+%P%j$N:]$K2DG=$G$"$l$P(Bpostgres$B%G!<%?%Y!<%9$r;H$&$h$&$K$7$^$7$?!#(B(Tatsuo) +</p><ul> + <li>フロントエンドとpgpool-II、pgpool-IIとPostgreSQLの間のSSL通信がサポートされました(Sean Finney) + </li><li>ラージオブジェクトのレプリケーションがサポートされました(Tatsuo Ishii) + </li><li>ヘルスチェックとオンラインリカバリの際に可能であればpostgresデータベースを使うようにしました。(Tatsuo Ishii) <p> - postgres$B%G!<%?%Y!<%9$,B8:_$7$J$$>l9g$O(Btemplate1$B$,;H$o$l$^$9(B($B0JA0$NF0:n$HF1$8(B)$B!#(B - $B$3$l$K$h$j!"(BDROP DATABASE$B$J$I$N%3%^%s%I$,%*%s%i%$%s%j%+%P%jCf$G$b;H$($k$h$&$K$J$j$^$7$?!#(B + postgresデータベースが存在しない場合はtemplate1が使われます(以前の動作と同じ)。 + これにより、DROP DATABASEなどのコマンドがオンラインリカバリ中でも使えるようになりました。 </p> - <li>$BLd$$9g$o$;$N%Q!<%9=hM}$G%(%i!<$,5/$-$?$H$-$K!"(BSQL$BJ8$r%m%0$K=PNO$9$k$h$&$K$7$^$7$?!#(B(Tatsuo) + </li><li>問い合わせのパース処理でエラーが起きたときに、SQL文をログに出力するようにしました。(Tatsuo Ishii) <p> - $B%(%s%3!<%G%#%s%0%(%i!<$J$I$,H/@8$7$?:]$K$O(BPostgreSQL$B$N%m%0$K$b(BSQL$BJ8$,5-O?$5$l$J$$$?$a!"$3$l$OM-8z$G$9!#(B + エンコーディングエラーなどが発生した際にはPostgreSQLのログにもSQL文が記録されないため、これは有効です。 </p> - <li>kind mismatch$B%(%i!<$,H/@8$7!"$=$N860x$,(BDEALLOCATE$B%3%^%s%I$@$C$?>l9g$K(BDEALLOCATE$B$,:o=|$7$h$&$H$7$?(B - PREPARED$BJ8$N85$K$J$C$?(BSQL$BJ8$r%m%0$K=PNO$9$k$h$&$K$7$^$7$?(B(Tatsuo) -</ul> -</p> - -<h3>$B%P%0=$@5(B</h3> -<p> -<ul> - <li>$B$?$^$K%?%$%`%9%?%s%W$r=q$-49$($?Ld$$9g$o$;$,%^%9%?0J30$N(BDB$B%N!<%I$K(B - $BIT@5$J%Q%1%C%H$rAw$C$F$7$^$&LdBj$r=$@5$7$^$7$?(B(Tatsuo) - <li>V2$B%W%m%H%3%k$G%?%$%`%9%?%s%W$N=q$-49$(=hM}$,%(%i!<$K$J$k$N$r=$@5$7$^$7$?(B(Toshihiro Kitagawa) - <li>master/slave$B%b!<%I!"$+$D%H%i%s%6%/%7%g%sFb$GH/9T$5$l$k(BBind$B!"(BDescribe$B!"(BClose$B%a%C%;!<%8$O(B - $B%^%9%?$@$1$KAw$k$h$&$K$7$^$7$?(B(Tatsuo) - <li>2.3$B$G(Bsmart shutdown$B$K$h$j$9$0$KDd;_$7$J$/$J$C$?%P%0$r=$@5$7$^$7$?(B(Toshihiro Kitagawa) - <li>$B%U%m%s%H%(%s%I$+$i$NIT@5$J%3%^%s%I$r<u$1IU$1$J$$$h$&$K$7$^$7$?(B(Xavier Noguer) - <li>$B0\?"@-$r9b$a$k$?$a$K!"(Bfprintf$B$N0z?t$K(B%dz$B$r;HMQ$9$k$h$&$K$7$^$7$?(B(Tatsuo) - <li>$B%3%s%Q%$%i%o!<%K%s%0$r=$@5$7$^$7$?(B(Tatsuo) - <li>master/slave$B%b!<%I$N:]$K!"(BDEALLOCATE$B$r$9$Y$F$N%N!<%I$KAw$i$J$$$h$&$K$7$F!"(B - kind mismatch$B%(%i!<$rKI$0$h$&$K$7$^$7$?(B(Tatsuo) -</ul> -</p> + </li><li>kind mismatchエラーが発生し、その原因がDEALLOCATEコマンドだった場合にDEALLOCATEが削除しようとした + PREPARED文の元になったSQL文をログに出力するようにしました(Tatsuo Ishii) +</li></ul> +<p></p> + +<h3>バグ修正</h3> +<p> +</p><ul> + <li>たまにタイムスタンプを書き換えた問い合わせがマスタ以外のDBノードに + 不正なパケットを送ってしまう問題を修正しました(Tatsuo Ishii) + </li><li>V2プロトコルでタイムスタンプの書き換え処理がエラーになるのを修正しました(Toshihiro Kitagawa) + </li><li>master/slaveモード、かつトランザクション内で発行されるBind、Describe、Closeメッセージは + マスタだけに送るようにしました(Tatsuo Ishii) + </li><li>2.3でsmart shutdownによりすぐに停止しなくなったバグを修正しました(Toshihiro Kitagawa) + </li><li>フロントエンドからの不正なコマンドを受け付けないようにしました(Xavier Noguer) + </li><li>移植性を高めるために、fprintfの引数に%dzを使用するようにしました(Tatsuo Ishii) + </li><li>コンパイラワーニングを修正しました(Tatsuo Ishii) + </li><li>master/slaveモードの際に、DEALLOCATEをすべてのノードに送らないようにして、 + kind mismatchエラーを防ぐようにしました(Tatsuo Ishii) +</li></ul> +<p></p> <h2><a name="release2.3.1"></a>2.3.1 (tomiteboshi) 2009/12/18</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.3$B$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B -$BFC$K!"$"$k>r7o$G(BDB$B$KIT@5$J?tCM$,=q$-9~$^$l$k%P%0$,=$@5$5$l$F$*$j!"(B -$B0J2<$N<($9>r7o$K9gCW$9$k;H$$J}$r$7$F$$$k(B2.3$B%f!<%6$O;j5^%P!<%8%g%s%"%C%W$9$k$3$H$r$*4+$a$7$^$9!#(B +このバージョンでは、2.3の色々なバグが修正されています。 +特に、ある条件でDBに不正な数値が書き込まれるバグが修正されており、 +以下の示す条件に合致する使い方をしている2.3ユーザは至急バージョンアップすることをお勧めします。 </p> -<h3>$B%P%0=$@5$H2~NIE@(B</h3> +<h3>バグ修正と改良点</h3> <p> -<ul> - <li>$B0J2<$N$9$Y$F$N>r7o$K9gCW$9$k>l9g!"(BDB$B$KIT@5$JCM$,=q$-9~$^$l$k%P%0$r=$@5$7$^$7$?(B(Tatsuo) +</p><ul> + <li>以下のすべての条件に合致する場合、DBに不正な値が書き込まれるバグを修正しました(Tatsuo Ishii) <p> - <ol> - <li>$B%l%W%j%1!<%7%g%s%b!<%I$GF0:n(B - <li>64bit OS - <li>INSERT$B$^$?$O(BUPDATE$B$K$*$$$F!"(Bnow(), CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME$B$rD>@\4^$`$+!"(B - $B%F!<%V%k$N%G%U%)%k%HCM$K4^$s$G$$$k(B - <li>$B99$K$=$N(BSQL$BFb$K(B32bit(10$B?J$G(B-2147483648$B$+$i(B2147483647)$B$NHO0O$rD6$($k@0?tDj?t$,4^$^$l$F$$$k(B - </ol> - $B0J>e$rK~$?$9(BSQL$B$NNc(B: -<pre> -INSERT INTO t1(id, regdate) VALUES(98887776655, NOW()); + </p><ol> + <li>レプリケーションモードで動作 + </li><li>64bit OS + </li><li>INSERTまたはUPDATEにおいて、now(), CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIMEを直接含むか、 + テーブルのデフォルト値に含んでいる + </li><li>更にそのSQL内に32bit(10進で-2147483648から2147483647)の範囲を超える整数定数が含まれている + </li></ol> + 以上を満たすSQLの例: +<pre>INSERT INTO t1(id, regdate) VALUES(98887776655, NOW()); </pre> - $B$3$NNc$G$O!"(B98887776655$B$,(B32bit$BCM$K%+%C%H$5$l$F=q$-9~$^$l$^$9!#(B - </p> + この例では、98887776655が32bit値にカットされて書き込まれます。 + <p></p> - <li>18$B0J>e$N(BDB$B%N!<%I$r;HMQ$7$F$$$k>l9g$K!"(Bshow pool_status$B$G%/%i%C%7%e$9$k%P%0$r=$@5$7$^$7$?!#(B - $B$3$N%P%0$O(Bshow pool_status$B$,<BAu$5$l$F$+$i$:$C$HB8:_$7$F$$$?$b$N$G$9!#(B + </li><li>18以上のDBノードを使用している場合に、show pool_statusでクラッシュするバグを修正しました。 + このバグはshow pool_statusが実装されてからずっと存在していたものです。 - <li>"kind mismatch"$B%a%C%;!<%8$,=P$?:]$K!"(Bkind$B$,(BERROR$B$^$?$O(BNOTICE$B$J$i$P!"(B - $B$=$N%a%C%;!<%8$rI=<($9$k$h$&$K$7$^$7$?!#(B(Tatsuo) + </li><li>"kind mismatch"メッセージが出た際に、kindがERRORまたはNOTICEならば、 + そのメッセージを表示するようにしました。(Tatsuo Ishii) <p> - $B$3$l$K$h$j!"(BPostgreSQL$B$N%m%0$r8+$J$/$F$b(Bkind mismatch$B%(%i!<$N860x$rMF0W$KD4$Y$k$3$H$,(B - $B$G$-$k$h$&$K$J$j$^$7$?!#(B + これにより、PostgreSQLのログを見なくてもkind mismatchエラーの原因を容易に調べることが + できるようになりました。 </p> - </ul> -</p> + </li></ul> +<p></p> <h2><a name="release2.3"></a>2.3 (tomiteboshi) 2009/12/07</h2> -<h3>$B35MW(B</h3> -<p>$B$3$N%P!<%8%g%s$G$O!"%l%W%j%1!<%7%g%s5!G=$K2~NI$,2C$($i$l!"(B -$B;~9o%G!<%?(B(CURRENT_TIMESTAMP, CURRENT_DATE, now()$B$J$I(B)$B$r@5$7$/07$&$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#(B</p> -<p> -<p>$B$^$?!"F1;~@\B3?t$,(B1(num_init_children$B$,(B1)$B$N$H$-$N%l%W%j%1!<%7%g%s@-G=8~>e$7$F$$$^$9!#(B</p> -<p>$B$^$?!"(Bpgpool-II$B:F5/F0;~$KA02s$N(BDB$B%N!<%I$N%@%&%s>uBV$r5-O?$7!"ITMQ0U$KI|5l%N!<%I$K%G!<%?$r=q$-9~$s$G(B -$B%G!<%?$NIT@09g$,5/$-$k$3$H$rKI$0$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#(B</p> -<p>$B$=$N$[$+!"%/%(%j%m%0$,2~NI$5$l$F(BDB$B%N!<%IC10L$N>u67$,GD0.$7$d$9$/$J$j!"(B -$B$^$?%U%'%$%k%*!<%P$N5sF0$,:Y$+$/@)8f$G$-$k$h$&$K$J$j$^$7$?!#(B</p> -<p>$B$J$*!"(Bpgpool-II 2.3$B$K$O!"(Bpgpool-II 2.2.1$B$+$i(B2.2.6$B$^$G$N$9$Y$F$N%P%0=$@5!"2~NI$,4^$^$l$F$$$^$9!#(B</p> -</p> - -<h3>pgpool-II 2.2.$B$+$i$NHs8_49@-(B</h3> +<h3>概要</h3> +<p>このバージョンでは、レプリケーション機能に改良が加えられ、 +時刻データ(CURRENT_TIMESTAMP, CURRENT_DATE, now()など)を正しく扱うことができるようになりました。</p> +<p> +</p><p>また、同時接続数が1(num_init_childrenが1)のときのレプリケーション性能向上しています。</p> +<p>また、pgpool-II再起動時に前回のDBノードのダウン状態を記録し、不用意に復旧ノードにデータを書き込んで +データの不整合が起きることを防ぐことができるようになりました。</p> +<p>そのほか、クエリログが改良されてDBノード単位の状況が把握しやすくなり、 +またフェイルオーバの挙動が細かく制御できるようになりました。</p> +<p>なお、pgpool-II 2.3には、pgpool-II 2.2.1から2.2.6までのすべてのバグ修正、改良が含まれています。</p> +<p></p> + +<h3>pgpool-II 2.2.からの非互換性</h3> <ul> -<li>[logdir]$B$N2<$K(Bpgpool_status$B$H$$$&%U%!%$%k$,:n$i$l$k$N$G!"(Bpgpool$B$N<B9T%f!<%6$,FI$_=q$-$G$-$k8"8B$r(B - $BM?$($F$*$$$F$/$@$5$$!#(B -</ul> +<li>[logdir]の下にpgpool_statusというファイルが作られるので、pgpoolの実行ユーザが読み書きできる権限を + 与えておいてください。 +</li></ul> -<h3>$B2~NIE@(B</h3> +<h3>改良点</h3> <ul> -<li>$B%l%W%j%1!<%7%g%s$K$*$$$F!";~9o%G!<%?(B(CURRENT_TIMESTAMP, CURRENT_DATE, now()$B$J$I(B)$B$r(B - $B@5$7$/07$&$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#(B(Akio Ishida) - <p> - $BFC$K%"%W%j%1!<%7%g%s$KJQ99$r2C$($k$3$H$J$/!"(BINSERT/UPDATE$BJ8!"%F!<%V%k$N%G%U%)%k%HCM$K(B - $B$3$l$i$N;~9o4X?t$r4^$`%1!<%9$G$b@5$7$/%l%W%j%1!<%7%g%s$G$-$^$9(B($B$$$/$D$+@)8B;v9`$,$"$j$^$9!#(B - $B>\:Y$O(B<a href="#restriction">$B@)8B;v9`(B</a>$B$r;2>H$7$F$/$@$5$$(B)$B!#(B - </p> -<li>SQL$B%Q!<%5$r(BPostgreSQL 8.4$B$N$b$N$K%P!<%8%g%s%"%C%W$7$^$7$?(B(Akio Ishida) -<li>$BF1;~@\B3?t$,(B1$B!J(B<a href="#NUM_INIT_CHILDREN">num_init_children</a> $B$,(B1$B!K$N$H$-$N(B - $B%l%W%j%1!<%7%g%s@-G=$,(B20%$B$+$i(B100%$B8~>e$7$^$7$?(B(Tatsuo) -<li>$B?7$7$$%G%#%l%/%F%#%V(B <a href="#LOG_PER_NODE_STATEMENT">log_per_node_statement</a> $B$,DI2C$5$l$^$7$?(B(Tatsuo) - <p> - <a href="#LOG_STATEMENT">log_statement</a> $B$H;w$F$$$^$9$,!"(BDB$B%N!<%IC10L$G%m%0$,=PNO$5$l$k$N$G!"(B - $B%l%W%j%1!<%7%g%s$dIi2YJ,;6$N3NG'$,MF0W$G$9!#(B - $B$^$?!"%P%C%/%(%s%I$N%W%m%;%9(BID$B$bI=<($5$l$k$N$G!"%P%C%/%(%s%I$N%m%0$HJ;$;$F$N2r@O$,MF0W$K$J$C$F$$$^$9!#(B - </p> -<li>$B?7$7$$%G%#%l%/%F%#%V(B <a href="#FAIL_OVER_ON_BACKEND_ERROR">fail_over_on_backend_error</a> $B$,DI2C$5$l!"(B - $B%U%'%$%k%*!<%P$N5sF0$,$h$j:Y$+$/@)8f$G$-$k$h$&$K$J$j$^$7$?(B(Tatsuo) -<li>pgpool-II$BDd;_;~$K%@%&%s$7$?(BDB$B%N!<%I$N>pJs$r%9%F!<%?%9%U%!%$%k$K5-O?$7!"(B - pgpool-II$B$r5/F0$7$?$H$-$K$=$N>pJs$r%j%9%H%"$G$-$k$h$&$K$7$^$7$?(B(Tatsuo) -$B%9%F!<%?%9%U%!%$%k$O(B [logdir]/pgpoo_status $B$H$$$&%U%!%$%k$K=q$+$l$^$9!#(B -<li>EXPLAIN$B$H!"Ld$$9g$o$;$,(BSELECT$B$N$H$-$N(BEXPLAIN ANALYZE$B$,Ii2YJ,;6$5$l$k$h$&$K$J$j$^$7$?!#(B(Tatsuo) - <p>$B$3$l$K$h$C$F!"(BDB$B%N!<%I$N4V$GBgI}$KLd$$9g$o$;%W%i%s$,0[$k$?$a$K!"(B - kind mismatch$B%(%i!<$,5/$-$k$N$rKI$0$3$H$,$G$-$^$9!#(B</p> -<li>$BF|K\8l%I%-%e%a%s%H$NBN:[$r2~NI$7$^$7$?(B(Tatsuo) -<li>$B%l%W%j%1!<%7%g%s%b!<%I!"%^%9%?!<%9%l!<%V%b!<%IMQ$N%G%U%)%k%H(Bpgpoo.conf.sample$B$,JLESDI2C$5$l$^$7$?(B(Tatsuo) -<li>$B;~9o%G!<%?$N%F%9%H$,DI2C$5$l$^$7$?(B(Akio Ishida) -</ul> - -</p> +<li>レプリケーションにおいて、時刻データ(CURRENT_TIMESTAMP, CURRENT_DATE, now()など)を + 正しく扱うことができるようになりました。(Akio Ishida) + <p> + 特にアプリケーションに変更を加えることなく、INSERT/UPDATE文、テーブルのデフォルト値に + これらの時刻関数を含むケースでも正しくレプリケーションできます(いくつか制限事項があります。 + 詳細は<a href="#restriction">制限事項</a>を参照してください)。 + </p> +</li><li>SQLパーサをPostgreSQL 8.4のものにバージョンアップしました(Akio Ishida) +</li><li>同時接続数が1(<a href="#NUM_INIT_CHILDREN">num_init_children</a> が1)のときの + レプリケーション性能が20%から100%向上しました(Tatsuo Ishii) +</li><li>新しいディレクティブ <a href="#LOG_PER_NODE_STATEMENT">log_per_node_statement</a> が追加されました(Tatsuo Ishii) + <p> + <a href="#LOG_STATEMENT">log_statement</a> と似ていますが、DBノード単位でログが出力されるので、 + レプリケーションや負荷分散の確認が容易です。 + また、バックエンドのプロセスIDも表示されるので、バックエンドのログと併せての解析が容易になっています。 + </p> +</li><li>新しいディレクティブ <a href="#FAIL_OVER_ON_BACKEND_ERROR">fail_over_on_backend_error</a> が追加され、 + フェイルオーバの挙動がより細かく制御できるようになりました(Tatsuo Ishii) +</li><li>pgpool-II停止時にダウンしたDBノードの情報をステータスファイルに記録し、 + pgpool-IIを起動したときにその情報をリストアできるようにしました(Tatsuo Ishii) +ステータスファイルは [logdir]/pgpoo_status というファイルに書かれます。 +</li><li>EXPLAINと、問い合わせがSELECTのときのEXPLAIN ANALYZEが負荷分散されるようになりました。(Tatsuo Ishii) + <p>これによって、DBノードの間で大幅に問い合わせプランが異るために、 + kind mismatchエラーが起きるのを防ぐことができます。</p> +</li><li>日本語ドキュメントの体裁を改良しました(Tatsuo Ishii) +</li><li>レプリケーションモード、マスタースレーブモード用のデフォルトpgpoo.conf.sampleが別途追加されました(Tatsuo Ishii) +</li><li>時刻データのテストが追加されました(Akio Ishida) +</li></ul> + +<p></p> <h2>2.2.6 (urukiboshi) 2009/12/01</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"%m!<%I%P%i%s%9$N=E$_%Q%i%a!<%?(Bweight$B$N07$$$,2~A1$5$l!"(B -$B$^$?0l;~%F!<%V%k$,%^%9%?!<!?%9%l!<%V%b!<%I$GMxMQ$G$-$k$h$&$K$J$j$^$7$?!#(B -$B$b$A$m$s$$$D$b$N$h$&$K(B2.2.5$B0JA0$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B +このバージョンでは、ロードバランスの重みパラメータweightの扱いが改善され、 +また一時テーブルがマスター/スレーブモードで利用できるようになりました。 +もちろんいつものように2.2.5以前の色々なバグが修正されています。 </p> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <ul> -<li>DECLARE, CLOSE, FETCH, MOVE$B$,%m!<%I%P%i%s%9$NBP>]$K$J$i$J$/$J$j$^$7$?!#(B(Tatsuo) +<li>DECLARE, CLOSE, FETCH, MOVEがロードバランスの対象にならなくなりました。(Tatsuo Ishii) <p> - $B$b$7%G!<%?$,99?7$5$l!"%H%i%s%6%/%7%g%s$,%3%_%C%H$5$l$?8e$K(BCLOSE$B$,H/9T$5$l$k$H%G!<%?$N0l4S@-$,$J$/$J$k$+$i$G$9(B - ($B$D$^$j!"(Bhold$B$G$-$k%+!<%=%k$N>l9g$N$3$H$r8@$C$F$$$^$9(B) + もしデータが更新され、トランザクションがコミットされた後にCLOSEが発行されるとデータの一貫性がなくなるからです + (つまり、holdできるカーソルの場合のことを言っています) </p> -<li>$B%^%9%?!<!?%9%l!<%V%b!<%I$K$*$$$F!"3HD%%W%m%H%3%k$N(BParse$B$r%^%9%?!<>e$G$N$_<B9T$9$k$h$&$K$7$^$7$?!#(B(Tatsuo) - <p>$B0JA0$O$9$Y$F$N%N!<%I$G(BParse$B$,<B9T$5$l$F$$$?$N$G$9$,!"$3$l$@$H(B - $BITI,MW$J%m%C%/$,%9%l!<%V$G$b<h$i$l$F$7$^$$$^$9(B</p> -<li>uninstall$B$NA0$K$9$Y$F$N%i%s%l%Y%k$+$i(Binit$B%9%/%j%W%H$r:o=|$9$k$h$&$K$7$^$7$?(B(Devrim) -<li>$BG'>Z$K<:GT$7$?$H$-$KE,@Z$J%(%i!<%a%C%;!<%8$r=P$9$h$&$K$7$^$7$?(B(Glyn Astill) -<li>$B%=%1%C%H$X$N=q$-9~$_$K<:GT$7$?$H$-$K%U%m%s%H%(%s%IMQ$J$N$+%P%C%/%(%s%IMQ$J$N$+$o$+$k$h$&$K$7$^$7$?(B(Tatsuo) -<li>$B%U%m%s%H%(%s%IMQ$N%=%1%C%H$K=q$-9~$_<:GT$7$?$H$-$K$$$A$$$A%(%i!<$r=P$5$J$$$h$&$K$7$^$7$?(B(Tatsuo) -<li>$B%^%9%?!<!?%9%l!<%V%b!<%I$G0l;~%F!<%V%k$,;H$($k$h$&$K$J$j$^$7$?!#(B(Tatsuo) +</li><li>マスター/スレーブモードにおいて、拡張プロトコルのParseをマスター上でのみ実行するようにしました。(Tatsuo Ishii) + <p>以前はすべてのノードでParseが実行されていたのですが、これだと + 不必要なロックがスレーブでも取られてしまいます</p> +</li><li>uninstallの前にすべてのランレベルからinitスクリプトを削除するようにしました(Devrim) +</li><li>認証に失敗したときに適切なエラーメッセージを出すようにしました(Glyn Astill) +</li><li>ソケットへの書き込みに失敗したときにフロントエンド用なのかバックエンド用なのかわかるようにしました(Tatsuo Ishii) +</li><li>フロントエンド用のソケットに書き込み失敗したときにいちいちエラーを出さないようにしました(Tatsuo Ishii) +</li><li>マスター/スレーブモードで一時テーブルが使えるようになりました。(Tatsuo Ishii) <p> - INSERT/UPDATE/DELETE$B$O<+F0E*$K%^%9%?$N$_$KAw$i$l$^$9!#(BSELECT$B$K4X$7$F$OL@<(E*$K%/%(%j$NA0$K(B - /*NO LOAD BALANCE*/$B$H$$$&%3%a%s%H$rIU$1$J$1$l$P$J$j$^$;$s!#(B + INSERT/UPDATE/DELETEは自動的にマスタのみに送られます。SELECTに関しては明示的にクエリの前に + /*NO LOAD BALANCE*/というコメントを付けなければなりません。 </p> -</ul> -</p> +</li></ul> +<p></p> <h2>2.2.5 (urukiboshi) 2009/10/4</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.2.4$B0JA0$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B +このバージョンでは、2.2.4以前の色々なバグが修正されています。 </p> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <ul> -<li>$B%3%M%/%7%g%s?t$N%+%&%s%H$N%_%9$K$h$j!"%*%s%i%$%s%j%+%P%j$,=*$o$i$J$/$J$k%P%0$r=$@5$7$^$7$?(B(Tatsuo) -<li>$BFbItE*$K%m%C%/$rH/9T$9$k:]$K$b%U%m%s%H%(%s%I$,0[>o=*N;$7$?$3$H$r8!=P$7$F(B - SQL$B%3%^%s%I$r%-%c%s%;%k$9$k$h$&$K$7$^$7$?(B(Tatsuo) -<li>$B@\B3$N=*N;=hM}$GL58B%k!<%W$K4Y$k$3$H$,$"$k%P%0$r=$@5$7$^$7$?(B(Xavier Noguer, Tatsuo) -<li>$B3HD%%W%m%H%3%k$N%Q!<%9=hM}$G(Bkind mismatch error$B$,5/$-$?:]$K@5$7$$(BSQL$BJ8$rI=<($9$k$h$&$K$7$^$7$?(B(Tatsuo) -<li>$B%I%-%e%a%s%H$r2~A1$7$^$7$?(B(Tatsuo) -</ul> -</p> +<li>コネクション数のカウントのミスにより、オンラインリカバリが終わらなくなるバグを修正しました(Tatsuo Ishii) +</li><li>内部的にロックを発行する際にもフロントエンドが異常終了したことを検出して + SQLコマンドをキャンセルするようにしました(Tatsuo Ishii) +</li><li>接続の終了処理で無限ループに陥ることがあるバグを修正しました(Xavier Noguer, Tatsuo Ishii) +</li><li>拡張プロトコルのパース処理でkind mismatch errorが起きた際に正しいSQL文を表示するようにしました(Tatsuo Ishii) +</li><li>ドキュメントを改善しました(Tatsuo Ishii) +</li></ul> +<p></p> <h2>2.2.4 (urukiboshi) 2009/8/24</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.2.3$B0JA0$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B +このバージョンでは、2.2.3以前の色々なバグが修正されています。 </p> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <ul> - <li>pgpool-II 2.2.2$B$GF~$C$F$7$^$C$?%P%0$r=$@5$7$^$7$?!#(B(Tatsuo) - <p>$B%U%m%s%H%(%s%I$,%"%\!<%H$9$k%?%$%_%s%0$K$h$C$F$O!"0J8eFbIt>uBV$,%j%;%C%H$5$l$:!"(B - $B<!$N%;%C%7%g%s$G(BDML$B$d(BDDL$B$,%^%9%?!<%N!<%I$N$_Aw$i$l!"(B - $B%N!<%I4V$G%G!<%?$NIT0lCW$,@8$8$k$3$H$,$"$j$^$7$?!#(B</p> - <li>pgpool-II 2.2.3$B$G%P!<%8%g%s(B2$B%W%m%H%3%k$N%/%i%$%"%s%H$,F0$+$J$/$J$C$F$7$^$C$F$$$?$N$r=$@5$7$^$7$?!#(B(Tatsuo) + <li>pgpool-II 2.2.2で入ってしまったバグを修正しました。(Tatsuo Ishii) + <p>フロントエンドがアボートするタイミングによっては、以後内部状態がリセットされず、 + 次のセッションでDMLやDDLがマスターノードのみ送られ、 + ノード間でデータの不一致が生じることがありました。</p> + </li><li>pgpool-II 2.2.3でバージョン2プロトコルのクライアントが動かなくなってしまっていたのを修正しました。(Tatsuo Ishii) <p> - $B$^$?!";~4V$N$+$+$k%/%(%j$rBT$C$F$$$k4V$K%U%m%s%H%(%s%I$,0[>o=*N;$7$?$3$H$r8!CN$9$k4V3V$r(B - 1$BIC$+$i(B30$BIC$KJQ99$7$^$7$?!#$3$N%A%'%C%/$O!"(B2.2.4$B$G$O%W%m%H%3%k%P!<%8%g%s$,(B3$B$N$H$-$N$_M-8z$G$9!#(B + また、時間のかかるクエリを待っている間にフロントエンドが異常終了したことを検知する間隔を + 1秒から30秒に変更しました。このチェックは、2.2.4ではプロトコルバージョンが3のときのみ有効です。 </p> - <li>$B;R%W%m%;%9$r5/F0$9$kA0$K%7%0%J%k$N%V%m%C%/$d%O%s%I%i$N@_Dj$r9T$J$&$h$&$K$7$^$7$?!#(B(Tatsuo) - <p>$B$3$l$O!"(Bpgpool-II$B$r5/F0$7$?D>8e$K%U%'%$%k%*!<%P$J$I$N;v>]$,H/@8$7$F(B - $B;R%W%m%;%9$+$i?F%W%m%;%9$K%7%0%J%k$,Aw$i$l$k$H!"(Bpgpool-II$B$N?F%W%m%;%9$,;`$s$G$7$^$&$3$H$,$"$k$+$i$G$9!#(B</p> -</ul> -</p> + </li><li>子プロセスを起動する前にシグナルのブロックやハンドラの設定を行なうようにしました。(Tatsuo Ishii) + <p>これは、pgpool-IIを起動した直後にフェイルオーバなどの事象が発生して + 子プロセスから親プロセスにシグナルが送られると、pgpool-IIの親プロセスが死んでしまうことがあるからです。</p> +</li></ul> +<p></p> <h2>2.2.3 (urukiboshi) 2009/8/11</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.2.2$B0JA0$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B +このバージョンでは、2.2.2以前の色々なバグが修正されています。 </p> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <ul> - <li>$B%P%C%/%(%s%I$K?7$7$$%3%M%/%7%g%s$rD%$k:]$K!"%P%C%/%(%s%I$N0l$D$,>c32$r5/$7$F$$$k%1!<%9$G!"(B - $B8e=hM}$NCf$G(Bpgpool-II$B$N;R%W%m%;%9$,Mn$A$k$3$H$,$"$k%P%0$r=$@5$7$^$7$?(B(Tatsuo) - <li>$B%Q%i%l%k%/%(%j$N%P%0$r=$@5$7$^$7$?(B(Yoshiharu Mori) - <li>$B3HD%%W%m%H%3%k$N>l9g$K$b%(%i!<%a%C%;!<%8$NCf$G:G8e$K;HMQ$7$?%/%(%j$,(B - $BI=<($G$-$k$h$&$K$J$j$^$7$?(B(Akio Ishida) - <li>kind mismatch error$B%a%C%;!<%8$N:n@.$G!"%a%C%;!<%8FbMF$,2u$l$k$3$H$,$"$k%P%0$r=$@5$7$^$7$?(B(Tatsuo, Akio Ishida) - <li>$B%P%C%/%(%s%I$X$N@\B35-=R;R$N;2>H%?%$%_%s%0$K$h$C$F$O(Bpgpool-II$B$N;R%W%m%;%9$,(B - $BMn$A$k$3$H$,$"$k%P%0$r=$@5$7$^$7$?(B(Tatsuo)$B!#(B - <li>pool_error$B$d(Bpool_log$B$N0z?t$,4V0c$C$F$$$?8D=j$r=$@5$7$^$7$?(B(Akio Ishida)$B!#(B - <li>statement_timeout$B$N%?%$%`%"%&%H$K$h$k%(%i!<=hM}$r2~NI$7$^$7$?!#(B(Tatsuo) + <li>バックエンドに新しいコネクションを張る際に、バックエンドの一つが障害を起しているケースで、 + 後処理の中でpgpool-IIの子プロセスが落ちることがあるバグを修正しました(Tatsuo Ishii) + </li><li>パラレルクエリのバグを修正しました(Yoshiharu Mori) + </li><li>拡張プロトコルの場合にもエラーメッセージの中で最後に使用したクエリが + 表示できるようになりました(Akio Ishida) + </li><li>kind mismatch errorメッセージの作成で、メッセージ内容が壊れることがあるバグを修正しました(Tatsuo Ishii, Akio Ishida) + </li><li>バックエンドへの接続記述子の参照タイミングによってはpgpool-IIの子プロセスが + 落ちることがあるバグを修正しました(Tatsuo Ishii)。 + </li><li>pool_errorやpool_logの引数が間違っていた個所を修正しました(Akio Ishida)。 + </li><li>statement_timeoutのタイムアウトによるエラー処理を改良しました。(Tatsuo Ishii) <p> - $B<B:]$K$O%?%$%`%"%&%H$^$G$K(Bstatement_timeout$B$G@_Dj$7$?;~4V$NG\$+$+$C$F$$$?$N$rD>$7$^$7$?!#(B - $B$^$?!"(Bmaster$B$@$1$,(Bstatement_timeout$B$rJV$7$?>l9g$K$bBP1~$G$-$k$h$&$K$7$^$7$?!#(B - $B0JA0$O(Bkind mismatch$B%(%i!<$K$J$C$F$$$^$7$?(B - (master$B0J30$,(Bstatement_timeout$B$rJV$5$J$$%1!<%9$G$O(Bkind mismatch$B%(%i!<$K$J$j$^$9(B)$B!#(B + 実際にはタイムアウトまでにstatement_timeoutで設定した時間の倍かかっていたのを直しました。 + また、masterだけがstatement_timeoutを返した場合にも対応できるようにしました。 + 以前はkind mismatchエラーになっていました + (master以外がstatement_timeoutを返さないケースではkind mismatchエラーになります)。 </p> - <li>health check$B$r$h$j6/2=$7!"(Bpostmaster$B$,(BSIGSTOP$B$G;_$C$F$7$^$C$F$$$k>l9g$b>c328!CN$G$-$k$h$&$K$7$^$7$?!#(B + </li><li>health checkをより強化し、postmasterがSIGSTOPで止ってしまっている場合も障害検知できるようにしました。 - <li>$B%P%C%/%(%s%I$K(BSQL$B$rEj$2!"$=$N1~Ez$rBT$C$F$$$k4V$K%/%i%$%"%s%H$,(Bpgpool$B$KBP$9$k%3%M%/%7%g%s$r(B - $B@ZCG$7$?$3$H$,8!=P$G$-$k$h$&$K$J$j$^$7$?!#(B(Tatsuo) - <p>$B$?$H$($P!"(BWeb$B%"%W%j%1!<%7%g%s$G$O(BDB$B$KBP$7$F%j%/%(%9%H$rEj$2$F!"(B - $B1~Ez$,$J$$$H%-%c%s%;%k$9$k$h$&$J$3$H$,IQHK$K5/$j$^$9!#(B - $B$3$N>l9g!":#$^$G$O(Bpgpool$B$d(BPostgreSQL$B$N%W%m%;%9$,;D$C$F$7$^$$!"F1;~@\B3?t$,8O3i$7$?$j!"(B - $B%m%C%/$r<h$C$?$^$^$N%H%i%s%6%/%7%g%s$,;D$k$J$I$7$F%7%9%F%`A4BN$K1F6A$rM?$($k$3$H$,$"$j$^$7$?!#(B</p> - <p>$B:#2s$N=$@5$K$h$j!"$3$&$7$?>u67$,8!=P$G$-$k$h$&$K$J$C$?$@$1$G$J$/!"(B - SQL$B$N1~EzBT$A$N4V$K%/%i%$%"%s%H$,%3%M%/%7%g%s$r@ZCG$7$?:]$K$O!"(B - SQL$B%3%^%s%I$N%-%c%s%;%k$r(Bpgpool$B$,9T$J$C$F!"%m%C%/BT$A$J$I$N%P%C%/%(%s%I%W%m%;%9$,;D$k$N$r(B - $BKI$0$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#(B</p> + </li><li>バックエンドにSQLを投げ、その応答を待っている間にクライアントがpgpoolに対するコネクションを + 切断したことが検出できるようになりました。(Tatsuo Ishii) + <p>たとえば、WebアプリケーションではDBに対してリクエストを投げて、 + 応答がないとキャンセルするようなことが頻繁に起ります。 + この場合、今まではpgpoolやPostgreSQLのプロセスが残ってしまい、同時接続数が枯渇したり、 + ロックを取ったままのトランザクションが残るなどしてシステム全体に影響を与えることがありました。</p> + <p>今回の修正により、こうした状況が検出できるようになっただけでなく、 + SQLの応答待ちの間にクライアントがコネクションを切断した際には、 + SQLコマンドのキャンセルをpgpoolが行なって、ロック待ちなどのバックエンドプロセスが残るのを + 防ぐことができるようになりました。</p> -<li>$B0z?t$J$7$N(BCLUSTER$B%3%^%s%I$O%H%i%s%6%/%7%g%s$NCf$G$O<B9T$G$-$J$$$N$G!"(B - $B<+F0%H%i%s%6%/%7%g%s$r%9%?!<%H$7$J$$$h$&$K$7$^$7$?(B(Tatsuo)$B!#(B +</li><li>引数なしのCLUSTERコマンドはトランザクションの中では実行できないので、 + 自動トランザクションをスタートしないようにしました(Tatsuo Ishii)。 -<li>$BJ#?t$N%W%j%Z%"%I%9%F!<%H%a%s%H$r;H$C$F$$$k:]$K!"%;%C%7%g%s$N=*$j$G(B - $B$=$N0lIt$@$1$,2rJ|$5$l$k%P%0$r=$@5$7$^$7$?(B(Akio Ishida)$B!#(B +</li><li>複数のプリペアドステートメントを使っている際に、セッションの終りで + その一部だけが解放されるバグを修正しました(Akio Ishida)。 -<li>sql/pgpool-recovery/pgpool-recovery.c$B$,(BPostgreSQL 8.4$B$G%3%s%Q%$%k$G$-$k$h$&$K$7$^$7$?(B(Tatsuo)$B!#(B +</li><li>sql/pgpool-recovery/pgpool-recovery.cがPostgreSQL 8.4でコンパイルできるようにしました(Tatsuo Ishii)。 -<li>$B3HD%%W%m%H%3%k$r;H$C$F$$$k>l9g$K!"%/%i%$%"%s%H$H(Bpgpool$B$N4V$G$*8_$$$K(B - $BBT$A>uBV$K$J$C$F$7$^$&$3$H$,$"$k%P%0$r=$@5$7$^$7$?(B(Gavin Sherry)$B!#(B +</li><li>拡張プロトコルを使っている場合に、クライアントとpgpoolの間でお互いに + 待ち状態になってしまうことがあるバグを修正しました(Gavin Sherry)。 -<li>COPY FROM$B$r<B9TCf$K%/%i%$%"%s%H$,=hM}$rCfCG$7$?>l9g$K!"%P%C%/%(%s%I%W%m%;%9$,(B - $B;D$C$F$7$^$&%P%0$r=$@5$7$^$7$?(B(Tatsuo)$B!#(B +</li><li>COPY FROMを実行中にクライアントが処理を中断した場合に、バックエンドプロセスが + 残ってしまうバグを修正しました(Tatsuo Ishii)。 -</ul> +</li></ul> <h2>2.2.2 (urukiboshi) 2009/5/5</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.2.1$B0JA0$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B -$B$H$j$o$1!"(Bpgpool$B$,%/%i%$%"%s%H$H$N4V$G%G!<%?$N$d$j<h$j$r$7$F$$$k:GCf$K!"(B -pgpool$B$N%/%i%$%"%s%H$,=*N;(B(X)$B%Q%1%C%H$r(Bpgpool$B$KAw?.$;$:$K=*N;$7$?>l9g$K5/$k2DG=@-$,$"$j$^$9!#(B -$B$3$N%P%0$O2a5n$N$9$Y$F$N(Bpgpool$B$KB8:_$7$F$$$^$9!#(B +このバージョンでは、2.2.1以前の色々なバグが修正されています。 +とりわけ、pgpoolがクライアントとの間でデータのやり取りをしている最中に、 +pgpoolのクライアントが終了(X)パケットをpgpoolに送信せずに終了した場合に起る可能性があります。 +このバグは過去のすべてのpgpoolに存在しています。 </p> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <ul> - <li>$B%U%m%s%H%(%s%I$K(Bpgpool$B$,%G!<%?$rAw?.$9$k:]$N%(%i!<$rL5;k$9$k$h$&$K$7$^$7$?!#(B(Tatsuo) - <p>$B$3$l$K$h$C$F!"%P%C%/%(%s%I$H$N4V$GI,MW$J=hM}$,CfCG$5$l$J$$$h$&$K$J$j!"(B - $B%P%C%/%(%s%I$N4V$G%G!<%?$N0l4S@-$,$J$/$J$kLdBj$,2sHr$5$l$k$h$&$K$J$j$^$7$?!#(B</p> + <li>フロントエンドにpgpoolがデータを送信する際のエラーを無視するようにしました。(Tatsuo Ishii) + <p>これによって、バックエンドとの間で必要な処理が中断されないようになり、 + バックエンドの間でデータの一貫性がなくなる問題が回避されるようになりました。</p> - <li>$B%^%9%?!<%9%l!<%V%b!<%I$K4X$9$k(B2.2.1$B$N=$@5$N:]$K@8$8$?%P%0$r=$@5$7$^$7$?!#(B - $B%W%j%Z%"%I%9%F!<%H%a%s%H$r;H$$2s$9$H%O%s%0%"%C%W$9$k2DG=@-$,$"$j$^$7$?(B(Toshihiro)$B!#(B + </li><li>マスタースレーブモードに関する2.2.1の修正の際に生じたバグを修正しました。 + プリペアドステートメントを使い回すとハングアップする可能性がありました(Toshihiro Kitagawa)。 - <li>SQL$B%3%^%s%I$N(BPREPARE$B$H%W%m%H%3%k%l%Y%k$N(BEXECUTE$B$,:.:_$9$k$H%P%C%/%(%s%I$,%/%i%C%7%e$9$k(B - $B%P%0$r=$@5$7$^$7$?!#$3$N%P%0$,!"(B2.2$B$G;}$A9~$^$l$?$b$N$G$9(B(Tatsuo)$B!#(B + </li><li>SQLコマンドのPREPAREとプロトコルレベルのEXECUTEが混在するとバックエンドがクラッシュする + バグを修正しました。このバグが、2.2で持ち込まれたものです(Tatsuo Ishii)。 - <li>$B%3%M%/%7%g%s$N%j%;%C%HMQ$NLd9g$o$;$r<B9TCf$K%(%i!<$,5/$-$?>l9g$K!"(B - PostgreSQL$B$N%m%0$K(B"unexpected EOF on client connection"$B$,5-O?$5$l$kLdBj$r=$@5$7$^$7$?(B(Tatsuo)$B!#(B -</ul> + </li><li>コネクションのリセット用の問合わせを実行中にエラーが起きた場合に、 + PostgreSQLのログに"unexpected EOF on client connection"が記録される問題を修正しました(Tatsuo Ishii)。 +</li></ul> <h2>2.2.1 (urukiboshi) 2009/4/25</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(B2.2$B$N?'!9$J%P%0$,=$@5$5$l$F$$$^$9!#(B +このバージョンでは、2.2の色々なバグが修正されています。 </p> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <ul> - <li>master/slave$B%b!<%I$G!"(BDEALLOCATE$B$,<:GT$9$k$3$H$,$"$kLdBj$r=$@5$7$^$7$?!#(B - $B$3$l$O!":G=i$N(BPREPARE$B$,(Bslave$B$G<B9T$5$l$J$$$3$H$K$h$k$b$N$G$9(B(Toshihiro) + <li>master/slaveモードで、DEALLOCATEが失敗することがある問題を修正しました。 + これは、最初のPREPAREがslaveで実行されないことによるものです(Toshihiro Kitagawa) - <li>pgpool.spec$B$J$I$r(B2.2$BBP1~$K$7$^$7$?(B(Devrim) + </li><li>pgpool.specなどを2.2対応にしました(Devrim) - <li>Version 2$B%W%m%H%3%k$G$O(Binsert_lock$B$,L5;k$5$l$k$h$&$K$7$^$7$?(B(Tatsuo) + </li><li>Version 2プロトコルではinsert_lockが無視されるようにしました(Tatsuo Ishii) - <li>$B%Q%i%a!<%?JQ99%a%C%;!<%8$,%P%C%/%(%s%I$+$iFO$/EY$K%m%0$,=PNO$5$l$k$N$r;_$a$^$7$?(B(Tatsuo) + </li><li>パラメータ変更メッセージがバックエンドから届く度にログが出力されるのを止めました(Tatsuo Ishii) - <li>$B%I%-%e%a%s%H$GDI2C$7K:$l$?%U%!%$%k$rEPO?$7$^$7$?(B(Tatsuo) -</ul> + </li><li>ドキュメントで追加し忘れたファイルを登録しました(Tatsuo Ishii) +</li></ul> <h2>2.2 (urukiboshi) 2009/2/28</h2> -<h3>$B35MW(B</h3> +<h3>概要</h3> <p> -$B$3$N%P!<%8%g%s$G$O!"(BSERIAL$B%G!<%?$N07$$$H%*%s%i%$%s%j%+%P%j$K2~NI$,9T$J$o$l$F$$$^$9!#(B -$B$^$?!"%H%i%s%6%/%7%g%sJ,N%%l%Y%k$,%7%j%"%i%$%6%V%k$N>l9g$K!"(BDB$B%N!<%I4V$G%G!<%?$N0l4S@-$,$J$/$J$k2DG=@-$,$"$kLdBj!"(B -$B%/%(%j$N%-%c%s%;%k$,$G$-$J$$LdBj$,=$@5$5$l$^$7$?!#(B +このバージョンでは、SERIALデータの扱いとオンラインリカバリに改良が行なわれています。 +また、トランザクション分離レベルがシリアライザブルの場合に、DBノード間でデータの一貫性がなくなる可能性がある問題、 +クエリのキャンセルができない問題が修正されました。 </p> -<h3>$B?75!G=(B</h3> +<h3>新機能</h3> <p> -<ul> -<li><a href="#INSERT_LOCK">insert_lock</a> $B$,M-8z$J>l9g!"(BSERIAL$B7?$r;}$D%F!<%V%k$@$1$,(B - $B%m%C%/$5$l$k$h$&$K$J$j$^$7$?(B(Tatsuo)$B!#(B -<li>$B@_Dj9`L\(B <a href="#CLIENT_IDLE_LIMIT_IN_RECOVERY">client_idle_limit_in_recovery</a> $B$,DI2C$5$l$^$7$?!#(B(Tatsuo) +</p><ul> +<li><a href="#INSERT_LOCK">insert_lock</a> が有効な場合、SERIAL型を持つテーブルだけが + ロックされるようになりました(Tatsuo Ishii)。 +</li><li>設定項目 <a href="#CLIENT_IDLE_LIMIT_IN_RECOVERY">client_idle_limit_in_recovery</a> が追加されました。(Tatsuo Ishii) <p> - $B%*%s%i%$%s%j%+%P%j$NBh(B2$B%9%F!<%8$G%/%i%$%"%s%H$,%"%$%I%k$N$^$^5o:B$k$3$H$K$h$C$F!"(B - $B%*%s%i%$%s%j%+%P%j$,?J9T$7$J$/$J$k$3$H$rKI$0$3$H$,$G$-$^$9!#(B + オンラインリカバリの第2ステージでクライアントがアイドルのまま居座ることによって、 + オンラインリカバリが進行しなくなることを防ぐことができます。 </p> -<li>$B@_Dj9`L\(B <a href="#PID_FILE_NAME">pid_file_name</a> $B$,DI2C$5$l$^$7$?!#(B(Tatsuo) +</li><li>設定項目 <a href="#PID_FILE_NAME">pid_file_name</a> が追加されました。(Tatsuo Ishii) <p> - $B$3$l$O!"(Bpgpool-II$B$N(Bpid$B%U%!%$%k$r;XDj$7$^$9!#(B - $B$3$l$K$h$j!"(B<a href="#LOGDIR">logdir</a> $B$O;HMQ$5$l$J$/$J$j$^$7$?!#(B + これは、pgpool-IIのpidファイルを指定します。 + これにより、<a href="#LOGDIR">logdir</a> は使用されなくなりました。 </p> -<li>DECLARE, FETCH, CLOSE$B$GIi2YJ,;6$5$l$k$h$&$K$J$j$^$7$?(B(Tatsuo)$B!#(B -<li>pcp$B%3%^%s%I$K%G%P%C%0%*%W%7%g%s(B(-d)$B$,DI2C$5$l$^$7$?(B(Jun Kuriyama)$B!#(B -<li>"kind mismatch"$B%(%i!<$N:]$K!"860x$H$J$C$?%/%(%j$rI=<($9$k$h$&$K$7$^$7$?(B(Tatsuo)$B!#(B -</ul> -</p> +</li><li>DECLARE, FETCH, CLOSEで負荷分散されるようになりました(Tatsuo Ishii)。 +</li><li>pcpコマンドにデバッグオプション(-d)が追加されました(Jun Kuriyama)。 +</li><li>"kind mismatch"エラーの際に、原因となったクエリを表示するようにしました(Tatsuo Ishii)。 +</li></ul> +<p></p> -<h3>$B8_49@-(B</h3> +<h3>互換性</h3> <ul> - <li>$B%U%'%$%k%*!<%P;~$KI,$:(Bpgpool$B$N;R%W%m%;%9$r:F5/F0$9$k$h$&$K$7$^$7$?!#(B(Tatsuo) + <li>フェイルオーバ時に必ずpgpoolの子プロセスを再起動するようにしました。(Tatsuo Ishii) <p> - $B$3$N7k2L!"%U%'%$%k%*!<%P;~$K$OI,$:(Bpgpool$B$X$N%;%C%7%g%s$,0lC<@Z$l$k$3$H$K$J$j$^$9!#(B - $B$3$&$7$J$$$H!"%M%C%H%o!<%/%1!<%V%kH4$1$J$I$N:]$K!"(B - TCP/IP$B$N%l%$%d$G:FAw$,9T$J$o$l!"D9$$;~4V$=$N$^$^$K$J$C$F$7$^$&$3$H$,(B - $B$"$k$+$i$G$9!#(B + この結果、フェイルオーバ時には必ずpgpoolへのセッションが一端切れることになります。 + こうしないと、ネットワークケーブル抜けなどの際に、 + TCP/IPのレイヤで再送が行なわれ、長い時間そのままになってしまうことが + あるからです。 </p> - <li>$B@_Dj9`L\(B <a href="#LOGDIR">logdir</a> $B$O;H$o$l$J$/$J$j$^$7$?!#(B - $BBe$j$K!"(B<a href="#PID_FILE_NAME">pid_file_name</a> $B$r;H$C$F$/$@$5$$(B(Tatsuo)$B!#(B + </li><li>設定項目 <a href="#LOGDIR">logdir</a> は使われなくなりました。 + 代りに、<a href="#PID_FILE_NAME">pid_file_name</a> を使ってください(Tatsuo Ishii)。 - <li><a href="#INSERT_LOCK">insert_lock</a> $B$N%G%U%)%k%HCM$,(Btrue$B$K$J$j$^$7$?(B(Tatsuo)$B!#(B -</ul> + </li><li><a href="#INSERT_LOCK">insert_lock</a> のデフォルト値がtrueになりました(Tatsuo Ishii)。 +</li></ul> -<h3>$B%P%0=$@5(B</h3> +<h3>バグ修正</h3> <ul> - <li> pgpool$B$,%G!<%b%s%b!<%I$G5/F0$5$l$k:]$K!"$9$Y$F$N%U%!%$%k%G%#%9%/%j%W%?$r(B - $BJD$8$k$h$&$K$7$^$7$?!#$3$&$7$J$$$H!"(BpgpoolAdmin$B$+$i5/F0$5$l$?:]$K(B - apache$B$N%=%1%C%H%U%!%$%k$r0z$-7Q$$$G$7$^$$!"(B80$BHV%]!<%H$,(B - $B@lM-$5$l$F$7$^$$$^$9(B(Akio Ishida)$B!#(B - <li> $B%H%i%s%6%/%7%g%s$r%7%j%"%i%$%:$G$-$J$$%(%i!<$,H/@8$7$?$H$-$K!"(B - $B$9$Y$F$N(BDB$B%N!<%I$N%H%i%s%6%/%7%g%s$r%"%\!<%H$9$k$h$&$K$7$^$7$?!#(B - $B$3$&$7$J$$$H!"(BDB$B%N!<%I$N4V$G%G!<%?$NIT@09g$,5/$-$k$3$H$,$"$j$^$9(B(Tatsuo)$B!#(B - $BNc$r<($7$^$9(B(M$B$O%^%9%?!"(BS$B$O%9%l!<%V$r<($7$^$9(B)$B!#(B -<pre> -M:S1:BEGIN; + <li> pgpoolがデーモンモードで起動される際に、すべてのファイルディスクリプタを + 閉じるようにしました。こうしないと、pgpoolAdminから起動された際に + apacheのソケットファイルを引き継いでしまい、80番ポートが + 専有されてしまいます(Akio Ishida)。 + </li><li> トランザクションをシリアライズできないエラーが発生したときに、 + すべてのDBノードのトランザクションをアボートするようにしました。 + こうしないと、DBノードの間でデータの不整合が起きることがあります(Tatsuo Ishii)。 + 例を示します(Mはマスタ、Sはスレーブを示します)。 +<pre>M:S1:BEGIN; M:S2:BEGIN; S:S1:BEGIN; S:S2:BEGIN; @@ -6136,13 +6940,12 @@ M:S2:ERROR: could not serialize access due to concurrent update S:S2:UPDATE t1 SET i = i + 1; &lt;-- success in UPDATE and data becomes inconsistent! </pre> - <li> raw$B%b!<%I$G(BMD5$BG'>Z$,;H$($k$h$&$K$7$^$7$?!#%I%-%e%a%s%H>e$G$O;H$($k$O$:$G$7$?(B(Tatsuo)$B!#(B + </li><li> rawモードでMD5認証が使えるようにしました。ドキュメント上では使えるはずでした(Tatsuo Ishii)。 - <li> "SET TRANSACTION ISOLATION LEVEL must be called before any query"$B$N(B - $B%(%i!<$,H/@8$7$?>l9g$K(B"kind mimatch"$B%(%i!<$K$J$k$3$H$rKI$0$h$&$K$7$^$7$?(B(Tatsuo)$B!#(B - $B0J2<$N%7%J%j%*$GLdBj$,H/@8$7$^$9!#(B -<pre> -M:S1:BEGIN; + </li><li> "SET TRANSACTION ISOLATION LEVEL must be called before any query"の + エラーが発生した場合に"kind mimatch"エラーになることを防ぐようにしました(Tatsuo Ishii)。 + 以下のシナリオで問題が発生します。 +<pre>M:S1:BEGIN; S:S1:BEGIN; M:S1:SELECT 1; &lt;-- only sent to MASTER M:S1:SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; @@ -6151,317 +6954,316 @@ M: &lt;-- error S: &lt;-- ok since no previous SELECT is sent. kind mismatch error occurs! </pre> -<li>FreeBSD$B$K$*$$$F!"(Bps$B$G$N(Bprocess status$B$NI=<($GM>7W$J%9%Z!<%9$,4^$^$l$F$7$^$&$N$r=$@5$7$^$7$?(B(Jun Kuriyama) +</li><li>FreeBSDにおいて、psでのprocess statusの表示で余計なスペースが含まれてしまうのを修正しました(Jun Kuriyama) -<li>BEGIN;$B$r(B2$BEYB3$1$k$H(Bkind mismatch error$B$,H/@8$9$k$N$r=$@5$7$^$7$?(B(Tatsuo) +</li><li>BEGIN;を2度続けるとkind mismatch errorが発生するのを修正しました(Tatsuo Ishii) -<li>PostgreSQL$B$,$?$/$5$s$N(BDEBUG$B%a%C%;!<%8$r=PNO$9$k>l9g$K!"8m$C$F%(%i!<$H8+$J$9%P%0$r=$@5$7$^$7$?(B(Tatsuo) +</li><li>PostgreSQLがたくさんのDEBUGメッセージを出力する場合に、誤ってエラーと見なすバグを修正しました(Tatsuo Ishii) -<li>$B%/%(%j$N%-%c%s%;%k$,F0$/$h$&$K$J$j$^$7$?(B(Tatsuo) +</li><li>クエリのキャンセルが動くようになりました(Tatsuo Ishii) -<li>$B%*%s%i%$%s%j%+%P%j$N8e%/%i%$%"%s%H$+$i$N@\B3$r<u$1IU$1$k%?%$%_%s%0$,Aa$9$.$k%P%0$r=$@5$7$^$7$?!#(B -$B$3$N%P%0$K$h$j!"%N!<%I%G!<%?$N4S@-$,J]$?$l$J$$2DG=@-$,$"$j$^$7$?(B(Tatsuo) +</li><li>オンラインリカバリの後クライアントからの接続を受け付けるタイミングが早すぎるバグを修正しました。 +このバグにより、ノードデータの貫性が保たれない可能性がありました(Tatsuo Ishii) -<li>SELECT, INSERT, UPDATE, DELETE$B0J30$N%3%^%s%I$G$b(B - $BI,MW$J$i$P%H%i%s%6%/%7%g%s%V%m%C%/$NFbB&$G<B9T$9$k$h$&$K$7$^$7$?!#(B - $B$3$l$K$h$j!"%(%i!<H/@8$N:]$K%m!<%k%P%C%/$7$F%N!<%I$N@09g@-$rJ]$D$3$H$,$G$-$^$9(B(Tatsuo) +</li><li>SELECT, INSERT, UPDATE, DELETE以外のコマンドでも + 必要ならばトランザクションブロックの内側で実行するようにしました。 + これにより、エラー発生の際にロールバックしてノードの整合性を保つことができます(Tatsuo Ishii) -<li>$B%*%s%i%$%s%j%+%P%j8e!"(Bpgpool-II$B$N;R%W%m%;%9$,%/%i%C%7%e$9$k$3$H$,$"$k%P%0$r=$@5$7$^$7$?!#(B(Tatsuo) - <p>$B$3$l$O!"%*%s%i%$%s%j%+%P%j$N8e!"?7$7$/%"%?%C%A$5$l$?%N!<%I$K@\B3$,$J$$$N$K!"(B - $B$=$N%N!<%I$K;R%W%m%;%9$,=*N;;~$K=*N;%a%C%;!<%8$r%P%C%/%(%s%I$KAw?.$7$h$&$H$7$F5/$C$F$$$^$7$?!#(B</p> +</li><li>オンラインリカバリ後、pgpool-IIの子プロセスがクラッシュすることがあるバグを修正しました。(Tatsuo Ishii) + <p>これは、オンラインリカバリの後、新しくアタッチされたノードに接続がないのに、 + そのノードに子プロセスが終了時に終了メッセージをバックエンドに送信しようとして起っていました。</p> -<li>PostgreSQL$B$,(Bpostgresql.conf$B$r:FFI$_9~$_$7$?:]$K(Bpgpool$B$,%(%i!<$r8!=P$7$F$7$^$&%P%0$r=$@5$7$^$7$?!#(B(Tatsuo) - <p>$B$3$l$O!"(BPostgreSQL$B$,!J$?$V$s!K%I%-%e%a%s%H$K=q$+$l$F$$$J$$%?%$%_%s%0$G(B - $B!V%Q%i%a!<%?JQ99!W%Q%1%C%H$rAw?.$7$F$/$k$?$a$K5/$j!"=$@5$O$=$N$3$H$KBP1~$7$?$b$N$G$9!#(B</p> +</li><li>PostgreSQLがpostgresql.confを再読み込みした際にpgpoolがエラーを検出してしまうバグを修正しました。(Tatsuo Ishii) + <p>これは、PostgreSQLが(たぶん)ドキュメントに書かれていないタイミングで + 「パラメータ変更」パケットを送信してくるために起り、修正はそのことに対応したものです。</p> -</ul> +</li></ul> <h2>2.1 (inamiboshi) 2008/7/25</h2> -<h3>$B?75!G=(B</h3> +<h3>新機能</h3> <ul> - <li><a href="#FAILOVER_COMMAND">failover_command</a> $B$H(B - <a href="#FAILBACK_COMMAND">failback_command</a> $B$K!"?7$7$$%^%9%?%N!<%I(B ID - $B$rI=$9(B '%m' $B$r%5%]!<%H$7$^$7$?!#(B(Yoshiyuki) - <li><a href="#FAILOVER_COMMAND">failover_command</a> $B$H(B - <a href="#FAILBACK_COMMAND">failback_command</a> $B$K!"8E$$%^%9%?%N!<%I(B ID $B$r(B - $BI=$9(B '%M' $B$r%5%]!<%H$7$^$7$?!#(B(Yoshiyuki) - <li>$B%j%+%P%j$N%?%$%`%"%&%H;~4V$r;XDj$9$k(B <a href="#RECOVERY_TIMEOUT">recovery_timeout</a> - $B%Q%i%a!<%?$rDI2C$7$^$7$?!#(B(Taiki) - <li> pg_md5 $B%3%^%s%I$K(B -p $B%*%W%7%g%s$rDI2C$7$^$7$?!#(B(Volkan Yazici, - Taiki) - <li> pgpool -v $B$r<B9T$9$k$H%P!<%8%g%sHV9f$rI=<($7!"=*N;$9$k$h$&$K$7(B - $B$^$7$?!#(B(Yoshiyuki) -</ul> - -<h3>$B8_49@-(B</h3> + <li><a href="#FAILOVER_COMMAND">failover_command</a> と + <a href="#FAILBACK_COMMAND">failback_command</a> に、新しいマスタノード ID + を表す '%m' をサポートしました。(Yoshiyuki Asaba) + </li><li><a href="#FAILOVER_COMMAND">failover_command</a> と + <a href="#FAILBACK_COMMAND">failback_command</a> に、古いマスタノード ID を + 表す '%M' をサポートしました。(Yoshiyuki Asaba) + </li><li>リカバリのタイムアウト時間を指定する <a href="#RECOVERY_TIMEOUT">recovery_timeout</a> + パラメータを追加しました。(Taiki Yamaguchi) + </li><li> pg_md5 コマンドに -p オプションを追加しました。(Volkan Yazici, + Taiki Yanaguchi) + </li><li> pgpool -v を実行するとバージョン番号を表示し、終了するようにし + ました。(Yoshiyuki Asaba) +</li></ul> + +<h3>互換性</h3> <ul> - <li><a href="#pgpool_recovery">pgpool_recovery</a> $B$H(B - <a href="#pgpool_remote_start">pgpool_remote_start</a> $B4X?t$O%9!<%Q!<%f!<%6$N$_(B - $B<B9T$G$-$k$h$&$K8"8B%A%'%C%/$r6/2=$7$^$7$?!#(B(Yoshiyuki) - <li> raw $B%b!<%I$G%9%?%s%P%$%N!<%I$K$O%3%M%/%7%g%s%W!<%k$r:n@.$7$J$$$h$&$K$7$^$7$?!#(B(Yoshiyuki) - <li> replication_timeout $B%Q%i%a!<%?$r:o=|$7$^$7$?!#(B(Yoshiyuki) - <li> PCP $B%/%i%$%"%s%H%3%^%s%I$N%?%$%`%"%&%H$rL58z$K$7$^$7$?!#(B(Taiki) - <li> replicate_select = false $B$N>l9g$K!"(BCOPY TO STDOUT $B$r%l%W%j%1!<(B - $B%7%g%s$5$;$J$$$h$&$K$7$^$7$?!#(B(Yoshiyuki) -</ul> - -<h3>$B=$@5(B</h3> -<h4> $BA4HL(B </h4> + <li><a href="#pgpool_recovery">pgpool_recovery</a> と + <a href="#pgpool_remote_start">pgpool_remote_start</a> 関数はスーパーユーザのみ + 実行できるように権限チェックを強化しました。(Yoshiyuki Asaba) + </li><li> raw モードでスタンバイノードにはコネクションプールを作成しないようにしました。(Yoshiyuki Asaba) + </li><li> replication_timeout パラメータを削除しました。(Yoshiyuki Asaba) + </li><li> PCP クライアントコマンドのタイムアウトを無効にしました。(Taiki Yamaguchi) + </li><li> replicate_select = false の場合に、COPY TO STDOUT をレプリケー + ションさせないようにしました。(Yoshiyuki Asaba) +</li></ul> + +<h3>修正</h3> +<h4> 全般 </h4> <ul> - <li> CloseComplete $B%a%C%;!<%8$r<u$1$H$k$H%/%i%C%7%e$9$kIT6q9g$r=$@5(B - $B$7$^$7$?!#(B(Yoshiyuki) - <li> $B%a%C%;!<%8E>Aw=hM}$r8zN($h$/$7$^$7$?!#(B(Yoshiyuki) - <li> Solaris 10 $B$G%3%s%Q%$%k$G$-$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) - <li> $B%X%k%9%A%'%C%/$H%j%+%P%j$N%m%0=PNO$r2~NI$7$^$7$?!#(B(Tatsuo) - <li> $BMM!9$J%a%b%j%j!<%/$r=$@5$7$^$7$?!#(B(Yoshiyuki) - <li> "failed to read kind from frontend" $B$H$$$&%(%i!<%a%C%;!<%8$r(B - ERROR$B%l%Y%k$+$i(B LOG $B%l%Y%k$K2<$2$^$7$?!#(B(Yoshiyuki) - <li> raw $B%b!<%I$G%U%'%$%k%*!<%P$K<:GT$9$kIT6q9g$r=$@5$7$^$7$?!#(B - (Taiki) - <li> $BIT@5$J%N!<%I$rDI2C!&@Z$jN%$7$r9T$&$H%>%s%S%W%m%;%9$,H/@8$9$kIT(B - $B6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) - <li> <a href="#HEALTH_CHECK_TIMEOUT">health_check_timeout</a> $B$,@5$7$/F0:n$7$J$$IT6q9g$r=$@5$7$^$7$?!#(B + <li> CloseComplete メッセージを受けとるとクラッシュする不具合を修正 + しました。(Yoshiyuki Asaba) + </li><li> メッセージ転送処理を効率よくしました。(Yoshiyuki Asaba) + </li><li> Solaris 10 でコンパイルできるようにしました。(Yoshiyuki Asaba) + </li><li> ヘルスチェックとリカバリのログ出力を改良しました。(Tatsuo Ishii) + </li><li> 様々なメモリリークを修正しました。(Yoshiyuki Asaba) + </li><li> "failed to read kind from frontend" というエラーメッセージを + ERRORレベルから LOG レベルに下げました。(Yoshiyuki Asaba) + </li><li> raw モードでフェイルオーバに失敗する不具合を修正しました。 + (Taiki Yamaguchi) + </li><li> 不正なノードを追加・切り離しを行うとゾンビプロセスが発生する不 + 具合を修正しました。(Yoshiyuki Asaba) + </li><li> <a href="#HEALTH_CHECK_TIMEOUT">health_check_timeout</a> が正しく動作しない不具合を修正しました。 (Kenichi Sawada) - <li> FreeBSD $B$G(B ps $B%3%^%s%I$N=PNO$,@5$7$/$J$$IT6q9g$r=$@5$7$^$7$?!#(B + </li><li> FreeBSD で ps コマンドの出力が正しくない不具合を修正しました。 (ISHIDA Akio) - <li> Unix domain $B%=%1%C%H$,;D$C$F$$$k>l9g$N%(%i!<%a%C%;!<%8$r6/2=$7(B - $B$^$7$?!#(B(Jun Kuriyama) - <li> $BG'>Z$K<:GT$7$?>l9g$N%(%i!<%a%C%;!<%8$r6/2=$7$^$7$?!#(B(Tatsuo) -</ul> + </li><li> Unix domain ソケットが残っている場合のエラーメッセージを強化し + ました。(Jun Kuriyama) + </li><li> 認証に失敗した場合のエラーメッセージを強化しました。(Tatsuo Ishii) +</li></ul> -<h4>$B%l%W%j%1!<%7%g%s(B</h4> +<h4>レプリケーション</h4> <ul> - <li> <a href="#REPLICATE_SELECT">replicate_select</a> $B$r@_Dj$7$F$b!">o$K(B false $B$N5sF0$K$J$kIT6q9g$r(B - $B=$@5$7$^$7$?!#(B(Tatsuo) - <li> $B3HD%Ld$$9g$o$;%W%m%H%3%k$r;H$C$F$$$k$H!"%H%i%s%6%/%7%g%s$r8m$C$F%m!<(B - $B%k%P%C%/$7$F$7$^$&IT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) - <li> $BHsF14|%/%(%j$r;H$C$F$$$k$H(B pgpool $B$,IT0BDj$K$J$kIT6q9g$r=$@5$7(B - $B$^$7$?!#(B(Yoshiyuki) - <li> $B3HD%Ld9g$;%W%m%H%3%k$r;H$&$H(B /* REPLICATION */$B$J$I$N%R%s%H6g$,>C$($F(B - $B$7$^$&IT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) - <li> DEALLOCATE ALL $B$r<B9T$9$k$H%/%i%C%7%e$9$kIT6q9g$r=$@5$7$^$7$?!#(B - (Yoshiyuki) - <li> immediate shutdown $B$9$k$H%O%s%0%"%C%W$9$kIT6q9g$r=$@5$7$^$7$?!#(B - (Yoshiyuki) - <li> $B9bIi2Y;~$K%*%s%i%$%s%j%+%P%j$r<B;\$9$k$H!"%j%+%P%j%W%m%;%9$,%O(B - $B%s%0%"%C%W$9$k2DG=@-$N$"$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) - <li> $B3HD%Ld9g$;%W%m%H%3%k$r;H$C$F(B SELECT $B$r<B9T$7$?:]$K!"%H%i%s%6%/(B - $B%7%g%s%V%m%C%/Fb$G%/%(%j$,%(%i!<$K$J$k$H!"(Bpgpool $B$,%O%s%0%"%C%W$9$k(B - $B2DG=@-$N$"$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) -</ul> - -<h4>$B%^%9%?!<%9%l!<%V(B</h4> + <li> <a href="#REPLICATE_SELECT">replicate_select</a> を設定しても、常に false の挙動になる不具合を + 修正しました。(Tatsuo Ishii) + </li><li> 拡張問い合わせプロトコルを使っていると、トランザクションを誤ってロー + ルバックしてしまう不具合を修正しました。(Yoshiyuki Asaba) + </li><li> 非同期クエリを使っていると pgpool が不安定になる不具合を修正し + ました。(Yoshiyuki Asaba) + </li><li> 拡張問合せプロトコルを使うと /* REPLICATION */などのヒント句が消えて + しまう不具合を修正しました。(Yoshiyuki Asaba) + </li><li> DEALLOCATE ALL を実行するとクラッシュする不具合を修正しました。 + (Yoshiyuki Asaba) + </li><li> immediate shutdown するとハングアップする不具合を修正しました。 + (Yoshiyuki Asaba) + </li><li> 高負荷時にオンラインリカバリを実施すると、リカバリプロセスがハ + ングアップする可能性のある不具合を修正しました。(Yoshiyuki Asaba) + </li><li> 拡張問合せプロトコルを使って SELECT を実行した際に、トランザク + ションブロック内でクエリがエラーになると、pgpool がハングアップする + 可能性のある不具合を修正しました。(Yoshiyuki Asaba) +</li></ul> + +<h4>マスタースレーブ</h4> <ul> - <li> $B%H%i%s%6%/%7%g%s%V%m%C%/Fb$G!"(BSET, PREPARE, DEALLOCATE $B$r<B9T$9(B - $B$k$H!"%W%m%;%9$,%@%&%s$9$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) - <li> $B%^%9%?!<%9%l!<%V%b!<%I$G%m!<%I%P%i%s%9$,@5$7$/F0:n$7$F$$$J$$IT(B - $B6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) -</ul> + <li> トランザクションブロック内で、SET, PREPARE, DEALLOCATE を実行す + ると、プロセスがダウンする不具合を修正しました。(Yoshiyuki Asaba) + </li><li> マスタースレーブモードでロードバランスが正しく動作していない不 + 具合を修正しました。(Yoshiyuki Asaba) +</li></ul> -<h4>$B%Q%i%l%k%/%(%j(B</h4> +<h4>パラレルクエリ</h4> <ul> - <li> INSERT $B$K<:GT$9$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiharu) - <li> FROM $B6g$K(B AS $B$,4^$^$l$k$H9=J8%(%i!<$K$J$kIT6q9g$r=$@5$7$^$7$?!#(B(sho) - <li> $B%/%(%j$rJ#?t2s<B9T$9$k$H%O%s%0%"%C%W$9$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiharu) - <li> JOIN $B$K<:GT$9$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiharu) - <li> DISTINCT$B9=J8(B $B$N2r@O$K<:GT$9$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiharu) -</ul> + <li> INSERT に失敗する不具合を修正しました。(Yoshiharu Mori) + </li><li> FROM 句に AS が含まれると構文エラーになる不具合を修正しました。(sho) + </li><li> クエリを複数回実行するとハングアップする不具合を修正しました。(Yoshiharu Mori) + </li><li> JOIN に失敗する不具合を修正しました。(Yoshiharu Mori) + </li><li> DISTINCT構文 の解析に失敗する不具合を修正しました。(Yoshiharu Mori) +</li></ul> <hr> <h2>2.0.1 (hikitsuboshi) 2007/11/21</h2> <ul> - <li> UPDATE $B$b$7$/$O(B DELETE $B$r<B9T$9$k$H%W%m%;%9$,%@%&%s$9$kIT6q9g$r(B - $B=$@5$7$^$7$?!#(B(Yoshiyuki) - <li> <a href="#MASTER_SLAVE_MODE">master_slave</a> $B$r(B true $B$K@_Dj$7$F$$$k>l9g$K!"(BSQL $B9=J8%(%i!<$r8!CN(B - $B$7$?;~$K%^%9%?$K$N$_$=$N%/%(%j$rAw?.$9$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) -</ul> + <li> UPDATE もしくは DELETE を実行するとプロセスがダウンする不具合を + 修正しました。(Yoshiyuki Asaba) + </li><li> <a href="#MASTER_SLAVE_MODE">master_slave</a> を true に設定している場合に、SQL 構文エラーを検知 + した時にマスタにのみそのクエリを送信するようにしました。(Yoshiyuki Asaba) +</li></ul> <hr> <h2>2.0 (hikitsuboshi) 2007/11/16</h2> -<h3>$B8_49@-(B</h3> +<h3>互換性</h3> <ul> - <li> <a href="#IGNORE_LEADING_WHITE_SPACE">ignore_leading_white_space</a> $B$N%G%U%)%k%HCM$r(B true $B$K$7$^$7$?!#(B - (Yoshiyuki) - <li> replicate_strict $B$rGQ;_$7$^$7$?!#>o$K(B replicate_strict $B$,(B true - $B$N5sF0$K$J$j$^$9!#(B(Yoshiyuki) -</ul> + <li> <a href="#IGNORE_LEADING_WHITE_SPACE">ignore_leading_white_space</a> のデフォルト値を true にしました。 + (Yoshiyuki Asaba) + </li><li> replicate_strict を廃止しました。常に replicate_strict が true + の挙動になります。(Yoshiyuki Asaba) +</li></ul> -<h3>$BA4HL(B</h3> +<h3>全般</h3> <ul> - <li> pgpool.conf $B$r%j%m!<%I$G$-$k$h$&$K$7$^$7$?!#%j%m!<%I;~$KJ,;6%k!<%k$bF1;~$K%j%m!<%I$7$^$9!#(B(Yoshiyuki) - <li> SQL $B%Q!<%5$r(B PostgreSQL 8.3 $B$KBP1~$7$^$7$?!#(B(Yoshiyuki) - <li> $B%N!<%I$r@Z$jN%$7$?:]$K%f!<%6$,@_Dj$7$?%3%^%s%I$r<B9T$G$-$k$h$&(B - $B$K!"(Bpgpool.conf $B$K(B <a href="#FAILOVER_COMMAND">failover_command</a> $B$H$$$&%Q%i%a!<%?$rDI2C$7$^$7$?!#(B - (Yoshiyuki) - <li> $B%N!<%I$rI|5"$7$?:]$K%f!<%6$,@_Dj$7$?%3%^%s%I$r<B9T$G$-$k$h$&$K!"(B - pgpool.conf $B$K(B <a href="#FAILBACK_COMMAND">failback_command</a> $B$H$$$&%Q%i%a!<%?$rDI2C$7$^$7$?!#(B - (Yoshiyuki) - <li> pgpool.conf $B$K(B <a href="#CLIENT_IDLE_LIMIT">client_idle_limit</a> $B$H$$$&%Q%i%a!<%?$rDI2C$7$^$7$?!#(B - $B$3$N%Q%i%a!<%?$G$O%/%i%$%"%s%H$+$i$N%/%(%j$N:GBgBT$A;~4V$r@_Dj$9$k$3$H$,$G$-$^$9!#(B(Tatsuo) -</ul> - -<h3>$B%l%W%j%1!<%7%g%s(B</h3> + <li> pgpool.conf をリロードできるようにしました。リロード時に分散ルールも同時にリロードします。(Yoshiyuki Asaba) + </li><li> SQL パーサを PostgreSQL 8.3 に対応しました。(Yoshiyuki Asaba) + </li><li> ノードを切り離した際にユーザが設定したコマンドを実行できるよう + に、pgpool.conf に <a href="#FAILOVER_COMMAND">failover_command</a> というパラメータを追加しました。 + (Yoshiyuki Asaba) + </li><li> ノードを復帰した際にユーザが設定したコマンドを実行できるように、 + pgpool.conf に <a href="#FAILBACK_COMMAND">failback_command</a> というパラメータを追加しました。 + (Yoshiyuki Asaba) + </li><li> pgpool.conf に <a href="#CLIENT_IDLE_LIMIT">client_idle_limit</a> というパラメータを追加しました。 + このパラメータではクライアントからのクエリの最大待ち時間を設定することができます。(Tatsuo Ishii) +</li></ul> + +<h3>レプリケーション</h3> <ul> - <li> $B%H%i%s%6%/%7%g%s%V%m%C%/$K0O$^$l$F$$$J$$%/%(%j$r%l%W%j%1!<%7%g%s$5$;$k>l9g!"(B - $BFbItE*$K%H%i%s%6%/%7%g%s$r3+;O$5$;$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) - <li> $B%l%W%j%1!<%7%g%s$r9bB.2=$5$;$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) - <li> $B%N!<%I$r:FF14|$5$;$FI|5"$5$;$k!"%*%s%i%$%s%j%+%P%j5!G=$r<BAu$7(B - $B$^$7$?!#(B(Yoshiyuki) - <li> INSERT, UPDATE, DELETE $B$7$?9T?t$,$9$Y$F0lCW$7$J$+$C$?>l9g$K!"(B - $B%H%i%s%6%/%7%g%s$r%"%\!<%H$5$;$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) -<pre> -x=# update t set a = a + 1; + <li> トランザクションブロックに囲まれていないクエリをレプリケーションさせる場合、 + 内部的にトランザクションを開始させるようにしました。(Yoshiyuki Asaba) + </li><li> レプリケーションを高速化させるようにしました。(Yoshiyuki Asaba) + </li><li> ノードを再同期させて復帰させる、オンラインリカバリ機能を実装し + ました。(Yoshiyuki Asaba) + </li><li> INSERT, UPDATE, DELETE した行数がすべて一致しなかった場合に、 + トランザクションをアボートさせるようにしました。(Yoshiyuki Asaba) +<pre>x=# update t set a = a + 1; ERROR: pgpool detected difference of the number of update tuples HINT: check data consistency between master and other db node </pre> - <li> $BJ#?t$N%P%C%/%(%s%I$+$i0[$J$k7k2L$,JV$C$F$-$?>l9g$K!"F1$87k2L$,(B - $BB??tJV$C$F$-$?7k2L$r?.Mj$9$kB??t7hJ}<0$r<BAu$7$^$7$?!#(B(Yoshiyuki) - <li> V2 $BLd9g$;%W%m%H%3%k$G%m!<%I%P%i%s%9$G$-$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) -</ul> + </li><li> 複数のバックエンドから異なる結果が返ってきた場合に、同じ結果が + 多数返ってきた結果を信頼する多数決方式を実装しました。(Yoshiyuki Asaba) + </li><li> V2 問合せプロトコルでロードバランスできるようにしました。(Yoshiyuki Asaba) +</li></ul> -<h3>$B%Q%i%l%k%/%(%j(B</h3> +<h3>パラレルクエリ</h3> <ul> - <li> $B%Q%i%l%k%b!<%I$GItJ,%l%W%j%1!<%7%g%s$r%5%]!<%H$7$^$7$?!#(B(Yoshiharu) -</ul> + <li> パラレルモードで部分レプリケーションをサポートしました。(Yoshiharu Mori) +</li></ul> <hr> <h2>1.3 (sohiboshi) 2007/10/23</h2> <ul> - <li> $B?7$7$/(B <a href="AUTHENTICATION_TIMEOUT">authentication_timeout</a> $B$H$$$&(B - $B%Q%i%a!<%?$rDI2C$7$^$7$?!#(B(Yoshiyuki) + <li> 新しく <a href="AUTHENTICATION_TIMEOUT">authentication_timeout</a> という + パラメータを追加しました。(Yoshiyuki Asaba) <ul> - <li>$B$3$N%Q%i%a!<%?$G$OG'>Z;~4V$N%?%$%`%"%&%H$r@_Dj$7$^$9!#(B - <li>$B%G%U%)%k%HCM$O(B 60 (1 $BJ,(B)$B$G$9!#(B - </ul> - <li> $B%9%?!<%H%"%C%W%Q%1%C%H$ND9$5$,(B 10000 $B%P%$%H1[$($F$$$k>l9g$K$O!"@\B3$r@ZCG$9$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) - <li> DEALLOCATE $B$r<B9T$9$k$H$^$l$KIT@5$J%a%b%j%"%/%;%9$,H/@8$9$kIT6q(B - $B9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) - <li> $B%H%i%s%6%/%7%g%sFb$G(B SELECT $B$r<B9T$7$?8e$K(B SELECT $B$r@5$7$/%m!<%I%P%i(B - $B%s%9$G$-$J$$IT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) + <li>このパラメータでは認証時間のタイムアウトを設定します。 + </li><li>デフォルト値は 60 (1 分)です。 + </li></ul> + </li><li> スタートアップパケットの長さが 10000 バイト越えている場合には、接続を切断するようにしました。(Yoshiyuki Asaba) + </li><li> DEALLOCATE を実行するとまれに不正なメモリアクセスが発生する不具 + 合を修正しました。(Yoshiyuki Asaba) + </li><li> トランザクション内で SELECT を実行した後に SELECT を正しくロードバラ + ンスできない不具合を修正しました。(Yoshiyuki Asaba) <ul> - <li> $B$3$NIT6q9g$O(B 1.2 $B$G:.F~$7$?IT6q9g$G$9!#(B - </ul> - <li> 64bit $B4D6-$G%/%(%j%-%c%C%7%e5!G=$rM-8z$K$9$k$H!"%/%i%C%7%e$9$k2DG=@-$N$"$kIT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) -</ul> + <li> この不具合は 1.2 で混入した不具合です。 + </li></ul> + </li><li> 64bit 環境でクエリキャッシュ機能を有効にすると、クラッシュする可能性のある不具合を修正しました(Yoshiyuki Asaba) +</li></ul> <hr> <h2>1.2.1 (tomoboshi) 2007/09/28</h2> <ul> - <li> $B3HD%Ld9g$;%W%m%H%3%k$N(B Parse $B%a%C%;!<%8$N=hM}$G%G%C%I%m%C%/$,H/(B - $B@8$9$k2DG=@-$,$"$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) + <li> 拡張問合せプロトコルの Parse メッセージの処理でデッドロックが発 + 生する可能性がある不具合を修正しました。(Yoshiyuki Asaba) - <li> Prepared statement $B$r4IM}$9$kNN0h$,%a%b%j%j!<%/$7$F$$$kIT6q9g$r(B - $B=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> Prepared statement を管理する領域がメモリリークしている不具合を + 修正しました。(Yoshiyuki Asaba) - <li> $B0lIt$N(B OS $B$G%3%s%Q%$%k%(%i!<$K$J$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> 一部の OS でコンパイルエラーになる不具合を修正しました。(Yoshiyuki Asaba) - <li>master/slave $B%b!<%IFb$G(B SET, PREPARE, DEALLOCATE $BJ8$r%l%W%j%1!<%7%g%s$5$;$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) -</ul> + </li><li>master/slave モード内で SET, PREPARE, DEALLOCATE 文をレプリケーションさせるようにしました。(Yoshiyuki Asaba) +</li></ul> <hr> <h2>1.2 (tomoboshi) 2007/08/01</h2> <ul> - <li> pgpool.conf $B$K(B <a href="#REPLICATE_SELECT">replicate_select</a> $B$H$$$&?75,%Q%i%a!<%?$rDI2C$7$^(B - $B$7$?!#%G%U%)%k%HCM$O(B false $B$G$9!#(B(Yoshiyuki) + <li> pgpool.conf に <a href="#REPLICATE_SELECT">replicate_select</a> という新規パラメータを追加しま + した。デフォルト値は false です。(Yoshiyuki Asaba) <ul> - <li> true $B$K@_Dj$7$?>l9g$O!"%m!<%I%P%i%s%9$5$l$J$$(B SELECT $BJ8$r%l%W%j%1!<%7%g%s$7$^$9(B - (pgpool-II 1.0 $B$N5sF0(B)$B!#(Bfalse $B$N>l9g$O%^%9%?$K$N$_(B SELECT $B$rAw?.$7$^$9!#(B - </ul> + <li> true に設定した場合は、ロードバランスされない SELECT 文をレプリケーションします + (pgpool-II 1.0 の挙動)。false の場合はマスタにのみ SELECT を送信します。 + </li></ul> - <li> $B%7%0%J%k=hM}$r0BA4$K9T$&$h$&$K$7$^$7$?!#(B(Yoshiyuki) + </li><li> シグナル処理を安全に行うようにしました。(Yoshiyuki Asaba) <ul> - <li>$B$^$l$K%>%s%S%W%m%;%9$,;D$C$F$7$^$C$?$j!"IT0BDj$K$J$k$3$H$,$"$j$^$7$?!#(B - </ul> + <li>まれにゾンビプロセスが残ってしまったり、不安定になることがありました。 + </li></ul> - <li> $B%H%i%s%6%/%7%g%sCf$K(B SELECT $BJ8$,%(%i!<$K$J$k$H!"%O%s%0%"%C%W$7$F$7$^$&IT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> トランザクション中に SELECT 文がエラーになると、ハングアップしてしまう不具合を修正しました。(Yoshiyuki Asaba) <ul> - <li> $B$3$NIT6q9g$O(B 1.1 $B$KF~$C$?IT6q9g$G$9!#(B - </ul> + <li> この不具合は 1.1 に入った不具合です。 + </li></ul> - <li> PREPARE/EXECUTE $B$,(B master/slave $B%b!<%I$G@5$7$/F0:n$7$J$$IT6q9g(B - $B$r=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> PREPARE/EXECUTE が master/slave モードで正しく動作しない不具合 + を修正しました。(Yoshiyuki Asaba) - <li> $B%G%C%I%m%C%/$r8!CN$9$k$H!"(Bkind mismatch error $B$,H/@8$9$kIT6q9g(B - $B$r=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> デッドロックを検知すると、kind mismatch error が発生する不具合 + を修正しました。(Yoshiyuki Asaba) - <li> $B3HD%Ld$$9g$o$;%W%m%H%3%k$r;H$C$?%I%i%$%P$r;HMQ$7$?>l9g$K!"(B - $B9=J82r@O;~$K7Y9p$,H/@8$9$k(B SQL $BJ8$r<B9T$9$k$H%O%s%0%"%C%W$b$7$/$O(B - $B%W%m%;%9$,%/%i%C%7%e$9$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> 拡張問い合わせプロトコルを使ったドライバを使用した場合に、 + 構文解析時に警告が発生する SQL 文を実行するとハングアップもしくは + プロセスがクラッシュする不具合を修正しました。(Yoshiyuki Asaba) - <li> $B%3%M%/%7%g%s%-%c%C%7%e$,0lGU$K$J$k$H%a%b%j%j!<%/$,H/@8$9$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> コネクションキャッシュが一杯になるとメモリリークが発生する不具合を修正しました。(Yoshiyuki Asaba) - <li> $B%;%C%7%g%s$,;D$C$?>uBV$G(B PostgreSQL $B$r(B fast shutdown $B$b$7$/$O(B - immediate shutdown $B$9$k$H!";D$C$?%;%C%7%g%s$,%O%s%0%"%C%W$9$kIT6q9g(B - $B$r=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> セッションが残った状態で PostgreSQL を fast shutdown もしくは + immediate shutdown すると、残ったセッションがハングアップする不具合 + を修正しました。(Yoshiyuki Asaba) - <li> $B%m!<%I%P%i%s%9@h$r@\B33+;O;~$K7hDj$7!"F1$8%;%C%7%g%sFb$G$O$9$Y(B - $B$FF1$8%N!<%I$K%/%(%j$rAw?.$9$k$h$&$K$7$^$7$?!#(B(Yoshiyuki) + </li><li> ロードバランス先を接続開始時に決定し、同じセッション内ではすべ + て同じノードにクエリを送信するようにしました。(Yoshiyuki Asaba) - <li> <a href="#CONNECTION_LIFE_TIME">connection_life_time</a> $B$r@_Dj$7$F$$$k>l9g$K(B - $B%P%C%U%!%*!<%P%i%s$,H/@8$9$k2DG=@-$,$"$kIT6q9g$r=$@5$7$^$7$?!#(B(Yoshiyuki) + </li><li> <a href="#CONNECTION_LIFE_TIME">connection_life_time</a> を設定している場合に + バッファオーバランが発生する可能性がある不具合を修正しました。(Yoshiyuki Asaba) -</ul> +</li></ul> <hr> <h2>1.1.1 (amiboshi) 2007/06/15</h2> <ul> - <li> <a href="#LOAD_BALANCE_MODE">load_balance_mode</a> $B$rM-8z$K$7$F$$$k$H!"(B"kind mismatch" $B%(%i!<$,(B - $BH/@8$7$F$7$^$&IT6q9g$r=$@5$7$^$7$?!#$3$l$O(B 1.1 $B$GF~$C$?IT6q9g$G$9!#(B - (Yoshiyuki) - <li> $B%W%m%H%3%k%P!<%8%g%s(B 2 $B$r;H$C$?%I%i%$%P$G%l%W%j%1!<%7%g%s;HMQ$9(B - $B$k$H!"(Bpgpool $B$,%O%s%0%"%C%W$9$kIT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) - <li> $B3HD%Ld9g$;%W%m%H%3%k$r;HMQ$9$k$H!"$^$l$K%G%C%I%m%C%/$,H/@8$9$k(B - $BIT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) -</ul> + <li> <a href="#LOAD_BALANCE_MODE">load_balance_mode</a> を有効にしていると、"kind mismatch" エラーが + 発生してしまう不具合を修正しました。これは 1.1 で入った不具合です。 + (Yoshiyuki Asaba) + </li><li> プロトコルバージョン 2 を使ったドライバでレプリケーション使用す + ると、pgpool がハングアップする不具合を修正しました(Yoshiyuki Asaba) + </li><li> 拡張問合せプロトコルを使用すると、まれにデッドロックが発生する + 不具合を修正しました(Yoshiyuki Asaba) +</li></ul> <hr> <h2>1.1 (amiboshi) 2007/05/25</h2> <ul> - <li> HBA $BG'>Z$r%5%]!<%H$7$^$7$?(B(Taiki) - <li> <a href="#LOG_CONNECTIONS">log_connections</a> $B$r%5%]!<%H$7$^$7$?(B(Taiki) - <li> <a href="#LOG_HOSTNAME">log_hostname</a> $B$r%5%]!<%H$7$^$7$?(B(Taiki) - <li> ps $B%3%^%s%I$G(B pgpool $B$N>uBV$,$o$+$k$h$&$K$7$^$7$?(B(Taiki) - <li> MacOS X $B$G%3%s%Q%$%k%(%i!<$K$J$kIT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) - <li> $B3HD%Ld$$9g$o$;%W%m%H%3%k$r;H$C$?%/%(%j$r%m!<%I%P%i%s%9$G$-$k$h$&$K$7$^$7$?(B(Yoshiyuki) - <li> $B%l%W%j%1!<%7%g%s@_Dj;~!"(BSELECT $B$O(B master $B$K$N$_Aw?.$9$k$h$&$K$7$^$7$?(B(Yoshiyuki) + <li> HBA 認証をサポートしました(Taiki Yamaguchi) + </li><li> <a href="#LOG_CONNECTIONS">log_connections</a> をサポートしました(Taiki Yamaguchi) + </li><li> <a href="#LOG_HOSTNAME">log_hostname</a> をサポートしました(Taiki Yamaguchi) + </li><li> ps コマンドで pgpool の状態がわかるようにしました(Taiki Yamaguchi) + </li><li> MacOS X でコンパイルエラーになる不具合を修正しました(Yoshiyuki Asaba) + </li><li> 拡張問い合わせプロトコルを使ったクエリをロードバランスできるようにしました(Yoshiyuki Asaba) + </li><li> レプリケーション設定時、SELECT は master にのみ送信するようにしました(Yoshiyuki Asaba) <ul> - <li> $B$b$7(B SELECT $B$r%l%W%j%1!<%7%g%s$5$;$k>l9g$O(B /*REPLICATION*/ $B$N$h$&$K(B - SELECT $B$NA0$K%3%a%s%H$rIU$1$kI,MW$,$"$j$^$9(B - </ul> - <li> $B%l%W%j%1!<%7%g%s@_Dj;~!"(BSELECT nextval() $B$*$h$S(B SELECT setval() - $B$r<+F0E*$K%l%W%j%1!<%7%g%s$5$;$k$h$&$K$7$^$7$?(B(Yoshiyuki) - <li> $B%P%C%/%(%s%I$X@\B3Cf$K%7%0%J%k$K3d$j9~$^$l$k$H!"%U%'%$%k%*!<%P$7$F$7$^$&IT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) - <li> PAM $BG'>Z$N%5%s%W%k%U%!%$%k(B pgpool.pam $B$r(B $PREFIX/share/pgpool-II/ $B$K%$%s%9%H!<%k$9$k$h$&$K$7$^$7$?(B(Taiki) - <li> $B5pBg$J(B SQL $B$r<B9T$7$h$&$H$7$?>l9g$K(B pgpool $B$,L58B%k!<%W$KF~$kIT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) -</ul> + <li> もし SELECT をレプリケーションさせる場合は /*REPLICATION*/ のように + SELECT の前にコメントを付ける必要があります + </li></ul> + </li><li> レプリケーション設定時、SELECT nextval() および SELECT setval() + を自動的にレプリケーションさせるようにしました(Yoshiyuki Asaba) + </li><li> バックエンドへ接続中にシグナルに割り込まれると、フェイルオーバしてしまう不具合を修正しました(Yoshiyuki Asaba) + </li><li> PAM 認証のサンプルファイル pgpool.pam を $PREFIX/share/pgpool-II/ にインストールするようにしました(Taiki Yamaguchi) + </li><li> 巨大な SQL を実行しようとした場合に pgpool が無限ループに入る不具合を修正しました(Yoshiyuki Asaba) +</li></ul> <hr> <h2>1.0.2 (suboshi) 2007/02/13</h2> <ul> - <li> $B5pBg$J(B SQL $B$r<B9T$7$h$&$H$7$?>l9g$K(B pgpool $B$,L58B%k!<%W$KF~$kIT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) - <li> $B3HD%Ld9g$;%W%m%H%3%k$r;H$C$?>l9g$K$^$l$K(B pgpool $B$,;_$^$C$F$7$^$&IT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) - <li> $B%U%'%$%k%*!<%P!"%U%'%$%k%P%C%/;~$N%m%0=PNO$r2~A1$7$^$7$?(B(Tatsuo) - <li> <a href="#pool_status">SHOW pool_status</a> $B$N7k2L$K%P%C%/%(%s%I%9%F!<%?%9>pJs$rDI2C$7$^$7$?(B(Tatsuo) - <li> $B%l%W%j%1!<%7%g%s;~$K(B UPDATE/DELETE $B$N7o?t$,<B:]$N7o?t$H$O0[$J$C$?7k2L$rJV$9IT6q9g$r=$@5$7$^$7$?(B(Tatsuo) - <li> $B8E$$(B gcc $B$r;H$&$H(B libpq $B$N%j%s%/$K<:GT$9$kIT6q9g$r=$@5$7$^$7$?(B (Yoshiyuki) - <li> PHP:PDO $B$d(B DBD-Pg $B$r;H$C$?>l9g$K!"<+F0(B DEALLOCATE $B$,<:GT$7$F$7$^$&IT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) - <li> SELECT FOR UPDATE, SELECT INTO $B$r%m!<%I%P%i%s%9$5$;$J$$$h$&$K$7$^$7$?!#(B - $B$^$?!"(BSELECT $B$NA0$K%3%a%s%H$,$"$k>l9g$b%m!<%I%P%i%s%9$5$;$J$$$h$&$K$7$^$7$?!#(B - $B$3$l$O(B pgpool-I $B$H$N8_49@-$N$?$a$G$9!#(B(Yoshiyuki) - <li> configure $B;~$N(B libpq $B$N%G%U%)%k%H%Q%9$r(B pg_config $B%3%^%s%I$r;H$C$F<hF@$9$k$h$&$K$7$^$7$?!#(B - $B$J$*!"(B--with-pgsql $B4XO"$N%*%W%7%g%s$O<!$N%P!<%8%g%s$G$OGQ;_M=Dj$G$9(B(Yoshiyuki) - <li> $B%3%M%/%7%g%s%W!<%k:FMxMQ;~$K!"%=%1%C%H$,2u$l$F$$$k>l9g$O:F@\B3$9$k$h$&$K$7$^$7$?(B(Yoshiyuki) - <li> PostgreSQL 7.4.x $B$N(B libpq $B$r;H$C$F%S%k%I$7$h$&$H$9$k$H!"(B - configure $B%9%/%j%W%H$G%(%i!<$H$J$C$F$7$^$&IT6q9g$r=$@5$7$^$7$?(B(Yoshiyuki) -</ul> + <li> 巨大な SQL を実行しようとした場合に pgpool が無限ループに入る不具合を修正しました(Yoshiyuki Asaba) + </li><li> 拡張問合せプロトコルを使った場合にまれに pgpool が止まってしまう不具合を修正しました(Yoshiyuki Asaba) + </li><li> フェイルオーバ、フェイルバック時のログ出力を改善しました(Tatsuo Ishii) + </li><li> <a href="#pool_status">SHOW pool_status</a> の結果にバックエンドステータス情報を追加しました(Tatsuo Ishii) + </li><li> レプリケーション時に UPDATE/DELETE の件数が実際の件数とは異なった結果を返す不具合を修正しました(Tatsuo Ishii) + </li><li> 古い gcc を使うと libpq のリンクに失敗する不具合を修正しました (Yoshiyuki Asaba) + </li><li> PHP:PDO や DBD-Pg を使った場合に、自動 DEALLOCATE が失敗してしまう不具合を修正しました(Yoshiyuki Asaba) + </li><li> SELECT FOR UPDATE, SELECT INTO をロードバランスさせないようにしました。 + また、SELECT の前にコメントがある場合もロードバランスさせないようにしました。 + これは pgpool-I との互換性のためです。(Yoshiyuki Asaba) + </li><li> configure 時の libpq のデフォルトパスを pg_config コマンドを使って取得するようにしました。 + なお、--with-pgsql 関連のオプションは次のバージョンでは廃止予定です(Yoshiyuki Asaba) + </li><li> コネクションプール再利用時に、ソケットが壊れている場合は再接続するようにしました(Yoshiyuki Asaba) + </li><li> PostgreSQL 7.4.x の libpq を使ってビルドしようとすると、 + configure スクリプトでエラーとなってしまう不具合を修正しました(Yoshiyuki Asaba) +</li></ul> </div> [parent: d1d7fbb90ee4]