Rabbit Slide Show

Amazon RDS+EC2+PGroonga+ロジカルレプリケーションを使った低コスト高速全文検索

2019-11-15

Description

PostgreSQL で使用できる全文検索の拡張に PGroonga という高速で高性能な拡張があります。 PGroonga は、全言語対応の超高速全文検索機能を PostgreSQL で使えるようにする拡張で、 安定して高速で、かつ高機能(同義語、表記ゆれや異字体への対応、類似文書検索などが使えます)です。 Amazon RDS は Amazon がクラウド上で提供する RDBS サービスで、データベースのインストールや パッチ適用、スケールアウト、バックアップなどを Amazon が面倒をみてくれるため、 運用上の手間を大幅に減らすことができます。 Amazon RDS は、とても便利なのですが、拡張機能を自由にインストールすることができません。 以下の URL の一覧にある拡張しか使えません。 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.FeatureSupport.Extensions.11x PGroonga も使えないため、日本語を始めとする多言語対応の超高速全文検索機能を Amazon RDS では使うことができません。 そこで、PostgreSQL 10 から使えるようになった、ロジカルレプリケーションと Amazon EC2 上にインストールした PostgreSQL と PGroonga を使って RDS のメリットである、 運用の負担を少なくしつつ、PGroonga を使用して高速で高機能な全文検索ができるような構成を考えました。 本発表では、どのような構成で Amazon RDS のメリットを活かしつつ、Amazon EC2 上で PGroonga を使った全文検索ができるのかを紹介します。

Text

Page: 1

Amazon
RDS+EC2+PGroonga+
ロジカルレプリケーション
を使った低コスト
高速全文検索
堀本泰弘
クリアコード
PostgreSQL Conference Japan 2019
2019-11-15
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

最後に
PGroongaについての疑問等
は、GitHub、Gitterにて
ドキュメントも充実
https://pgroonga.github.io/ja/
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0

Page: 88

最後に
より突っ込んだお話がしたい場合
は↓↓
問い合わせ先:
https://www.clear-code.com/contact/?
type=groonga
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0

Page: 89

最後に
ご静聴ありがと
うございました
Amazon RDS+EC2+PGroonga+ロジカルレプリケーション を使った低コスト 高速全文検索
Powered by Rabbit 3.0.0

Other slides