使用Bucardo5實現PostgreSQL的主要資料庫複製,bucardo5postgresql

來源:互聯網
上載者:User

使用Bucardo5實現PostgreSQL的主要資料庫複製,bucardo5postgresql

下一代非同步多個主要資料庫複製系統Bucardo 5發布了。這個版本刪除了老版本中兩個資料庫源的限制,允許有更多的來源資料庫(即主要資料庫)以及更多的目標資料庫(即備份資料庫)。Bucardo還可以複製到其他類型的目標資料庫,其中包括MySQL、MariaDB、Oracle、SQLite、MongoDB和Redis。Bucardo已經被完全重寫了,這個版本比前一版本Bucardo 4功能更強大,效率更高。你可以訪問Bucardo wiki尋找最新版本的Bucardo。

這篇文章快速的介紹了一下Bucardo。以後的部落格文章將會介紹Bucardo的強大功能,現在我們將介紹如何簡單地實現多主要資料庫複製。


為了示範方便,我使用了亞馬遜Web服務(AWS)提供的可快速建立、隨意使用的伺服器,即運行Amazon Linux的基本t1.micro伺服器。如果你按照提示繼續的話,它將免費而且簡單地給你建立一個伺服器執行個體。一旦執行個體建立成功,我們就可以使用ec2-user賬戶通過SSH協議登陸到伺服器,這時就可以開始安裝PostgreSQL和Bucardo了。
 

# Always a good idea:$ sudo yum update# This also installs other postgresql packages:$ sudo yum install postgresql-plperl# Create a new Postgres cluster:$ initdb btest

此時,我們仍然不能期待哦你個PostgreSQL,因為這個發布版的socket通訊目錄使用的是/var/run/postgresql和/tmp。我們調整了第一個目錄的許可權後就可以啟動PostgreSQL了,然後建立第一個測試資料庫:
 

$ sudo chmod 777 /var/run/postgresql$ pg_ctl -D btest -l logfile start$ createdb shake1


接下來我們就可以進行資料庫複寫了!為了得到範例資料,我使用了開放原始碼的Shakespeare項目。它有一個易於裝載的小型的、可任意使用的、簡單的資料庫模式。github上的這個小型項目就包含了一個現成的PostgreSQL資料庫模式,現在我們將可以把它裝載到新的資料庫了:
 

$ sudo yum install git$ git clone -q https://github.com/catherinedevlin/opensourceshakespeare.git$ psql shake1 -q -f opensourceshakespeare/shakespeare.sql# You can safely ignore the 'role does not exist' errors

我們打算建立這個資料庫的副本,這些副本可被當作其他資料來源。換個說法,這些伺服器擁有相同的資料而且可以寫入。實現這些非常簡單:
 

$ createdb shake2 -T shake1$ createdb shake3 -T shake1

Bucardo需要安裝一些依賴包。如果你安裝的作業系統發布不同,那麼你可能要安裝的依賴包就不同:下面是我寫這篇文章的時候Amazon Linux需要安裝的依賴包。(如果幸運的話,你的發布包可能已經包含了Bucardo,在這種情況下,下面的執行步驟就不需要執行了,你只要運行"yum install bucard"就可以了-不過要確定一下你使用的是版本5或者更好的版本!(通過yum info bucardo查看))
 

$ sudo yum install perl-ExtUtils-MakeMaker perl-DBD-Pg \> perl-Encode-Locale perl-Sys-Syslog perl-boolean \> perl-Time-HiRes perl-Test-Simple perl-Pod-Parser$ sudo yum install cpan$ echo y | cpan DBIx::Safe


在這個系統的yum軟體倉庫裡不包含Perl模組DBIx::Safe,因此我們需要通過CPAN來安裝這個模組。一旦上面的所有依賴都安裝成功,這時我們就準備安裝Bucardo。我們將擷取官方壓縮包,驗證、解壓,接著安裝:
 

$ wget -nv http://bucardo.org/Bucardo.tar.gz$ wget -nv http://bucardo.org/Bucardo.tar.gz.asc$ gpg -q --keyserver pgp.mit.edu --recv-key 14964AC8$ gpg --verify Bucardo.tar.gz.asc$ tar xfz Bucardo.tar.gz $ ln -s Bucardo-5.0.0 bucardo$ cd bucardo$ perl Makefile.PL$ make$ sudo make install

我們對bucardorc檔案(設定某些全域資訊的檔案)進行某些小的調整。然後運行"bucardo install",這條命令將建立bucardo的主要資料庫,其中包含Bucardo服務進程所需的資訊:
 

$ mkdir pid$ echo -e "piddir=pid\nlogdest=." > .bucardorc$ bucardo install --batch --quietCreating superuser 'bucardo'


現在已經安裝好Bucardo,接下來就準備複製了。此時,我們有了三個可以彼此複製的資料庫。下面我們只使用了兩條命令就可以實現三資料庫彼此複製:
 

 bucardo add dbs s1,s2,s3 dbname=shake1,shake2,shake3Added databases "s1","s2","s3"$ bucardo add sync bard dbs=s1:source,s2:source,s3:source tables=allAdded sync "bard"Created a new relgroup named "bard"Created a new dbgroup named "bard" Added table "public.chapter" Added table "public.character" Added table "public.character_work" Added table "public.paragraph" Added table "public.wordform" Added table "public.work"

第一條命令,我們告訴Bucardo如何串連到三個資料庫,我們告訴Bucardo資料庫的名字,然後Bucardo把這三個資料庫看作(s1,s2,s3)。你還可以指定連接埠和主機,不過在這個例子裡,預設的連接埠為5432,而且不需要主機(採用的是Unix Socket通訊機制)。


第二條命令建立了一個已命名的複製系統,其sync名稱為bard。Bucardo需要知道複製到哪兒和如何複製,因此我們告訴它使用三個資料庫s1,s2和s3。每一個資料庫都可以作為來源資料庫,因此我們給它們添加了這樣的資訊。最後我們需要知道要複製什麼。在這個例子裡,我們需要複製的是所有表(或者更精確點,複製具有主鍵或者唯一索引的所有資料庫)。注意: Bucardo總是把資料庫和表放在命名組裡-在這個例子裡我們只是寫入程式碼其為10,然而通常這個值是表格視圖控制器數組的長度。現在例子裡,這一切都是自動進行的,dbgroup和relgroup都是以sync的名字命名的。

我們驗證一下複製是否運行,即檢查一下更新行是否複製到sync裡包含的所有資料庫了:
 

$ bucardo start$ psql shake1 -c \> "update character set speechcount=123 where charname='Hamlet'"UPDATE 1$ for i in {1,2,3}; do psql shake$i -tc "select \> current_database(), speechcount from character \> where charname='Hamlet'"; done | grep s shake1    |   123 shake2    |   123 shake3    |   123

我們還可以查看Bucardo的記錄檔"log.bucardo",看看是否有複製操作:
 

$ tail -2 log.bucardo(25181) KID (bard) Delta count for s1.public."character": 1(25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=0


上面出現了兩條delete和兩條insert命令,這是因為更新一行意味著在其他兩個資料庫上首先啟動並執行是delete,然後才運行insert(技術上採用的COPY)。接下來我們看看Bucardo是怎麼處理衝突的。我們將對所有伺服器上的同一行進行更新,這樣就會產生衝突:
 

$ for i in {1,2,3}; do psql shake$i -tc \> "update character set speechcount=$i$i$i \> where charname='Hamlet'"; doneUPDATE 1UPDATE 1UPDATE 1

查看日誌表明確實存在衝突,而且也很好的解決了衝突。預設的衝突解決方案表明:最後一個更新的資料庫是獲勝者,現在所有三個資料庫具有與最後一個更新資料庫相同的行。
 

$ tail log.bucardo(25181) KID (bard) Delta count for s1.public."character": 1(25181) KID (bard) Delta count for s2.public."character": 1(25181) KID (bard) Delta count for s3.public."character": 1(25181) KID (bard) Conflicts for public."character": 1(25181) KID (bard) Conflicts have been resolved(25181) KID (bard) Totals: deletes=2 inserts=2 conflicts=1 $ for i in {1,2,3}; do psql shake$i -tc \> "select current_database(), speechcount \> from character where charname='Hamlet'"; done | grep s shake1    |   333 shake2    |   333 shake3    |   333

我們開發這個樣本的時候,Bucardo有時啟動並執行非常快,所以沒有發生衝突。也就是說,因為更新時順序執行的。所以在下一個更新之前,存在一個時間視窗可以讓Bucardo完成更新的複製。另外,“暫停sync"功能也非常方便,只要在你需要暫時停止運行sync的情況下,運行下面命令即可:
 

$ bucardo pause bardSyncs paused: bard$ psql shake1 -c "update character set speechcount=1234 where charname='Hamlet'"UPDATE 1$ psql shake2 -c "update character set speechcount=4321 where charname='Hamlet'"UPDATE 1$ bucardo resume bardSyncs resumed: bard $ tail log.bucardo(27344) KID (bard) Delta count for s1.public."character": 1(27344) KID (bard) Delta count for s2.public."character": 1(27344) KID (bard) Conflicts for public."character": 1(27344) KID (bard) Conflicts have been resolved(27344) KID (bard) Totals: deletes=2 inserts=2 conflicts=1


Bucardo 5比我們在這兒示範的功能多很多。以後的部落格文章裡我們將包含它可以完成的其他功能,從複製到比如Oracle、Mysql或者MongoDB等非PostgreSQL系統到使用自訂的衝突解決方案。以及複製時對正在啟動並執行資料實行轉換。如果你有任何問題,請在下面的評論裡說明,或者寫一封簡訊給Bucardo郵件清單bucardo-general@bucardo.org。

這麼多年,如果沒有許多人貢獻代碼、提出漏洞、測試Bucardo以及詢問(或者回答!)重大問題,就不可能有這個重大版本的發布。查看 Changes檔案,你就可以看到部分貢獻者的列表。謝謝你們所有人,特別感謝Jon Jensen,是他在很久之前就開啟了這個項目。

相關文章

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.