天天看點

PostgreSQL 9.6 同步多副本 與 remote_apply事務同步級别 應用場景分析

digoal

2016-10-06

postgresql , 9.6 , 同步多副本 , remote_apply , 全同步

對于金融級的應用場景,2個副本通常是不夠的,使用者可能會需要多個副本。

例如,一主4從,要求除了主以外,還需要2個同步的副本,其他可以為異步的副本。

PostgreSQL 9.6 同步多副本 與 remote_apply事務同步級别 應用場景分析

另一方面,我們在使用資料庫時,為了擴充讀的能力,讀寫分離是比較常見的用法。

9.6以前的版本,同步複制是確定xlog已經複制到備庫,而不是已經在備庫apply,雖然apply通常都很快,可能也在毫秒級别完成,但是以前沒有apply級别的同步機制。

例如,使用者a往使用者b的賬戶彙了一筆錢,同一時間使用者b在異地馬上要看到a彙過來的錢,這種異地、異庫的讀寫分離場景,就需要主備事務級的嚴格一緻,是以9.6的remote_apply就非常有效。

PostgreSQL 9.6 同步多副本 與 remote_apply事務同步級别 應用場景分析

還有一種場景,在主備切換時,要求備庫快速激活成和主庫一樣的狀态,也需要remote_apply級别的複制。

以上是postgresql 9.6在流複制方面的增強。

參數配置如下

synchronous_standby_names (string)

支援兩種寫法

num_sync 數字,表示同步的副本數。

沒有寫num_sync的格式相容以前的配置,表示1個副本。

standby_name是standby配置在recovery.conf中的application_name,可以使用*代替所有standby。

例子

表示2個副本為同步standby,其他為異步standby。

事物送出時,確定xlog已同步到任意2個副本(前面兩個是同步節點,後面2個是替補,目前面兩個中任意的節點出問題,後面的會依次替補上)。

手冊說明

注意standby_name隻是指定了同步的standby節點,而事務級别還有一個開關為synchronous_commit,通過配置synchronous_commit用于控制事務的同步級别,可以是異步的,也可以是同步的。

對于可靠性要求高的,可以配置為同步,否則可以為了性能配置為異步。

通過參數synchronous_commit (enum)配置事務的同步級别。

如果要配置事務或者會話級别的參數,通過以下文法

也就是說,使用者可以根據實際的業務需求,對不同的事務,設定不同的同步級别。

目前支援的同步級别如下

1. 可靠性

結合synchronous_standby_names與synchronous_commit的設定,可以實作非常靈活的事務級别可靠性的要求。

2. 讀寫分離的讀一緻性保證

當synchronous_commit=remote_apply時,這個事務産生的redo必須要在sync standby(s)已apply,才傳回給用戶端事務結束。

這類事務,事務結束後發起的讀請求,在primary以及sync standby可以做到讀寫完全一緻。

犧牲寫事務的rt,獲得在多借點的讀事務的完全一緻。

3. 切換時延

當設定了synchronous_commit=remote_apply事務同步複制級别時,可以降低切換延遲。

備庫在激活時,不需要apply redo,可以迅速的激活成為主庫。

<a href="http://info.flagcounter.com/h9v1">count</a>

繼續閱讀