2010年6月24日

基盤技術

ヤフーにおけるパッケージ管理

  • このエントリーをはてなブックマークに追加

こんにちは、R&D統括本部 開発推進室 セキュリティプラットフォーム技術の戸田 薫です。

個人的に自宅では、 FreeBSD でよく遊んでいて、FreeBSDのパッケージ管理には、portsnap、portupgrade を利用していますが、ヤフーでは独自の方法で行われます。

その背景としてヤフーには、平均15億以上のPVを支えるためやサービスの付加価値のために何万台ものサーバがあり、サービスやシステムごとに大規模なシステムを構成する必要があるため、一般的なパッケージ管理システムよりもより柔軟で効率的なパッケージ管理が必要となっています。

今回は、ヤフーにおけるパッケージの管理についてご紹介します。


ヤフーインストーラ

ヤフーでは、開発環境から本番環境にindex.phpなどのファイルをscpして、公開用のディレクトリに置く、といったようなことはしていません。もし、そのようなことを手動で行っているとオペレーションの信頼性が乏しく、サービスの安定運用を保つのが難しくなります。

ヤフーでは、開発と運用の分離を行っており、開発者と運用者が異なります。そのため、開発者は、実際にサービスを行っている本番環境と呼ばれるサーバには、アカウントを所有しておらず、本番環境のパッケージや設定の変更は、運用者が行うことになっています。

開発者や運用者の入れ替えや効率などを考慮すると、一般化されていない方式でサーバのセットアップを行うことは、望ましくありません。そのために、ヤフーでは、独自のインストーラを利用して、システムのセットアップをしています。
インストールの作業をすべてパッケージ化することにより、ヒューマンエラーを極力なくし、運用者のスキルに依存することなく、セットアップの品質を一定にすることができます。

ヤフーインストーラは、ヤフーのすべてのエンジニアが必ず利用するもので、入社すると最初の技術研修で必ず講義を受けることになります。

ヤフーの Web サービスのほとんどは、共通の Web サービスに必要となるコアソフトウェアを利用しています。
ヤフーインストーラは、パッケージのインストールや管理、削除などを行うことができ、非常に多種多様な機能が実装されています。パッケージの構造は、FreeBSD の package に似ていて、それにヤフーインストーラの設定ファイルなどが追加されています。
多くの場合、プロセスの制御はヤフーインストーラを利用して行われます。
いろいろな設定を簡単にヤフーインストーラで変更することもできます。設定を変更するために、本番環境で運用者が sudo vi を実行して設定ファイルを編集することも基本的に推奨される行為ではありません。誰がどのように、いつ、設定を変更したのか、トラッキングすることが難しいことや、サービスによっては、数百台のサーバの設定の変更を矛盾なく、すべて正しく行うのは、容易なことではありません。
そのため、設定の変更を行う場合には、ヤフーインストーラのコマンドで設定の変更を行ったり、設定用パッケージを更新し、新しいパッケージをインストールするようにしています。

ヤフーインストーラは、インストーラの開発チームで日々改良を続けられています。
ヤフーインストーラは、Perlで書かれており、インストーラ自身、アップデート/ダウングレードすることが可能です。


自分でMakeしない

たいていの場合、ほとんどのソフトウェアをエンジニアがビルドすることはありません。
たとえば、 Apache や PHP といった良く使われるものは、ビルドしません。ヤフーで利用されているミドルウェア、コアライブラリなどもビルドしません。ビルドするとしたら、エンジニアがサービスために開発したソフトウェアだけです。
ほとんどのよく使われるパッケージは、すでにヤフーインストーラ用のパッケージがパッケージ配布サーバに用意されています。


ヤフーインストーラの利点

ヤフーのインストーラの利点は、

  • パッケージのバージョンの切り替えが容易にできる。
  • どこのマシンにどのバージョンのパッケージがインストールされているか把握できる。
  • パッケージの状態を簡単にロールバックできる。
  • 複数のサーバを同時にセットアップできる。
  • パッケージの一元管理ができる。
  • インストールの履歴が残る。
といったことが挙げられます。

社内では、よく「ヤフーのインストーラを使っているとバカになる」と言われたりします。
ヤフーのインストーラを使って生活をしていないとわからないことですが、つまり、非常に優秀なインストーラであるということです。


パッケージのメンテナンス

それぞれのパッケージは、それぞれの専門のチームで開発・メンテナンスされています。
そのため、サービス側は定期的に安定版のパッケージの更新と動作テストを行うだけで、Web サービスに必要なコアソフトウェアの問題や脆弱性の対応ができ、サービスの開発に集中できるのです。

共通で利用されるライブラリの多くは、基本的に C/C++ でライブラリを実装され、さまざまなプログラミング言語に提供されます。例えば、C/C++、PHP、Perl、Python、Java、Ruby などです。

FreeBSD の ports パッケージなどもヤフーでビルドを行い、ヤフーインストーラからインストール可能になっています。それらのパッケージも専門のチームによってメンテナンスされています。


パッケージの作成

パッケージを作成するには、まずパッケージの設定ファイルを書く必要があります。設定ファイルには、パッケージに含めるファイルや依存関係のあるパッケージ、cronなどの設定を指定できます。

ヤフーでは、バイナリのディレクトリ、ログのディレクトリ、PHPスクリプトのディレクトリ、htmlのディレクトリなどのインストール先のディレクトリが決まっており、その設定ファイルを元に、パッケージ作成の専用のコマンドでパッケージを作成することができます。
作成したパッケージは、パッケージ配布用のサーバにパッケージ配布用サーバの専用コマンドで登録します。当然、パッケージ作成コマンドもパッケージ配布サーバ用コマンドもパッケージで提供されています。すべてのOSのパッケージやFreeBSD、RedHatなどに限定したパッケージの作成が可能です。

パッケージの作成には、基本的にGNU Makeを利用しています。ヤフー用のMakeの設定ファイルがパッケージで用意されており、それをincludeすることで利用します。
内部的にパッケージ作成コマンドが利用され、環境にあったパッケージが作成されます。

サービスやプラットフォームを作る場合は、Webサービス用のPHPのスクリプトのパッケージやライブラリのパッケージ、管理アプリケーションのパッケージ、設定のパッケージなどの目的ごとに複数のパッケージを作るのが一般的です。ライブラリのパッケージは、ライブラリだけのパッケージとそのライブラリを利用して開発を行うための開発用パッケージ(Cなどのヘッダファイルなどを含んだパッケージ)を作成します。


パッケージのブランチ

パッケージには、ブランチという概念があり、stable、current、test などがあります。安定したパッケージをstableとし、最新のパッケージは、currentやtestブランチとして配布することが多いです。インストール時にどのブランチのパッケージをインストールするか、選択することができます。
バグフィックスや小さな変更であれば、current、大きな変更があれば、 test といった具合にブランチを使い分けています。
当然のことなのですが、安定運用のために stable のパッケージが好まれます。

私がメンテナンスしているパッケージのブランチを current から stable へ切り替えるときは、配布サーバに登録してからの期間や導入しているサーバ台数などを参考にして、変更しています。


パッケージ配布サーバ

パッケージは、パッケージ配布サーバから配信されてます。
ヤフーインストーラは、パッケージのインストール時にパッケージ配布サーバからパッケージの依存関係の情報を元に必要なパッケージをダウンロードして、インストールを行います。また、配布サーバのWebインターフェースからは、パッケージの検索やパッケージのドキュメント、bugの登録、ソースコードなどを探すことができ、非常に便利です。


パッケージをリリースするまでに

簡単にパッケージが本番環境に入るまでの流れを紹介します。


1. 開発者がソフトウェア開発を行う。
2. 開発者がパッケージを作成する。
3. 開発者が開発環境で作成したパッケージの動作確認・テストを行う。
4. 開発者がパッケージをパッケージ配布サーバに登録する。
5. 運用者は、新しいパッケージをステージングでテストする。
6. 運用者は、新しいパッケージを本番環境でテストする。

上記のような流れで、開発されたソフトウェアはパッケージ化され、本番へ導入されます。

私のチームでは、本番に反映する場合にも、より安全・安定したサービスを提供することを意識し、サービスやデータの整合性に影響が出ない場合には、新しいパッケージをインストールするときは、例えば9台あるうちの1台だけで実験的に本番投入を行います。数日程度、観察期間をおき、問題ないと判断した場合に、すべてのサーバに新しいパッケージを導入するといった形で、慎重に更新を行っています。


まとめ

以上のことは、ヤフーのパッケージ管理の概要になります。ヤフーのサービスを支えているパッケージは、何万個もあり、その豊富なリソースを利用して、サービスが日々開発されています。
このようにパッケージ作成環境、パッケージ配布の仕組み、パッケージのデータベースが整備されているヤフーは、非常に開発しやすい環境であると言えます。

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加