PostgreSQL Conference JPPostgreSQL Conference JP
(2018-11-22)(2018-11-22)
論理レプリケーションの論理レプリケーションの
ダメな使い方ダメな使い方
ぬこ@横浜ぬこ@横浜 (@nuko_yokohama)(@nuko_yokohama)
2
自己紹介
「 PostgreSQL ラーメン」
でググってください
(Bing ってもいいです)
3
今日も
役に立たない話で
すまんな
4
みなさん、
PostgreSQL の
おもしろ機能
論理レプリケーション
使ってますか?
5
同一テーブルの双方向複製は
いろいろ面倒なので避けるが吉
Use Case マルチマスタ構成
テーブル A
テーブル B
テーブル A
テーブル B
サーバ 1 サーバ 2
6
Use Case 部分複製
テーブル A
テーブル B
テーブル A
テーブル C
サーバ 1 サーバ 2
テーブル C
7
Use Case データ集約
テーブル A
テーブル B
テーブル A
サーバ 1 サーバ 3
テーブル X
サーバ 2
テーブル X
8
Use Case 異バージョン複製
テーブル A
テーブル B
テーブル A
テーブル B
サーバ 1 サーバ 2
PostgreSQL 10 PostgreSQL 11
9
Use Case 異 OS 間複製
テーブル A
テーブル B
テーブル A
テーブル B
サーバ 1 サーバ 2
10
そして
11
Use Case 山手線ゲーム
※ イメージです
12
Use Case 山手線ゲーム
※ イメージです
「お題」として 1 つのテーマを定め、そのお題に沿った解答
を参加者が順番に解答していく。
「お題」は誰にもいくつか答えが思いつくもので、正誤の判
定が容易に可能なもの(「日本の都道府県の名前」「タロッ
トの 22 大カードの名前」など)で、一度出た答えは再び答
えとして使うことは出来ない。
答えが全て出尽くすと終了となるが、通常は同じ答えを 2 回
言ったり、途中で解答を言えなくなったり、テーマに合わな
い誤答をした者が敗者となる。
敗者に対しては罰ゲームが行われることがある。
●(引用 https://ja.wikipedia.org/wiki/%E5%B1%B1%E6%89%8B%E7%B7%9A%E3%82%B2%E3%83%BC%E3%83%A0)
13
Use Case 山手線ゲーム
※ イメージです
要するに
●値域外を入力しちゃダメ
●自分が既に入力した値を再度入力しては
ダメ
●他人が既に入力した値を入力してはダメ
というルールを実装すれば良い。
14
ということで
15
ロジカルレプリケーションを
無駄に使って山手線ゲームを
作ってみた
16
入力値の値域チェック
ENUM 型
17
自分の入力重複チェック
PRIMARY KEY 制約
18
ENUM 型 /PK 制約
--
-- 山手線型と山手テーブル(新駅対応版)
--
DROP TABLE IF EXISTS yamanote_table;
DROP TYPE yamamote;
CREATE TYPE yamanote AS ENUM (
' 大崎 ', ' 五反田 ', ' 目黒 ', ' 恵比寿 ', ' 渋谷 ',
' 原宿 ', ' 代々木 ', ' 新宿 ', ' 新大久保 ', ' 高田馬場 ',
' 目白 ', ' 池袋 ', ' 大塚 ', ' 巣鴨 ', ' 駒込 ', ' 田端 ',
' 西日暮里 ', ' 鴬台 ', ' 上野 ', ' 御徒町 ', ' 秋葉原 ',
' 神田 ', ' 東京 ', ' 有楽町 ', ' 新橋 ', ' 浜松町 ',
' 田町 ', ' 品川 ',
' 真・北品川 ' -- たぶん、こんな名前になるはず
);
CREATE TABLE yamanote_table (
name yamanote PRIMARY KEY, player text, ts timestamp
);
19
他人の入力履歴はみせない
ロジカルレプリケーション
20
Q. なんで Row Level Security
機能を使わないの?
⬇
A. ロジレプはロマンなので
21
他人との入力重複チェック
UNIQUE 制約@ SUBSCRIBER
22
こんな感じ
yamanote-server
name
新宿
日暮里
name
新宿
渋谷
日暮里
yamanote-client
name
渋谷
yamanote-client
yamanote 表 yamanote 表
Logical Replication Logical Replication
yamanote 表
23
SUBSCRIBER 側での
コンフリクトの自動検知
・・・なんだけど、
PostgreSQL 自体では
コンフリクト自動検知は
できない
24
すぐ
拡張
25
そこになければ
ないですね
作れば良いです
26
ごく簡単な拡張
(detect_conflict) を作って
PostgreSQL に組み込む
・コンフリクト検知
・任意の処理を起動
27
拡張機能とパラメータ
$ tail -4 ~/yamanote/test2/postgresql.conf
# Add settings for extensions here
shared_preload_libraries = 'detect_conflict'
detect_conflict.constraint_name = 'yamanote_t_name_key'
detect_conflict.action_script = '/tmp/action.sh'
$
パラメータ名 型 意味
detect_conflict.constraint_name TEXT コンフリクト検知対象とする制約名
detect_conflict.action_script TEXT コンフリクト検知後に実行されるスクリプト
のパス
SQLSTATE=23505 (一意性制約違反)
かつ、指定した制約名のときにスクリプトを起動する、だけ。
28
山手線ゲームの構成
yamanote-server
yamanote-clientyamanote-client
Logical
Replication
Logical
Replication
yamanote 表
yamanote 表
status 表
yamanote 表 status 表
検知プラグイン
status 表
yamanote 表
status 表status 表
スクリプト起動
更新
サーバログ Conflict 検知
挿入挿入 挿入
参照 参照
SUBSCRIBER PUBLISHER
SUBSCRIBERSUBSCRIBER
SUBSCRIBERPUBLISHER
29
デモ
30
ロジカルレプリケーションを無駄に
使うと山手線ゲームを作れる
コンフリクト検知機能をもうちょっと
真面目に作ると役にたつのかなあ?
ロジカルレプリケーションは楽しいので
もっとみんなで変な使い方を考えよう
まとめ
31
おしまい

20181122 pg con-jp-lt-logrep