MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2017年1月4日 星期三

Logical Replication Slot on PostgreSQL 9.4 觀察 WAL 交易

這是在 PostgreSQL 9.4 推出的功能,稱作 Logical Decoding。也就是解析交易日誌的功能。發展此功能的目標是為了達成 Log-Based Replication 的功能,以便於日後達成 Master-Master Replication 或是負荷比較小的 Row­level 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');


參考


Logical Replication in PostgreSQL - 5432 … Meet us!


沒有留言:

張貼留言