第三回 ライブドア・テクニカルセミナーに行ってきた
livedoor Techブログ : 第三回 ライブドア・テクニカルセミナーのお知らせに行ってきました。
内容が濃くてメモしきれないところもあったのですが載せておきます。
「クラウド時代のWebストレージ/データベース戦略」
- ライブドアが求めるストレージは?
- 実装
- CAP定理
- Consistency(一貫性), Availability(可用性), Partition Tolerance(ネットワーク分断の耐性)の3つのうちどれか一つを捨てなければいけないというのがある
- 今回は、一貫性を捨てている。物理的には一貫性が崩れている瞬間があるけれどもそこを捨てている
- テーブル構成
- mod_stf_storage.c
- GET/PUT/DELETEメソッドを受け付けてファイルの読み書き
- GETはdefault-handlerまかせ
- PUTはRecursiveにディレクトリを作成
- 同一ファイル名での上書きはできない
- 更新は一回消して内部的には別ファイルを作成
- Queue
- Storage管理用のWebIF
- Catalystベース
- 機能
- ストレージの追加
- サーバをセットアップしてWebIFから追加
- 利用状況の確認
- ストレージのモード切り替え
- ストレージの追加
- 画像加工はImlib2かImageMagickから選べる
- Squidにキャッシュしている
- 現在運用されている状況
- 20TB〜30TBは用意されていて、運用されているのが10数TB
- 1TB/月くらいで増える
「ライブドア流クラウド的サービス」
- 仮想化技術の選定
- ソーシャルアプリ向けに開発した
- 実装
- LVSのサーバの性能は?
- 250台くらいまでは大丈夫だそう。
- 課金形態は話し合い中
- 同じ顧客のインスタンスは同じところに作らないポリシーにする
- フルマネージドホスティングをベースにして、自動化できるところを自動化するというポリシー
「livedoor Readerの新機能とは?」
- 新機能の紹介
- livedoor streaming API
- フィードの更新情報をリアルタイムで取得するAPI
- 外部ドメインでも普通に動く
- 非公開フィードの記事はでない
- ストリーミング、といっても、Readerがクロールしたタイミングにはなる
- livedoor Blog Tumblr Feedburner PubSubHubbub使ってるフィードはほぼ瞬時に出てくる
- Q4m
- TokyoTyrant
- Nginx
- Streaming APIのフロントエンドとして利用
- long-pollコネクション可
- Plack
- そろそろnginx + Plackに変えたい
- Coro AnyEvent
- MySQL
- Perl 5.8.7
- Q4M
- memcachedの代わりにTokyoTyrant
- HashDB7台
- Coroで作られたDOSツール
- 大量のコネクションを張ってテストするのに使っている
- 処理の内容
- Brocker
- クロール対象をキューに入れる
- cronで1分置きに起動
- このとき必要なデータをMemcachedに入れる
- Fetcher
- Parallel::PreforkとClass::Triggerつかっている
- daemontoolsで管理
- 一定件数処理したら死ぬように作っている
- Coroを使って並列処理をしている。1プロセスで50~100(HTTPDのコネクション)くらい。
- レスポンスが遅いものがあってもクローラが遅れないようにしている
- Parser
- XML::LibXMLとXML::Liberal+独自
- 独自、というのは、巨大フィードを途中で中断するなど
- feedburner.origLink保存するなど
- 一番CPUパワーに依存する処理
- 並列数増やしても意味がない
- XML::LibXMLとXML::Liberal+独自
- Updater
- DBの処理速度に依存
- 1台あたり10程度
- Brocker
- 記事の振り分け
- SKIP
- INSERT
- UPDATE
- SILENT_UPDATE
- ちょっとしか更新されてない
- 一定文字数意外更新されたもののみ
- フィードごとに既出フラグを保存している
- 既出フラグの保存をmemcached→TokyoTyrantに移行
- このとき、ストレージとネットワークIOの節約のため、既出フラグをfeedごとにまとめた。
- フラグだけで5億件!→180万件に減った
- XMLとしては変化しているが記事は変更されていないケースが実は非常に多いことが判明
- 配信元サーバがコメントで書かれてるとか
- lastBuildDateがアクセス日時になってるとか
- 独自のネームスペースにアクセス回数やコメント数が含まれているとか
- そこで前回のパース結果をTokyoTyrantに保存
- 前回更新時のフィードに含まれていた記事は既出の記事である
- Parserの段階で不要な記事にはSkipFlagをつける
- updaterキューへの送信数が半減
- Async::Queue
- クライアント側は書けませんでしたごめんなさい><