はてな http://www.hatena.ne.jp/ はてなの開発裏側見せますパート3 はてな http://www.hatena.ne.jp/
システム構成
Hatena サーバー 170台ぐらい。 5台/月増
Hatena システム構成図 Apache 2.0 reverse proxy Apache 1.3 + mod_perl 1.29 Apache 2.0 / esehttpd MySQL repli MySQL repli MySQL repli はてなグループは Apache2 + mode_perl2 (Hatena2フレームワーク) Hatena1は Perl 5.6, Hatena2 は Perl 5.8 MySQLレプリの方式はサービス毎に異なる どのレプリに接続するか、レプリ / マスターの接続の切り替えは Hatena::DataBase モジュールに実装 MySQL master MySQL master
Reverse Proxy Apache2 主に2つの役割 memcached によるキャッシュシステム KeepAlive On Staticなコンテンツを返し、Dynamicなコンテンツはmod_perl に転送 (mod_rewrite + mod_proxy) ロードバランサーとしての役割 memcached によるキャッシュシステム vs Yahoo! アタック KeepAlive On mod_deflate によるコンテンツ圧縮
画像サーバ (Apache2 or esehttpd) 画像の返却は負荷が高いので専用サーバ RAID + NFS Apache2 or esehttpd 奇跡の esehttpd 以降なぜか同じ設定でもパフォーマンスが出ない lighttpd 検討中
mod_perlサーバ J2EEなんかでは Application Server (Servlet Container) に相当する箇所 mod_perl 1.29 or mod_perl 1.99 2.0 は名前空間が! (Apache2::*) KeepAlive Off
MySQL 3.23.XX or 4.0.XX (+ Senna) MySQLのレプリケーションで負荷分散 マスタはテーブル設計により工夫 レプリDBのデータは可能ならオンメモリで運用 Linux の tmpfs レプリケーションへのデータ振り分けはフレームワークで吸収 Select → スレーブ / Insert, Delete, Update → マスタ IPベースの振り分け 雑多なデータも MySQL に。 NFSより安定したネットワークストレージ DB台数増加中! やばいよやばいよ
はてなとPerl
Perl すべて Perl (一部 C) MVCフレームワークでプログラマ間のコード差を吸収 ある程度のコーディング規則 Perl 5.6 or 5.8 必要なら XS or SWIG で MVCフレームワークでプログラマ間のコード差を吸収 ある程度のコーディング規則 Emacs 使えとか(違) Ruby もいいなあ (ぼそ)
cperl-mode 用 .emacs (autoload 'perl-mode "cperl-mode" "alternate mode for editing Perl programs" t) (setq cperl-auto-newline t) (setq cperl-indent-parens-as-block t) (setq cperl-close-paren-offset -4) (setq cperl-indent-level 4) (setq cperl-label-offset -4) (setq cperl-continued-statement-offset 4) (setq cperl-highlight-variables-indiscriminately t)
HTML生成 (associate object) Hatena Framework (1 or 2) mod_perl上で動作する 汎用フレームワーク HTML生成 (associate object) Object (Diary) Object (Keyword) Content Maker Content Maker … PageMaker 各種処理(あれやこれや) Function Function … PageMaker Factory Object Oriented Perl Module Engine Engine Factory Trans Handler Access Handler Handler Apache
主な使用 CPAN モジュール Apache::Session Apache::DBI CGI DBI HTML::Template LWP Data::Page Storable HTML::Parser Template-Toolkit HTML::StickyQuery XML::RSS::LibXML Email::Valid::Loose Digest::MD5 HTML::FillInForm IPC::ShareLite Jcode / Encode Text::Diff WWW::RobotRules GD::Graph GD::Barcode HTML::MobileAgent HTML::Prototype etc.
はてなフレームワークの特徴 MVCフレームワークの Model と Controller 継承をベースにしたフレームワーク Model View は HTML::Template or TT 継承をベースにしたフレームワーク e.g Hatena2::Bookmark::Bookmark extends Hatena2::TableObjectOO e.g Hatena2::Bookmark::PageMakerEdit extends Hatena2::PageMaker Model O/Rマッピング Hatena2::List Hatena2::TableObject or Hatena2::TableObjectOO M と C, V は完全に切り離されているので、Class::DBI とかも使おうと思えば使える。(使わないけど) Controller Engine - PageMaker の二階層 Plug-In 方式でのロジック追加 URI/Classマッピング
処理の流れ Handler EngineFactory Function Engine Function Function PageMakerFactory PageMaker ContentMaker ContentMaker H::T or TT
フレームワークに関する余談 URIによるクラスマッピング RESTful なアプリケーションを作るのに有効 Catalyst とかはこの辺の自由度が高すぎる Rails はどうなんだろ?
Template-Toolkit HTML::Templateを使い続けてきたが、近頃はTTに以降 HTML::Prototype なんかも使いたい H::T は else if できない (;´Д`) H::T::Expr は遅い filter を自分たちで定義できる
prototype.js JavaScript を積極活用しつつある prototype.js の採用 HTML::Prototype Ajax などを楽に使うため HTML::Prototype H:P + TT イイ!
XML関連処理 (半年前) XMLモジュールは使わず速度重視で正規表現 (最近) XML::RSS::LibXML とか使ってる 月間2億PVのサイトでは速度問題はシビア はてなはXML系モジュールはほとんど使わず。 (最近) XML::RSS::LibXML とか使ってる XML::Feed LibXML 実装は結構速いので現実的
コミュニティへの還元 少しずつ取り組みつつあり CPANモジュール HTML::AccountAutoDiscovery (naoya) CGI::Application::FastCGI (naoya) HTML::MobileConverter (jkondo)
運用/開発体制
オープンソース万歳 利用ソフトウェア LAMP のみ (商用ソフトウェアなし) Linux + Apache + MySQL + Perl 外部サポート 利用していない エンジニア人数 8名。すべて開発兼運用。 監視方法 オープンソースソフトウェア + 自社開発ツール 障害発生時は携帯電話で連絡 セキュリティ対策 自分たちで実施 ハードウェア パーツを調達して自作
ソフトウェアの更新 yumサーバー 自社開発以外のソフトウェアは yum で定期的に自動更新 web server web server 3. 各アプリケーションサーバは cron で定期的に Queue DB を参照し、自分のタスクがないかを確認 タスクQueue DB CVSサーバ 2. 指定したタスクが Queue DB に保存される 4. タスクが見つかったらウェブサーバは CVS から最新のモジュールを取得し、自ら httpd を再起動する。 管理用サーバ 1. 管理者が自社開発の更新ツールから、更新したいモジュールやサーバーを指定する
障害対応 Nagios で全ホスト監視 最小限の冗長化 障害があると携帯電話でメール通知 就寝中にメール50通とかも... (;´Д`) ホットスタンバイとかイラネ バックアップは定期的な dump + レプリケーション 障害があったときにいかに速くリカバリするか
開発体制 社長含めエンジニア8人(増えたワア) XP の良いとこどり はてなグループで情報共有 朝から立ってミーティング ソースが仕様書 ペアプログラミング しんどい所はペア、楽しいところはソロ 朝に仕様決定、夕方リリース、夜に広報 はてなグループで情報共有
紙でタスク管理 あしか ペンディング そのうちやる すぐやる 終わった 毎朝すぐやるをチェック やり忘れを防ぐ 連続的な成長に向いている
移動オフィスと合宿 座席フリーオフィス 週に1回 図書館で仕事 月に1回合宿 早く出社したもの勝ち 行きたい人だけ。 移動車の中で何をどう作るか会議 意地でもアウトプットを出す