はてなの開発裏側見せますパート 3

27
©2005 株株株株株株株 株株株株 株株株株株株株株株株株 株株株株株株株 株株株株株株株株株株株株株株株 3 株株株 http://www.hatena.ne.jp/

description

はてなの開発裏側見せますパート 3. はてな http://www.hatena.ne.jp/. システム 構成. Hatena サーバー. 170 台ぐらい。 5 台 / 月増. Hatena システム構成図. Apache 2.0 reverse proxy. Apache 1.3 + mod_perl 1.29. Apache 1.3 + mod_perl 1.29. Apache 1.3 + mod_perl 1.29. Apache 2.0 / esehttpd. MySQL repli. MySQL repli. MySQL repli. - PowerPoint PPT Presentation

Transcript of はてなの開発裏側見せますパート 3

Page 1: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

はてなの開発裏側見せますパート 3

はてなhttp://www.hatena.ne.jp/

Page 2: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

システム構成

Page 3: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

Hatena サーバー

170 台ぐらい。

5 台 / 月増

Page 4: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

Hatena システム構成図

Apache 2.0 reverse proxy

Apache 1.3 + mod_perl 1.29

Apache 1.3 +mod_perl 1.29

Apache 1.3 +mod_perl 1.29 Apache 2.0 / esehttpd

MySQL repli MySQL repli MySQL repli

MySQLmaster

MySQLmaster

• はてなグループは Apache2 + mode_perl2 (Hatena2 フレームワーク )

• Hatena1 は Perl 5.6, Hatena2 は Perl 5.8

• MySQL レプリの方式はサービス毎に異なる• どのレプリに接続するか、レプリ / マスターの接

続の切り替えは Hatena::DataBase モジュールに実装

Page 5: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

Reverse Proxy

Apache2主に 2 つの役割

Static なコンテンツを返し、 Dynamic なコンテンツは mod_perl に転送 (mod_rewrite + mod_proxy)

ロードバランサーとしての役割memcached によるキャッシュシステム

vs Yahoo! アタックKeepAlive Onmod_deflate によるコンテンツ圧縮

Page 6: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

画像サーバ (Apache2 or esehttpd)

画像の返却は負荷が高いので専用サーバRAID + NFSApache2 or esehttpd奇跡の esehttpd

以降なぜか同じ設定でもパフォーマンスが出ない

lighttpd 検討中

Page 7: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

mod_perl サーバ

J2EE なんかでは Application Server (Servlet Container) に相当する箇所mod_perl 1.29 or mod_perl 1.99

2.0 は名前空間が ! (Apache2::*)KeepAlive Off

Page 8: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

MySQL

3.23.XX or 4.0.XX   (+ Senna)MySQL のレプリケーションで負荷分散

マスタはテーブル設計により工夫レプリ DB のデータは可能ならオンメモリで運用

Linux の tmpfsレプリケーションへのデータ振り分けはフレームワークで吸収

Select → スレーブ / Insert, Delete, Update → マスタ

IP ベースの振り分け雑多なデータも MySQL に。

NFS より安定したネットワークストレージ DB 台数増加中 ! やばいよやばいよ

Page 9: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

はてなと Perl

Page 10: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

Perl

すべて Perl ( 一部 C)Perl 5.6 or 5.8必要なら XS or SWIG で

MVC フレームワークでプログラマ間のコード差を吸収ある程度のコーディング規則

Emacs 使えとか ( 違 )Ruby もいいなあ ( ぼそ )

Page 11: はてなの開発裏側見せますパート 3

©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)

Page 12: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

Hatena Framework (1 or 2)mod_perl 上で動作する汎用フレームワーク

Apache

TransHandler

AccessHandler

Handler

EngineFactory

Engine

Function Function … PageMakerFactory

PageMaker

ContentMaker

ContentMaker …

Object OrientedPerl Module

Object(Diary)

Object(Keyword)

各種処理(あれやこれや)

HTML 生成( associate object )

Page 13: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

主な使用 CPAN モジュールApache::SessionApache::DBICGIDBIHTML::TemplateLWPData::PageStorableHTML::ParserTemplate-ToolkitHTML::StickyQueryHTML::ParserXML::RSS::LibXML

Email::Valid::LooseDigest::MD5HTML::FillInFormIPC::ShareLiteJcode / EncodeText::DiffWWW::RobotRulesGD::GraphGD::BarcodeHTML::MobileAgentHTML::Prototype

etc.

Page 14: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

はてなフレームワークの特徴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 マッピング

Page 15: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

処理の流れ

EngineFactory

Engine

PageMakerFactory

PageMaker

H::T or TT

Handler

Function

Function

Function

ContentMaker

ContentMaker

Page 16: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

フレームワークに関する余談

URI によるクラスマッピングURI を見ただけで変更箇所がわかる

RESTful なアプリケーションを作るのに有効Catalyst とかはこの辺の自由度が高すぎる

Rails はどうなんだろ ?

Page 17: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

Template-Toolkit

HTML::Template を使い続けてきたが、近頃は TT に以降

HTML::Prototype なんかも使いたいH::T は else if できない ( ; ´Д ` )

H::T::Expr は遅いfilter を自分たちで定義できる

Page 18: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

prototype.js

JavaScript を積極活用しつつあるprototype.js の採用

JavaScript のコードに均一性を持たせるために

Ajax などを楽に使うため

HTML::PrototypeH:P + TT イイ !

Page 19: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

XML 関連処理

( 半年前 ) XML モジュールは使わず速度重視で正規表現

月間 2 億 PV のサイトでは速度問題はシビアはてなは XML 系モジュールはほとんど使わず。

( 最近 ) XML::RSS::LibXML とか使ってるXML::FeedLibXML 実装は結構速いので現実的

Page 20: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

コミュニティへの還元

少しずつ取り組みつつありCPAN モジュール

HTML::AccountAutoDiscovery (naoya)CGI::Application::FastCGI (naoya)HTML::MobileConverter (jkondo)

Page 21: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

運用 / 開発体制

Page 22: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

利用ソフトウェア LAMP のみ (商用ソフトウェアなし )Linux + Apache + MySQL + Perl

外部サポート 利用していない

エンジニア人数 8 名。すべて開発兼運用。

監視方法 オープンソースソフトウェア + 自社開発ツール障害発生時は携帯電話で連絡

セキュリティ対策 自分たちで実施

ハードウェア パーツを調達して自作

オープンソース万歳

Page 23: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

yum サーバー

web server web server web server web server web server

タスク QueueDB

管理用サーバ

1. 管理者が自社開発の更新ツールから、更新したいモジュールやサーバーを指定する

CVS サーバ

2. 指定したタスクが Queue DB に保存される

3. 各アプリケーションサーバは cron で定期的に Queue DB を参照し、自分のタスクがないかを確認

4. タスクが見つかったらウェブサーバは CVS から最新のモジュールを取得し、自ら httpd を再起動する。

自社開発以外のソフトウェアは yum で定期的に自動更新

ソフトウェアの更新

Page 24: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

障害対応

Nagios で全ホスト監視障害があると携帯電話でメール通知就寝中にメール 50通とかも ... ( ; ´Д ` )

最小限の冗長化ホットスタンバイとかイラネバックアップは定期的な dump + レプリケー

ション障害があったときにいかに速くリカバリするか

Page 25: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

開発体制

社長含めエンジニア 8人 ( 増えたワア )

XP の良いとこどり朝から立ってミーティングソースが仕様書ペアプログラミング

しんどい所はペア、楽しいところはソロ朝に仕様決定、夕方リリース、夜に広報

はてなグループで情報共有

Page 26: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

紙でタスク管理

あしかペンディング そのうちやる すぐやる終わった

毎朝すぐやるをチェック やり忘れを防ぐ 連続的な成長に向いている

Page 27: はてなの開発裏側見せますパート 3

©2005 株式会社はてな  本資料の一部または全部の無断複製・転載を禁じます

移動オフィスと合宿座席フリーオフィス

早く出社したもの勝ち

週に 1回 図書館で仕事行きたい人だけ。

月に 1回合宿移動車の中で何をどう作るか会議意地でもアウトプットを出す