PGCluster是日本作者修改PostgreSQL,使其達到Auto Replication, Load Balance 的能力。操作方式與原本PostgreSQL沒有太多差異,新增增加的幾個功能也會在下面介紹。
在安裝之前也建議將所有的node使用NIS/NFS管理。
系統架構如下:
[code lang="cpp"]
((Load Balance Server))
(( Replication Server))
( hostname: master )
( receive port:5432 )
( recovery port:6001 )
|
----------+-------------+------------+----------
| |
(( Cluster DB 1 )) (( Cluster DB 2 ))
( hostname: db1 ) ( hostname: db2 )
( receive port: 5432 ) ( receive port:5432 )
( recovery port:7001 ) ( recovery port 7001 )
[/code]
[b]1. 安裝[/b]
解開套件並且安裝,在此我們配合SRB的配置,prefix改成/opt/pgsql
[code lang="cpp"]
# tar -zxvf /usr/local/src/pgcluster-1.0.x.tar.gz
# ./configure
# make
# make install
[/code]
使用標準的postgresql初始化PGDATA的方式
請先確定你有一個postgres帳號。
[code lang="cpp"]
# cd /usr/local/pgsql
# mkdir data
# chown postgres data
# su postgres
# initdb -D data
[/code]
2. 設定
大略的架構圖,在我們的系統裡,Load Balancer和Replicator是一起的。
一般設定:
a. 存取控制
修改data/pg_hba.conf使其可以不用帳號登入存取其他node
舉例來說,
[code lang="cpp"]
local all trust
host all 127.0.0.1 255.255.255.255 trust
host all 192.168.0.1 255.255.255.0 trust
host all 192.168.0.2 255.255.255.0 trust
[/code]
請記得將IP改成你的主機的IP位置。
b. 開啟TCP Socket
修改data/postgres.conf,找到一行
#tcpip_socket = false
請刪除註解,並改成
tcpip_socket = true
c. rsync
在一般的linux系統,rsync是預設安裝的套件。pgcluster需要rsync + ssh(secured rsync)作為有任何資料庫損毀時回復資料的工具,而在進行資料回復時如果要打密碼,postmaster主程序會導致錯誤,所以需要進行public key authentication。
[code lang="cpp"]
# su postgres
# ssh-keygen -d
Generating public/private dsa key pair.
Enter file in which to save the key (/home/postgres/.ssh/id_dsa): <直接按enter>
Enter passphrase (empty for no passphrase):<直接按enter>
Enter same passphrase again:<直接按enter>
Your identification has been saved in /home/postgres/.ssh/id_dsa.
Your public key has been saved in /home/postgres/.ssh/id_dsa.pub.
# cp ~/.ssh/id_dsa.pub ~/.ssh/authorized_keys2
[/code]
接著進行連線的建立,一般ssh連線都會在known_host建立主機的finger-print,在你尚未連到對方主機前,會要求你輸入yes以便驗明正身。然而postmaster如果執行時還要輸入yes就不妙了,所以要事先進行連線。
在known_host裡的主機驗證是根據你連線時打的名稱,如果你打的是ip,便會增加ip,如果打主機名稱便以此類推。但ip,hostname,fullname在known_host裡視為不同的entry,而postmaster連線是連fullname,所以一定要對每一台的主機進行ssh fullname的連線。
[code lang="cpp"]
# ssh master.nchc.org.tw
The authenticity of host 'master.nchc.org.tw (192.168.0.1)' can't be established.
RSA key fingerprint is 22:f7:fe:31:67:1d:a2:60:7a:0e:fd:68:95:c7:b4:11.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'master.nchc.org.tw,192.168.0.1' (RSA) to the list of known hosts.
#
[/code]
如果成功,你不需要打密碼便可以登入主機。
設定Replicator:
[code lang="cpp"]
# cp [path to source]/src/pgcluster/pgrp/pgreplicate.conf.sample /usr/local/pgsql/data/pgreplicate.conf
[/code]
編輯pgreplicate.conf ,每一個
如果你不想安裝Load Balancer,請將有關Load Balancer的標籤註解起來。
設定Cluster DB:
data/cluster.conf在你initdb時就會存在,先編輯它。
編輯
注意到
而為了避免任何資料庫損毀時系統就無法進行insert,視你的需要將
設定Load Balancer:
LB是將查詢轉送給ClusterDB來實際進行資料查詢,所以不能夠再執行postmaster。
同樣我們將範本複製到data目錄。
[code lang="cpp"]
# cp [path to source]/src/pgcluster/pgrp/pglb.conf.sample /usr/local/pgsql/data/pglb.conf
[/code]
編輯這個檔案,並且在
注意到下面的
[b]3. 啟動[/b]
啟動的順序:Replicator -> Master DB -> Slave DB -> Load Balancer
同樣地,請使用postgres帳號進行作業。
[i]a. 啟動及停止Replicator[/i]
[code lang="cpp"]
# pgreplicate -D /usr/local/pgsql/data
# pgreplicate -D /usr/local/pgsql/data stop
[/code]
[i]b. 啟動及停止ClusterDB[/i]
[code lang="cpp"]
# pg_ctl -D /usr/local/pgsql/data start
# pg_ctl -D /usr/local/pgsql/data stop
[/code]
其餘的操作方式皆與原本的pg_ctl相同
[i]c. 啟動及停止Load Balancer[/i]
[code lang="cpp"]
# pglb -D /usr/local/pgsql/data
# pglb -D /usr/local/pgsql/data stop
[/code]
[b]4. 回復[/b]
當任何DB發生問題,你手動停止之後,你可能需要進行回復的作業以便讓這個DB與還活著的DB進行同步。
請使用postgres帳號進行作業。
回復的時候postmaster會明確呼叫rsync讓重新啟動的DB複製資料,相關的問題前面已經敘述。
而新增加的DB也可以同樣使用這個方式來進行資料同步。
[code lang="cpp"]
# pg_ctl start -D /usr/local/pgsql/data -o "-R"
[/code]
您好,想請教一個問題,
回覆刪除PGCluster的重點在於負載平衡以及同步備份,那Select的效率,比一般的PostgreSQL差多少呢?
在Insert、Delete、Update我想是應該比一般的PostgreSQL慢,因為要同步備份。
因為公司有打算這麼做,只是資料庫使用的人數沒想像中的大,用PGCluster似乎只有同步備份這個功能可用。
還是說您有什麼良好的建議嗎?
我先跟你解釋PGCluster的實做的方式。基本上Select是由Load Balancer分配下去的沒錯,因此節點(主機)數一多一定會加快。依照我之前使用在SRB這個負載相當中的應用上,我想一兩個結點是不夠的,我至少用了三個。也因此究竟需要多少結點才能真正滿足你的應用程式,這就要看你了。但是透過tpc-h實測,其實也沒快多少,兩個節點了不起才快50%。
回覆刪除但是新增修改刪除就不一樣了,請參考http://pgcluster.projects.postgresql.org/structure_of_replication.html
。他的意思是這樣,如果是正常模式,就看是哪個真實DB先接到寫入查詢,但是執行完後就馬上回應。然後後面的replicator繼續做他的,不做檢查,因此只花一個真實DB的時間。但是如果是安全模式,會等到所有資料庫都完成寫入查詢才回應。因此在正常模式下,不見得會慢喔。而如果你使用mulit-master,則要等到所有的master都回應才算是完成。
我的建議是,如果你無法裝很多節點,又想要效能,建議你還是挑一個快的資料庫如Oracle然後用一台很強的機器去跑。pgcluster還是要多節點才能達到理想的效能。
而如果你只是想方便備份,定期使用pg_dump就可以基本的解決你的問題,不需要用pgcluster。但是我更偷懶,我將整個pgsql/data都複製起來備份,要還原的話複製回去就好,這個備份方法就要看你的資料庫大不大了。
真的很感謝您的回應,這樣我大致了解pgcluster的做法了。
回覆刪除目前在公司我的做法是定期pg_dump,將整個pgsql/data複製起來,只能針對同版本的pgsql來做還原,而且資料庫太大,會複製好久啊!
請教一下,PGCluster 最新版是 1.7 嗎? 哪裡可以下載最新版安裝呢?
回覆刪除謝謝。
http://pgcluster.projects.postgresql.org/
回覆刪除怎麼覺得好像有點胡鬧的感覺?
不好意思,我發現預設會把妳的名字自動填入,上次留言時沒有注意到。
回覆刪除我想再請教一個問題,有RPM版本嗎?
基本上是沒有,這個程式相當小,手動編譯不會很困難的。
回覆刪除你好,请教一个关于pgcluster的问题,我试了很多种方案,现在都出现一个问题
回覆刪除只要pgreplicate server 启动着 pgadmin和JDBC访问数据库都出现问题,挂起在那,象死机一样,连接方式也试了两种,一种是直接访问clusterDb,另一种是通过balance来访问,都不行.
这个会存在什么样的问题呢?
感谢您的任何答复
因為不太清楚實際的情況,從我的角度看,比較像是防火牆的問題。我只能告訴你,先從防火牆開始,再來是檢查所有real db的pg_hba.conf。接著在real db的機器上,試著用psql -h {主機名稱}來交叉連連看是否能夠登入,如果可以的話,我相信pgadmin就不會有問題。再不行的話,就得詳細地檢查網路及伺服器環境了。
回覆刪除cluster的db弄在同一台主機上~~
回覆刪除能夠增進pgsql效能嗎?
理論上是不行的,而且還會增加多餘的cpu負載
回覆刪除