Text
Page: 1
Amazon
RDS+EC2+PGroonga+
ロジカルレプリケーション
を使った低コスト
高速全文検索
堀本泰弘
クリアコード
第28回 中国地方 DB 勉強会 in 岡山
2020-01-25
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 2
自己紹介
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 3
自己紹介
他のOSSへもコントリビュート
PostgreSQLのドキュメントの改善等
問題は「開発元」で修正が弊社の
ポリシー
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 4
今日のテーマ
なるべく楽に
高機能で高速な全
文検索
がしたい
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 5
実現のための要素
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 6
特に大事な要素
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 7
楽
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 8
楽
なぜ楽なのか?
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 9
設定が楽
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 10
構築が楽
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 11
スケールアップが楽
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 12
スケールアップが楽
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 13
障害対策が楽
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 14
障害対策が楽
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 15
障害対策が楽
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 16
今日のテーマ
なるべく楽に
高機能で高速な全
文検索
がしたい
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 17
全文検索
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 18
全文検索
なぜPGroongaな
のか?
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 19
対応言語
全言語対応
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 20
速い
高速
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 21
速い
ベンチマーク
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 22
速い
日本語Wikipedia
レコード数:約90万レコード
平均テキストサイズ:6.7KiB
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 23
速い
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 24
速い
ベンチマークの詳細な条件は
以下を参照
https://pgroonga.github.io/ja/reference/pgroonga-
versus-pg-bigm.html
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 25
SQLが使える
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 26
実例
具体的に
どう書くのか?
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 27
実行例:テーブル定義
CREATE TABLE entries (
title text,
content text
);
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 28
実行例:
インデックス定義
-- 全文検索用インデックス
CREATE INDEX entries_full_text_search
ON entries
-- 「 USING pgroonga 」 = 「 PGroonga を使う」
USING pgroonga (title, content);
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 29
実行例:データ挿入
-- 普通に挿入するだけでよい
INSERT INTO entries
VALUES ('PGroongaで高速全文検索!',
'高速に全文検索したいですね!');
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 30
実行例:全文検索
SELECT title FROM entries
WHERE
-- &@~で全文検索
-- 「検索」と「高速」を AND 検索
title &@~ '検索 高速' OR
content &@~ '検索 高速';
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 31
実行例:LIKE
SELECT title FROM entries
WHERE
-- LIKE でもインデックスが効く
--=アプリを書き換えずに高速化可能
-- ただし&@~より性能が落ちる
title LIKE '%検索%' OR
content LIKE '%検索%';
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 32
機能
全文検索に必要そうな機能は
一通り揃っている
同義語検索
類似文書検索
読みがな検索
入力補完 etc..
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 33
読みがな検索
「やきにく」
ってどう書きます
か?
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 34
読みがな検索
やきにく
焼き肉
焼肉
やき肉
ヤキニク
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 35
読みがな検索
当然ですがどれも
「やきにく」と読
みます
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 36
読みがな検索
読みが同じなので、以下は全部同
じものとして扱えます
やきにく
焼き肉
焼肉
やき肉
ヤキニク
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 37
読みがな検索
例えば
「やきにく」で検
索すると
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 38
読みがな検索
「やきにく」Hit!
「焼き肉」Hit!
「焼肉」Hit!
「やき肉」Hit!
「ヤキニク」Hit!
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 39
読みがな検索
異体字
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 40
読みがな検索
「広」と「廣」
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 41
読みがな検索
例えば人名の
検索
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 42
読みがな検索
検索キーワード「広瀬」で
「広瀬」Hit
「廣瀬」Hit
となってほしい
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 43
読みがな検索
通常の検索
検索キーワード「広瀬」で
「広瀬」のみHit
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 44
読みがな検索
読みがな検索なら
検索キーワード「広瀬」で
「広瀬」Hit
「廣瀬」Hit
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 45
読みがな検索
両方ヒット!
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 46
読みがな検索
「広瀬」も
「廣瀬」も
読みが同じ
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 47
他にも
それっぽい順でソート
キーワードハイライト
キーワードの周辺テキスト表示
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 48
他にも
電話番号検索
090-1234-5678 と 090 1234 5678、
(090)1234-5678 等
fuzzy検索
typo対策
テクノロジーとテノクロジー
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 49
他にも
継続的に
メンテナンス
されている
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 50
他にも
PostgreSQL12に
も対応!
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 51
高機能で高速
PGroongaなら高
機能で高速に全文
検索できる
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 52
Amazon RDS + PGroonga
しかし。。。
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 53
Amazon RDS + PGroonga
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 54
Amazon RDS + PGroonga
他の2つの要素の
出番!
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 55
Amazon RDS + PGroonga
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 56
構成
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 57
ロジカル
レプリケーションの特徴
複製元と複製先の
構造が同一でなく
てもよい
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 58
ロジカル
レプリケーションの特徴
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 59
ロジカル
レプリケーションの特徴
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 60
検索
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 61
更新
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 62
問題点
Subscriberが
1台しかない
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 63
問題点
リクエストが増加しつづけた場
合、この構成では耐えられない
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 64
負荷分散
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 65
復旧
検索できなくなっ
たら
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 66
復旧
使い捨てる
復旧は
がんばらない
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 67
復旧
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 68
復旧
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 69
復旧
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 70
サービス開始時間
もう一つの問題
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 71
サービス開始時間
データが増えると
復旧が遅延
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 72
サービス開始時間
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 73
停止時間の見積もり
許容できる停止時
間は?
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 74
停止時間の見積もり
停止時間を
見積もる
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 75
停止時間の見積もり
例えば...
サービス復旧時間:1日
新しくAmazon EC2を作成して、サービス開始
できるまでの時間
故障:1ヶ月に1回の頻度で故障
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 76
停止時間の見積もり
リクエスト:
各EC2には均等にリクエストが振り分
けられる
サービス継続:
Amazon EC2が3台あれば、サービス
を提供可能なくらいの負荷
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 77
停止時間の見積もり
Amazon EC2を3台で運用する場
合
1台でも故障するとサービス継続不可
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 78
停止時間の見積もり
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 79
停止時間の見積もり
この場合の稼働率
平均故障間隔 =
365*24/12 = 730時間
平均復旧時間 = 24時間
稼働率 = 730/754 =
0.9681697612732095 ≒96.8%
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 80
停止時間の見積もり
つまり
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 81
停止時間の見積もり
この構成では、1ヶ月に1日程度シ
ステムが停止する
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 82
停止時間の見積もり
では、4台運用の場合ではどうな
るのか?
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 83
停止時間の見積もり
1台あたりの稼働率:96.8%
1台あたりの故障率:
100% - 96.8% = 3.2%
2台同時に故障する確率:
0.032*0.032≒0.001=0.1%
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 84
停止時間の見積もり
したがって、1ヶ月に約45分程度
システムが停止する
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 85
同期か非同期か
レプリケーション
には同期と非同期
がある
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 86
同期レプリケーション
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 87
同期レプリケーション
更新性能は落ちる
マスターと同じデータが検索でき
ることを保証
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 88
非同期レプリケーション
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 89
非同期レプリケーション
更新性能に影響はない
タイミングによっては古いデータ
が見える
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 90
まとめ
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 91
まとめ
なるべく楽に
高機能で高速な全
文検索が
できました!
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 92
最後に
PGroongaについての疑問等は、
GitHub、Gitterにて
ドキュメントも充実
https://pgroonga.github.io/ja/
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 93
最後に
より突っ込んだお話がしたい場合は
↓↓
問い合わせ先:
https://www.clear-code.com/contact/?
type=groonga
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0
Page: 94
最後に
ご静聴ありがとう
ございました
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0