1 / 27

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

はてなの開発裏側見せますパート 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.

Télécharger la présentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. はてなの開発裏側見せますパート3 はてな http://www.hatena.ne.jp/

  2. システム構成

  3. Hatena サーバー 170台ぐらい。 5台/月増

  4. 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 • はてなグループは Apache2 + mode_perl2 (Hatena2フレームワーク) • Hatena1は Perl 5.6, Hatena2 は Perl 5.8 • MySQLレプリの方式はサービス毎に異なる • どのレプリに接続するか、レプリ / マスターの接続の切り替えは Hatena::DataBase モジュールに実装 MySQL master MySQL master

  5. Reverse Proxy • Apache2 • 主に2つの役割 • Staticなコンテンツを返し、Dynamicなコンテンツはmod_perl に転送 (mod_rewrite + mod_proxy) • ロードバランサーとしての役割 • memcached によるキャッシュシステム • vs Yahoo! アタック • KeepAlive On • mod_deflate によるコンテンツ圧縮

  6. 画像サーバ (Apache2 or esehttpd) • 画像の返却は負荷が高いので専用サーバ • RAID + NFS • Apache2 or esehttpd • 奇跡の esehttpd • 以降なぜか同じ設定でもパフォーマンスが出ない • lighttpd 検討中

  7. mod_perlサーバ • J2EEなんかでは Application Server (Servlet Container) に相当する箇所 • mod_perl 1.29 or mod_perl 1.99 • 2.0 は名前空間が! (Apache2::*) • KeepAlive Off

  8. MySQL • 3.23.XX or 4.0.XX(+ Senna) • MySQLのレプリケーションで負荷分散 • マスタはテーブル設計により工夫 • レプリDBのデータは可能ならオンメモリで運用 • Linux の tmpfs • レプリケーションへのデータ振り分けはフレームワークで吸収 • Select → スレーブ / Insert, Delete, Update → マスタ • IPベースの振り分け • 雑多なデータも MySQL に。 • NFSより安定したネットワークストレージ • DB台数増加中! やばいよやばいよ

  9. はてなとPerl

  10. Perl • すべて Perl (一部 C) • Perl 5.6 or 5.8 • 必要なら XS or SWIG で • MVCフレームワークでプログラマ間のコード差を吸収 • ある程度のコーディング規則 • Emacs 使えとか(違) • Ruby もいいなあ (ぼそ)

  11. 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)

  12. Hatena Framework (1 or 2) • mod_perl上で動作する汎用フレームワーク HTML生成(associate object) Object (Keyword) Object (Diary) Content Maker Content Maker … PageMaker 各種処理(あれやこれや) Function Function … PageMaker Factory Object Oriented Perl Module Engine Engine Factory Trans Handler Access Handler Handler Apache

  13. Apache::Session Apache::DBI CGI DBI HTML::Template LWP Data::Page Storable HTML::Parser Template-Toolkit HTML::StickyQuery HTML::Parser 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. 主な使用 CPAN モジュール

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

  15. 処理の流れ Handler EngineFactory Engine Function Function Function PageMakerFactory PageMaker ContentMaker ContentMaker H::T or TT

  16. フレームワークに関する余談 • URIによるクラスマッピング • URIを見ただけで変更箇所がわかる • RESTful なアプリケーションを作るのに有効 • Catalyst とかはこの辺の自由度が高すぎる • Rails はどうなんだろ?

  17. Template-Toolkit • HTML::Templateを使い続けてきたが、近頃はTTに以降 • HTML::Prototype なんかも使いたい • H::T は else if できない (;´Д`) • H::T::Expr は遅い • filter を自分たちで定義できる

  18. prototype.js • JavaScript を積極活用しつつある • prototype.js の採用 • JavaScript のコードに均一性を持たせるために • Ajax などを楽に使うため • HTML::Prototype • H:P + TT イイ!

  19. XML関連処理 • (半年前) XMLモジュールは使わず速度重視で正規表現 • 月間2億PVのサイトでは速度問題はシビア • はてなはXML系モジュールはほとんど使わず。 • (最近) XML::RSS::LibXML とか使ってる • XML::Feed • LibXML 実装は結構速いので現実的

  20. コミュニティへの還元 • 少しずつ取り組みつつあり • CPANモジュール • HTML::AccountAutoDiscovery (naoya) • CGI::Application::FastCGI (naoya) • HTML::MobileConverter (jkondo)

  21. 運用/開発体制

  22. オープンソース万歳

  23. ソフトウェアの更新 yumサーバー 自社開発以外のソフトウェアは yum で定期的に自動更新 web server web server web server web server web server 3. 各アプリケーションサーバは cron で定期的に Queue DB を参照し、自分のタスクがないかを確認 タスクQueue DB CVSサーバ 2. 指定したタスクが Queue DB に保存される 4. タスクが見つかったらウェブサーバは CVS から最新のモジュールを取得し、自ら httpd を再起動する。 管理用サーバ 1. 管理者が自社開発の更新ツールから、更新したいモジュールやサーバーを指定する

  24. 障害対応 • Nagios で全ホスト監視 • 障害があると携帯電話でメール通知 • 就寝中にメール50通とかも... (;´Д`) • 最小限の冗長化 • ホットスタンバイとかイラネ • バックアップは定期的な dump + レプリケーション • 障害があったときにいかに速くリカバリするか

  25. 開発体制 • 社長含めエンジニア8人(増えたワア) • XP の良いとこどり • 朝から立ってミーティング • ソースが仕様書 • ペアプログラミング • しんどい所はペア、楽しいところはソロ • 朝に仕様決定、夕方リリース、夜に広報 • はてなグループで情報共有

  26. 紙でタスク管理 • あしか • ペンディング • そのうちやる • すぐやる • 終わった • 毎朝すぐやるをチェック • やり忘れを防ぐ • 連続的な成長に向いている

  27. 移動オフィスと合宿 • 座席フリーオフィス • 早く出社したもの勝ち • 週に1回 図書館で仕事 • 行きたい人だけ。 • 月に1回合宿 • 移動車の中で何をどう作るか会議 • 意地でもアウトプットを出す

More Related