PostgreSQL 叢集複製方案之使用pgq和londiste工具包

來源:互聯網
上載者:User
文章目錄
  • 關於PostgreSQL叢集複製方案
  • 關於pgq和londiste工具
  • 安裝
  • 配置
  • 啟動replication daemon
  • 添加一個複製集
  • 測試結論
  • 應用場合的探索
關於PostgreSQL叢集複製方案

可以參考25 高可用性,負載平衡和複製這篇文章瞭解一些常規的複製方案。

關於pgq和londiste工具

來自於skype的工具包skytools,其中pgq是基於postgresql的通用隊列實現。而londiste是基於pgq的複製工具。這 兩個工具的組合類別似於slony,但相比二者,前者更簡單一些。我們可以簡單地把這種複製理解成 producer(provider)/consumer(subscriber)類型。master產生資料在隊列中,而slave從隊列中取資料並且 作用在自己身上。

安裝

簡單描述一下安裝過程如下(假設兩台機器,一台是master,一台是slave,都已經安裝了資料庫)

  • 安裝psycopg2,到這裡下載
tar xzvf psycopg2-2.0.7.tar.gz
cd psycopg2-2.0.7
python setup.py build_ext -Rpgsql的安裝目錄/lib
python setup.py install
  • 安裝skytools,到這裡下載
tar xzvf skytools-2.1.7.tar.gz
cd skytools-2.1.7
./configure
make
make install
python setup.py install

配置

  • master-pgq

設定檔名:ticker.ini

[pgqadm]
job_name = ticker
db = dbname=foo host=127.0.0.1 port=5555 user=chry
# how often to run maintenance [minutes]
maint_delay_min = 1
# how often to check for activity [secs]
loop_delay = 0.1
logfile = %(job_name)s.log
pidfile = %(job_name)s.pid
use_skylog = 0
  • master-provider和slave-subscriber

設定檔名:replica.ini

[londiste]
job_name = lmaster_to_slave
provider_db = dbname=foo host=127.0.0.1 port=5555 user=chry
subscriber_db = dbname=foo host=205.203.*.* port=5555 user=chry
# it will be used as sql ident so no dots/spaces
pgq_queue_name = londiste.write
pidfile = %(job_name)s.pid
logfile = %(job_name)s.log
use_skylog = 0

啟動replication daemon

  • master(producer)
pgqadm.py ticker.ini ticker -d (啟動pgq管理進程)
londiste.py replica.ini provider install(安裝londiste需要的schema)
  • slave(consumer)
londiste.py replica.ini subscriber install(安裝londiste需要的schema)
londiste.py replica.ini replay -d(啟動資料複製,replica這個檔案被部署了兩次)

以上過程需要保證slave可以登入master的資料庫。

添加一個複製集

  • 假設你要同步表entry, 其有兩個欄位:id(sequence, primary key), item text。那麼我們還需要同步sequence:entry_id_seq

master

londiste.py replica.ini provider add entry
londiste.py replica.ini provider add-seq entry_id_seq

slave

londiste.py replica.ini subscriber add entry
londiste.py replica.ini subscriber add-seq entry_id_seq

添加完畢。

測試結論

  • 同步的表對象需要有primary key
  • 在master操作insert/update/delete操作,可以正確同步到slave相應的表中。但不支援truncate。
  • 如果slave資料庫down掉,在slave重新起來的這段時間內的master的資料變化可以同步到slave相應的表中,而舊資料不會被同步。
  • 如果slave上執行insert/update/delete的表操作,那麼master是不會影響到的,與之相反,sequence在slave上的任何改變,在master變化時會重設。
  • 要強制舊資料同步,可以在slave上執行:
londiste.py replica.ini subscriber resync -v --force

應用場合的探索

  • 這個方案可以應用在讀寫可分離的場合,比如結合plproxy的如下應用:

一邊是feed資料到write叢集,一邊不僅僅希望讀寫分開以提高效能,同時可以支援load balance,那麼pgq/londiste無疑是比較好的方案。之前可能需要同時寫兩個節點的資料以保證資料同步,這樣不僅效能打折,而且還必須保證 事務,標準的plproxy是不支援事務的。

票務搜尋就是這類應用,還有一些OLTP以及web應用可能也是合適的場合。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.