POSTGRESQL主備部署模式


一、預期目的

主數據庫(Primary pg ,假定主機名為A,后文不再贅述)和備用數據庫(Standby pg,假定主機名為B,后文不再贅述)之間的數據能夠相互備份。

主數據庫發生故障時備用數據庫可以接管工作,變為主數據庫。舊的主數據庫恢復后,能變為新的主數據庫的備用數據庫。

主數據庫有寫入、讀取功能,備數據庫只有讀取功能。

二、使用的軟件

Pgpool-II

Postgresql 9.2

使用的特性:

posgresql的streaming replication 功能

pgpool-II的master/slave和online recovery

三、部署結構圖

 

四、部署環境

在centos、suse環境下

服務器有幾個系統配置需要修改:文件句柄數和最大用戶進程數

1.    修改最大用戶進程數

vi /etc/security/limits.conf  添加

 

*          soft     nproc          65535

*          hard     nproc          65535

*          soft     nofile         65535

*          hard     nofile         65535

and  vi  /etc/security/limits.d/90-nproc.conf 添加

 

*          soft     nproc          65535

*          hard     nproc          65535

*          soft     nofile         65535

*          hard     nofile         65535

2.    修改文件句柄數

vi  /etc/sysctl.conf   添加

fs.file-max = 65536

 

3.    驗證:

 ulimit -a  命令可得結果

五、部署步驟

4.    創建postgres用戶

最好手動創建postgres用戶,如果已經存在請先刪除,語句如下:

userdel -r postgres    //刪除postgres用戶及其對應的主目錄

useradd -d /home/postgres  -m -g root postgres   //創建用戶postgres,-d指定主目錄為/solr/postgres,-m如果目錄不存在則創建該目錄,-g指定用戶組為root。

5.    修改postgres用戶密碼

passwd postgres  //修改postgres用戶密碼,需要在root用戶下執行。連續輸入兩次密碼postgres,postgres。

6.    關閉所有機器的防火牆

在centos下:

 

chkconfig iptables off

service iptables stop

在suse下:

sudo SuSEfirewall2 stop

 

7.    ssh無密鑰登錄postgres用戶

在所有需要安裝pg數據庫的主機之間以及主機自己跟自己之間,要求相互能夠無密鑰登錄。

在進行下面操作前,請確保主機這間通過ip及主機名能夠相否ping通。

1)   登錄主機A,進入postgres用戶

su postgres

執行以下命令生成密鑰對

ssh-keygen -t dsa

在整個過程中只需點擊Enter建

 

2)   登錄主機B,進入postgres用戶

su postgres

執行以下命令生成密鑰對

ssh-keygen -t dsa

 

在整個過程中只需點擊Enter建

 

3)   登錄主機A

su postgres

將密鑰對的公鑰加入相應主機

 

cat  ~/.ssh/id_dsa.pub  |  ssh postgres@A  'cat - >> ~/.ssh/authorized_keys'

在提示輸入密碼后,就能在主機A的postgres用戶下無密鑰登錄到主機A的postgres用戶了。測試命令為:

ssh  A

 

cat  ~/.ssh/id_dsa.pub  |  ssh postgres@B  'cat - >> ~/.ssh/authorized_keys'

在提示輸入密碼后,就能在主機A的postgres用戶下無密鑰登錄到主機B的postgres用戶了。測試命令為:

ssh  B

 

4)   登錄主機B

su postgres

將密鑰對的公鑰加入相應主機

 

cat  ~/.ssh/id_dsa.pub  |  ssh postgres@A  'cat - >> ~/.ssh/authorized_keys'

在提示輸入密碼后,就能在主機B的postgres用戶下無密鑰登錄到主機A的postgres用戶了。測試命令為:

ssh  A

 

cat  ~/.ssh/id_dsa.pub  |  ssh postgres@B  'cat - >> ~/.ssh/authorized_keys'

在提示輸入密碼后,就能在主機B的postgres用戶下無密鑰登錄到主機B的postgres用戶了。測試命令為:

ssh  B

8.    安裝C++ 編譯包

如果c++的編譯包沒有安裝,需要安裝,已經安裝可以跳過。

將目錄gcc及其下的文件copy到需要安裝gcc的主機上,如在/home/pcc下面。

cd  /home/gcc  //切換到gcc目錄下

chmod  +x  *.rpm  //修改所有rpm為可執行權限

以下命令為安裝gcc的包:

rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm

rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm

rpm -ivh cpp-4.4.6-4.el6.x86_64.rpm --force --nodeps 

rpm -ivh  kernel-headers-2.6.32-279.el6.x86_64.rpm

rpm -ivh glibc-headers-2.12-1.80.el6.x86_64.rpm --force --nodeps

rpm -ivh glibc-devel-2.12-1.80.el6.x86_64.rpm  --force --nodeps

rpm -ivh libgomp-4.4.6-4.el6.x86_64.rpm

rpm -ivh nscd-2.12-1.80.el6.x86_64.rpm --force --nodeps

rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm

rpm -ivh gcc-4.4.6-4.el6.x86_64.rpm  --force --nodeps

rpm -ivh libstdc++-devel-4.4.6-4.el6.x86_64.rpm --force --nodeps

rpm -ivh gcc-c++-4.4.6-4.el6.x86_64.rpm --force --nodeps

9.    安裝postgresql數據庫

主數據庫節點及備用數據庫節點均需安裝,確保不同機器上指定的安裝路徑相同,建議不要安裝在系統盤。

 

將postgresql-9.2.4-1-linux-x64.run放到待安裝數據庫的主機任意目錄下。

chmod  +x postgresql-9.2.4-1-linux-x64.run //修改權限為可執行

./postgresql-9.2.4-1-linux-x64.run    //開始安裝

在安裝的過程中,需要指定安裝路徑,此處例子為/opt/PostgreSQL/9.2;還需要指定超級用戶的密碼,請指定為postgres;需要選定數據庫編碼,請選擇UTF-8 CN 。

安裝完成后需要將數據庫的執行目錄加入系統環境變量PATH中:

vi /etc/profile

在文件的開始處加入

export  PATH=/opt/PostgreSQL/9.2/bin:$PATH

退出vi,刷新配置文件

source /etc/profile

 

 

1)   修改pg_hba.conf文件內容

在/opt/PostgreSQL/9.2/data/pg_hba.conf里面

pool_hba.conf 10.196.0.0可能需要根據你的網絡環境修改。

注意除上面兩行外,還需要加入下面兩行,stream replication要求必須為偽數據庫replication配置連接權限。

 

2)   重啟數據庫

su postgres //到postgres用戶下

pg_ctl   -D  /opt/PostgreSQL/9.2/data restart

10.         安裝pgpool-II

將pgpool-II-3.2.6.tar.gz放置到要安裝的機器上(主備主機上都要安)的目錄下。

在root用戶下操作

tar zxvf pgpool-II-3.3.1.tar.gz   //解壓pgpool-II-3.2.6.tar.gz到當前目錄

cd pgpool-II-3.3.1 //進入解壓的pgpool目錄

./configure  --with-pgsql=/opt/PostgreSQL/9.2  //配置pgpool編譯環境,/opt/PostgreSQL/9.2為上步安裝的pg數據庫的路徑。

make   //編譯

make install  //安裝

 

刷新共享庫文件

sudo ldconfig -v

 

然后,安裝pgpool-II的pg數據庫c語言函數

在root用戶下操作

cd  pgpool-II-3.3.1/sql/pgpool-regclass/  //到解壓出的pgpool-II下的pgpool-regclass目錄下

make install //編譯安裝

 

cd pgpool-II-3.3.1/sql/pgpool-recovery/  //到解壓出的pgpool-II下的pgpool-recovery目錄下

make install  //編譯安裝

 

su postgres //到postgres用戶下,以下.sql文件的路徑根據安裝環境相應的調整

 

psql -f  /home/pgpool-II-3.3.1/sql/pgpool-regclass/pgpool-regclass.sql template1

psql -f  /home/pgpool-II-3.3.1/sql/pgpool-regclass/pgpool-regclass.sql postgres

 

psql -f  /home/pgpool-II-3.3.1/sql/pgpool-recovery/pgpool-recovery.sql template1 

psql -f  /home/pgpool-II-3.3.1/sql/pgpool-recovery/pgpool-recovery.sql postgres

 

/home/kmstool/postgresql/pgpool-II-3.3.1/sql -f /home/kmstool/postgresql/pgpool-II-3.3.1/sql/pgpool-regclass/pgpool-regclass.sql template1

11.         配置postgresql數據庫

以下1至4步需在主、備數據庫上都執行

1)   創建目錄

mkdir  /opt/PostgreSQL/9.2/archive

修改所屬用戶

chown  postgres:postgres /opt/PostgreSQL/9.2/archive

2)   修改postgresql.conf文件內容

在/opt/PostgreSQL/9.2/data/postgresql.conf里面,修改

wal_level = hot_standby # minimal, archive, or hot_standby

archive_mode = on    

max_wal_senders = 5 

hot_standby = on

archive_command = 'cp  -i  "%p"  /opt/PostgreSQL/9.2/archive/"%f"  </dev/null'

//此處路徑/opt/PostgreSQL/9.2/archive為上面創建的路徑

 

修改鏈接數大小:max_connections=5000; 

3)   加入並修改recovery.done

 

將config目錄下的recovery.done文件,copy到A主機的/opt/PostgreSQL/9.2/data目錄下,

修改其中的host=10.196.142.226為主機B的IP。

 

將config目錄下的recovery.done文件,copy到B主機的/opt/PostgreSQL/9.2/data目錄下,

修改其中的host=10.196.142.226為主機A的IP。

 

並根據安裝路徑修改其中的restore_command值的路徑。

修改文件的權限

chown postgres:postgres /opt/PostgreSQL/9.2/data/recovery.done

 

4)   添加並修改basebackup.sh

將config目錄下的basebackup.sh文件,copy到/opt/PostgreSQL/9.2/data/下,並

chmod 777 /opt/PostgreSQL/9.2/data/basebackup.sh //修改為可執行權限

注意根據你的數據庫安裝路徑修改文件里面opt/PostgreSQL/9.2/,共有3處。

 

 

12.         配置pgpool-II

以下配置需在主、備數據庫上都執行

 

1)   添加故障轉移腳本文件

將config目錄下的failover_stream.sh文件,copy到/opt/PostgreSQL/9.2/bin/下,並

chmod 777 /opt/PostgreSQL/9.2/bin/failover_stream.sh //修改為可執行權限

 

2)   添加並修改遠程啟動腳本文件

將config目錄下的pgpool_remote_start文件,copy到/opt/PostgreSQL/9.2/data/下,並

chmod 777 /opt/PostgreSQL/9.2/data/pgpool_remote_start //修改執行權限

注意根據你的數據庫安裝路徑修改文件中的/opt/PostgreSQL/9.2/bin/pg_ctl。

 

3)   修改pgpool-II配置

將config目錄下的pcp.conf文件,copy到usr/local/etc/下,並

chmod 777  /usr/local/etc/pcp.conf  //修改權限

 

將config目錄下的pgpool.conf文件,copy到usr/local/etc/下,並

chmod 777  /usr/local/etc/pgpool.conf  //修改權限

根據部署情況修改pgpool.conf文件內容:

此處A、B分別為主備數據庫主機名

backend_hostname0 = 'A'

backend_port0 = 5432

backend_weight0 = 1

backend_data_directory0 = '/opt/PostgreSQL/9.2/data'

backend_hostname1 = 'B'

backend_port1 = 5432

backend_weight1 = 100

backend_data_directory1 = '/opt/PostgreSQL/9.2/data'

failover_command = '/opt/PostgreSQL/9.2/bin/failover_stream.sh  %d  %H  /tmp/trigger_file'

//需要根據安裝情況修改

 

4)   創建目錄

mkdir  /var/run/pgpool

chown  postgres:root  /var/run/pgpool/

 

13.         啟動數據庫

以下操作順序很重要,請一定遵循。

 

1)   先將主、備數據庫都關閉

su postgres  //到postgres用戶下

pg_ctl   -D  /opt/PostgreSQL/9.2/data  stop

2)   啟動主數據庫

在主數據庫主機上

su postgres  //到postgres用戶下

pg_ctl   -D  /opt/PostgreSQL/9.2/data  start

3)   啟動備數據庫 

先,在主數據庫主機上

su  postgres

sh  /opt/PostgreSQL/9.2/data/basebackup.sh  /opt/PostgreSQL/9.2/data  B  /opt/PostgreSQL/9.2/data

//   B為備數據庫的主機名

 

再,在備數據庫主機上啟動數據庫

su postgres  //到postgres用戶下

pg_ctl   -D  /opt/PostgreSQL/9.2/data  start

4)   啟動成功的驗證

在主數據庫主機上,執行

ps -ef | grep sender

預期結果

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

在備數據庫主機上,執行

ps -ef | grep receiver

預期結果

 

14.         啟動pgpool-II

啟動單機pgpool

現在只需要啟動一個pgpool-II,在主數據庫主機上啟動。結合HA的虛擬IP,可以啟動兩個pgpool-II,如果你選擇有HA的pogool請直接跳到第六節。

touch  /home/pgpool.log

chmod 777  /home/pgpool.log //改變權限

su  postgres //到postgres用戶

pgpool -n -d > /home/pgpool.log 2>&1 &

現在,直接可以通過pgadmin工具去連接pppool-II的9999端口數據庫。能夠寫入和查詢。

在關掉主數據庫(必須kill不能stop)后,仍然能訪問pppool-II的9999端口。

通過命令可重啟原來的主數據庫,此時它變為新主數據庫的備用數據庫。

pcp_recovery_node  -d  5  A  9898 postgres postgres  0

//A為啟動的pgpool-II的主機名

此時如果B數據庫死掉,不能自動將A切換為主數據庫,為了解決該問題以及pgpool的單點故障,請參考六節的配置。

六、pgpool的HA

 

1.    修改pgpool的配置

修改主、備數據庫主機上的pgpool.conf文件的配置:

use_watchdog = on

delegate_IP = '10.196.142.230'      # 配置一個虛擬IP,務必確保此IP沒有被人使用

wd_hostname = 'A'                # 在A主機上配置A,在B主機上配置B

ifconfig_path = '/home/apache/sbin'   # ifconfig command path

arping_path = '/home/apache/sbin'    # arping command path

wd_interval = 3

other_pgpool_hostname0 = 'B'       #在A主機上配置B,在B主機上配置A

other_pgpool_port0 = 9999

other_wd_port0 = 9000

heartbeat_destination0 = 'B'         #在A主機上配置B,在B主機上配置A

修改完成上面的配置文件后,分別在主、備數據庫的root用戶下做下面的操作

 

mkdir -p /home/apache/sbin

chown postgres:postgres /home/apache/sbin

chmod 700 /home/apache/sbin

 

cp /sbin/ifconfig /home/apache/sbin

cp /usr/sbin/arping /home/apache/sbin

chmod 4755 /home/apache/sbin/ifconfig

chmod 4755 /home/apache/sbin/arping

 

修改主數據庫的配置文件failover_stream.sh中的$failed_node = 1 為$failed_node = 0,備數據不需要修改。

 

在此配置文件中,有一個與網絡有關的配置可能需要修改,

先用ifconfig命令查看

注意此處的網絡設置使用的是bond1,默認一般使用eth0,如果使用的事bond1,那么在配置中需要需改為bond1,如下圖

2.    啟動有HA的pgpool

在主、備數據庫主機上分別:

touch /home/pgpool.log

chmod 777 /home/pgpool.log //改變權限

su  postgres //到postgres用戶

pgpool -n -d > /home/pgpool.log 2>&1 &

 

此時A數據庫為主數據庫,B數據庫為備數據庫,虛擬IP在A機上。可通過gpadmin工具來連接虛擬IP的9999端口,跟普通的5432的操作一樣

 

3.    驗證效果                                                                   

1)   關掉主機A

如上設置后,將A機關掉,B機自動接管,並且B機會開啟動虛擬IP,達到popool的HA。仍可通過gpadmin工具來連接虛擬IP的9999端口,跟普通的5432的操作一樣。

 

此時B機會啟動虛擬IP,並將B機設置為主數據庫。

 

需要重新啟動A機為備數據庫,過程如下:

接着要將A機重新開機,這時postgres會自動開啟,需要先將其先關掉,

在A機上

su  postgres

pg_ctl -D /opt/PostgreSQL/9.2/data stop

 

在B機上執行

su postgres

pcp_recovery_node  -d  5  B  9898 postgres postgres  0

會重新將A機與B機的數據庫同步並重啟A機的pg數據庫。

 

在A機上重啟pgpool

su postgres

pgpool -n -d > /home/pgpool.log 2>&1 &

 

在B機pgpool上刷新A機pg的狀態

su postgres

pcp_attach_node  -d  5  B  9898 postgres postgres 0

 

此時B數據庫為主數據庫,A數據庫為備數據庫,虛擬IP在B機上。

 

2)   關掉主機B

將B機關掉,A機自動接管,並且A機會開啟動虛擬IP,達到popool的HA。仍可通過gpadmin工具來連接虛擬IP的9999端口,跟普通的5432的操作一樣。

 

此時A機會啟動虛擬IP,並將A機設置為主數據庫。

 

需要重新啟動B機為備數據庫,過程如下:

接着要將B機重新開機,這時postgres會自動開啟,需要先將其先關掉,

在B機上

su  postgres

pg_ctl -D /opt/PostgreSQL/9.2/data stop

 

在A機上執行

su postgres

pcp_recovery_node  -d  5  A  9898 postgres postgres  1

會重新將B機與A機的數據庫同步並重啟B機的pg數據庫。

 

在B機上重啟pgpool

su postgres

pgpool -n -d > /home/pgpool.log 2>&1 &

 

在A機pgpool上刷新B機pg的狀態

su postgres

pcp_attach_node  -d  5  A  9898 postgres postgres  1

 

此時A數據庫為主數據庫,B數據庫為備數據庫,虛擬IP在A機上。回到原來的位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM