CDN 対応ミラーの設定
Debian JP Project では、1 つのサーバがダウンしただけで APT によるパッケージのダウンロードができなくなるといった障害に対処するため、複数の Debian ミラーサーバを仮想的に集約して耐障害性を持たせる CDN (Contents Delivery Network) 化を進めています。CDN ミラーには、次の APT リポジトリでアクセスできます (詳細)。
deb http://ftp.jp.debian.org/debian/ lenny main contrib non-free deb-src http://ftp.jp.debian.org/debian/ lenny main contrib non-free
(※lenny 以外にも、Debian 公式ミラーで提供されている stable、testing、unstable、etch、squeeze、sid、experimental といった名前も利用できます)
ミラー参加を検討しているサイトのために、本ドキュメントでは、Debian ミラーの構築方法と、CDN への追加方法を説明します。
前提条件
安定したミラーを構築するにあたっては、いくつかの条件があります。これらが満たされていないと、ユーザに十分なサービスを提供することができません。CDN への加盟にあたっては、次の条件があります。
- Debian のフルミラーであること。 つまり、ftp.debian.org で公開されているものと同様に、すべてのアーキテクチャ、膨大なすべてのファイルを格納する必要があります。
- push ミラーであること。詳細は後述しますが、上流ミラーが更新を完了したタイミングでシグナルを送り、それを受けてミラーを行うようにします。こうすることで、上流がまだ更新中なのにミラーを行って APT の整合性を壊した状態にしてしまったり、上流のハードウェアクラッシュを受けて一緒にミラーを失ってしまったりといった事態を回避しやすくなります。
- Debian のミラーは HTTP (Web サーバ) で提供されており、Web ブラウザから見て /debian ディレクトリの下にあること。エイリアスや rewrite モジュールなどを使ってもかまいません。ただし、HTTP リダイレクトヘッダは APT ツールが対応していないので利用できません。FTP サービスは提供しなくてもかまいません。rsync サービスは提供できるとベターですが、必須ではありません。
また、ミラーにあたっては、次の条件を満たしていることが要求されます。
- 大容量ディスク: ミラーをするために何よりも必要なのは、大きなディスクです。現時点 (2010年6月) でフルミラーには 520GB 程度を消費しており、将来見込まれる増加を前提とすると最低でも 1TB 以上のクラスのディスク容量が必要になります。ミラーするアーテキクチャを絞ればディスクの消費は抑えられますが、本ドキュメントでは CDN の一員とするための条件であるフルミラーを行うものとします。RAID は必須ではありませんが、ディスク障害によってミラーが消失すると、復旧に時間がかかることになります。
- 安定した広帯域ネットワークと堅固なハードウェア: ミラーとなったサーバには、(CDN では分散されるとはいえ) 多数のディスクアクセスおよびネットワークアクセスが発生することになります。特に rsync で上流ミラーに追従する最中は、短時間のうちに多量のアクセスが起こり、高負荷になります。たとえば安価な NAS のようなものではこの負荷に対処しきれず、頻繁なクラッシュが起きる可能性もあります。管理チームでは、x86 アーキテクチャのように十分に枯れたものを推奨しています。
- Unix OS: 基本的には、rsync と Web サーバが動作すれば OS は特に問いません (実際、Debian GNU/Linux を使っていない Debian ミラーもいくつかあります)。でも、Debian ならきっと簡単ですよ :)
- 十分な実メモリ: rsync および Web サーバ (通常は Apache) は、実メモリを多量に消費します。管理チームの経験では、最低でも 512MB、できれば 1GB 以上のメモリを塔載しているのが望ましいと思われます。
- 外部からの SSH アクセス: このドキュメントの手順で推奨する push ミラーを実現するためには、外部からの SSH アクセスを許可するよう設定しなければなりません。基本的には上流ミラーからミラーを開始するよう送られる「シグナル」を何らかの形で受け取れさえすればよいので、上流ミラーだけにアクセスを許可して、またシェルログインを与える必要もありません。SSH 以外のシグナル (たとえば指定の Web ページにアクセスしたり自動処理メールを送ったりするなど) を使うことも理論上はできますが、現時点では要求する声もないので本ドキュメントでは扱いません。
- 信頼できる連絡・管理責任者: ミラーのほぼすべての作業は自動で行われますが、まれに障害・事故で手動の作業が要求されることがあります。気付かないうちにディスクがいっぱいになっているということもあるでしょう。そのようなとき、理事会または管理チームから連絡が必要になりますが、誰に聞いたらよいのかわからないというのは困ります。また、Debian ミラーの整合性は APT の機構によってひとまず守られているとは言えますが、ファイルを汚染されたりすることのないよう、ミラーサーバ上のユーザ管理は厳密にお願いいたします。
ミラーの設定
Debian ミラーを構成するには、まず anonftpsync スクリプトで rsync によるミラーを行います。
- サーバの適当なディレクトリに anonftpsync をダウンロードして配置します。たとえば /home/ftpadm/bin/anonftpsync とします。ミラーを行うユーザは専用の (あまり権限のない) ものを作ったほうがよいでしょう。
- このファイルを編集します。
- TO: Debian ミラーを配置するディレクトリ。たとえば /var/www/debian。ミラーを実行するユーザが書き込める必要があります
- RSYNC_HOST: Debian 上流ミラー。たとえば ftp1.debian.or.jp。push ミラーサービスを開始するにあたってどの上流を選ぶべきかは理事会または管理チームに問い合わせてください。最初の時点では手近なミラーでかまいません。
- RSYNC_DIR: 上流ミラーで公開されている Debian ミラーの名前。通常は debian/
- LOGDIR: ミラーログを置くディレクトリ。たとえば /home/andy/logs。ミラーを実行するユーザが書き込める必要があります
- ARCH_EXCLUDE: 除外するアーキテクチャ。フルミラーのためには空のままにしておきます
- EXCLUDE: 除外するファイル。フルミラーのためには空のままにしておきます
- MAILTO: ログを送付するアドレス。長大ですし、通常は空でよいでしょう
- rsync、 procmail、debianutils をインストールしておきます。procmail はミラーの動作自体には必須ではないのですが、ミラー中であることを示すロックファイルを作成するのに lockfile コマンドをスクリプト内で使っています。procmail を入れられない場合には、スクリプト内で lockfile を呼び出している箇所を別のコマンドで置き換える必要があります。debianutils もミラーの動作には影響しませんが、ログファイルのローテーションのために savelog コマンドをやはりスクリプトの最後で実行しています。
- Debian の CD や DVD があるなら、ミラーディレクトリにコピーしておくと、ダウンロード時間を一部軽減できます。
- anonftpsync を実行します。LOGDIR で指定したディレクトリにログが書き込まれるので、tail -f /home/andy/logs/debian-mirror.log のようにしてうまくダウンロードできているか監視するのがよいでしょう。
- anonftpsync での rsync ミラーは 2 回行われます。最初にパッケージプールの pool/ ディレクトリへの追加ミラーが行われ、そのあとにパッケージ情報ファイルを格納する dists/ ディレクトリの更新と、上流で削除されたファイルの削除が行われます。こうすることで、パッケージ情報にはあるのにプールにファイルがないという事態を避けられます。
- 上流からミラーがうまくできたことを確認したら一段落です。Web サーバ経由で http://サーバ名/debian/ でミラーを参照できる (つまり、http://サーバ名/debian/dists/stable のように参照できる) ようにしておきましょう。
push ミラー化する
前述の方法で上流からミラーを引っ張ってくる (pull) ことはできるようになりましたが、いつ上流の更新のミラーを行うかという問題があります。だいたいのアタリを付けて cron で定期的に実行するという方法もありますが、上流で何か不具合があったときにはその影響を被ってしまいます。push ミラーは、上流が自身のミラーの完了後に下流に向けてシグナルを送り (push)、これを受けて初めて下流がミラーを開始するというものです (下図を参照)。

シグナルには、SSH アクセスが一般的に用いられています。上流のミラーユーザの SSH 公開鍵 (理事会または管理チームに尋ねてください) をサイト上のミラーユーザの認証済み鍵リング (~/.ssh/authorized_keys) に加え、この鍵でのアクセスを受けたときに anonftpsync を起動する、というように設定します。
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/home/ftpadm/bin/anonftpsync &" ssh-rsa AB12....2vIg== ftpadm@hp.debian.or.jp
上流からシグナルの送信テストを行い、ミラースクリプトが起動することを確認します。あとは、マスターサーバでの更新が発生するごとに順にシグナルとミラーの波及が行われるようになります。
ちなみにシグナルを送る側は、次のように記述した signal.sh を用意し、
#!/bin/sh echo Signalling $1 ssh -4 -2 -o"BatchMode yes" -o"user $2" "$1" -i $HOME/.ssh/id_dsa_push-mirror sleep 1 < /dev/null > /dev/null 2>&1 (ここでは秘密鍵には~/.ssh/id_dsa_push-mirrorを使っている)
これを anonftpsync の最後で呼び出すだけです。
savelog $LOGFILE /home/ftpadm/bin/signal.sh ftp.example.jp ftpadmin (下流ミラーのftp.example.jpのユーザftpadminにシグナルを送る)
CDN に加盟する
ここまでできたら、あとは CDN に加盟するだけです。CDN は、DNS サーバを使ったラウンドロビンの一種ですが、重み付けを設定し、加盟サイトの生存確認も行うことで、耐障害性が高く負荷も分散されたダウンロードサービスを提供します (下図を参照)。

push ミラー構築後、理事会に連絡してください。重み付けの設定のため、あなたの提供できる帯域についての情報も付加していただけると助かります。連絡を受けた管理チームは、あなたのミラーを CDN のネットワークに追加します。「host cdn.debian.or.jp」で DNS 問い合わせを実行し、あなたのサーバが加わっていることを確認してください。
その他
ロボットによる絨毯爆撃的なアクセスなどへの対処は、ミラー担当者のローカルアクセスポリシーに基いて随時設定を行ってかまいません。広範囲な拒否設定を行う場合には、理事会および管理チームに一報していただければ幸いです。
