050921hatena

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