暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

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

原创 阎书利 2022-05-13
5258
地址信息
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 https://www.postgresql.org/ftp/source/v11.10/postgresql-11.10.tar.gz  --no-check-certificate

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  //查看同步状态和资源
最后修改时间:2022-05-13 16:26:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论