SlideShare uma empresa Scribd logo
1 de 43
Baixar para ler offline
サイボウズの
MySQL に対する取り組み
           サイボウズ株式会社 開発本部
           サイボウズ株式会社 開発本部
                   プロダクト開発部
                   プロダクト開発部
                 ガルーン開発グループ
                 ガルーン開発グループ
                     丹羽 純平
                     丹羽 純平
                     米川 健一
                     米川 健一
目次

ガルーン 2 とは?
     MySQLを使い倒したグループウェア

特徴と問題点
解決策 → 次期ガルーン
     全文検索を求めて
       Senna の取り込み
     スケーラビリティを求めて
      ガルーン 2 のスケールアウトについて
       DB/テーブル分割、クエリチューニング、キャッシュ




                                   2
ガルーン2とは?

 サイボウズのWebグループウェア
  http://garoon.cybozu.co.jp/
  300人以上の中規模でもOK
  つなガル、ひろガル、おてガル

 管理者もユーザもみんなが使いやすいグループウェア
   弊社のグループウェアは 7回連続顧客満足度1位




 MySQLを使い倒したグループウェア




                                3
ガルーン 2 の中身



             4
ポータル画面

                      各アプリケーションをアイコンで分かりやすく説明。
                      ワンクリックで目的の情報の場所に移動できます。


                            全社・所属部署・個人と目的や組織別
                            に自由にポータルを作成できます。
 当日、今週のスケジュールや
 天気がひと目でわかります。




                        グラフポートレットを使って
                        簡単にグラフ化。数字を
                        視覚的に表示できます。


                                   ≪企業ポータル画面≫

                  自分に関係があるすべての情報の新着や更新がトップペー
       ≪個人ポータル画面≫ ジに集ります。好みにあわせて、情報の表示位置を変え、仕
                  事のしやすい環境を作れます。
                                             5
スケジュール機能



           見たい予定の期間を選択できます。     予定はクリック操作だけ
                                で時間、メンバー、会議
                                室まですべて登録できま
                                す。




     所属部署のメンバや他部署
     の社員の予定、会議室や備
     品の予約まで一覧で把握で
                    予約登録時にメンバーや
     きます。
                    会議室の空き時間を確認
                    して、予定を調整できます。

                                          6
ガルーン2を支える技術


 CyDE2ーフレームワーク
   MySQL4+PHP4+Smarty




                        7
現行ガルーン2が抱える障壁

スケーラビリティの壁
 現行バージョンでは分間アクセス 1,500を上限

                        更なるスケールアップ

検索機能の壁
   現バージョンでは検索は LIKE のみ
   アクセス権の評価をするため、複雑なSQL処理が必要
     SELECT * FROM bulletin
     WHERE article LIKE ’%hoge%’ AND (アクセス権);

                       遅い・・・


                                                8
次期ガルーン


                          検索機能を求めて
 スケーラビリティを求めて

・DB分割                  ・Sennaの取り込み

・ユーザ単位でテーブル分割          ・MySQL+Senna
                           → Tritonnを利用
・キャッシュを活用(memcached)




                                          9
全文検索
全文検索
全文検索エンジン


 FAST
   インターネット



 Google Search Appliance
   イントラネット


                                Hit!
 Lucene, HyperEstraier, Senna
   アプリケーション
   オープンソース多数




                                  11
Senna

  組み込み用の高速全文検索エンジン
     MySQLやPostgreSQL、Ruby等に対応
         アプリ側から見たら、普通にMySQLを使用


  (有)未来検索ブラジルにおいて開発
  http://qwik.jp/senna/

  LGPL




                                 12
Tritonn (MySQL + Senna)

   MySQLのソースにパッチ
   MySQLの上位層がSennaを隠蔽


               My SQL                        FULLTEXTのINDEX
                                             の処理時にSennaが
     SQL文解析 → 最適化 → データ検索/格納                 使用される

                                patch
      MEMORY    Inno DB     MyISAM
                                        Senna
      (HEAP)



                          .MYD .MYI
               ibdata1
       RAM                              .sen.i

                            引用元 : http://qwik.jp/tritonn/about.html

                                                                  13
ガルーンの全文検索

検索機能
  「横串検索」
    ガルーン内の複数のアプリケーションを横断して検索




  「全文検索」
    ガルーン内に保存されたファイルの中身も検索
   (例:WordやExcelやPowerpointやpdfファイル)
       テキスト抽出フィルター
       TFライブラリ(データ変換研究所)を使用
       http://www.dehenken.co.jp/products/products-01/products-tf01.html

高速なアクセス権評価が必須
データとACL(アクセス制御リスト)のクローリング

                                                                           14
全文検索の構成




   データ収集エンジン                      検索エンジン
・クローラ →データとACL                   ・認証
・インデクサ→テキスト抽出フィルタ
                                 ・SQL実行
      →クロールしたデータの追加
       データの変更/削除


                             ×



                      設定画面




                                           15
データ収集エンジンの概観
                        Crawler



                          Data
                                            Indexer

                                            filter
                …                           filter
API
                                    Queue
                          ACL
                                                           MySQL
             acl_id,
                                            filter           +
GRN          uid list
                                                           Senna

              …
                          Data              filter    Use bulk transfer
  acl_id,
  uid list              Crawler

                                  クロール間隔やスレッド数は
                          ACL
                                  設定ファイルで変更可能

                                                                   16
検索エンジンの概観



                             Servlet
            画面作成
                   API
                         …
            GRN
                                       DB




  ・リモートサービス対応のため検索エンジンには直接アクセスできない。
  ・ガルーンを通じて検索サーバにアクセス

                                            17
検索 SQL 実行
        データテーブル                     ACL評価テーブル
title    data   acl_id   …          acl_id   uid
                                                   検索
                             +
                                                        スコア/日付で
                             JOIN
                                                          マージ

 掲示板
 select * from tab_grn_bulletin
 where (MATCH (title, data) AGAINST (‘hoge’) )
  ……

title    data            …
                acl_id              acl_id   uid
                                                   検索
                             +
                             JOIN

 社内メール
 select * from tab_grn_message
 where (MATCH (title, data) AGAINST (‘hoge’) )

                                                             18
ACL評価


    PIM系
    •UIDの比較
    •データテーブルをユーザ毎に用意


        共有系

    ・ACL評価テーブルにUIDが含まれているか?
    ・object単位でACLの評価を行うと高コスト
     →カテゴリ単位、フォルダ単位
    ・クロールされるデータには、ACL評価テーブルのIDが含まれる
    ・GRANTモデルでもREVOKEモデルでもOK



                                      19
プロトタイプ

 検索画面


         検索結果




            20
まとめ

 高性能全文検索機能
  Tritonn(=MySQL+Senna)
  お手軽、高速
  プロトタイプ完成


 Sennaの進化
  マルチセクション機能
  NGRAMの文字種分割の制御




                          21
ガルーン 2 のスケールアウトについて
ガルーン 2 のスケールアウトについて
現行ガルーン 2 スケーラビリティの壁


Webサーバーは複数台構成ができるが
DBサーバーはできない

分間1500アクセスを上限




                      23
現行ガルーン 2 の構成


               ロードバランサ




     WEBサーバ    WEBサーバ    WEBサーバ




                DBサーバ


          DBサーバーに負荷が集中


                                  24
壁を越えるために

 機能単位のDB分散
 クエリチューニング
 Memcachedの導入
 ユーザー単位のテーブル分割
 テーブル分割 + DB分散




                 25
スケールアウト後の構成


                          ロードバランサ




            WEBサーバ         WEBサーバ     WEBサーバ




Memcached    Memcached   Memcached




                  DBサーバ       DBサーバ   DBサーバ

                                               26
スケールアウト効果


 5,000 アクセス/分の利用頻度でも快適に動作
    →弊社ではWeb15台 / DB7台の構成で検証




サーバーを増やせば更に伸ばすことも可能
    →機能ごとの分割なので限界はある




                               27
レスポンスタイム(現行ガルーン 2)




レ
ス
ポ
ン
ス
タ            以降エラーしか返さない
イ
ム




             経過時間
                           28
スケールアウト後




レ
ス
ポ
ン
ス
タ
イ
ム




           経過時間
                  29
スループット


         スケールアウト後
         ガルーン 2.1.2

処
理
量




               経過時間
                      30
機能単位のDB分散


 負荷の高い機能のテーブルを別のDBに分散する


 ユーザー情報などの共通テーブルはマスタDBに配置してレプリ
 ケーションする


 共通テーブルの更新は常にマスタへ


 分散するアプリはインストール時に設定する
  → 運用中の変更は考慮しない



                                 31
マスタDB
                               共通テーブルへの更新
                  ユーザーテーブル
                   組織テーブル
                     …

                  レプリケーション
各アプリケーションへの
更新


      スケジュールDB                社内メールDB


                              ユーザーテーブル
      ユーザーテーブル
                               組織テーブル
       組織テーブル
                             社内メールテーブル
     スケジュールテーブル
          …                      …
                                         32
クエリチューニング


 スロークエリログに出現した遅いクエリを排除して
 レスポンスを上げる


 純粋なパフォーマンスチューニング
 - インデックスを追加 / 張り直す
 - 正しいインデックスを使うようにする
 - 非正規化




                           33
Memcachedの導入


 更新の少ないデータをキャッシュしてクエリの数を
 減らす


 複数のMemcachedサーバーを登録して負荷を分
 散できる


 ダウンしているMemcachedへのアクセスは自動で
 フェイルオーバーさせることができる


                              34
ユーザー単位のテーブル分割


 ユーザー毎のデータをテーブル分割
 - アプリケーションの通知, メール, etc…


 1テーブルに格納されるレコード数を減らす


 個人データの書き込み処理を分散




                            35
tab_grn_notification_notify
          _id               col_user        ….
          1                 100             ….
          2                 200             ….




tab_grn_notification_notfy___100       tab_grn_notification_notfy___200

    _id         ….                        _id      ….
    1           ….                        1        ….



                                                                      36
大量テーブルと参照性制約による弊害

 col_userはユーザーテーブルに参照性制約を
 設定している


 テーブルに対してクエリを実行すると
 子テーブルと子テーブルに参照性制約を
 設定しているテーブルを全て開こうとする


 MySQL起動後のそのテーブルに対する
 最初のクエリのみこの現象が起きる



                            37
ユーザーテーブル分割+DB分散


 分割したユーザー毎テーブルを更に別のDBへ
 分散する


 どのDBにどのユーザーのテーブルを
 配置するかは、ユーザーIDで範囲指定して設定する




                            38
例) ユーザーID1~1000のユーザーをhost1に
   ユーザーID1001~2000のユーザーをhost2に
       tab_grn_notification_notify
       _id                 col_user       ….
       1                   100            ….
       2                   200
       3                   1500           ….




                                                   host2
           host1
 tab_grn_notification_notfy___100     tab_grn_notification_notfy___1500
 tab_grn_notification_notfy___200
                                                                      39
その他のチューニング


 mod_phpに対応


 APCによるPHPスクリプトキャッシュ


 ログテーブルのエンジンをMyISAMに変更




                         40
まとめ


 アプリケーション単位でDBを分散して負荷を減らす


 クエリチューニングで重いクエリを排除する


 Memcachedを導入してクエリの数を減らす


 ユーザーごとのデータを分割して共通テーブルの
 負荷も分散する


                            41
今後の課題 / 展望

 複数ユーザーの個人データに対する更新処理の
 パフォーマンス
 分割により大量に作られるテーブルへの対策
   ユーザーごとの分割ではなく、1サーバーに1テーブルでよいかもしれない



 MySQL5.1のパーティショニング
 行ベースレプリケーション

 InnoDB 以外のストレージエンジンの検討



                                        42
ご清聴ありがとうございました。


http://cydn.cybozu.co.jp/


                            43

Mais conteúdo relacionado

Destaque

Redisととあるシステム
RedisととあるシステムRedisととあるシステム
Redisととあるシステム
Takehiro Torigaki
 
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったDatastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Masahiro Wakame
 
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
Insight Technology, Inc.
 
NoSQL勉強会
NoSQL勉強会NoSQL勉強会
NoSQL勉強会
Yuji Otani
 

Destaque (20)

Memcache Queue
Memcache QueueMemcache Queue
Memcache Queue
 
短期間で大規模なシンクラ環境を用意した話
短期間で大規模なシンクラ環境を用意した話短期間で大規模なシンクラ環境を用意した話
短期間で大規模なシンクラ環境を用意した話
 
情報技術者の社会的責任 第15話 (最終話)
情報技術者の社会的責任 第15話 (最終話)情報技術者の社会的責任 第15話 (最終話)
情報技術者の社会的責任 第15話 (最終話)
 
Redisととあるシステム
RedisととあるシステムRedisととあるシステム
Redisととあるシステム
 
Ajn24
Ajn24Ajn24
Ajn24
 
かしわざきの(あたまのおかしな)研究紹介
かしわざきの(あたまのおかしな)研究紹介かしわざきの(あたまのおかしな)研究紹介
かしわざきの(あたまのおかしな)研究紹介
 
情報技術者の社会的責任 2014 第2回
情報技術者の社会的責任 2014 第2回情報技術者の社会的責任 2014 第2回
情報技術者の社会的責任 2014 第2回
 
過去と未来の災害シナリオを用いた耐災害性を検証・評価するためのネットワークエミュレータの実装
過去と未来の災害シナリオを用いた耐災害性を検証・評価するためのネットワークエミュレータの実装過去と未来の災害シナリオを用いた耐災害性を検証・評価するためのネットワークエミュレータの実装
過去と未来の災害シナリオを用いた耐災害性を検証・評価するためのネットワークエミュレータの実装
 
情報技術者の社会的責任 2014 第3回
情報技術者の社会的責任 2014 第3回情報技術者の社会的責任 2014 第3回
情報技術者の社会的責任 2014 第3回
 
JANOG35 ネットワーク災害訓練 BoF
JANOG35 ネットワーク災害訓練 BoFJANOG35 ネットワーク災害訓練 BoF
JANOG35 ネットワーク災害訓練 BoF
 
PHPのキャッシュを使いこなせ!
PHPのキャッシュを使いこなせ!PHPのキャッシュを使いこなせ!
PHPのキャッシュを使いこなせ!
 
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったDatastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
 
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
 
情報技術者の社会的責任 第1話
情報技術者の社会的責任 第1話情報技術者の社会的責任 第1話
情報技術者の社会的責任 第1話
 
NoSQL勉強会
NoSQL勉強会NoSQL勉強会
NoSQL勉強会
 
SmartNewsのニュース配信を支えるサーバ技術 / Kazhiro Sera @ SmartNews,Inc. #jjug_ccc
SmartNewsのニュース配信を支えるサーバ技術 / Kazhiro Sera @ SmartNews,Inc. #jjug_cccSmartNewsのニュース配信を支えるサーバ技術 / Kazhiro Sera @ SmartNews,Inc. #jjug_ccc
SmartNewsのニュース配信を支えるサーバ技術 / Kazhiro Sera @ SmartNews,Inc. #jjug_ccc
 
技術的特異点より向こうの世界
技術的特異点より向こうの世界技術的特異点より向こうの世界
技術的特異点より向こうの世界
 
メールシステムのおはなし #Mailerstudy
メールシステムのおはなし #Mailerstudyメールシステムのおはなし #Mailerstudy
メールシステムのおはなし #Mailerstudy
 
AWSの進化とSmartNewsの裏側
AWSの進化とSmartNewsの裏側AWSの進化とSmartNewsの裏側
AWSの進化とSmartNewsの裏側
 
障害を防ぎ、サービスを守るために #gotandapm
障害を防ぎ、サービスを守るために #gotandapm障害を防ぎ、サービスを守るために #gotandapm
障害を防ぎ、サービスを守るために #gotandapm
 

Cy Dn 20070912 My Sql Users Conf Japan 2007