Postgresql + Pgpool 主从及高可用配置
軟件版本
服務器:CentOS7
PostgresSql:14
PGPool-II:4.3.1
操作注意事項:
1.?? 注意目錄歸屬及權限,建議相關目錄均使用【chown -R postgres:postgres 目錄】執行一次,防止權限問題
2.???數據庫相關部分只需要配置主庫,從庫在安裝完成后,不需要啟動及初始化
3.?? pgpool的配置在各服務器上一致,都需要操作一遍
4. ??SSH免密登錄配置完成請驗證
5.?? 從庫初始化及主庫恢復需要配置插槽
6.?? psql的根目錄/usr/pgsql-14/bin/psql,若搞不清楚目錄,請使用完整路徑運行
7.?? 最好聯網安裝,防止產生依賴,或者指令缺失
參考文檔
Pgpool-II + Watchdog Setup Example
本文主體根據官方文檔制作,去除大段的解釋文字,優化了部分操作順序,并補充幾個官方未提及的細節點,筆者所作文檔與網上其他文檔差距較大,請不要同時參考,若發現了筆者沒有碰到的問題,再額外去查詢。
官方文檔比較詳細,但請注意版本,不同版本差距較大
Pg14安裝
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql14-server
初始化數據庫
/usr/pgsql-14/bin/postgresql-14-setup initdb
相關目錄
軟件目錄
/usr/pgsql-14/
數據目錄 ??? ????????
/var/lib/pgsql/14/data/
存檔目錄
/var/lib/pgsql/archivedir
修改密碼
su - postgres
psql
\password postgres
postgres在系統與數據庫均有賬戶,兩邊密碼可以不一致
配置遠程訪問
vi /var/lib/pgsql/14/data/pg_hba.conf
填入如下或類似語句,讓全部或指定的服務器訪問數據庫
host??? all???????????? all???????????? 0.0.0.0/0?????????????? md5
vi /var/lib/pgsql/14/data/postgresql.conf
添加下方語句,監聽所有服務器請求
listen_addresses = '*'
打開防火墻端口,默認5432
firewall-cmd --permanent --zone=public --add-service=postgresql
firewall-cmd --permanent --zone=public --add-port=5432/tcp
firewall-cmd --reload
配置自啟
systemctl enable postgresql-14
開關服務
systemctl start postgresql-14
systemctl stop postgresql-14
systemctl restart postgresql-14
主從IP
主:10.70.1.118
從:10.70.1.119
虛擬:10.70.1.120
Pgpool-II安裝
vi /etc/yum.repos.d/pgdg-redhat-all.repo
添加加粗內容并保存
[pgdg-common]
...
exclude=pgpool*
[pgdg14]
...
exclude=pgpool*
[pgdg13]
...
exclude=pgpool*
[pgdg12]
...
exclude=pgpool*
[pgdg11]
...
exclude=pgpool*
[pgdg10]
...
exclude=pgpool*
[pgdg96]
...
exclude=pgpool*
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-release-4.3-1.noarch.rpm
yum install -y pgpool-II-pg14-*
目錄
日志目錄
/var/log/pgpool_log/
軟件目錄
/etc/pgpool-II/
Run目錄,這兩個是同一個目錄,var下的是一個連接
/run/pgpool/?? ???? /var/run/pgpool/
編輯主庫
vi /var/lib/pgsql/14/data/postgresql.conf
修改并添加如下內容, 可以加其他參數,官方沒提,我也就沒加
listen_addresses = '*'
archive_mode = on
archive_command = 'cp "%p" "/var/lib/pgsql/archivedir/%f"'
max_wal_senders = 10
max_replication_slots = 10
wal_level = replica
hot_standby = on
wal_log_hints = on
添加用戶
su - postgres
psql
SET password_encryption = 'scram-sha-256';
CREATE ROLE pgpool WITH LOGIN;
CREATE ROLE repl WITH REPLICATION LOGIN;
\password pgpool
\password repl
\password postgres
GRANT pg_monitor TO pgpool;
配置SSH,實現無密碼登錄效果
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@server1
ssh-copy-id -i id_rsa_pgpool.pub postgres@server2
su - postgres
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@server1
ssh-copy-id -i id_rsa_pgpool.pub postgres@server2【
1.?? 使用ssh postgres@serverX -i ~/.ssh/id_rsa_pgpool指令檢驗是否需要密碼,
2.?? 若需要密碼,上述目錄均執行restorecon -R -v ~/.ssh
3.?? 可能需要自己建立.ssh文件夾
4.?? 可能需要修改linux中postgres賬戶密碼,非postgresql里的密碼
pool_hba.conf配置訪問
vi /etc/pgpool-II/pool_hba.conf
格式同pg_hba.conf,
host??? all???????????? all???????????? 0.0.0.0/0?????????????? trust
host??? replication???? all??????????? ?0.0.0.0/0?????????????? trust
配置.pgpass
su - postgres
vi /var/lib/pgsql/.pgpass
填入下方內容,注意文件權限及歸屬
#【ip】:【port】:【group】:【user】:【pwd】
10.70.1.118:5432:replication:repl:repl
10.70.1.119:5432:replication:repl:repl
10.70.1.118:5432:postgres:postgres:postgres
10.70.1.119:5432:postgres:postgres:postgres
chmod 600? /var/lib/pgsql/.pgpass
防火墻
firewall-cmd --permanent --zone=public --add-service=postgresql
firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9000/tcp? --add-port=9694/udp
firewall-cmd --reload
開機自啟
systemctl enable pgpool.service
配置節點ID
第一臺服務器配1,第二臺配置2,以此類推
vi /etc/pgpool-II/pgpool_node_id
根據設備順序,填入數字,0,1,2,3,4…
0
pgpool.conf配置
填入以下內容,根據實際進行修改,主要就是IP,網卡【本例中ens33】
# 集群模式 【流復制】
backend_clustering_mode = 'streaming_replication'
# 通訊
listen_addresses = '*'
port = 9999
# 流復制檢查
sr_check_user = 'pgpool'
sr_check_password = ''
# 健康檢查
health_check_period = 5
health_check_timeout = 30
health_check_user = 'pgpool'
health_check_password = ''
health_check_database = 'postgres'
# 后端設置【配置IP】
backend_hostname0 = '10.70.1.118'
backend_data_directory0 = '/var/lib/pgsql/14/data/'
backend_port0 = 5432
backend_weight0 = 1
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = "zhu" #用于顯示
backend_hostname1 = '10.70.1.119'
backend_data_directory1 = '/var/lib/pgsql/14/data/'
backend_port1 = 5432
backend_weight1 = 1
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = "cong" #用于顯示
# 故障轉移配置【腳本可能需要修改PGHOME】
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
# follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R' #三個及以上需要配置
# 在線恢復配置【主服務器 創建recovery_1st_stage和pgpool_remote_start,并添加執行權限】
recovery_user = 'postgres'
recovery_password = ''
recovery_1st_stage_command = 'recovery_1st_stage'
# 客戶端認證配置
enable_pool_hba = on
pool_passwd = 'pool_passwd'
# 看門狗 VIP 【可能需要配置visudo】【網卡】
use_watchdog = on
delegate_IP = '10.70.1.120'
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens33 label ens33:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens33'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens33'
# 看門狗停止事件【腳本內需要配置網卡】
wd_escalation_command = '/etc/pgpool-II/escalation.sh'
# 服務器【配置IP】
hostname0 = '10.70.1.118'
wd_port0 = 9000
pgpool_port0 = 9999
hostname1 = '10.70.1.119'
wd_port1 = 9000
pgpool_port1 = 9999
# 偶數節點需要打開
enable_consensus_with_half_votes = on
# 生命檢查
wd_lifecheck_method = 'heartbeat'
wd_interval = 10
heartbeat_hostname0 = '10.70.1.118'
heartbeat_port0 = 9694
heartbeat_device0 = 'ens33'
heartbeat_hostname1 = '10.70.1.119'
heartbeat_port1 = 9694
heartbeat_device1 = 'ens33'
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
# 日志
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/pgpool_log'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
#
pid_file_name = '/run/pgpool/pgpool.pid'
注意配置文件中涉及到的目錄均需要權限
需要注意配置文件中涉及到的run目錄,若run目錄下是pgpool-II,則都改成pgpool-II,不要自己建文件夾
pcp.conf配置
密碼填入對應賬戶的實際密碼
echo 'pgpool:'`pg_md5 密碼` >> /etc/pgpool-II/pcp.conf
echo 'postgres:'`pg_md5 密碼` >> /etc/pgpool-II/pcp.conf
su - postgres
echo 'localhost:9898:pgpool:密碼' > ~/.pcppass
chmod 600 ~/.pcppass
故障恢復指令
cp -p /etc/pgpool-II/recovery_1st_stage.sample /var/lib/pgsql/14/data/recovery_1st_stage
cp -p /etc/pgpool-II/pgpool_remote_start.sample /var/lib/pgsql/14/data/pgpool_remote_start
chown postgres:postgres /var/lib/pgsql/14/data/{recovery_1st_stage,pgpool_remote_start}
僅主庫需要執行
su - postgres
psql template1 -c "CREATE EXTENSION pgpool_recovery"
pool_passwd配置
su - postgres
echo 'some string' > ~/.pgpoolkey
chmod 600 ~/.pgpoolkey
pg_enc -m -k ~/.pgpoolkey -u pgpool -p
pg_enc -m -k ~/.pgpoolkey -u postgres -p
cat /etc/pgpool-II/pool_passwd
配置escalation.sh
vi /etc/pgpool-II/escalation.sh
需配置下方內容
PGPOOLS=(zhu cong)
VIP=10.70.1.120
DEVICE=ens30
配置hosts文件
vi /etc/hosts
#Public IP
10.70.1.118????????? zhu
10.70.1.119????????? cong
#Virtual IP
10.70.1.120????????? vip
/etc/sysconfig/pgpool 配置
vi /etc/sysconfig/pgpool
OPTS=" -D -n"
打開服務
systemctl start pgpool.service
systemctl stop pgpool.service
systemctl restart pgpool.service
查看節點信息
使用虛擬IP
psql -h 10.70.1.120 -p 9999 -U pgpool postgres -c "show pool_nodes"
查看看門狗信息
pcp_watchdog_info -h 10.70.1.120 -p 9898 -U pgpool
從庫初始化,主庫恢復
1.從主庫恢復數據到從庫,從庫不要運行,也不需要初始化
pcp_recovery_node -h 10.70.1.120 -p 9898 -U pgpool -n 1
若執行失敗,多半是權限問題,可以使用腳本測試一下
./recovery_1st_stage '/var/lib/pgsql/14/data/' '10.70.1.119' '/var/lib/pgsql/14/data/' '5432' 1 '5432' '10.70.1.118'
???? 參數說明
'/var/lib/pgsql/14/data/' ???????? 【主庫】
'10.70.1.119'???????????????????? 【要恢復的主機IP】
'/var/lib/pgsql/14/data/' ???????? 【要恢復的庫】
'5432' ????????????????????????? 【主節點端口號】
1 ?????????????????????????????? 【要恢復的節點號】
'5432' ????????????????????????? 【要恢復的端口號】
'10.70.1.118'???????????????????? 【主節點IP】
執行報錯后,可以去/var/log/pgpool_log找日志,有類似指令的語句可以更方便的構建該指令
2.配置插槽,若不配置,從庫不能同步主庫數據
su - postgres
psql
查詢指令:SELECT slot_name, slot_type, active FROM pg_replication_slots;
添加指令:SELECT * FROM pg_create_physical_replication_slot('插槽名稱');
插槽名稱在從庫的/var/lib/pgsql/14/data/ myrecovery.conf
primary_slot_name = '10_70_1_119'
3.需要殺掉pgsql進程,使用腳本內恢復數據后,從庫會運行pgsql進程,若不殺掉,不能運行從庫
???? ps -ef | grep pgsql
???? kill 30544
4.運行從庫
???? systemctl start postgresql-14
高可用測試
1.?? 開關pgpool服務,查看虛擬IP轉移情況,數據訪問情況
2.?? 關閉從庫,主庫寫入數據,運行從庫,查看數據是否同步
3.?? 關閉主庫,查看從庫是否變成主庫,是否寫入數據
關閉主庫后,不能立刻運行主庫,會出錯,原因在于從庫升級為主庫了,此時需要使用上面方法使主庫變成從庫運行
4.?? 關閉主庫服務器,查看從庫是否變主庫,虛擬IP轉移情況,期間應該會有短時不能訪問
主從區分
ll /var/lib/pgsql/14/data/
有standby.signal文件的為從服務器
筆者出錯點
1.?? 按本文操作,最好不要先配置好主從,再配置pgpool,自行配置的主從可能不兼容pgpool的配置
2.?? SSH不能免密訪問,本文已提供解決方式
3.?? 目錄歸屬及權限,請格外注意
4.?? 從庫初始化及主庫恢復時的插槽配置
?
總結
以上是生活随笔為你收集整理的Postgresql + Pgpool 主从及高可用配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过DS18B20学时序
- 下一篇: qemu-img转换镜像文件格式