目前 BDR 2.0 以上已經是商業產品( 沒錢沒人權 ),而且 BDR 1 不支援太新的 postgresSQL.不過基於還要維護舊系統的關係,所以留個紀錄.
BDR 跟 db 是綁在一起的,每個 DB 可以建立不同的 bdr group
加入任一個在 group 中的 node,其他 nodes 會自動被更新.
bdr 並沒有所謂的 master 跟 slave 的概念
已經加入 bdr 的 node, 就算整個 node 刪除,如果重新啟動新的 DB,
依然會被原本的 group 做 bdr sync, 但是新的 DB 可能還沒有 ready,所以會造成錯誤.
因此要在原本的 server 上面重啟一個新的 DB,最保險的方法還是先把 bdr 從 group 中移除,再重新啟動 DB.
bdr.c : bdr_establish_connection_and_slot: 建立 bdr connection 跟 slot
bdr.c : bdr_connect 建立 bdr connection 的點
如果要重新加入節點(相同 ip), 則要先刪除 bdr 上的 nodes 在加入,否則新的 node 一上線就會馬上被 query,但是因為是新的 database 所以沒有任何 bdr 的資訊,此時重新加入 bdr 則狀態會一直呈現 i (initialize)
有時候就算是 bdr node 被移除了,還是沒辦法加入 group。 這可能是因為 slot 的關係.因為 slot 的資料是沒有進行同步的,所以必須進入每一個 dns 做刪除的動作
有時候可能會有多餘的 identifier, 如果有出現 identifier 但是名稱沒有出現在 node. 則可以用下面的方式移除
Add a record
使用方式可以參考這邊
https://www.postgresql.org/docs/9.5/logicaldecoding-example.html
首先先建立一個 slot
這邊要注意的是我的帳號是使用 postgres
建立 slot 的 user 跟 pg_hba.conf 有關,如果碰到 authentication 或者 cert issue, 則需要去查 pg_hba 設定
理論上 default 是開給 local 端的 postgres 帳號不用密碼登入,我的設定是 peer 所以要先切成 postgres 帳號
然後開始跑 slot
這邊指令是說把輸出輸出到 stdout,也就是螢幕輸出
如果 DB 的資料有更動,則會收到以下訊息
如果想要開啟 timestamp 可以用 --option include-timestamp
結果就會變成這樣, 在 commit 後面多了一筆 timestamp
這樣就可以做紀錄來觀察 DB 的變化
由於 option 是看 plugin 的支援.
default 的 slot plugin 是 test-decoding. option的部分可以從以下程式碼得知