PostgreSQL基於Pacemaker+Corosync+pcs的高可用

T1YSL發表於2022-05-13
地址資訊
172.20.10.6  pg01  
172.20.10.7  pg02
172.20.10.8  pg03
172.20.10.9   vip-master
172.20.10.10  vip-slave

hosts檔案如下
image.png

一、三臺機器同步時間

[root@ysl01 ~]# ntpdate ntp1.aliyun.com
12 May 13:31:04 ntpdate[1571]: adjust time server 120.25.115.20 offset -0.003524 sec

二、安裝依賴包和叢集軟體

1.三個節點均安裝依賴包和叢集軟體

yum install -y pacemaker corosync pcs

其中, pacemaker 為Linux環境中使用最為廣泛的開源 叢集資源管理器, Pacemaker利用叢集基礎架構(Corosync或者 Heartbeat)提供的訊息和叢集成員管理功能,實現節點和資源級別的故障檢測和資源恢復,從而最大程度保證叢集服務的高可用。是 整個高可用叢集的控制中心,用來管理整個叢集的資源狀態行為。客戶端通過 pacemaker來配置、管理、監控整個叢集的執行狀態。

Corosync叢集引擎是一種群組通訊系統(Group Communication System),為應用內部額外提供支援高可用性特性。corosync和heartbeat都屬於訊息網路層, 對外提供服務和主機的心跳檢測,在監控的主服務被發現當機之後,即時切換到從屬的備份節點,保證系統的可用性。一般來說都是選擇corosync來進行心跳的檢測,搭配pacemaker的資源管理系統來構建高可用的系統。

pcs是Corosync和Pacemaker 配置工具。它 允許使用者輕鬆檢視,修改和建立基於Pacemaker的叢集。pcs包含pcsd(一個pc守護程式),它可作為pc的遠端伺服器並提供Web UI。全部受控的 pacemaker和配置屬性的變更管理都可以通過 pcs實現。

2.啟動服務

systemctl start pcsd
systemctl enable pcsd
systemctl enable corosync
systemctl enable pacemaker

image.png

三、啟動叢集

1.設定hacluster使用者密碼(三個節點)

echo hacluster|passwd hacluster --stdin

image.png

2.叢集認證(在任何一個節點上執行)

pcs cluster auth -u hacluster -p hacluster pg01 pg02 pg03

image.png

3.同步配置(在任何一個節點上執行)

pcs cluster setup --last_man_standing=1 --name pgcluster pg01 pg02 pg03

image.png

4.啟動叢集(在任何一個節點上執行)

pcs cluster start --all

image.png

四、安裝PostgreSQL資料庫(三個節點)

1.安裝依賴

yum install -y  openssl openssl-devel readline readline-devel zlib-devel gcc flex

2.建立使用者

groupadd dba -g 1100
useradd postgres -g 1100 -u 1100

image.png

3.安裝資料庫

1.獲取並解壓包

su - postgres
wget 
tar -xf postgresql-11.10.tar.gz

2.編譯安裝(三個節點)

進入目錄

cd postgresql-11.10/
./configure --prefix=/home/postgres/soft 
make world -j24
make install-world -j24

3.初始化資料庫資料目錄到/home/postgres/data(master節點)

/home/postgres/soft/bin/initdb -D /home/postgres/data

4.配置環境變數

vi .bashrc
export PGUSER=postgres
export PGHOME=/home/postgres/soft
export PGDATA=/home/postgres/data
export PATH=${PGHOME}/bin:${PATH}
LD_LIBRARY_PATH=$PGHOME/lib:/usr/local/lib:/usr/local/lib64:/usr/lib64:$LD_LIBRARY_PATH
source .bashrc

5.修改配置檔案和hba

postgresql.conf:

listen_addresses = '*'
wal_level = logical
wal_log_hints = on
max_wal_size = 10GB
min_wal_size = 80MB
checkpoint_completion_target = 0.9 
archive_mode = on
archive_command = '/bin/true'
wal_keep_segments = 1000
synchronous_standby_names = ''
hot_standby_feedback = on 
logging_collector = on
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_size = 0
log_min_duration_statement = 0
log_checkpoints = on
log_connections = on
log_disconnections = on
log_line_prefix = '%t [%p]: db=%d,user=%u,app=%a,client=%h '
log_lock_waits = on
log_temp_files = 0
log_autovacuum_min_duration = 0
lc_messages = 'en_US.UTF-8'

pg_hba.conf:

host    all             all             172.20.10.0/24            md5
host    replication     repluser             172.20.10.0/24       md5

image.png
image.png

6.啟動master資料庫

 pg_ctl start -D /home/postgres/data

image.png

7.建立複製使用者(master節點)

 create user repluser with replication password 'repluser';

image.png

8.建立備機節點(pg02、pg03)

pg_basebackup -h pg01 -U repluser -p 5432 -D /home/postgres/data --wal-method=stream --checkpoint=fast --progress --verbose

image.png
image.png

9.停止master(pg01)

pg_ctl stop -D /home/postgres/data

image.png

五、配置叢集

1.配置cluster_setup.sh指令碼

vim cluster_setup.sh

pcs cluster cib pgsql_cfg
pcs -f pgsql_cfg property set no-quorum-policy="ignore"
pcs -f pgsql_cfg property set stonith-enabled="false"
pcs -f pgsql_cfg resource defaults resource-stickiness="INFINITY"
pcs -f pgsql_cfg resource defaults migration-threshold="1"
pcs -f pgsql_cfg resource create vip-mas IPaddr2 \
   ip="172.20.10.9" \
   nic="ens33" \
   cidr_netmask="24" \
   op start   timeout="60s" interval="0s"  on-fail="restart" \
   op monitor timeout="60s" interval="10s" on-fail="restart" \
   op stop    timeout="60s" interval="0s"  on-fail="block"
pcs -f pgsql_cfg resource create vip-sla IPaddr2 \
   ip="172.20.10.10" \
   nic="ens33" \
   cidr_netmask="24" \
   meta migration-threshold="0" \
   op start   timeout="60s" interval="0s"  on-fail="stop" \
   op monitor timeout="60s" interval="10s" on-fail="restart" \
   op stop    timeout="60s" interval="0s"  on-fail="ignore"
pcs -f pgsql_cfg resource create pgsql pgsql \
   pgctl="/home/postgres/soft/bin/pg_ctl" \
   psql="/home/postgres/soft/bin/psql" \
   pgdata="/home/postgres/data" \
   config="/home/postgres/data/postgresql.conf" \
   rep_mode="async" \
   node_list="pg01 pg02 pg03" \
   master_ip="172.20.10.9" \
   repuser="repluser" \
   primary_conninfo_opt="password=repluser keepalives_idle=60 keepalives_interval=5 keepalives_count=5" \
   restart_on_promote='true' \
   op start   timeout="60s" interval="0s"  on-fail="restart" \
   op monitor timeout="60s" interval="4s"  on-fail="restart" \
   op monitor timeout="60s" interval="3s"  on-fail="restart" role="Master" \
   op promote timeout="60s" interval="0s"  on-fail="restart" \
   op demote  timeout="60s" interval="0s"  on-fail="stop" \
   op stop    timeout="60s" interval="0s"  on-fail="block" \
   op notify  timeout="60s" interval="0s"
pcs -f pgsql_cfg resource master msPostgresql pgsql \
   master-max=1 master-node-max=1 clone-max=5 clone-node-max=1 notify=true
pcs -f pgsql_cfg resource group add master-group vip-mas
pcs -f pgsql_cfg resource group add slave-group vip-sla
pcs -f pgsql_cfg constraint colocation add master-group with master msPostgresql INFINITY
pcs -f pgsql_cfg constraint order promote msPostgresql then start master-group symmetrical=false score=INFINITY
pcs -f pgsql_cfg constraint order demote  msPostgresql then stop  master-group symmetrical=false score=0
pcs -f pgsql_cfg constraint colocation add slave-group with slave msPostgresql INFINITY
pcs -f pgsql_cfg constraint order promote msPostgresql then start slave-group symmetrical=false score=INFINITY
pcs -f pgsql_cfg constraint order demote  msPostgresql then stop  slave-group symmetrical=false score=0
pcs cluster cib-push pgsql_cfg
sh cluster_setup.sh

image.png

2.修改叢集配置:

cibadmin --query > tmp.xml
//將當前叢集配置資訊儲存到tmp.xml檔案中 cibadmin --query > tmp.xml
vi tmp.xml
//使用編輯器對XML檔案進行修改  vim tmp.xml
cibadmin --replace --xml-file tmp.xml
//將修改後的XML檔案替換掉當前叢集的配置資訊 cibadmin --replace --xml-file tmp.xml

cibadmin是用於操作 Heartbeat CIB 的低階管理命令。它可以用來轉儲、更新或修改所有或部分 CIB,刪除整個 CIB 或執行各種 CIB 管理操作。

叢集配置資訊是Pacemaker叢集中CIB資訊的關鍵組成部分,Pacemaker的叢集配置資訊決定了叢集最終應該如何工作以及叢集最終的執行狀態,因為只有一個正確的叢集配置才能驅動叢集資源執行在正常的狀態。通常情況下,叢集的配置資訊由叢集配置選項(crm_config)、叢集節點(nodes)、叢集資源(resources)和資源約束(constraints)四個配置段組成,通過 cibadmin --query可查。

image.png

六、叢集狀態檢查

1.啟動叢集並設定開機自啟動

資料庫無需配置自啟動,由叢集軟體自動拉起

pcs cluster start --all

image.png

 pcs cluster enable --all

image.png

2.檢視叢集狀態

 pcs cluster status

image.png

3、檢視本機叢集狀態及資源狀態

crm_mon -Afr -1

image.png

4.檢視主節點流複製狀態

select * from pg_stat_replication;

image.png

5.檢視vip掛載情況

節點1
image.png
節點2
image.png
節點3
image.png

七、資料同步驗證

主節點插入資料

postgres=# create table ysl(id int);
CREATE TABLE
postgres=# insert into ysl values(1);
INSERT 0 1
postgres=# select * from ysl;
 id
----
  1
(1 row)

image.png
備機檢視
image.png

八、故障模擬

停掉主庫,節點2提升為主節點

pg_ctl stop

image.png

節點3成為節點2的備機
image.png

注意master節點掛掉之後,使用 crm_mon -Arf -1命令看到末尾有" You have to remove /var/lib/pgsql/tmp/PGSQL.lock file to force start."字樣,master當機啟動時,需要刪除臨時鎖檔案方可進行叢集角色轉換。即執行 rm -rf /var/lib/pgsql/tmp/PGSQL.lock
image.png

拉起資料庫不需要執行pg_ctl start,只需重啟服務,軟體會自動把資料庫拉起。

systemctl restart corosync pacemaker pcsd

九、叢集常用操作

pcs status //檢視叢集狀態
pcs resource show //檢視資源
pcs resource create ClusterIP IPaddr2 ip=192.168.0.120 cidr_netmask=32 //建立一個虛擬IP資源
pcs resource cleanup //xx表示虛擬資源名稱,當叢集有資源處於unmanaged的狀態時,可以用這個命令清理掉失敗的資訊,然後重置資源狀態
pcs resource list //檢視資源列表
pcs resource restart //重啟資源
pcs resource enable //啟動資源
pcs resource disable //關閉資源
pcs resource delete //刪除資源
crm_mon -Arf -1  //檢視同步狀態和資源


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2894008/,如需轉載,請註明出處,否則將追究法律責任。

相關文章