[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 メーリングリストの案内