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




