一、預期目的
主數據庫(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機上。回到原來的位置。