[pgpool-general-jp: 1392] pgpool-II 3.5.0 & pgpoolAdmin 3.5.0 リリース
Yugo Nagata
nagata @ sraoss.co.jp
2016年 1月 29日 (金) 18:57:03 JST
長田です。
pgpool-II 3.5.0 および pgpoolAdmin 3.5.0 をリリースしました。
以下より、ソースコード、RPM のダウンロードができます。
http://pgpool.net/mediawiki/index.php/Downloads
3.5 の新しい特徴には以下が含まれています。
- 拡張問い合わせプロトコル使用時のパフォーマンス改善
- Thundering herd(獣群の暴走)問題対応によるパフォーマンス改善
- より障害に強く拡張性が高くなった watchdog
- PCP コマンドの改善
- PostgreSQL 9.5 パーサの取り込み
- その他
詳しくは以下をご覧ください。
http://pgpool.net/mediawiki/index.php?title=pgpool-II_3.5_features&redirect=no
リリースノート:
=====================================================================
3.5.0 (ekieboshi) 2016/01/29
=====================================================================
* 概要
このバージョンは 3.5 系列の最初の版で、3.4 系からの「メジャーバージョンアップ」
にあたります。
* 互換性のない変更
- パラレルクエリモードのコードが削除されました。(Yugo Nagata)
これは、パラレルクエリモードのユーザが少ない割に維持に手間がかかるためです。
また、システムDBに関するコードも削除されました。 これらはパラレルクエリモードと
古いオンディスクのクエリキャッシュででしか使用されていなかったためです。
- パラメータ "ifconfig_path" が"if_cmd_path"に名前が変更になりました。
(Yugo Nagata)
ifconfig が非推奨になり現在では ip コマンドがデフォルトで使われており、
ifconfig_path がパラメータ名として不適切になったためです。
- pcp コマンド引数の文法が変更されました。(Muhammad Usama)
- pcp_watchdog_infoの出力とパラメータの意味が変更されました。 (Muhammad Usama)
このコマンドはクラスタ中の全ての pgpool-II ノードの watchdog 情報を表示するよう
改善されました。 それに伴い、ノードインデックスを指定するパラメータの意味が変更され、
0 が最初のリモート pgpool-II ノードではなくローカル pgpool-II ノードを意味する
ようになりました。
* 新機能
- 新しいパラメータ serialize_accept が追加されました。(Tatsuo Ishii)
クライアントからの接続を受け付ける際に accept() の呼び出しをシリアライズするか
どうかを指定します。 デフォルトはoffです(シリアライズしません)で、これは
pgpool-II 3.4 以前と同じ挙動です。 このパラメータがoffの場合、カーネルはすべての
pgpool-II子プロセスを起こして accept() を実行させます。 そして子プロセスのうち
ひとつだけが実際に接続を受け付けます。 問題は、ここで多くの子プロセスが一度に起こされる
ため、重いコンテキストスイッチングが起こり、性能に影響がでることです。 この現象は
「thundering herd problem」と呼ばれる古典的な問題です。 serialize_accept
を有効にすることにより、pgpool-II子プロセスのうちひとつだけが起こされて accept()
を実行するようになり、この問題は回避されます
- PostgreSQL 9.5 のパーサを取り込みました。(Yugo Nagata)
これにより、pgpool-II は PostgreSQL 9.5 で導入された新しい構文を理解可能です。
とくに GROUPING SET、CUBE、ROLLUP、そして TABLESAMPLE の負荷分散とクエリ
キャッシュ(TABLESAMPLE を除く)が可能になりました。 また、INSERT ... ON CONFLICT
と UPDATE tab SET (col1, col2, ..) = (SELLECT ...) ... もネイティブレプリ
ケーションで適切にクエリ書き換え処理が可能です。
- ヘルスチェックとストリーミングレプリケーション遅延チェックに使うデータベースを指定
できるようになりました。(Tatsuo Ishii)
そのために、新しいパラメータ health_check_database と sr_check_database
が追加されました。
* 改善点
- 拡張問い合わせプロトコル使用時の性能が改善されました。(Tatsuo Ishii)
拡張プロトコルメッセージ(parse, bind, describe, execute) の各段階で送信され通信
のオーバヘッドとなっていた、不必要な "flush" メッセージが取り除かれました。現在のところ、
この改善はストリーミングレプリケーションモード でのみ効果があり、他のモードでは性能は
変わりません。
- watchdog 機能の改善 (Muhammad Usama, Yugo Nagata)
この改善は pgpool-II のwachdog の弱点や問題点を見直し watchdog システムをよりロバスト
で適応的なものにすることです。パッチは Usama により作成され、Yugo がレビュー、テスト、
デバッグを行いました。
-- watchdog はクォーラム(定足数)を考慮し、所属する watchdog クラスタに全体の半数以上
のノードが存在する場合のみマスター/リーダに選ばれます。
-- watchdog クラスタに参加している全ての pgpool-II ノードは同じ設定となっている必要が
あります。
-- watchdog ノードは優先度の設定を持ち、ユーザはどのノードがリーダになるべきかを制御
しやすくなりました。
-- watchdog はスプリットブレイン現象のような問題の状況を監視し続け、自動的にそこから
復帰します。
-- ユーザは、ノードのマスター/リーダへの昇格時および降格時に実行するスクリプトを指定可能です。
以下のパラメータが追加されました:
-- wd_ipc_socket_dir:
pgpool-II watchdog の IPC(プロセス間通信)で受け付ける UNIX ドメインソケットが
作成されるディレクトリを指定します。
-- wd_priority:
このパラメータによって自身の watchdog ノードがリーダに選ばれる優先度を上げることができます。
-- wd_de_escalation_command:
pgpool-II watchdog のマスターノードがマスターの責務を辞退し降格するときに、ここで指定した
コマンドが実行されます。
-- wd_monitoring_interfaces_list:
watchdog プロセスがリンク状態を監視するネットワークデバイス名をカンマ区切りで指定します。
- pcp コマンドが改善されました。(Muhammad Usama)
-- コマンド引数の改善:
長いコマンドライン形式のオプションが使用可能になりました。
-- 安全な pcp パスワード:
セキュリティリスクとなるため、パスワードをコマンドラインで渡さなくなりました。
-- 複数の pcp コマンドの同時実行:
例えば、実行に時間のかかる pcp_recovery_node の最中に他の pcp コマンドの実行が可能です。
- "show pool_nodes" コマンドの結果に SELECT 回数を表示するようになりました。
(Tatsuo Ishii)
show pool_nodes の結果には各バックエンドの状態が出力されますが、これに SELECT が何回発行
されたかが出力されるようなりました。これにより、ロードバランスの効果をすぐに確認することができます。
例:
test=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role | select_cnt
---------+----------+-------+--------+-----------+---------+------------
0 | /tmp | 11002 | 2 | 0.500000 | primary | 338230
1 | /tmp | 11003 | 2 | 0.500000 | standby | 163939
(2 rows)
- クエリ書き換えのためのパーサ改善 (Yugo Nagata)
ネイティブレプリケーションのクエリ書き換えで WITH 句付きの INSERT/UPDATE/DELETE、
更新可能 CTE、RETURNING 句が適切に扱えるようになりました。
- pool_passwd ファイルが読み込み権限で開けるようになりました。(Tatsuo Ishii)
- test: レグレッションテストで pgpool-II をデバッグモードで実行できるようになりました。
(Tatsuo Ishii)
- doc: pgpool_adm のドキュメントを追加しました。(Tatsuo Ishii)
- doc: 中国語のドキュメントを更新しました。 (Bambo Huang)
* バグ修正 (pgpool-II 3.4.3以降のもの)
- doc: ドキュメントのロードバランスに関する情報を修正しました。(Tatsuo Ishii)
- ストリーミングレプリケーションでは DECLARE, FETCH, CLOSE, SHOW はプライマリノードに
のみ送られます。[pgpool-general-jp: 1378] での指摘によります。
- pgpool_status 書き込み時に fsync() を実行するようになりました。(Tatsuo Ishii)
これにより、pgpool_status が永続ストレージに保存され、システムクラッシュ時も情報が失われ
ないことを保証します。
- リセットクエリがスタックする問題を修正しました。(Muhammad Usama)
DISCARD ALL などのリセットクエリが時々終了せずに pgpool 子プロセスはバックエンドからの応答を
待ったままとなり、 その結果、クライアントが pgpool-II に接続できなくなるという報告があります
(例えば bug #107 の報告)。 原因はまだ特定できていませんが、クライアントがクエリ処理中に突然
pgpool-II への接続をクローズした場合、 バックエンドは ready for query でないために、リセット
クエリを受け付けられなくなるかもしれません。
これは、フロントエンドのソケットの状態を追跡し続け、フロントエンドへの接続が適切に
終了できない場合には PostgreSQL の接続をキャッシュしないことで修正しました。
- test: レグレッションテスト 062 の誤報を修正しました。(Yugo Nagata)
- test: ネイティブレプリケーションのレグレッションテストが壊れていたのを修正しました。
(Yugo Nagata)
insert-lock のテストが動作していませんでした。
- test: レグレッションテストで pgpool_reload の後に sleep を実行するよう修正しました。
(Yugo Nagata)
いくつかのテストでは設定ファイルを変更しリロードしますが、時々のリロードを実行した直後では
設定の変更が適用されていないことがありました。
- レプリケーションモードで発生するシーケンス値の不整合を修正しました。(Yugo Nagata)
スキーマ名が与えられときに、テーブル名が正しくない方法で引用符がつけられていました。 例えば、
"public"."mytbl" ではなく "public.mytbl" というようにです。このため、 pool_regclass
または to_regclass が正しくテーブルの OID を取得できず、insert-lock が常に実行されなく
なっていました。これは DB 間の不整合の原因となっていました。
- test: timestamp rewrite テストのコンパイラエラーとセグメンテーションフォルトを
修正しました。(Yugo Nagata)
- doc: 日本語ドキュメントに未翻訳の文があったのを修正しました。(Yugo Nagata)
- 古くから存在していた pool_push() 関連関数のバグを修正しました。(Tatsuo Ishii)
これはバッファを realloc で割り当て、返却されたポインタを使っていますが、realloc が
呼ばれる前にポインタの計算を行っていたため、古いポインタ値が使われることになり、
セグメンテーションフォルトを含む様々な問題の原因となっていました。
また、他にも問題がありました。バッファポインタやバッファサイズが初期化されていない、
バッファが pool_close で解放されていない、デバッグメッセージの typo などです。
これらも同時に修正されました。
- doc: log_standby_delay に関するドキュメントの誤った記述が修正されました。
(Yugo Nagata)
- FROM 句に関数が使われた場合に発生するセグメンテーションフォルトが修正されました。
(Yugo Nagata)
ストリーミングレプリケーションモードでの PREPARE 文、ネイティブレプリケーション
モードでのSELECT を伴う INSERT/UPDATE 文が影響を受けていました。
例)
prepare p as select * from generate_series(1,1);
insert into tbl select now(), * from generate_series(1,1);
- doc: app_name_redirect_preference_list の JDBC ドライバに関する注意をドキュメント
に追加しました。(Tatsuo Ishii)
- bug #145 で報告されたハングを修正しました。(Tatsuo Ishii)
この問題は以下の全ての条件が揃うと発生します:
-- pgpool-II 3.4 か、それ以降
-- ストリーミングレプリケーションモード
-- プライマリノードがロードバランス先
-- 拡張プロトコルが使われている
-- client_idle_limit に達した
- インメモリクエリキャッシュのバグを修正しました。(Tatsuo Ishii)
拡張プロトコルが使用されており、以前の parse メッセージで作成された文を使用する
bind/execute メッセージが到着した際に、一時キャッシュが parse メッセージで初期され
ておらず、メッセージは既存の一時キャッシュに追加されていました。これが、キャッシュ の結果
を返すときに Data Row メッセージと Command Complete メッセージが2重に現れるという
トラブルの原因になっていました。 bug #152 の報告によります。
- test: レグレッションテスト 065 を修正しました。(Tatsuo Ishii)
JDBC ドライバのパスが明示的に定義されていました。これは良くないため、 JDBC_DRIVER
環境変数の値を用いるように変更されました。
- test: レグレッションテスト 054.postgres_fdw で発生し得るハングアップを修正しました。
(Yugo Nagata)
- test: レグレッションテストと pgpool_setup に unix ドメインソケットディレクトリを
指定するオプションを追加しました。 (Yugo Nagata)
- doc: ドキュメントに欠けていたデフォルト値の記述を追加しました。(Yugo Nagata)
- リセットクエリがスタックする問題を修正しました。(Muhammad Usama)
この問題は他のブランチでは既に修正済みであり、今回も 3.3 シリーズと同じ方法で解決されました。
すなわち、client idle limit に達した際に、バックエンドの接続を閉じるようにしました。
- "SET TRANSACTION READ ONLY" のバグを修正しました。(Tatsuo Ishii)
pgpool-II は読み込み以外を行うクエリ(SET を含む)が明示的なトランザクションの中で実行
されたことを記憶し、それが「書き込みトランザクション」であることをマークします。これは
ストリーミングレプリケーション時のクエリの振り分け処理に影響します。 pgpool-II はそのマークの後、
クエリをプライマリに送信するようになります。 これは、ストリーミングレプリケーションで書き込み
クエリの結果がスタンバイで遅れて現れるために、 クエリはプライマリに送られが方がより安全だからです。
ただし、見過ごされていましたが "SET TRANSACTION READ ONLY" はデータを変更しないので、例外
として扱われるべきでした。 バグ報告 #157 によります。
- test: レグレッションテスト 063 のタイムアウト処理で timeout コマンドを使用するよう修正
しました。(Yugo Nagata)
- エラー出力が誤っていた箇所を修正しました。(Tatsuo Ishii)
connect_with_timeout() で getsockopt(SO_ERROR) がエラーを報告した際に、
適切なエラー情報が表示できていませんでした。 bug #159 の報告によります。
- test: regress.sh のヘルプメッセージで抜けていた改行を追加しました。(Yugo Nagata)
- get_backends_status() 関数のロジックの誤りを修正しました。(Muhammad Usama)
get_backends_status () 関数は現在の有効でかつダウンしているバックエンドノードの数を
カウントします。このとき、有効ではないノードは常にダウンステータスにあることを前提にして
いましたが、この前提は常に正しい訳ではありません。
- white/black_memqcache_table_list パラメータがクォーテーションを要求しないよう
修正しました。(Yugo Nagata)
*_memqcache_table_list でテーブル名およびスキーマ名を指定する際に、ダブルクォーテーション
が必要となっていました。修正パッチは Dang Minh Huong によって提供されました。
[pgpool-hackers: 1323] の報告によります。
- 設定リロード時の FATAL エラーを修正しました。(Tatsuo Ishii)
pgpool.conf をリロードする際には DB ノードの数が一時的に 0 にセットされたのちに pgpool
メインプロセスにより実際のバックエンド数に達するまでカウントアップされます。この変数が共有
メモリ上にあったため pgpool 子プロセスで問題が発生し FATAL エラーの原因となっていました。
Bug #156 の harukat の報告によります。
- test: レグレッションテスト 006.memqcache に white/black_memqcache_table_list
のテストを追加しました。 (Yugo Nagata)
- リセットクエリがスタックする問題を修正しました。(Muhammad Usama, Tatsuo Ishii)
pool_read がフロントエンドからの読み込みに失敗した場合、または poll_flush が
フロントエンドへの書き込みに失敗した場合に、pgpool 子プロセスの切断・終了処理を行う ERROR
ではなく、FRONTEND_ERROR を報告するようにしました。これによりクエリがスタックすることを防止します。
- test: デバッグモードで失敗していたレグレッションテストを修正しました。(Yugo Nagata)
- IPv6 使用時のパフォーマンス低下を修正しました。(Muhammad Usama)
Bug #165 の報告によります。
--
Yugo Nagata <nagata @ sraoss.co.jp>
pgpool-general-jp メーリングリストの案内