はてなの開発裏側見せます パート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 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます
© Copyright 2024 ExpyDoc