Top Banner
株式会社ドワンゴ 吉村総一郎(@sifue) Solr@ニコニコ生放送
23

20121126 Solr@ニコニコ生放送

May 25, 2015

Download

Technology

第9回Solr勉強会
http://atnd.org/events/33718
で発表した内容
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 20121126 Solr@ニコニコ生放送

株式会社ドワンゴ 吉村総一郎(@sifue)

Solr@ニコニコ生放送

Page 2: 20121126 Solr@ニコニコ生放送

ニコニコ生放送とは

Page 3: 20121126 Solr@ニコニコ生放送
Page 4: 20121126 Solr@ニコニコ生放送

2007年12月にニコニコ動画に追加されたライブストリーミングサービス

動画に流れるコメントをつけられる

公式放送、チャンネル放送、ユーザー生放送があり、一日に約10万番組(大体30分枠)が放送中

Page 5: 20121126 Solr@ニコニコ生放送

10/17にバージョンQをリリース(ニコ生のトップはひどい叩かれようだった...)

要求の高いユーザー、ニコ厨(ヘビーユーザ)と生主(生放送者)が独自の文化感を醸成

自分も生主の一人

Page 6: 20121126 Solr@ニコニコ生放送

自己紹介

Page 7: 20121126 Solr@ニコニコ生放送

吉村 総一郎 (@SIFUE)

twitter、github、はてなのidはsifue

2012年4月ドワンゴ入社 (担当:検索、tweetまとめ、Qトップの一部)

前職では製造業向けシステムのサーバーサイド等

やってきた順: Jackrabbit→Lucene→Solr(600GBのMSOfficeファイルとか)→ニコ生のSolr

Page 8: 20121126 Solr@ニコニコ生放送

ニコ生のSolr担当者が入れ替わり退職していた...

その方をtwitterでfollowすることからスタート

今日の話は、後で資料や環境を調べたりIRCログから発掘して判明した情報です☆(ゝω・)vキャピ

Page 9: 20121126 Solr@ニコニコ生放送

ニコニコ生放送における要件

Page 10: 20121126 Solr@ニコニコ生放送

問題として、検索精度、レスポンス、各種ソートがない、などがあった (残念ながら当時はGoogleの方が...)

要件は放送開始後1分以内にひっかかること

とにかく高速なインデックス更新が必要

だいたい1年ぐらいかけて少しずつ移行 (%, 部分)

元々MySQL + Sennaだった

Page 11: 20121126 Solr@ニコニコ生放送

キーワード検索

マイナス, AND, OR検索

放送中、放送予定、放送終了での区分け

タグ検索、タグ絞込み

コミュニティ毎のグループ化

各種ソート

放送日時範囲指定

機能

Page 12: 20121126 Solr@ニコニコ生放送

モジュール: Solr/Lucene3.4.0, jetty-7.5.0.v20110901

マスター(1台 - 更新のみ) - スレーブ(2台)構成

リプリケーションはSolrの機能を利用

この構成は、スレーブ格上げ・追加がやりやすく可用性高い

元々は分散インデクスを実装していたが、ボトルネックがDBからのデータ収集にあったことや、不具合で断念

Master (write-only)

Slave (read-only) Slave (read-only)

SolrReplication

2core 8G mem構成

Page 13: 20121126 Solr@ニコニコ生放送

過去の全ての公式番組の番組情報と1週間でできる70万番組の番組情報 (更新は多いが全量は少ない)

1番組あたり1kb~10kb程度のテキストを持つ

更新頻度の高い情報に「来場者数」と「コメント数」がある

✕ 700,000

インデックス対象

Page 14: 20121126 Solr@ニコニコ生放送

基本はバッチ処理で作成。大量の番組更新・削除情報はWebサーバー(AP)から情報を一旦Redisに積んでそれを利用。

インデックス作成タイミング

AP

AP

Redis

batch(PHP) Solr

DB

DB

Page 15: 20121126 Solr@ニコニコ生放送

アナライザ

トーカナイザはインデックス更新速度優先で、solr.CJKTokenizerFactoryをそのまま利用

フィルタは、solr.HTMLStripCharFilterFactoryとお手製の正規化フィルタのみ

無論Bi-gramなので、「FF」とか「DQ」に弱い。そこはタグ情報を付加してしのいでいる

Page 16: 20121126 Solr@ニコニコ生放送

1日のSELECTリクエスト

ピーク時で40QPS程度 (iPhone, Android等含む)

スレーブ2台の2コア割当でロードアベレージは、ピーク時で8程度でなんとかなんとか

分刻み

Page 17: 20121126 Solr@ニコニコ生放送

1日のUPDATEリクエスト

ピーク時は80QPSの更新 (番組作成・更新・削除)

1番組のテキストが多くて5000文字程度で小さい

マスターのロードアベレージはピークでも0.2程度で余裕あり

分刻み

Page 18: 20121126 Solr@ニコニコ生放送

簡単に今のパフォーマンスを紹介しましたが、実はここに至るまで壮絶な失敗があったようでした...

自作分散インデクシングが高負荷状態でCPU100%になったり、メモリリークしたり

特定のテキストでお手製Filterが無限ループ

ボット・クローラー対策

結局最後は、非常にシンプルな構成に→これがいいのかも

Page 19: 20121126 Solr@ニコニコ生放送

開発環境用意のための工夫

Page 20: 20121126 Solr@ニコニコ生放送

Jettyのマルチテナント機能を利用した単一Jettyサーバーへの30近いsolr環境構築

検索はDBと結合してるので、個人の開発DBの数だけ環境用意が大変、仮想イメージ配るのも大変、Jetty立てまくりも大変

リクエスト送ると自動でインスタンスを作るサーバーを作ってマルチテナントを用意。jarの更新も1箇所でOK。

Solr Solr Solr Solr

Solr Solr Solr

jar/warMulti tenancy

Create overlay.xml

Sinatra(Ruby)Hot deploy

Developer

Request

… …

Developer

Developer

Developer

DB

DB

DB

DB

Page 21: 20121126 Solr@ニコニコ生放送

今後

インデックス作成のCPUに余裕があるのでkuromojiやgosenを使った形態素解析に移行したい...が。台湾語や英語サイトも立ち上がっておりこういうのどうしてるのか聞きたい。(単漢字とか。)

データ収集の方にボトルネックがあるのでむしろそちら側の改善をやっていく予定。

Page 22: 20121126 Solr@ニコニコ生放送

以上ご清聴ありがとうございました

Page 23: 20121126 Solr@ニコニコ生放送

質疑応答