postgresql叢集搭建

基於pgpool中介軟體實現postgresql一主多從叢集部署,這裡用兩臺伺服器作一主一從示例

虛擬機器名 IP 主從劃分
THApps 192.168.1.31 主節點
YY-Test-01 192.168.1.36 從節點
vip 192.168.1.100 虛擬ip

1.軟體版本

系統版本 CentOS Linux release 7.9.2009 (Core)
PostgreSQL 10
pgpool-II 4.0.1

2.整體架構

3.安裝postgresql

postgresql 安裝步驟請檢視IOT私有化部署文件,兩臺伺服器都需要安裝

3.1主節點配置

(1)建立用於主從訪問的使用者, 修改postgres使用者的密碼,用於遠端登入。(切換到postgres使用者操作)

su - postgres
psql
create role actorcloud login replication encrypted password 'public';
alter role postgres with password 'postgres';

(2)修改pg_hba.conf和postgresql.conf配置:

vim /var/lib/pgsql/10/data/pg_hba.conf在最後一行新增下面內容:

host    replication    actorcloud    192.168.1.31/32    trust
host replication actorcloud 192.168.1.36/32 trust
host all all 192.168.1.0/24 md5
host all all 0.0.0.0/0 md5

修改postgresql.conf配置:

vim /var/lib/pgsql/10/data/postgresql.conf

listen_addresses = '*'
port = 5432
wal_level = replica
max_wal_senders= 10
wal_keep_segments = 10240
max_connections = 512

(3)重啟主節點

建議先停止,再啟動,而不是重啟。之後再驗證一下是否啟動成功

systemctl stop postgresql-10
systemctl start postgresql-10

3.2從節點配置

從節點的操作建議全部在postgres使用者下進行。

(1)切換postgres使用者

su - postgres

(2)對主節點的資料進行備份到從節點,其中192.168.1.31為主節點IP,actorcloud是上一節主節點建立的使用者。

rm -rf /var/lib/pgsql/10/data/*
pg_basebackup -h 192.168.1.31 -U actorcloud -D /var/lib/pgsql/10/data -X stream -P

(3)拷貝recovery.conf,編輯recovery.conf內容,其中192.168.1.31對應主機IP,actorcloud是上一節主機建立的使用者。

cp /usr/pgsql-10/share/recovery.conf.sample /var/lib/pgsql/10/data/recovery.conf

vim /var/lib/pgsql/10/data/recovery.conf修改配置:

standby_mode = on
primary_conninfo = 'host=192.168.1.31 port=5432 user=actorcloud password=public'
recovery_target_timeline = 'latest'
trigger_file = '/tmp/trigger_file0'

(4)修改從節點的postgresql.conf,用於開啟standby模式。

hot_standby = on

(5)退出postgres使用者,重啟PostgreSQL

4.驗證主從

4.1檢視從節點資訊

在主節點切換至psql介面,輸入命令:

select client_addr,sync_state from pg_stat_replication;

若從節點顯示出來,如下圖所示,則說明PostgreSQL叢集搭建成功。

4.2讀寫測試

(1)在主節點寫資料,從節點讀資料。

create database test;
\l

在從節點上檢視建立之後的資料庫。可以看見,資料庫同步了。

\l

5.postgres使用者間免密登入

先關閉防火牆和SETLINUX,操作請檢視IOT私有化部署文件

以下操作兩臺機器同時進行:

(1)給postgres使用者更改密碼:密碼修改為postgres

passwd postgres

(2)生成並同步金鑰

以192.168.1.31為例,想要免密登入另外一臺機器。先切換到postgres使用者執行,ssh-keygen時一路回車往下,提升輸入y時輸入y,ssh-copy-id時需要輸入密碼。

su postgres
ssh-keygen
ssh-copy-id 192.168.1.36

測試免密登入:

ssh 192.168.1.36
ip addr

同理在192.168.1.36機器上也是相同操作

6.安裝pgpool

(1)安裝(兩臺機器都需要安裝)

# 新增源
yum install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-release-4.0-1.noarch.rpm # 安裝
yum install pgpool-II-pg10-debuginfo pgpool-II-pg10-devel pgpool-II-pg10-extensions pgpool-II-pg10

安裝完之後pgpool的配置檔案在/etc/pgpool-II/下

(2)修改配置(兩臺機器都需要配置)

pool_hba.conf和之前配置的PostgreSQL中的配置時一樣的

vim /etc/pgpool-II/pool_hba.conf
host replication actorcloud 192.168.1.31/32 trust
host replication actorcloud 192.168.1.36/32 trust
host all all 192.168.1.0/24 md5
host all all 0.0.0.0/0 md5

(3)對postgres的密碼進行加密。本文將postgres的密碼設定為和使用者名稱相同,將加密結果複製,並貼上到pcp.conf中相應的位置,取消掉該行的註釋。

pg_md5 postgres

vim /etc/pgpool-II/pcp.conf
postgres:81dc9bdb52d04dc20036dbd8313ed055

(4)執行命令(先切換到postgres使用者再執行然後輸入密碼):

pg_md5 -m -p -u postgres pool_passwd

7.修改叢集配置

以192.168.1.31主節點為例

vim /etc/pgpool-II/pgpool.conf

(1)修改監聽地址,將localhost改為*,即監聽所有地址發來的請求。

修改前:listen_addresses = 'localhost'
修改後:listen_addresses = '*'

(2)修改backend相關引數,對應的是PostgreSQ兩個節點的相關資訊。

修改前:
backend_hostname0 = 'localhost'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
修改後:
backend_hostname0 = '192.168.1.31'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/10/data'
backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = '192.168.1.36'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/10/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

(3)pg_hba.conf生效

修改前:enable_pool_hba = off
修改後:enable_pool_hba = on

(4)使負載均衡生效

修改前:load_balance_mode = off
修改後:load_balance_mode = on

(5)主從流複製生效,並配置用於檢查的使用者,這個使用者就用上方建立的用於主從訪問的使用者。

修改前:
master_slave_mode = off
sr_check_period = 0
sr_check_user = 'nobody'
sr_check_password = ''
sr_check_database = 'postgres'
delay_threshold = 0
修改後:
master_slave_mode = on
sr_check_period = 6
sr_check_user = 'actorcloud'
sr_check_password = 'public'
sr_check_database = 'postgres'
delay_threshold = 10000000

(6)健康檢查相關配置,並配置用於檢查的使用者,這個使用者就用上方建立的用於主從訪問的使用者。

修改前:
health_check_period = 0
health_check_user = 'nobody'
health_check_password = ''
health_check_database = ''
修改後:
health_check_period = 10
health_check_user = 'actorcloud'
health_check_password = 'public'
health_check_database = 'postgres'

(7)配置主機故障觸發執行的指令碼。

修改前:failover_command = ''
修改後:failover_command = '/var/lib/pgsql/10/failover_stream.sh %d %H'

(8)開啟開門狗,IP為本機IP

修改前:
use_watchdog = off
wd_hostname = ''
修改後:
use_watchdog = on
wd_hostname = '192.168.1.31'

(9)開啟虛擬IP,並修改網絡卡資訊。啟動後直接使用虛擬IP進行資料庫操作劇哦

修改前:
delegate_IP = ''
if_up_cmd = 'ip addr add $_IP_$/24 dev eth0 label eth0:0'
if_down_cmd = 'ip addr del $_IP_$/24 dev eth0'
arping_cmd = 'arping -U $_IP_$ -w 1 -I eth0'
修改後:
delegate_IP = '192.168.1.100'
if_up_cmd = 'ip addr add $_IP_$/24 dev ens192 label ens192:0'
if_down_cmd = 'ip addr del $_IP_$/24 dev ens192'
arping_cmd = 'arping -U $_IP_$ -w 1 -I ens192'

上方把所有eth0改為了ens192,ens192是該主機的網絡卡裝置名稱,可通過命令ip addr檢視

(10)心跳檢查的配置與看門狗配置。IP為從節點的IP

修改前:
heartbeat_destination0 = 'host0_ip1'
heartbeat_device0 = ''
#other_pgpool_hostname0 = 'host0'
#other_pgpool_port0 = 5432
#other_wd_port0 = 9000
修改後:
heartbeat_destination0 = '192.168.1.36'
heartbeat_device0 = 'ens192'
other_pgpool_hostname0 = '192.168.1.36'
other_pgpool_port0 = 9999
other_wd_port0 = 9000

以上,是主節點的配置。對於從節點,只有(8)和(10)的IP需要更改,其他的一致。

8.編寫故障切換指令碼

vim /var/lib/pgsql/10/failover_stream.sh

內容為:



9.檔案許可權更改

chmod u+s /sbin/ifconfig &&chmod u+s /usr/sbin

chown postgres:postgres /var/lib/pgsql/10/failover_stream.sh && chmod 777 /var/lib/pgsql/10/failover_stream.sh

chown -R postgres.postgres /etc/pgpool-II

mkdir /var/log/pgpool

chown -R postgres.postgres /var/log/pgpool

mkdir /var/run/pgpool

chown -R postgres.postgres /var/run/pgpool

10.執行pgpool

# 啟動
systemctl start pgpool
# 開機自啟
systemctl enable pgpool

登入虛擬ip檢視叢集節點。以後所有的操作均可通過連線虛擬IP操作資料庫。

psql -p 9999 -h 192.168.1.100 -U postgres
show pool_nodes;

至此,基於 Pgpool-II 中介軟體的 PostgreSQL 叢集搭建完成。