[pgpool-general-jp: 109] Re: notice_backend_error(1) in do_child()
Tatsuo Ishii
ishii @ sraoss.co.jp
2007年 4月 14日 (土) 13:51:16 JST
石井です.
> 現在 pgpool-II 1.0.2 を試してみています。
>
> 全部一台のマシン(FreeBSD 6.2R)で試していて、バックエンドをポート番号
> を変えて三つ立ち上げています。
>
> 主な設定は以下の状態です。
>
> replication_mode = true
> replication_strict = true
> load_balance_mode = false
> replication_stop_on_mismatch = true
>
>
> このとき、バックエンドのうち一台だけがデータが狂ってしまった時を想定
> してテストをしていた所、replication_stop_on_mismatch を true にしてい
> るので、バックエンドのうちひとつが切り離される、という所までは想定通り
> にいきました。
>
> ところが、切り離されるバックエンドが想定と異なっていました。
>
> 今回、node_id == 2 のデータだけを狂ったものにして、SELECT 文の返り値
> が異なるような状態にしています。
> その際、以下のようなログを出しています。
>
> read_kind_from_backend: read kind from 0 th backend D NUM_BACKENDS: 3
> read_kind_from_backend: read kind from 1 th backend D NUM_BACKENDS: 3
> read_kind_from_backend: read kind from 2 th backend C NUM_BACKENDS: 3
> pool_process_query: 2 th kind C does not match with master connection kind D
> notice_backend_error: 1 failover request from pid 20707
> failover_handler called
>
> このように、node_id == 2 のバックエンドを切り離そうとしている所はい
> いのですが、実際には真ん中の node_id == 1 が切り離されてしまいました。
>
> ちょっとソースを追ってみたところ、child.c の do_child() で
>
> /* fatal error occured. just exit myself... */
> case POOL_FATAL:
> notice_backend_error(1);
> child_exit(1);
> break;
>
> という部分を見付けました。ここで notice_backend_error(1) と定数 1 を渡
> しているので、毎回 node_id == 1 なバックエンドを切り離してしまっている
> ようです。
>
> この定数 1 の部分に、適切な node_id を渡してやればいいのかな、と思っ
> たのですが、mismatch を検出する read_kind_from_backend() から、上記の
> case POOL_FATAL までの経路で、どの node_id のバックエンドが POOL_FATAL
> の原因なのか、を渡すのにどういう形を想定して設計されているのかがわから
> なかったので、ここの定数部分をどう変えてやればいいのかわかりませんでし
> た。
>
> 適切なバックエンドが切り離されるようにするには、どうしたらいいでしょ
> うか?
ノード間でデータが不一致になったときには,一般的にはどのノードが正しく
て,どのノードが間違っているかを確実に断定する方法はありません.考えら
れる方法としては,
1) master node(上の例で言うと,node id = 0)を正しいものと信じて一致し
ないnodeを切り離す
2) 各nodeの結果を比較し,多数派を正しいものとし,それ以外のnodeを切り
離す
の2つがあります.今考えているのは,基本的に2)で判断し,それができない
場合(ノード数が偶数でかつ判断が分かれたとき)は1)の基準を採用する,とい
う方法です(TODO項目).
ちなみに現在のpgpool-IIで,kind mismatchのときに切り離すnode idが1に固
定されているのは,たぶんnode数が2までのpgpoolのコードをそのまま持って
きたからで,node数が3つ以上だとこのような現象になってしまいます.つま
りバグですね.ちょっと対策を考えてみます.
--
Tatsuo Ishii
SRA OSS, Inc. Japan
pgpool-general-jp メーリングリストの案内