[pgsql-jp: 32945] Re: pgpoolのfailover について

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 5月 15日 (土) 18:41:26 JST


石井です.

>  なるほど、やっぱり、pgpool側では切断を知る方法はないんですかね。
> 
>  石井さんのアイデアを受けて、次のようにしてみました。
> 
>  これで、LANケーブルを引っこ抜いた場合も、期待通り動いている
> ようです。
> 
> ------------------------------------------------------------------------
> *** pgpool-1.2.1/child.c        Sat May  8 11:03:27 2004
> --- pgpool-1.2.1_hira2/child.c  Sat May 15 02:40:25 2004
> ***************
> *** 56,61 ****
> --- 56,62 ----
>   static void reset_backend(POOL_CONNECTION *backend);
>   static void cancel_request(CancelPacket *cp, int secondary_backend);
>   static RETSIGTYPE die(int sig);
> + static RETSIGTYPE backend_timeout();
> 
>   /*
>   * child main loop
> ***************
> *** 79,84 ****
> --- 80,86 ----
>         signal(SIGCHLD, SIG_DFL);
>         signal(SIGUSR1, SIG_DFL);
>         signal(SIGPIPE, SIG_IGN);
> +       signal(SIGUSR2, backend_timeout);
> 
>   #ifdef NONE_BLOCK
>         /* set listen fds to none block */
> ***************
> *** 624,626 ****
> --- 626,636 ----
>   {
>         exit(0);
>   }
> +
> + static RETSIGTYPE backend_timeout()
> + {
> +       pool_debug("backend connection error occured");
> +
> +       notice_backend_error();
> +       exit(1);
> + }
> ------------------------------------------------------------------------
> 
> 監視スクリプト
> 
> #!/bin/csh -f
> 
> set hosts = (192.168.5.161 192.168.5.163)
> 
> while (1)
>     foreach host ($hosts)
>         ping -q -n -c 1 -w 1 $host > /dev/null
>         if ($status == 1) then
>             set pids = `netstat -anp | grep ${host}:5432 | tr '/' ' ' | awk '{print $7}'`
>             foreach pid ($pids)
>                 if ("$pid" != "-") then
>                     echo $host cannot be reached. notice to process $pid
>                     kill -USR2 $pid
>                 endif
>             end
>         endif
> 
>         sleep 1
>     end
> end
> 
> ------------------------------------------------------------------------

これでもいいのですが,pgpoolの親プロセスにSIGUSR1を投げればfailoverさ
せられると思います.なお,親プロセスのpidはlogdir/pgpool.pidで分かりま
す.

後,pgpoolとは別の監視スクリプトでもいいのですが,pgpoolの親プロセスの
中でpingと同じことをやるようにすればすっきりしそうですね.今後機能追加
することを考えてみます.
--
Tatsuo Ishii



pgsql-jp メーリングリストの案内