PostgreSQL基於Pacemaker+Corosync+pcs的高可用
地址資訊 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檔案如下
一、三臺機器同步時間
[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
三、啟動叢集
1.設定hacluster使用者密碼(三個節點)
echo hacluster|passwd hacluster --stdin
2.叢集認證(在任何一個節點上執行)
pcs cluster auth -u hacluster -p hacluster pg01 pg02 pg03
3.同步配置(在任何一個節點上執行)
pcs cluster setup --last_man_standing=1 --name pgcluster pg01 pg02 pg03
4.啟動叢集(在任何一個節點上執行)
pcs cluster start --all
四、安裝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
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
6.啟動master資料庫
pg_ctl start -D /home/postgres/data
7.建立複製使用者(master節點)
create user repluser with replication password 'repluser';
8.建立備機節點(pg02、pg03)
pg_basebackup -h pg01 -U repluser -p 5432 -D /home/postgres/data --wal-method=stream --checkpoint=fast --progress --verbose
9.停止master(pg01)
pg_ctl stop -D /home/postgres/data
五、配置叢集
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
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可查。
六、叢集狀態檢查
1.啟動叢集並設定開機自啟動
資料庫無需配置自啟動,由叢集軟體自動拉起
pcs cluster start --all
pcs cluster enable --all
2.檢視叢集狀態
pcs cluster status
3、檢視本機叢集狀態及資源狀態
crm_mon -Afr -1
4.檢視主節點流複製狀態
select * from pg_stat_replication;
5.檢視vip掛載情況
節點1
節點2
節點3
七、資料同步驗證
主節點插入資料
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)
備機檢視
八、故障模擬
停掉主庫,節點2提升為主節點
pg_ctl stop
節點3成為節點2的備機
注意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
拉起資料庫不需要執行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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL基於PG內建流複製的,靠譜的PostgreSQL高可用方案SQL
- 基於 MHA 高可用的 MySQLMySql
- PostgreSQL repmgr高可用叢集+keepalived高可用SQL
- 【Redis】基於consul的Redis高可用方案Redis
- PostgreSQL patroni高可用叢集SQL
- 基於 ZooKeeper 搭建 Spark 高可用叢集Spark
- 基於 ZooKeeper 搭建 Hadoop 高可用叢集Hadoop
- 基於 Rainbond 部署 DolphinScheduler 高可用叢集AI
- Kubernetes-基於Helm安裝部署高可用的RedisRedis
- 基於MFS高可用的分散式儲存架構分散式架構
- 基於 HAProxy + KeepAlived 搭建 RabbitMQ 高可用叢集MQ
- 使用 Docker Compose 本地部署基於 Sentinel 的高可用 Redis 叢集DockerRedis
- 基於kubeasz部署高可用k8s叢集K8S
- LVS + Keepalived + Nginx基於DR模式構建高可用方案Nginx模式
- 基於Gossip流言演算法實現alertmanager高可用Go演算法
- 同程旅行基於 RocketMQ 高可用架構實踐MQ架構
- PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案SQLAI
- 基於Redis的低成本高可用排行榜服務構建Redis
- 基於 Apache ShardingSphere 構建高可用分散式資料庫Apache分散式資料庫
- PostgreSQL10高可用本地SSD盤版本釋出SQL
- 基於MySQL Cluster + LVS + KeepAlived部署負載均衡高可用架構MySql負載架構
- 基於Centos7.x 搭建MySQL Galera Cluster高可用架構CentOSMySql架構
- PostgreSQL高可用之Repmgr和Patroni部分場景對比SQL
- 關於Redis的幾件小事 | 高併發和高可用Redis
- 基於Centos7部署Percona Xtradb Cluster高可用架構CentOS架構
- 關於服務高可用的一些理解
- 高可用!一個基於 SpingBoot + Oauth2 的單點認證授權中心!bootOAuth
- 基於K8S部署生產高可用的ES叢集(附遷移方案)K8S
- 基於python的圖片修復程式-可用於水印去除Python
- Procrastinate:基於PostgreSQL的Python任務佇列ASTSQLPython佇列
- 高可用服務之Keepalived基礎入門
- 關於redis的幾件小事(五)redis保證高併發以及高可用Redis
- EurekaServer高可用Server
- Keepalived 高可用
- 在 RHEL 或 CentOS 上使用 Patroni 部署 PostgreSQL 以實現高可用性CentOSSQL
- 聊聊PowerJob Server的高可用Server
- 搭建高併發、高可用的系統
- 什麼是高可用?高可用軟體哪家好?