WINS-replication

提供:Samba-JP
ナビゲーションに移動検索に移動

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とモジュール

  1. perl
    5.6.0 以降が必要です。できれば5.8.x系が望ましいです。
  2. IO::Socket
    標準で添付されているはずです。
  3. Data::Hexdumper
    CPANからダウンロードしてください。バージョン1.2を使っています。
  4. 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 サーバでの実績はありません。


利用方法

サーバの設定

 利用方法は単純です。

  1. smb.confのwins hook = で指定した場所に winssend.pl を配置します。
  2. winslist.confに複製先のWINSサーバの情報を記述します。
  3. 複製先のSambaの設定をWINSサーバに変更します。
  4. 設定変更が終わったサーバを再起動します。

これでWINSの複製が出来るようになります。

クライアントの設定

 プライマリWINSサーバを、もともとのサーバに、複製先のWINSサーバを、 セカンダリのWINSサーバに設定します。

注意事項

サーバの動作について

  1. 2つのhostからのpush動作しか検証していません。それ以上のhostからの双方向 pushは検証していません。
  2. WINS登録が輻湊する場合、負荷がかかる場合があります。winssend.plの構造上、登録ごとにperlスクリプトが起動するからです。
  3. 障害時の動作は検証していません。

クライアントの動作について

  1. プライマリサーバが障害した場合、セカンダリサーバに登録されたものはどうなるか不明です。

その他

 winssendについては2006年のソフトウェアシンポジウムで論文が採択され、 発表を行ないました。本バージョンでは論文時(ver 0.02)から機能強化を行 なったものです。論文本体はNECのLinuxのページ( http://www.nec.co.jp/linux/topics070627.html)にあります。

 本件についてのお問い合わせは Samba-JP ML(samba-jp@samba.gr.jp)までお 願いします。

プログラム本体

media:Winssend015.zipです。

最新版(2007/07/16)は ver 0.15です。今のところこれ以上の改良は予定していません。