Rabbit Slide Show

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

2020-01-25

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+
ロジカルレプリケーション
を使った低コスト
高速全文検索
堀本泰弘
クリアコード
第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

Other slides