Recommended
PDF
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
PDF
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
PPT
Performance and Scalability of Web Service
PDF
いろいろ考えると日本語の全文検索もMySQLがいいね!
PDF
Webアプリケーションの パフォーマンス向上のコツ 実践編
PDF
Mroongaを選んだ理由と
ちょっと嬉しかった話
PDF
Ansibleではじめるサーバー・ネットワークの自動化(2018/07/05)
PDF
PPT
PDF
Ansible とネットワーク自動化の概要(SmartCS と Ansible の連携による自動化の可能性を体験!)
PDF
PPTX
Pythonユーザのための構成管理入門 #pyconapac
PDF
PDF
PPTX
PDF
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
PDF
PDF
OpenStack を NetApp Unified Driver と NFS Copy Offload を使って拡張する Vol.002
PDF
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
PPT
PDF
Mackerelによる
簡単サーバー管理入門と発展形
PDF
Ansible ではじめる ネットワーク自動化(Ansible 2.9版)
PDF
ネットワークコンフィグ分析ツール Batfish との付き合い方
PPTX
PDF
PPTX
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
PPTX
PDF
PDF
全文検索エンジンMroonga_エンジニア勉強会20140418
More Related Content
PDF
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
PDF
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
PPT
Performance and Scalability of Web Service
PDF
いろいろ考えると日本語の全文検索もMySQLがいいね!
PDF
Webアプリケーションの パフォーマンス向上のコツ 実践編
PDF
Mroongaを選んだ理由と
ちょっと嬉しかった話
PDF
Ansibleではじめるサーバー・ネットワークの自動化(2018/07/05)
What's hot
PDF
PPT
PDF
Ansible とネットワーク自動化の概要(SmartCS と Ansible の連携による自動化の可能性を体験!)
PDF
PPTX
Pythonユーザのための構成管理入門 #pyconapac
PDF
PDF
PPTX
PDF
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
PDF
PDF
OpenStack を NetApp Unified Driver と NFS Copy Offload を使って拡張する Vol.002
PDF
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
PPT
PDF
Mackerelによる
簡単サーバー管理入門と発展形
PDF
Ansible ではじめる ネットワーク自動化(Ansible 2.9版)
PDF
ネットワークコンフィグ分析ツール Batfish との付き合い方
PPTX
PDF
PPTX
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
PPTX
Viewers also liked
PDF
PDF
全文検索エンジンMroonga_エンジニア勉強会20140418
PDF
new Objctive-C literal syntax
PDF
Next Generation Web Application Architecture
PDF
PDF
これからはじめるCoda2とSublime Text 2
PDF
PDF
PPTX
PDF
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
PDF
PDF
KEY
PDF
PDF
PPTX
PDF
PDF
PDF
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
PDF
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Similar to blogサービスの全文検索の話 - #groonga を囲む夕べ
PDF
PDF
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
PDF
Mroongaを使ったときの MySQLの制限との戦い
PDF
PDF
Solr meeting in Japan 2011
PDF
PDF
PDF
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
KEY
My sql casual_in_fukuoka_vol1
PDF
PDF
Mroongaを社内クラウド的なMySQLプラットフォームに標準搭載している話 #groonga
PDF
Introducing mroonga 20111129
PPTX
Tritonn から Elasticsearch への移行話
PDF
KEY
1台から500台までのMySQL運用(YAPC::Asia編)
PPTX
MySQL対応全文検索システムMroonga(むるんが)
PDF
PDF
PDF
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
PDF
MySQL at Yahoo! JAPAN #dbts2018
More from Masahiro Nagano
PDF
Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min
PDF
Rhebok, High Performance Rack Handler / Rubykaigi 2015
PDF
Big Master Data PHP BLT #1
PDF
Stream processing in Mercari - Devsumi 2015 autumn LT
PDF
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
PDF
メルカリでのNorikraの活用、 Mackerelを添えて
PDF
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
PDF
Mackerel & Norikra mackerel meetup #4 LT
PDF
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
PDF
Isucon makers casual talks
PDF
Gazelle - Plack Handler for performance freaks #yokohamapm
PDF
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
PDF
Webアプリケーションの パフォーマンス向上のコツ 概要編
PDF
PDF
最近作ったN個のCPANモジュール Yokohama.pm #10
PDF
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
PDF
How to build a High Performance PSGI/Plack Server
PDF
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
PDF
KEY
blogサービスの全文検索の話 - #groonga を囲む夕べ 1. 2. Me
•長野雅広 (Masahiro Nagano)
•@kazeburo / github:kazeburo
•Operations Engineer / Site
Reliability
•LINE corp.
•ISUCON 2013,2014 連覇
3. 5. 6. livedoor Blogを支える技術
•Reverse Proxy - Apache, Nginx
•Application - Perl, Go
•Cache - Memcached
•RDBMS - MySQL 4.0, 5.5
•Search Engine - Mroonga
7. 10. 11. 12. 競合
• MySQLのLIKE検索
➡ 検索機能不足
➡ カテゴリやタグなどの絞り込みが面倒
• MySQL組み込みの全文検索
➡ 日本語非対応
• Elasticsearch
➡ Java/JVMの経験不足
➡ 大規模環境でのトラブルシューティングに不安
13. 14. 15. 16. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
Q4M MappingDB
shard1 shard2 shard3
検索 Service
17. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
Q4M MappingDB
検索 Service
記事追加
shard1 shard2 shard3
18. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
Q4M MappingDB
検索 Service
記事追加
shard1 shard2 shard3
Queueing
19. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
Q4M MappingDB
検索 Service
記事追加
shard1 shard2 shard3
Queueing
blog_idと
shardの
mapping
20. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
Q4M MappingDB
検索 Service
記事追加
shard1 shard2 shard3
Queueing
blog_idと
shardの
mapping
INSERT!
21. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
Q4M MappingDB
shard1 shard2 shard3
検索 Service
22. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
検索
Q4M MappingDB
shard1 shard2 shard3
検索 Service
23. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
検索
Q4M MappingDB
shard1 shard2 shard3
検索 Service
blog_idと
shardの
mapping
24. 記事表示 Service 記事編集 Service
blog
App
blog
App
blog
App
cms
App
cms
App
cms
App
Search
API
Search
API
Index
Worker
Index
Worker
検索
Q4M MappingDB
shard1 shard2 shard3
検索 Service
blog_idと
shardの
mapping
SELECT
25. 26. 27. 28. 29. 30. スキーマ
CREATE TABLE article_index_0001 (
id bigint unsigned NOT NULL AUTO_INCREMENT,
blog_id int unsigned NOT NULL,
article_id int unsigned NOT NULL,
status tinyint NOT NULL,
public_terms mediumtext,
private_terms mediumtext,
article_datetime datetime NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY unique_entry (blog_id,article_id),
FULLTEXT KEY for_public (public_terms),
FULLTEXT KEY for_cms (public_terms,private_terms)
) ENGINE=mroonga;
storage mode
31. スキーマ
CREATE TABLE article_index_0001 (
id bigint unsigned NOT NULL AUTO_INCREMENT,
blog_id int unsigned NOT NULL,
article_id int unsigned NOT NULL,
status tinyint NOT NULL,
public_terms mediumtext,
private_terms mediumtext,
article_datetime datetime NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY unique_entry (blog_id,article_id),
FULLTEXT KEY for_public (public_terms),
FULLTEXT KEY for_cms (public_terms,private_terms)
) ENGINE=mroonga; x150 storage mode
32. mysql>show tables;
+--------------------+
| Tables_in_hermes |
+--------------------+
| article_index_0001 |
| article_index_0002 |
| article_index_0003 |
| article_index_0004 |
| article_index_0005 |
| article_index_0006 |
| article_index_0007 |
...
...
| article_index_0142 |
| article_index_0143 |
| article_index_0144 |
| article_index_0145 |
| article_index_0146 |
| article_index_0147 |
| article_index_0148 |
| article_index_0149 |
| article_index_0150 |
+--------------------+
150 rows in set (0.00 sec)
33. Table 分散
Search
API
Index
Worker
blog_idで分散
0001 0002 0003 0004 0005 0006
0007 ... ... ... ... 0144
0145 0146 0147 0148 0149 0150
34. Table 分散
Search
API
Index
Worker
blog_idで分散
(murmur_hash(blog_id) % 150) + 1
0001 0002 0003 0004 0005 0006
0007 ... ... ... ... 0144
0145 0146 0147 0148 0149 0150
35. 36. 37. Kernel Tuning
$ cat /etc/sysctl.conf
# NUMAを無効に
vm.zone_reclaim_mode = 0
# 物理メモリ以上のメモリ確保を許可
vm.overcommit_memory = 1
# mmapで確保できる最大マッピング数
vm.max_map_count = 5000000
38. Linux Tuning (2)
# 透過的hugepageを切る
$ echo 'never' > /sys/kernel/mm/
transparent_hugepage/enabled
39. 40. 41. 42. 43. 44. GET_LOCKで並列度制限
# table名でlock
mysql> SELECT GET_LOCK(“article_index_0099”,30);
# 検索
mysql> SELECT article_id FROM article_index_0099
WHERE blog_id=30 AND status=1
AND MATCH(public_terms) AGAINST(? IN BOOLEAN MODE)
ORDER BY article_datetime DESC LIMIT 10 OFFSET 0;
# 終わったらlockを解放
mysql> SELECT RELEASE_LOCK(“article_index_0099”)
45. 46. 47. 48.