ストリーミングレプリケーションの遅れのチェックのためにPostgreSQLに接続できなかった時に誤ったメッセージを出していました。health_check_userはこの目的のために使われていないので、これは誤りです。19a4ea9215da0b61728741fc0da2271958b09238)で行われた修正と同じものです。strncpy()が使われている箇所が複数あり、そこではコピー長とバッファサイズが同じであるケースが考慮されていません。このため、コピー後の文字列がNULL終端されていない可能性があり、多くの問題を後で引き起こすことになります。この問題を修正するために、ほとんどの箇所をstrlcpy()で置き換えました。Frostから以下のメールで報告された問題が解決されました。正しくバックエンドの状態を読み取れない問題です。-0700Windows環境でのみ必要なPGDLLIMPORTIを削除しました。これはgccを使わない環境で問題を引き起こします。Ahmedさんが提供しました。2011/09/08概要このバージョンは3.1系列の最初の版で、3.0系からの「メジャーバージョンアップ」にあたります。互換性のない変更insert_lockのロック方法を変更しました。以前のinsert_lockは、シーケンステーブルに対して行ロックを行いましたが、現在は、pgpool_catalog.insert_lockテーブルに対して行ロックを行います。その理由は、シーケンステーブルに対するロックが内部エラーを引き起こすため、PostgreSQLのコア開発者がそれを許可しないことを決定したためです。したがって、pgpool-II経由でアクセスするすべてのデータベースにinsert_lockテーブルをあらかじめ作成しておく必要があります。insert_lockテーブルが存在しない場合は、挿入対象のテーブルに対してロックを行います。2.2と2.3シリーズのinsert_lockと同じ動作です。過去のバージョンと互換性のあるinsert_lockを使用したい場合は、configureオプション(--enable-sequence-lock,--enable-table-lock)で設定できます(Kitagawa)backend_socket_dirパラメータを廃止しました。その代わりに、backend_hostnameが'/'で始まるならば、それをUNIXドメインへのパスとみなします。backend_hostnameが空ならば、デフォルトのUNIXドメインパス(/tmp)が使われます。これは、libpqインタフェースの規約に従います。Rorthaisさんから頂きました。フェイルオーバー時にpgpool_walrecrunning()を使用せず、プライマリノードへの昇格が完了するまで待つようになりました。関数を使用しない理由はプライマリノードを確実に見つけることができないためです。setval)の扱いをblack/white_function_listの設定に完全に従うように変更しました。以前、それらは常に書き込み関数として扱われていました(Kitagawa)新機能syslogに対応しました。Lelargeさんがレビューと編集をしました。9.0で導入されたapplication_nameに対応しました。コネクションが再利用されたときに、スタートアップパケットのapplication_nameをバックエンドへ送信し、パラメータステータスをフロントエンドに返します(Tatsuo)pgpool-II内部で使用するシステムカタログキャッシュの有効時間を、秒単位で指定できる設定項目relcache_expireが追加されました。TABLEによってテーブル定義が変更された際に、もはや有効でない結果を利用してしまうリスクが軽減されます。(Tatsuo)follow_master_commandパラメータを追加しました。このパラメータには、マスタースレーブモードのストリーミングレプリケーション構成においてマスタノードがフェイルオーバーした後に実行されるコマンドを指定します。Daroldさんから頂きました。pcp_promote_nodeコマンドを追加しました。このコマンドはpgpool-IIに対して新しいマスタノードへの昇格を行います。これは、マスタースレーブモードのストリーミングレプリケーション構成のみで使用できます。Daroldさんから頂きました。pcp_pool_statusコマンドを追加しました。APIも追加されています。Rorthaisさんから頂きました。バックエンドごとのパラメータ"backend_flag"を追加しました。これは、バックエンドごとの動作を制御します。今は"ALLOW_TO_FAILOVER"または"DISALLOW_TO_FAILOVER"が指定できます(Tatsuo)health_check_passwordパラメータを追加しました。Thauvin)sr_check_period、sr_check_user、sr_check_passwordパラメータを追加しました。これらは、ストリーミングレプリケーションの遅延チェックとプライマリノードの決定に使用されます(Tatsuo)pg_md5コマンドに--username(または-u)オプションを追加しました。これは、UNIXアカウントを持たないユーザの管理を可能にします。Thauvin)pgpool_adm関数をpgpool_adm/に追加しました。Thauvin)マスタースレーブモードにおいて、unloggedテーブルに対するSELECTは、常にマスター(primary)で実行されるようになりました(Kitagawa)バグ修正スタンバイノードでJDBCドライバのカーソルが使用できないバグを修正しました。この修正によって、マスタースレーブモードではトランザクションコマンドがすべてのノードに送られるようになります(Kitagawa)空のクエリの処理に関するバグを修正しました。空のクエリはSELECTクエリと同じ扱いになります。nextval(('"x_seq"'::text)::regclass)"のようになっていてもinsert_lockが正しく動作するように修正しました(Kitagawa)フェイルオーバー中はエラーメッセージを出力するようにpcp_attach_nodeコマンドを修正しました(Kitagawa)拡張問い合わせプロトコルでpgpool-IIがクエリを解析できないときに出力されるログメッセージがクエリを表示するよう修正しました(Kitagawa)pgpool-IIマニュアルのbackend_weightに関する説明を修正しました。それは、pgpool.confの再読み込みで変更できます(Tatsuo)英語のチュートリアルドキュメント内の表現の改善と修正を行いました。Lelarge)ストリーミングレプリケーションモードにおけるレプリケーション遅延の計算が間違っていたのを修正しました(Tatsuo)フェイルオーバーのログメッセージにおける誤った関数名"notice_backend_error"を、正しいもの"degenerate_backend_set"に置き換えました(Tatsuo)pgpool.conf解析後の不要なログ出力を削除しました(Tatsuo)バックエンドを新規追加した後に起こり得るpgpool/worker子プロセスのクラッシュを修正しました。SHARE/UPDATE句のあるサブクエリを含むSELECTがスレーブ(standby)に送られるバグを修正しました(Tatsuo)PREPARE文でデフォルト値のタイムスタンプ書き換えに失敗するバグを修正しました。これは以前は動作していましたが、3.0で動作しなくなっていました(Kitagawa)getopt_long()がない環境でpcpコマンドのコンパイルが失敗するのを修正しました(Tatsuo)rawモード、enable_hbaが無効、バックエンドが2台以上の場合にpgpool子プロセスがクラッシュするのを修正しました(Kitagawa)メモリリークをいくつか修正しました(Kitagawa)改良ストリーミングレプリケーション構成でのオンラインリカバリにおいて、リカバリ終了時に子プロセスを再起動しないようにしました。そのため、既存のセッションはオンラインリカバリ中も継続することができます(Tatsuo)ストリーミングレプリケーションモードにおいて、pcp_attache_nodeが既存のセッションを切断しなくなりました。ほかのモードでは依然としてセッションが切断されます(Tatsuo)。9.0のパーサを移植しました。INDEXが実行できるようになりました。パッチは石田さんから頂きました。black_function_listとwhite_function_listパラメータに正規表現が使えるようになりました。Lelargeさんがレビューしました。Takatsuka)pgpool-IIマニュアルのストリーミングレプリケーションにおけるオンラインリカバリの説明を改善しました(Tatsuo)ストリーミングレプリケーションモードにおけるレプリケーション遅延をチェックするための関数を変更しました。現在、pgpoolはpg_last_xlog_receive_location()の代わりにpg_last_xlog_replay_location()を使用します。Yuzhaninovさんの提案によるものです(Tatsuo)カラムのデフォルト値に任意の式を指定してもタイムスタンプ書き換えが動作するようにしました。以前は、now()が含まれているものを検知すると、単純にそれをnow()で置き換えてました。これは、デフォルト値の誤った書き換えを引き起こします。これは簡易プロトコルのみへの適用であることに注意してください。2011/06/01概要このバージョンでは、3.0.3における様々なバグが修正されています。互換性のない変更ストリーミングレプリケーションにおいて、delay_thresholdが0またはヘルスチェックが無効ならば、遅延チェックは実施されません。8.0以降でコンパイルできるように修正しました。BALANCE*/コメントを使用したときにハングアップする可能性を修正しました(Kitagawa)Flush(H)メッセージやCloseComplete(C)メッセージを受信したときのハングアップを修正しました(Kitagawa)pgpool-IIがバックエンドに接続後、RedyForQuery(Z)メッセージを受信するタイミングによって起こり得るハングアップを修正しました(Kitagawa)recovery_1st_stage_commandとrecovery_2nd_stage_commandパラメータの説明を追加しました(Tatsuo)pgpool-II内部で使用するシステムカタログキャッシュのサイズを32から128に増やしました。Kitagawa)pcp_connect()関数で二重free()を行うバグを修正しました。status」変数の名前を正しく修正しました。Lelarge)md5認証方式を採用してデーモンとして実行したときのハングアップを修正しました。Thauvinさんから頂きました(Tatsuo)拡張問い合わせプロトコルでSQL文が出力されるように、log_per_node_statementを修正しました。これは以前は動作していましたが、3.0で動作しなくなっていました(Kitagawa)改良サンプルの設定ファイルのblack_function_listにcurrval()とlastval()を追加しました。3.0.2のリリースはパッケージングの問題でキャンセルされました)。互換性のない変更ストリーミングレプリケーションモードを使用する場合に、PostgreSQLサーバにC関数「pgpool_walrecrunning()」をインストールすることが推奨されます(後述)。この場合、新しい変数「%P」がオンラインリカバリのスクリプトで利用できるようになります。この関数をインストールしない場合は、従来と同じ動作になります(Tatsuo)rawモードでDBノードがひとつだけの場合、DBノードに問題が発生するとダウン状態になりますが、DBノードが復旧したらpgpoolの再起動なしにDBノードを使用できるようにしました。Kitagawa)バグ修正パスワード認証における移植性を損なうコードを修正しました。Kitagawa)ユーザ名の長さが32バイトのときにpgpool子プロセスがクラッシュするパスワード認証のバグを修正しました(Tatsuo)rawモードまたはバックエンドノード数が1のときに、pgpool子プロセスがクラッシュするmd5認証のバグを修正しました。Shepherdさんから頂きました(Tatsuo)以前からあった配列と複合型に対するタイムスタンプ書き換えのバグを修正しました。Ishidaさんから頂きました(Tatsuo)debug_levelパラメータが動作しないバグを修正しました。DATABASEが失敗するバグを修正しました(Kitagawa)rawモードでフェイルオーバが失敗するバグを修正しました(Kitagawa)1セッションで簡易問い合わせプロトコルと拡張問い合わせプロトコルの両方が使われたときに起こりうるpgpool子プロセスの終了を修正しました(Kitagawa)拡張問い合わせプロトコルを使用中にエラーが発生すると起こりうるハングアップを修正しました(Kitagawa)PG_TRY/CATCHを使用しないようにpgpool-regclass()を修正しました。connection」が出ないように修正しました(Tatsuo)バックエンドがすべてダウンした場合に発生するpgpoolのクラッシュを修正しました(Tatsuo)レプリケーション遅延チェックがバックエンドとの永続的な接続を行わないように修正しました。クエリがマスタノードに送信されないバグを修正しました(Kitagawa)マスタースレーブモードである拡張問い合わせプロトコルを使用している明示的にトランザクションを開始している更新クエリを実行した後であるストリーミングレプリケーションモード利用時のオンラインリカバリにおいて、以下のシナリオがうまく動作しない問題を修正しました。以下のシナリオでは、ノード0を最初のプライマリサーバ、ノード1を最初のスタンバイサーバとします。ノード0プライマリサーバがダウンし、ノード1スタンバイサーバが新しいプライマリサーバになるノード0の旧プライマリサーバは、オンラインリカバリで新スタンバイサーバになるこのときpgpool-IIは、ノード0の新スタンバイサーバを、プライマリサーバとみなしてしまうこれは、生きているノード番号の一番若いサーバをプライマリサーバと見なしていたためです。3.0.3では、pgpool_walrecrunning()を使って、実際にそのノードがプライマリサーバかどうか判定するため、このような問題は起きません。この機能をうまく使うために、オンラインリカバリのスクリプトで%P(古いプライマリノード番号)が利用できるようになっています。pgpool_walrecrunning()がインストールされていない場合は、上の問題は解消されず、3.0.1と同様の動作になります。2011/02/17概要このバージョンは問題があったために、リリースが取り消されました。2010/10/19概要このバージョンでは、3.0における様々なバグが修正されています。認証されるサーバが複数ある場合にクラッシュするmd5認証のバグを修正しました(Tatsuo)拡張問い合わせプロトコルにおいて、構文エラーのクエリを実行したときに子プロセスがクラッシュするバグを修正しました(Kitagawa)ポータル情報のハンドリングにおける子プロセスが終了するバグを修正しました(Kitagawa)拡張問い合わせプロトコルにおいて、ひとつのノードに送信されたクエリがエラーを起こしたときにハングアップするバグを修正しました(Kitagawa)英語ドキュメントの誤植を修正しました。2010/09/10概要このバージョンは3.0系列の最初の版で、2.2系や2.3系からの「メジャーバージョンアップ」にあたります。Standby構成に対応するなど、多くの機能が追加されると共に、内部構造が整理されて見通しが良くなって保守性が向上しています。マスタースレーブモード全般で多くの改善がなされています。明示的なトランザクション内のSELECTが負荷分散できるようになりました不必要なDBノードにparse/bindメッセージが送られなくなりロック競合が減りました不必要な内部トランザクションの起動がなくなり、オーバヘッドが軽減しています一時テーブルを意識せずに安全に使えるようになりました書き込みを伴う関数呼び出しを行なうSELECTをマスター(primay)でのみ実行するように制御できるようになりましたレプリケーションモードにおいても、書き込みを伴う関数呼び出しを行なうSELECTを負荷分散するかどうかの制御できるようになるなどの改良が加えられています。いう新しい設定項目に"stream"を設定することにより、SR+HS構成に最適な動作をします。更新クエリはPrimaryサーバにのみ送信し、SELECTはPrimaryとStandbyサーバに負荷分散することが可能です。そのほか、Standbyサーバをオンラインリカバリで復旧したり、PrimaryとStandbyのレプリケーション同期を監視し、遅れが大きいようならPrimaryにのみSELECTを送信させるようにすることも可能です。Replicationへの対応"をご覧下さい。追加され、レプリケーションの遅れが監視できるようになりました。Replicationにおけるレプリケーションの遅延のログを制御する新しい設定項目"log_standby_delay"が追加されました(Tatsuo)insert_lockが有効で、テーブルにシリアル型が含まれている場合、テーブルロックではなく、該当シーケンスを行ロックするようにしました。vacuumとロックが衝突したりして性能が低下する問題がありました(Tatsuo)新しい"SHOW"コマンドが追加されました。Lelarge)pcp_proc_infoコマンドの出力結果に、PostgreSQLバックエンドプロセスのプロセスIDとフロントエンドからの接続があるかどうかが追加されました(Tatsuo)関数呼び出しを伴うSELECTを制御する設定項目white_function_listとback_function_listが追加されました(Tatsuo)マスタースレーブモードにおいて、システムカタログを検索するSELECTは、整合性を保つために常にマスター(primary)で実行されるようになりました(Tatsuo)マスタースレーブモードにおいて、一時テーブルを検索するSELECTは、整合性を保つために常にマスター(primary)で実行されるようになりました(Tatsuo)マスタスレーブモードで、明示的なトランザクション内で実行されない更新クエリにおいて、自動的にトランザクションを開始することを止めました。Kitagawa)マスタスレーブモードで、必要なDBノードにのみコマンドが送られるようになりました。9.0のVACUUMの新しい書式をpgpool-IIのパーサがサポートしました(Tatsuo)フェイルオーバ/フェイルバックコマンドで、"%H"という特殊変数が利用できるようになりました。従来、レプリケーションモードでINSERT/UPDATE/DELETEの結果行数が異なると、トランザクションをアボートしてセッションを強制切断していました。trueに設定すると、この現象が起きたときに、不一致のあったDBノードを切り放して縮退運転に入るようになります。レプリケーションモードでDBノード間でINSERT/UPDATE/DELETEの結果行数の不一致が検出された際に、各DBノードにおける結果行数がログに記録されるようになりました(Tatsuo)レプリケーションモードとマスタスレーブモードで、md5認証がサポートされました(Tatsuo)オンラインリカバリで、強制的にフロントエンドへの接続を切断して直ちにセカンドステージに入ることができるようになりました。いう設定項目が追加され、pgpool.confの再読み込みによってデバッグメッセージの出力をオン/オフできるようになりました(Tatsuo)pgpool.confで、postgresql.confと同じ真偽値表現が利用できるようになりました。1/0しか使えませんでした(Kitagawa)オンラインリカバリのセカンドステージをより安全に実行するために、C言語関数pgpool_switch_xlogを追加しました(Kitagawa)異なるスキーマに同じ名前のテーブルが存在する場合に起きる不具合を回避するために、C言語関数pgpool_regclassを追加しました(Tatsuo)互換性のない変更replicate_selectとload_balance_modeを共にtrueに設定した場合、トランザクションブロックの外側で実行されるSELECT文は、replicate_selectに従うようになりました。以前は、load_balance_modeに従うようになっていました。クライアントがこの動作を利用している場合は、replicate_selectをfalseにしてback_function_listを設定することで同じ動作を実現できます。型が時刻データ以外の列の場合、デフォルト値にnow()が含まれていても書き換えを行なわないようにしました。今までは無条件に書き換えを行なっていたため、書き換えの結果、INSERT文などがエラーになっていました(Tatsuo)タイムスタンプの書き換え処理対象となるテーブルのスキーマが無視されないようにしました。この機能を有効にするためには、付属のユーザ定義関数"pgpool_regclass"のインストールが必要です。この関数がインストールされていない場合は、依然としてスキーマが無視されてしまいます(Tatsuo)pcpコマンドのタイムアウトの扱いにおけるバグが修正されました(Tatsuo)SSLが有効な状態で、大量のデータ通信が起るとハングする問題が修正されました(Tatsuo)DBノードが1個だけしか存在しない状態でDBがエラーを起したた際に、間違ったDBノードがフェイルオーバするバグを修正しました(Tatsuo)オンラインリカバリ時のpostmasterの起動チェックにおけるバグを修正しました。以前の色々なバグが修正されています。以前より多くの共有メモリを使うようになったので注意してください。いったメッセージがあれば、システムの共有メモリを増やしてください。パラレルモードが、レプリケーションモードかロードバランスモードが有効でないと使えないようになりました。レプリケーションモードかロードバランスモードが有効でないときパラレルモードは正しく動作していませんでした。しても無意味なためです。さんの指摘により修正しました。このドキュメントには、オンラインリカバリの内部的なことが書いてあります。長い間存在したバグを修正しました。サイズの計算を間違えていたことに起因します。バグ解析(Kitagawa)、パッチ作成(Tatsuo)ドキュメントにパラレルモード用の以下の制約を追記しました。