WINS-replication
SambaにおけるWINSサーバ複製機能の実装
概要
Samba Samba2.x~3.x では、winsの複製が出来ません。これは、 winsの複製に必要なプロトコルが公開されていないからです。Sambaでは、認証 サーバ本体をPDC/BDCとして多重化することは出来ますが、winsサーバの複製が 出来ないために、PDCが障害した場合には、名前解決でトラブルを生じる場合が あります。 PDCのクラスタ化を行なえば、自動的にWINSサーバも複製が出来るため、問題 はありませんが、高価なクラスタ化ソフトウェアが必要となります。 そこで、Sambaの機能を使って、限定的にWINS情報の複製を行なう方法を考案 してみました。このソフトは、この機能を実現するものです。
なお、このソフトをベースにした後継が、osstechの佐藤氏により wins-push.pl として[ここに]公開されています。
動作の基本
MicrosoftによるWINSデータの複製は、push/pull 型で行なわれます。すなわち、 あるサーバに登録されたWINSデータは、そのサーバから別サーバに送りつけること も、別のサーバの情報を定期的に取得しに行くことも、どちらも可能です(双方向 レプリケーション)。この機能を実現するためには、かなりめんどくさい 同期プロトコルが必要となります。そのかわり、もよりのWINSサーバに情報を 登録するだけで、全部のWINSサーバに情報が伝達するという利便性があります。
双方向レプリケーションの実装は難しく、Sambaそのものでもまだ実現は されていません。そこで、winssend.plは、pull型の同期を諦め、push型の同期 のみに絞ることで、機能を縮小してはいますが、WINS情報の複製を可能にしました。
また、WINS情報をpushするための仕組みとして、送り込むプログラムの他に、 Sambaのwins hook 機能を使います。このため、wins hook が実装されている バージョンのSamba(2.2系列、3.0系列)であれば、本体の改造無しにWINS情報の 複製が可能です。従って、ディストリビューション中のSambaをそのまま使う ことが可能です。
実現方法
基本的な考え方
SambaはWINSの登録やリフレッシュ、削除があるたびごとに、wins hook で 定義されたプログラムを呼び出す機能を持っています。本来この機能は、DNSとの 連携を目的としていたものですが、この機能を使って、他のWINSサーバに情報を 送りつけることで、WINS情報の複製を行なっています。 具体的には、wins hook で渡されたパラメータを元に、WINS登録のためのパケット を作成し、他のWINSサーバに送ります。 作成するパケットは、RFC1001とRFC1002で定義されていますので、入力データ を元に組み立てています。WINSサーバにクライアントが名前を登録したときの パケットとは微妙に違いますが、要は名前登録さえできてしまえばいいので、 あまり細かなところまでは考慮していません。
双方向レプリケーション
ver 0.02 までは片方向レプリケーションしか出来ませんでした。ある1つのマスタ となるwinsサーバを立ち上げておいて、ここから他のwinsサーバに対してデータを 配信することしか出来ませんでした。
ver 0.13からは双方向(pushのみ)のレプリケーションが出来るようになりました。 それぞれのwinsサーバにwinssend.plを設定することで、互いに他のwinsサーバに 対してデータを供給できるようになりました。ただ、そのままでは他のwinsサーバか ら登録要求があったデータもwinssend.plを起動して、また他のwinsサーバにデータを 送り込んでしまいます。そこで、winssend.plでは自分自身が所属しているネットワー ク以外からのデータは送り出さないようにしています。これで、winsデータの白山羊 さん黒山羊さん問題を解決できます。
準備作業
winssend.pl を使うためにはいくつかの準備が必要です。
perlとモジュール
- perl
- 5.6.0 以降が必要です。できれば5.8.x系が望ましいです。
- IO::Socket
- 標準で添付されているはずです。
- Data::Hexdumper
- CPANからダウンロードしてください。バージョン1.2を使っています。
- File::Log
- CPANからダウンロードしてください。バージョン1.0.2を使っています。
smb.confの設定
winssend.pl はwins hook機能を使います。そのため、winssend.pl を smb.conf の wins hook で設定します。たとえば、
wins hook = /etc/samba/winssend.pl
と記述します。
winssend.conf の設定
winssend.conf には、WINS情報を送り込みたいWINSサーバを設定します。 たとえば以下のように記述します。
wins list = 1.2.3.4 [2.3.4.5 ...]
サーバはIPアドレスで記述します。複数のサーバを記述するときは空白 で分離します。
winssend.plの設定
Ver 0.02 ではwinssend.confおよびログファイルの場所を指定する部分を 個別に設定する必要があります。既定値では、Red Hat 系のLinuxにあわせて あります。
相手側のWINSサーバ
WINS情報を複製する先のWINSサーバが必要です。Sambaの場合、smb.conf で、
wins support = yes
と設定してください。なお、Windows サーバでの実績はありません。
利用方法
サーバの設定
利用方法は単純です。
- smb.confのwins hook = で指定した場所に winssend.pl を配置します。
- winslist.confに複製先のWINSサーバの情報を記述します。
- 複製先のSambaの設定をWINSサーバに変更します。
- 設定変更が終わったサーバを再起動します。
これでWINSの複製が出来るようになります。
クライアントの設定
プライマリWINSサーバを、もともとのサーバに、複製先のWINSサーバを、 セカンダリのWINSサーバに設定します。
注意事項
サーバの動作について
- 2つのhostからのpush動作しか検証していません。それ以上のhostからの双方向 pushは検証していません。
- WINS登録が輻湊する場合、負荷がかかる場合があります。winssend.plの構造上、登録ごとにperlスクリプトが起動するからです。
- 障害時の動作は検証していません。
クライアントの動作について
- プライマリサーバが障害した場合、セカンダリサーバに登録されたものはどうなるか不明です。
その他
winssendについては2006年のソフトウェアシンポジウムで論文が採択され、 発表を行ないました。本バージョンでは論文時(ver 0.02)から機能強化を行 なったものです。論文本体はNECのLinuxのページ( http://www.nec.co.jp/linux/topics070627.html)にあります。
本件についてのお問い合わせは Samba-JP ML(samba-jp@samba.gr.jp)までお 願いします。
プログラム本体
最新版(2007/07/16)は ver 0.15です。今のところこれ以上の改良は予定していません。