cy dn 20070912 my sql users conf japan 2007

43
サイボウズの MySQL に対する取り組み サイボウズの MySQL に対する取り組み サイボウズ株式会社 開発本部 プロダクト開発部 ガルーン開発グループ 丹羽 純平 米川 健一 サイボウズ株式会社 開発本部 プロダクト開発部 ガルーン開発グループ 丹羽 純平 米川 健一

Upload: cydncybozucojp

Post on 31-Jul-2015

3.758 views

Category:

Technology


3 download

TRANSCRIPT

サイボウズのMySQL に対する取り組みサイボウズのMySQL に対する取り組み

サイボウズ株式会社 開発本部プロダクト開発部

ガルーン開発グループ

丹羽 純平

米川 健一

サイボウズ株式会社 開発本部プロダクト開発部

ガルーン開発グループ

丹羽 純平

米川 健一

2

目次

ガルーン 2 とは?

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

特徴と問題点

解決策 → 次期ガルーン

全文検索を求めて

Senna の取り込み

スケーラビリティを求めて

ガルーン 2 のスケールアウトについて

DB/テーブル分割、クエリチューニング、キャッシュ

3

ガルーン2とは?

サイボウズのWebグループウェア

http://garoon.cybozu.co.jp/

300人以上の中規模でもOK

つなガル、ひろガル、おてガル

管理者もユーザもみんなが使いやすいグループウェア

弊社のグループウェアは 7回連続顧客満足度1位

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

4

ガルーン 2 の中身

5

ポータル画面

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

当日、今週のスケジュールや天気がひと目でわかります。

自分に関係があるすべての情報の新着や更新がトップページに集ります。好みにあわせて、情報の表示位置を変え、仕事のしやすい環境を作れます。

全社・所属部署・個人と目的や組織別に自由にポータルを作成できます。

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

≪個人ポータル画面≫

≪企業ポータル画面≫

6

スケジュール機能

見たい予定の期間を選択できます。

所属部署のメンバや他部署の社員の予定、会議室や備品の予約まで一覧で把握できます。

予定はクリック操作だけで時間、メンバー、会議室まですべて登録できます。

予約登録時にメンバーや会議室の空き時間を確認して、予定を調整できます。

7

ガルーン2を支える技術

CyDE2ーフレームワーク

MySQL4+PHP4+Smarty

8

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

スケーラビリティの壁

現行バージョンでは分間アクセス 1,500を上限

更なるスケールアップ

遅い・・・

検索機能の壁

現バージョンでは検索は LIKE のみ

アクセス権の評価をするため、複雑なSQL処理が必要

SELECT * FROM bulletin WHERE article LIKE ’%hoge%’ AND (アクセス権);

9

次期ガルーン

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

・Sennaの取り込み

・MySQL+Senna → Tritonnを利用

・DB分割

・ユーザ単位でテーブル分割

・キャッシュを活用(memcached)

全文検索全文検索

11

全文検索エンジン

FAST

インターネット

Google Search Appliance

イントラネット

Lucene, HyperEstraier, Senna

アプリケーション

オープンソース多数

Hit!

12

Senna

組み込み用の高速全文検索エンジン

MySQLやPostgreSQL、Ruby等に対応

アプリ側から見たら、普通にMySQLを使用

(有)未来検索ブラジルにおいて開発

http://qwik.jp/senna/

LGPL

13

Tritonn (MySQL + Senna)

MySQLのソースにパッチ

MySQLの上位層がSennaを隠蔽

FULLTEXTのINDEXの処理時にSennaが使用される

My SQL

MEMORY Inno DB MyISAM

SQL文解析 → 最適化 → データ検索/格納

patch

Senna

RAM .sen.iibdata1 .MYD .MYI

(HEAP)

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

14

ガルーンの全文検索

検索機能

「横串検索」

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

「全文検索」

ガルーン内に保存されたファイルの中身も検索

(例:WordやExcelやPowerpointやpdfファイル)

テキスト抽出フィルター

TFライブラリ(データ変換研究所)を使用

http://www.dehenken.co.jp/products/products-01/products-tf01.html

高速なアクセス権評価が必須

データとACL(アクセス制御リスト)のクローリング

15

全文検索の構成

データ収集エンジン

・クローラ →データとACL

・インデクサ→テキスト抽出フィルタ

→クロールしたデータの追加

データの変更/削除

検索エンジン

・認証

・SQL実行

×

設定画面

16

Crawler

Queue

Indexer

MySQL+

Senna

filter

filter

filter

filter…

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

acl_id,uid list

Crawler

Data

ACL

Use bulk transfer

APIACL

Data

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

acl_id,uid list

GRN

17

検索エンジンの概観

Servlet

画面作成API

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

・ガルーンを通じて検索サーバにアクセス

GRN…

DB

18

検索 SQL 実行

掲示板

title data …検索

社内メール

title data …

……

スコア/日付でマージ

select * from tab_grn_bulletinwhere (MATCH (title, data) AGAINST (‘hoge’) )

select * from tab_grn_messagewhere (MATCH (title, data) AGAINST (‘hoge’) )

検索

…acl_id

acl_id

acl_id uid

acl_id uid

JOIN

JOIN

データテーブル ACL評価テーブル

19

•UIDの比較

•データテーブルをユーザ毎に用意

ACL評価

・ACL評価テーブルにUIDが含まれているか?

・object単位でACLの評価を行うと高コスト

→カテゴリ単位、フォルダ単位

・クロールされるデータには、ACL評価テーブルのIDが含まれる

・GRANTモデルでもREVOKEモデルでもOK

共有系

PIM系

20

プロトタイプ

検索画面

検索結果

21

まとめ

高性能全文検索機能

Tritonn(=MySQL+Senna)

お手軽、高速

プロトタイプ完成

Sennaの進化

マルチセクション機能

NGRAMの文字種分割の制御

ガルーン 2 のスケールアウトについてガルーン 2 のスケールアウトについて

23

現行ガルーン 2 スケーラビリティの壁

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

DBサーバーはできない

分間1500アクセスを上限

24

現行ガルーン 2 の構成

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

DBサーバ

DBサーバーに負荷が集中

ロードバランサ

25

壁を越えるために

機能単位のDB分散

クエリチューニング

Memcachedの導入

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

テーブル分割 + DB分散

26

スケールアウト後の構成

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

Memcached Memcached Memcached

ロードバランサ

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

27

スケールアウト効果

5,000 アクセス/分の利用頻度でも快適に動作

→弊社ではWeb15台 / DB7台の構成で検証

→機能ごとの分割なので限界はある

サーバーを増やせば更に伸ばすことも可能

28

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

以降エラーしか返さない

レスポンスタイム

経過時間

29

スケールアウト後

レスポンスタイム

経過時間

30

スループット

スケールアウト後

ガルーン 2.1.2

経過時間

処理量

31

機能単位のDB分散

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

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

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

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

32

マスタDB

レプリケーション

ユーザーテーブル組織テーブル

共通テーブルへの更新

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

ユーザーテーブル組織テーブル

スケジュールテーブル

ユーザーテーブル組織テーブル

…社内メールテーブル

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

33

クエリチューニング

スロークエリログに出現した遅いクエリを排除して

レスポンスを上げる

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

34

Memcachedの導入

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

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

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

35

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

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

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

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

36

_id col_user ….

1 100 ….2 200 ….

_id ….

1 ….

tab_grn_notification_notfy___100 tab_grn_notification_notfy___200

tab_grn_notification_notify

_id ….

1 ….

37

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

col_userはユーザーテーブルに参照性制約を

設定している

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

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

38

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

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

分散する

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

39

host1

_id col_user ….1 100 ….2 2003 1500 ….

tab_grn_notification_notify

tab_grn_notification_notfy___100

tab_grn_notification_notfy___200tab_grn_notification_notfy___1500

例) ユーザーID1~1000のユーザーをhost1にユーザーID1001~2000のユーザーをhost2に

host2

40

その他のチューニング

mod_phpに対応

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

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

41

まとめ

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

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

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

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

42

今後の課題 / 展望

複数ユーザーの個人データに対する更新処理のパフォーマンス

分割により大量に作られるテーブルへの対策

ユーザーごとの分割ではなく、1サーバーに1テーブルでよいかもしれない

MySQL5.1のパーティショニング

行ベースレプリケーション

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

43

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

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

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

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