440 likes | 630 Views
はてなの開発 / 運用体制. 株式会社はてな 伊藤 直也. お話したいこと. はてなブックマークのシステム概要 ソフトウェア ハードウェア LVS はてなの開発体制. はてなブックマーク. はてなブックマークの数字. 66,000 ユーザー del.icio.us 30 万人 ( 被買収時点 ) digg 60 万人 (2006.10 時点 ) サーバー 30 台強 開発者 1 + 数名 LAMP. LVS. proxy. proxy. 通常のリクエスト. bot / feed. 画像 API etc. MP. 他サービス.
E N D
はてなの開発/運用体制 株式会社はてな 伊藤 直也
お話したいこと • はてなブックマークのシステム概要 • ソフトウェア • ハードウェア • LVS • はてなの開発体制
はてなブックマークの数字 • 66,000 ユーザー • del.icio.us 30万人 (被買収時点) • digg 60万人 (2006.10時点) • サーバー30台強 • 開発者 1 + 数名 • LAMP
LVS proxy proxy 通常のリクエスト bot / feed 画像API etc. MP 他サービス LVS slave master
ソフトウェア • Linux 2.6 (FC4) • Perl / Ruby • LVS • Apache 2.2 / 2.0 • rev proxy (mod_proxy_balancer) • app server (mod_perl) • memcached • MySQL 4.0 • MyISAM
そのほか • Subversion • Capistrano • Nagios • Observer (自社開発)
Perl • Perl 5.8 • CPANモジュールは自由に • Capistranoでまとめてインストール
はてなフレームワーク • M + C • V は基本TT / H:T:Pro (JSON / YAML) • mini httpd (server.pl) • スケルトンジェネレータ • DI • Pluggable
Hatena Framework HTML生成(associate object) Content Maker Content Maker … PageMaker 各種処理(あれやこれや) Function Function … PageMaker Factory Object Oriented Perl Module Engine Engine Factory Trans Handler Access Handler Handler Apache
Model - Hatena2::TableObject • ORM + Array like Ruby my $bookmarks = App::Bookmark->search( where => ["name = ?", 'naoya'], order => 'id desc', with => 'entry', ); print $bookmark->collect(sub { $_->entry->url })->join("\n");
はてなフレームワークの公開? • やろうやろうと思ってたら時期を逃した
Ruby • Ruby • Rails • dRuby • ブックマークの一部機能 • はてなセリフ • はてなSNS
JavaScript / ActionScript • JavaScript部 • prototype.js (老) • MochiKit (若) • Flash重要 • flvプレイヤーとか • 2.0 時代の...
低レベル層 • C / C++ • Apache modules • XS modules • 自社開発のツール、ミドルウェア
Perlにこだわるか? • 技術を一つに絞る利点よりも、幅が広がることにより得られるメリットが大きい • フレームワークの普及などにより人材の交換コストは昔ほど高くない • Perlプログラマは Ruby が嫌じゃないけど Ruby 厨は Perl が嫌
Capistrano • ベリー便利 % ruby bookmark/script/switchtower -e users shell cap> uptime [establishing connection(s) to ...] [192.168.0.XXX] 13:35:20 up 121 days, 5:10, 1 user, load average: 1.89, 1.65, 1.09 [192.168.0.XXX] 13:35:20 up 121 days, 5:12, 1 user, load average: 1.88, 1.40, 0.89 [192.168.0.XXX] 13:35:19 up 121 days, 5:08, 1 user, load average: 1.98, 1.40, 0.90 [192.168.0.XXX] 13:35:20 up 109 days, 13:54, 1 user, load average: 1.53, 1.33, 0.90 [192.168.0.XXX] 13:35:22 up 121 days, 5:18, 1 user, load average: 1.41, 1.47, 1.15 [192.168.0.XXX] 13:35:20 up 109 days, 13:52, 1 user, load average: 1.88, 1.43, 0.93 command finished cap> ps auxw | grep httpd | wc -l [192.168.0.XXX] 26 [192.168.0.XXX] 31 [192.168.0.XXX] 25 [192.168.0.XXX] 27 [192.168.0.XXX] 27 [192.168.0.XXX] 29 command finished
監視 • Observer • like Plagger • Notify::IRC • Notify::Mail • Nagios • nagios-bot • POE
ハードウェア#2 • サーバーが増えてきた (300台弱) • データセンター引越し • さくらインターネットへ
LVSって? • Linux Virtual Server • ipvs • Linuxカーネル組み込みのロードバランサ • ipvsadm
LVS (ipvsadm) % sudo /sbin/ipvsadm -Ln -t 192.168.2.9:3306 Password: Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.2.9:3306 lc -> 192.168.0.43:3306 Route 1 0 370 -> 192.168.0.158:3306 Route 1 1 369 -> 192.168.1.31:3306 Route 1 2 362 -> 192.168.1.9:3306 Route 1 2 367 -> 192.168.1.17:3306 Route 1 1 256
LVS + keepalived • keepalived • LVS の冗長化 (VRRP) • Real Serverの稼動監視 • ipvs のフロントエンド
LVS + keepalived図 ACTIVE BACKUP VRRP ipvs + keepalived#1 ipvs + keepalived#2 TCP CHECK Real Server#1 Real Server#2 Real Serve#3
LVS++ • DSR (Dynamic Server Return) も可能 • バランシングアルゴリズムもいろいろ • lc (least connection) • 負荷がほとんどない
DSR クライアント 1 VIP LVS 3 2 RIP Real Server
keepalived++ • 2台LVSを用意すればどっちかが壊れても勝手に自動復帰できる (VRRP) • Real Server が死んでも勝手にバランサから外してくれる • Real Server のチェックは自前のスクリプトでも可能
LVS-- • いくつかのソフトを組み合わせて使うので操作を覚えるのが面倒 (難しくはない) • ipvsadm • keepalived • iptables • DSR してるとネットワークパケットの動きが特殊なのでちゃんと理解してないとはまる • Martian Source 問題
MySQLの手前にLVS • スレーブ群への振り分けをLVSに任せる • http://d.hatena.ne.jp/naoya/20060901/1157109663
メリット#1 • Perl側から見るとDB群が大きなスレーブ群に見える (Flickr の中の人も言っていた) • PerlがLVS以外のアドレスを知らなくていい • DBの追加/削除をアプリケーションを考慮せずに可能 • ウェブアプリケーションの再起動必要なし
メリット#2 • 負荷にあわせて分散できる • 分散アルゴリズム色々 • うちでは lc or wlc (wlc は重み付けを加えられる) • Perl から MySQL の負荷を低コストに知るのはおそらく難しい
メリット#3 • 故障したリアルサーバーを確実に切り離せる • Perl でやるとアプリケーションと稼動監視が切り離せてないため、予想しない問題が起こりやすい • LVSの品質は高い
メリット#4 • Perlに依存しない • 仮に Ruby やそのほかの言語から接続する場合でも振り分けのロジックは気にしなくて良い
使用感 • 便利、丈夫 • メンテナンスコストが下がった • サーバー構成の変更に強くなった • ノウハウは結構必要 • ネットワーク周りではまりがち • 今のところ商用製品要らず • 普通にzshとvimでメンテとかできて◎
開発者と企画者 • 開発者が企画/運用 • 新しいことの正しさは本人にしか分からない • 苦手なことは人の手を借りられる • デザイン • ユーザインタフェース • ハードウェア、負荷分散
開発者のモチベーション • 新しい機能を思いついたらおもむろに • でかい機能は合宿などで • 重い腰をあげられるかどうかがすべて • 不具合などは見つけたら直す • Web App • はてなアイデア • "自分の頭で考えろ"
生産性を高めよう • 会議less • フリーアドレス • デュアルモニタ購入サポート • ノートPC (ポケット1個の法則) • 自宅オフィス / 離れオフィス • 休日選択制 (水 or 土) • 20%ルール • g.hatena.ne.jp + IRC
サービス開発者の哲学 • 正しいことはあなたにしか分からない。 • それが正しいかどうかは自分の手で証明する • Show us the CODE • 自分の頭で考える。自分を信じる。 • 半年続けると流行るの法則。継続は力。 • 「はてならしさ」 • スルー力なんて要らない。
まとめ • 最近のシステム構成を紹介しました。 • 日々改善しております。 • ソフトでがんばるのでも結構いけます。 • LVS は激しくおすすめです。 • プログラマのモチベーションは会社の原動力です。