暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

PG高可用集群安装(corosync+pacemaker)

原创 qi_yu 2024-08-21
610

1. 安装环境说明

1.1 操作系统版本

suse 12 sp4发行版本

1.2 环境数据展示

使用的IP地址及主机名如下:

192.168.0.101/24	pgnode01
192.168.0.102/24	pgnode02
192.168.0.103/24	pgnode03

集群服务IP地址:

192.168.0.201/24	vip-master
192.168.0.202/24	vip-slave

数据库名称:

testdb

2. 系统操作标准化

2.1 ZYPPER配置

三台服务器安装PG高可用集群需要挂载以下ISO镜像文件:

SLE-12-SP4-Server
SLE-12-SP4-SDK
SLE-12-SP4-HA -CD1
SLE-12-SP4-HA- CD2

2.2 RPM安装

所有服务器安装以下rpm包:

gcc-c++、flex、bison、zlib-deve、readline-devel、corosync*、 pacemaker*

2.3 系统主机名确认

每台服务器使用root用户进行操作,修改服务器的主机名

注:因pacemaker编写资源需要读到主机名,但不支持以数字开头、主机名中存在大写字母和符号”-”的情况,需要把所有的主机名修改成小写并且是_。

2.4 系统参数修改

每台服务器使用root用户进行操作
修改/etc/security/limits.conf,添加方框中的内容

vi /etc/security/limits.conf
*  soft   stack  10240
*  hard  stack  10240
*  soft    nofile  131072  
*  hard   nofile  131072  
*  soft    nproc   131072  
*  hard   nproc   131072  
*  soft    core    unlimited  
*  hard   core    unlimited 

2.5 内核参数修改

每台服务器使用root用户进行操作
修改/etc/sysctl.conf,添加方框中的内容

vi /etc/sysctl.conf
kernel.sem = 50100 64128000 50100 1280
sysctl -p

2.6 目录空间规划

PG数据库需要创建如下文件系统并进行存储的挂载:

/pgdb		数据文件存放路径
/pgwal		数据库wal日志存放路径
/pgarch		数据库归档日志存放路径
/pgsoft		数据库安装文件及其他组件程序安装的路径

#总存储容量小于500G的分配计算方式

/pgdb		total – 170G
/pgwal		50G
/pgarch		100
/pgsoft		20G

#总存储容量小于1T(包含1T)的分配计算方式

/pgdb		total – 320G
/pgwal		100G
/pgarch		200
/pgsoft		20G

#总存储容量大于1T的分配计算方式

/pgdb		total – 520G
/pgwal		200G
/pgarch		300
/pgsoft		20G

2.7 postgres用户创建

每台服务器使用root用户进行操作
规范gid uid 暂定10000

groupadd -g 10000 postgres
useradd -g 10000 -u 10000 -m postgres

更改密码为postgres@123

passwd postgres

修改postgres用户profile
属组是postgres:postgres

vi /home/postgres/.bash_profile

export PGPORT=10001
export PGHOME=/pgsoft/postgres
export PGDATA=/pgdb
export PGUSER=postgres
export PGDATABASE=postgres
export LD_LIBRARY_PATH=$PGHOME/lib:${LD_LIBRARY_PATH}
export PATH=$PGHOME/bin:$PATH
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH
export MANPATH=$PGHOME/share/man:$MANPATH

2.8 修改对应目录权限

每台服务器使用root用户进行操作

chmod 700 /pgdb
chown -R postgres:postgres /pgdb
chown -R postgres:postgres /pgwal
chown -R postgres:postgres /pgarch

3. 安装配置高可用组件

3.1 配置hosts文件

每台服务器使用root用户进行操作,编辑/etc/hosts,添加如下内容

vi /etc/hosts

192.168.0.101	 pgnode01
192.168.0.102 	pgnode02
192.168.0.103 	pgnode03

3.2 corosync日志配置

每台服务器使用root用户进行操作,配置corosync日志

echo "/var/log/corosync.log {
    delaycompress
    dateext
    daily
    rotate 30
    notifempty
    missingok
    olddir /var/log/corosync/old
    copytruncate
}" >>/etc/logrotate.d/corosync 

3.3 主节点集群配置

在一台服务器上使用root用户进行操作,这里以pgnode01为例
在192.168.0.101上:

cd /etc/corosync
corosync-keygen

会在/etc/corosync/目录下生成一个名为authkey文件

创建集群配置文件,安装方框中的模板进行配置参数修改和添加

cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf

按照如下模板进行参数的修改和新增

totem {
        max_messages:   20
        vsftype:        	none
        crypto_cipher:  	none
        secauth:        	on
        token_retransmits_before_loss_const:    10
        interface {
                bindnetaddr:    x.x.x.x
                mcastaddr:      x.x.x.x
                ringnumber:     0
                mcastport:      5405
                ttl:    1
        }
        consensus:      		6000
        clear_node_high_bit:	yes
        crypto_hash:    		none
        rrp_mode:       	none
        join:   				60
        cluster_name:   		cluster
        token:  				5000
        version:        		2
        transport:      		udp
        ip_version:     		ipv4
        heartbeat_failures_allowed : 3
}
logging {
        to_logfile:     	yes
        timestamp:      on
        syslog_facility: 	daemon
        logger_subsys {
                debug:	off
                subsys: 	QUORUM
        }
        to_syslog:      	yes
        debug:  			off
        logfile: 			/var/log/corosync.log      
		  to_stderr:      	no
        fileline:       	off
}
quorum {
        expected_votes: 	3
        two_node:		0
        provider:			corosync_votequorum
}

bindnetaddr: x.x.x.x 服务器网络地址
mcastaddr: x.x.x.x多播通信地址,各个集群之间一定不能重复

各个从节点将主节点的authkey和corosync拷贝到各自目录下

scp 192.168.0.102:/etc/corosync/corosync.conf /etc/corosync/
scp 192.168.0.103:/etc/corosync/authkey /etc/corosync/

4. 安装配置postgres

4.1 编译安装postgres

所有节点编译安装postgres

cd /pgsoft
mkdir /pgsoft/postgres
tar -zxvf postgresql-10.3.tar.gz
cd postgresql-10.3
./configure --prefix=/pgsoft/postgres
make world
make install-world

4.2 初始化主节点

在主节点pgnode01上,使用postgres用户进行操作

rm -rf /pgdb/*
rm -rf /pgwal/*
initdb -D /pgdb -X /pgwal -E UTF-8 --locale=zh_CN.utf8 –W

密码更改为postgres@123

4.3 更改数据库配置参数

将附件一中的模板配置参数文件postgresql.conf上传到/pgdb目录下
根据服务器实际硬件配置进行相应的参数更改

shared_buffers = 	物理内存的1/4
max_wal_size 	= 	shared_buffers * 0.75
min_wal_size	=	max_wal_size * 0.25

修改pg_hba.conf 文件,添加如下内容。

host    replication     replicator      192.168.0.0/24         md5
host	  postgres      bakuser		 192.168.0.0/24         trust
host	  all			 all			     0.0.0.0/0					md5

启动数据库

pg_ctl start

4.4 创建数据库复制用户

在主节点上,使用postgres用户进行操作
在psql命令行中执行如下SQL进行复制角色的创建

create role replicator with login replication password 'replicator';

创建SQL监控模块

create extension pg_stat_statements ;

4.5 配置从节点流复制

在各个从节点上,使用postgres用户登录主机执行如下命令:

rm -rf /pgdb/*
rm -rf /pgwal/*
pg_basebackup -h 192.168.0.101 -p 10001 -U replicator -D /pgdb -Xs --waldir=/pgwal -P 

4.6 修改复制槽文件位置

** 如果不需要使用逻辑复制功能,则此步骤跳过 **
在主节点使用root用户进行操作
#testdb为数据库名称,根据实际情况进行更改

mkdir /share/testdb 
chown -R postgres:postgres /share/testdb

在三台服务器上进行复制槽文件位置的替换

su - postgres
cd /pgdb
mv pg_replslot pg_replslot_bak
ln -sn /share/testdb /pgdb/pg_replslot

5. 配置集群资源

5.1 修改crm配置参数

在主节点pgnode01上使用root用户进行操作
上传crm配置文件.pgsql.crm到/home/postgres/
修改.pgsql.crm,按照方框中的模板进行参数的修改

vi /home/postgres/.pgsql.crm

修改IP为vip-master地址,nic为网卡名称,cidr_netmask为子网掩码

primitive vip-master ocf:heartbeat:IPaddr2 \
    params \
        ip="192.168.0.201" \
        nic="eth0" \
        cidr_netmask="24" \

修改IP为vip-slave地址,nic为网卡名称,cidr_netmask为子网掩码

primitive vip-slave ocf:heartbeat:IPaddr2 \
    params \
        ip="192.168.0.202" \
        nic="eth0" \
        cidr_netmask="24" \

修改pgctl的实际位置、psql的实际位置、pgdata的路径、pgport端口号
rep_mode为流复制的模式、复制用户repuser的用户名、
node_list为各台主机名列表、master_ip为主虚拟IP的地址

primitive pgsql ocf:heartbeat:pgsql \
    params \
        pgctl="/pgsoft/postgres/bin/pg_ctl" \
        psql="/pgsoft/postgres/bin/psql" \
        pgdata="/pgdb" \
		  pgport=10001 \
        repuser="replicator" \
        start_opt="-p 1001" \
        rep_mode="sync" \
        node_list="pgnode01 pgnode02 pgnode02" \
        restore_command="" \
        primary_conninfo_opt="password=replicator keepalives_idle=60 keepalives_interval=5 keepalives_count=5" \
        master_ip="192.168.0.201" \

5.2 注册集群资源

每台服务器使用root用户进行操作,启动高可用服务

service corosync start;service pacemaker start;

主节点上使用root用户进行操作

cd /home/postgres

开始注册资源

crm configure load update .pgsql.crm

刷新资源

crm resource cleanup pgsql-cluster

任意节点上使用root用户操作,查看集群状态:

crm_mon -Afr

Online: [ pgnode01 pgnode02 pgnode03]

Full list of resources:

 Resource Group: master-group
     vip-master (ocf::heartbeat:IPaddr2):       Started pgnode01
 Resource Group: slave-group
     vip-slave  (ocf::heartbeat:IPaddr2):       Started pgnode02
 Master/Slave Set: pgsql-cluster [pgsql]
     Masters: [ pgnode01 ]
     Slaves: [ pgnode02 pgnode03 ]

Node Attributes:
* Node pgnode01:
    + master-pgsql                      : 1000
    + pgsql-data-status                 : LATEST    
    + pgsql-master-baseline             : 000000000C000098
    + pgsql-status                      : PRI
* Node pgnode02:
    + master-pgsql                      : 100
    + pgsql-data-status                 : STREAMING|SYNC
    + pgsql-status                      : HS:sync   
    + pgsql-xlog-loc                    : 000000000C000140
* Node pgnode03:
    + master-pgsql                      : -INFINITY 
    + pgsql-data-status                 : STREAMING|POTENTIAL
    + pgsql-status                      : HS:potential

pgnode01状态为PRI,为数据库资源主节点
pgnode02状态为sync,主节点失效后优先接管数据库资源
pgnode03状态为potential,当sync节点失效后,该节点变为sync状态

6. 集群高可用验证

6.1 模拟主节点宕机

模拟把pgnode01节点上的postgres服务停掉
在pgnode01节点上使用postgres用户进行操作

pg_ctl stop

然后任意节点上监控查看集群的资源状态:

crm_mon -Afr

资源会迁移到原sync(pgnode02)的节点上,pgnode02由sync变为PRI,pgnode03由potential变为sync

6.2 恢复主节点

集群发生切换后,原主节点需要清理锁文件
在pgnode01节点上使用root用户进行操作

rm -f /var/lib/pgsql/tmp/PGSQL.lock

刷新集群资源

crm resource cleanup pgsql-cluster

再次查看集群状态

crm_mon -Afr

pgnode01状态会变为potential

任意节点查看资源状态:

crm_mon -Afr

Node Attributes:
* Node pgnode01:
    + master-pgsql                      : -INFINITY 
    + pgsql-data-status                 : STREAMING|POTENTIAL
    + pgsql-status                      : HS:potential
* Node pgnode02:
    + master-pgsql                      : 1000
    + pgsql-data-status                 : LATEST    
    + pgsql-master-baseline             : 000000000D000098
    + pgsql-status                      : PRI
* Node pgnode03:
    + master-pgsql                      : 100
    + pgsql-data-status                 : STREAMING|SYNC
    + pgsql-status                      : HS:sync   
+ pgsql-xlog-loc                    : 000000000D006428

7. 数据库集群重启

当某些情况下必须要重启集群内所有的数据库节点时,比如修改了postgresql.conf中的某项参数,需要重启数据库才能生效,此时需要重启所有数据库节点才能生效。

7.1 停止数据库集群

在集群内任意一台服务器使用root用户进行操作,进入CRM命令操作

crm resource stop pgsql-cluster

通过crm_mon -Afr和ps -ef|grep postgres命令检查,确认postgres数据库进程都已经停止掉。

7.2 检查PGSQL.lock文件

检查三台服务器/var/lib/pgsql/tmp目录内是否存在PGSQL.lock文件
存在该文件就删除

rm -rf /var/lib/pgsql/tmp/PGSQL.lock

7.3 启动数据库集群

在集群内任意一台服务器使用root用户进行操作,进入CRM命令操作

crm resource start pgsql-cluster

刷新数据库集群状态

crm resource cleanup pgsql-cluster

通过crm_mon -Afr命令检查集群状态

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

评论