[pgcluster: 645] FreeBSDで repllicationサーバのゾンビが残る

Masayuki Ookubo ookubo @ kme.co.jp
2005年 1月 11日 (火) 18:58:24 JST


はじめまして、大窪と申します。

自社内のシステムをPostgreSQLを使ったWebベースのシステムで構築しており、
それに負荷分散、及びレプリケーション機能を追加することを検討しています。
先日より、PGClusterのWebサイトからpgcluster-1.0.8のフルパッケージ版を
ダウンロードして試してしましたが、導入とその他の問題が少しありましたので
ご教授戴ければ幸いです。

[環境]
1.全体構成
  クラスタサーバ×3、レプリケーションサーバ×1
2.各システムの構成
  クラスタ1(マスタ)
   OS: FreeBSD4.10-STABLE
   CPU: Intel(R) Pentium(R) 4 CPU 2.80GHz (2800.11-MHz 686-class CPU)
   real memory  = 1056899072 (1032128K bytes)
  クラスタ2
   OS: FreeBSD4.2-RELEASE
   CPU: Pentium III/Pentium III Xeon/Celeron (1365.77-MHz 686-class CPU)
   real memory  = 50331648 (49152K bytes)
  クラスタ3
   OS: FreeBSD4.10-STABLE
   CPU: Intel(R) Pentium(R) 4 CPU 2.80GHz (2800.11-MHz 686-class CPU)
   real memory  = 1056899072 (1032128K bytes)
  レプリケーション
   クラスタ3のマシンに同居

  導入したpgclusterのバーション
   全てpgcluster-1.0.8のフルパッケージ版
   (pgcluster-1.0.8.tar.gz)

[報告事項と問題点]
1.FreeBSDでコンパイルエラー
2.GENERICカーネルでの問題
3.pgreplicateがゾンビプロセスとして残る?

1.FreeBSDでコンパイルエラー
 ダウンロードしてきたソースを展開してINSTALL_PGCLUSTERに従いコンパイル
するとエラーとなりました。これは

[pgcluster: 577]
http://ml.postgresql.jp/pipermail/pgcluster/2004-October/000576.html

でも報告されていますが$source_dir/src/pgcluster/pglb/pool_params.cの
#include <time.h> の行を #include <sys/time.h> とすることで解決しました。
また、2005-01-07にアップれさたpgcluster-1.0.8bのソースも同じでしたので
ご報告させて頂きます。
(pgcluster-1.0.8bのコンパイルはしていませんが・・・)


2.GENERICカーネルでの問題
 これらのマシンは全てGENERICカーネルでテストし、クラスタサーバや
レプリケーションサーバを設定後最初に問題が発生したため、同じような
ことではまって先に進めない場合のための防備録的なものとしてご報告致します。
過去のログを検索しても同じパターンの報告が見られなかった(見つけられなかった?)
だけなので、他の人には問題がないのか、または既知の問題かも知れませんが。

・問題点
 レプリケーションサーバの起動ができていなかった。
  しかし、1回目の起動後psコマンドで確認したときにはプロセスが確認できたため
  問題ないと思い込んでいた。一度レプリケーションサーバを停止&起動しなおすと
  psでも確認できなくなった。
・原因
 セマフォ領域の獲得に失敗していた模様
 起動失敗時のpgreplicateのデバックログは次の通り
%/usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/etc -n -v
DEBUG:/usr/local/pgsql/etc/pgreplicate.sts open ok

DEBUG:PGR_Get_Conf_Data ok
DEBUG:LoadBalanceTbl allocate ok
DEBUG:PGRset_Conf_Data():CascadeTbl shmget ok
DEBUG:PGRset_Conf_Data():CascadeTbl shmat ok
DEBUG:PGRset_Conf_Data():CascadeInf shmget ok
DEBUG:PGRset_Conf_Data():CascadeInf shmat ok
DEBUG:PGRset_Conf_Data():CommitLog shmget ok
DEBUG:PGRset_Conf_Data():Commit_Log_Tbl shmat ok
ERROR:PGRset_Conf_Data():semget() failed. (No space left on device)
ERROR:main():PGRset_Conf_Data error

・対応
 カーネルの再構築が必要だった。
情報を探して参考にする。(参考にした情報が古いですが)
[pgsql-jp 14078] Re: FreeBSD v3.4 におけるKernel再構築について
を見て、現在の状態の確認

%pstat -T
106/12328 files
0M/1999M swap space

%ipcs -M
shminfo:
        shmmax: 33554432        (max shared memory segment size)
        shmmin:       1 (min shared memory segment size)
        shmmni:     192 (max number of shared memory identifiers)
        shmseg:     128 (max shared memory segments per process)
        shmall:    8192 (max amount of shared memory in pages)

%ipcs -S
seminfo:
        semmap:     30  (# of entries in semaphore map)
        semmni:     10  (# of semaphore identifiers)
        semmns:     60  (# of semaphores in system)
        semmnu:     30  (# of undo structures in system)
        semmsl:     60  (max # of semaphores per id)
        semopm:    100  (max # of operations per semop call)
        semume:     10  (max # of undo entries per process)
        semusz:     92  (size in bytes of undo structure)
        semvmx:  32767  (semaphore maximum value)
        semaem:  16384  (adjust on exit max value)

何も考えずまねる。レプリケーションサーバのカーネルに下記のオプションを
付けて再構築。
        options		SEMMAP=41
        options		SEMMNI=39
        options		SEMMNS=150

再構築後の状態確認

%ipcs -S
seminfo:
        semmap:     41  (# of entries in semaphore map)
        semmni:     39  (# of semaphore identifiers)
        semmns:    150  (# of semaphores in system)
        semmnu:     30  (# of undo structures in system)
        semmsl:    150  (max # of semaphores per id)
        semopm:    100  (max # of operations per semop call)
        semume:     10  (max # of undo entries per process)
        semusz:     92  (size in bytes of undo structure)
        semvmx:  32767  (semaphore maximum value)
        semaem:  16384  (adjust on exit max value)

この後、レプリケーションサーバ、クラスタサーバの順で立上げると
レプリケーションができるようになりました。
起動手順はPGClusterのWebサイトの起動/停止手順を参照。


3.pgreplicateがゾンビプロセスとして残る?
 現在、この問題があって解決方法を探しております。
これらの解決方法等情報がありましたらご教授願います。
また、この環境の各confファイルを末尾に記述致します。

・状態
 これまでに記述した環境で、各クラスタサーバのコマンドラインから
psqlを起動してデータ更新等のテストを行なっていますが、色々とテストを
行なっているうちに、レプリケーションサーバが稼動しているマシンの
プロセスを確認するとゾンビプロセスが残ってしまう様子です。
詳しい状況が判らなくて申し訳ないのですが。

以下はテスト中のプロセスの状態
%ps ax | grep pgreplicate
  332  p0  S+     0:00.02 /usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/etc -n -v
  333  p0  I+     0:00.00 /usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/etc -n -v
  345  p0  S+     0:00.01 /usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/etc -n -v
  346  p0  Z+     0:00.00  (pgreplicate)
  359  p0  S+     0:00.01 /usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/etc -n -v
  438  p0  Z+     0:00.00  (pgreplicate)
  458  p0  Z+     0:00.00  (pgreplicate)
  494  p0  Z+     0:00.00  (pgreplicate)
  517  p0  S+     0:00.00 /usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/etc -n -v

これらのプロセスはクラスタサーバを全て停止後も残っています。
%ps ax | grep pgreplicate
  332  p0  S+     0:00.02 /usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/etc -n -v
  333  p0  S+     0:00.00 /usr/local/pgsql/bin/pgreplicate -D /usr/local/pgsql/etc -n -v
  345  p0  Z+     0:00.00  (pgreplicate)
  346  p0  Z+     0:00.00  (pgreplicate)
  359  p0  Z+     0:00.00  (pgreplicate)
  438  p0  Z+     0:00.00  (pgreplicate)
  458  p0  Z+     0:00.00  (pgreplicate)
  494  p0  Z+     0:00.00  (pgreplicate)
  517  p0  Z+     0:00.00  (pgreplicate)

レプリケーションサーバを停止後は全てのプロセスがなくなりました。

#
# cluster.conf
#
 Host_Nameは実際の設定とは変更しています。
 各クラスタサーバの設定はHost_Nameのみ異なります。

<Replicate_Server_Info>
	<Host_Name> claster1.postgres.jp </Host_Name>
	<Port> 8777 </Port>
	<Recovery_Port> 7778 </Recovery_Port>
</Replicate_Server_Info>
#-------------------------------------------------------------
<Recovery_Port> 7779 </Recovery_Port>
<Rsync_Path> /usr/local/bin/rsync </Rsync_Path>
<Rsync_Option> ssh -1 </Rsync_Option>
<When_Stand_Alone> read_only  </When_Stand_Alone>

#
# replicate.conf
#

<Cluster_Server_Info>
    <Host_Name>  claster1.postgres.jp   </Host_Name>
    <Port>        5432                </Port>
    <Recovery_Port>       7779        </Recovery_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
    <Host_Name>  claster2.postgres.jp  </Host_Name>
    <Port>        5432                </Port>
    <Recovery_Port>       7779        </Recovery_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
    <Host_Name>  claster3.postgres.jp  </Host_Name>
    <Port>        5432                </Port>
    <Recovery_Port>       7779        </Recovery_Port>
</Cluster_Server_Info>
#-------------------------------------------------------------
<Replication_Port>    8777            </Replication_Port>
<Recovery_Port>       7778            </Recovery_Port>


// 久米電気株式会社 大窪将介
// E-mail	ookubo @ kme.co.jp




pgcluster メーリングリストの案内