這是在 PostgreSQL 9.4 推出的功能,稱作 Logical Decoding。也就是解析交易日誌的功能。發展此功能的目標是為了達成 Log-Based Replication 的功能,以便於日後達成 Master-Master Replication 或是負荷比較小的 Rowlevel Filtering Replication。直到 2016 年底,該功能還在發展當中(稱作 Bi-Directional replication,BDR)。不過這個功能的推出,也使的些許基於 PostgreSQL 的 Active-Active 實作方案推出,像是 EnterpriseDB 的 EDB Replication Server 的 Multi-Master Replication,或是社群的 pglogical 專案。
Logical Decoding 的使用,也是透過 Replication Slot 來進行,只是這裡的 Replication Slot 不同於在 Streaming Replication 使用的 (Physical) Replication Slot,而是另一類型,叫做 Logical Replication Slot。
以下用 9.4 版的 PostgreSQL作簡易的示範。看看 Logical Decoding 的功能。
1. 調整/增加 postgresql.conf、pg_hba.conf 相關內容,再重新啟動:在這裡允許 postgres 帳號走 replication 協定
$PGDATA/postgresql.conf
wal_level = logical max_replication_slots = 1
$PGDATA/pg_hba.conf
local replication postgres md5 host replication postgres 127.0.0.1/32 md5
2. 啟用一個 logical replication slot
postgres=# SELECT pg_create_logical_replication_slot('my_slot', postgres-# 'test_decoding'); pg_create_logical_replication_slot ------------------------------------ (my_slot,0/409A050) (1 row)
可以檢視 slot 資訊
postgres=# SELECT slot_name, slot_type FROM pg_replication_slots; slot_name | slot_type -----------+----------- my_slot | logical (1 row)
3. 在指令下觀察 WAL 活動:以下兩段是同時發生的視窗
[postgres ~]$ pg_recvlogical -d \ > postgres --slot my_slot --start -f - BEGIN 1915 COMMIT 1915 BEGIN 1916 table public.ab: INSERT: a[integer]:1 COMMIT 1916 ^C [postgres ~]$ | postgres=# CREATE TABLE postgres-# ab(a INT); CREATE TABLE postgres=# INSERT INTO postgres-# ab VALUES (1); INSERT 0 1 postgres=# |
或是在 psql 下觀察
postgres=# INSERT INTO ab VALUES (2); INSERT 0 1 postgres=# SELECT data FROM postgres-# pg_logical_slot_get_changes('my_slot', NULL, NULL); data --------------------------------------- BEGIN 1917 table public.ab: INSERT: a[integer]:2 COMMIT 1917 (3 rows) postgres=#
以上可見,在 WAL 中解析出來的是 SQL 的細節
4. 不再進行觀察後,要將 slot 關閉
postgres=# SELECT pg_drop_replication_slot('my_slot');
參考
沒有留言:
張貼留言