PostgreSQL 高可用

参考资料:https://www.cnblogs.com/songyuejie/p/4561089.html

方案简介

使用主备流复制模式,加上pgpool中间件做读写分离和负载均衡。

环境配置

主备服务器都要设置

统一系统时间

每5分钟同步时钟

shell
1
2
yum install -y ntpdate && ntpdate ntp1.aliyun.com
echo -e "# sync time from ntp1.aliyun.com\n5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1" >> /var/spool/cron/root

创建系统用户

shell
1
2
3
useradd -U postgres
passwd postgres
${password}

配置数据库目录

shell
1
2
3
4
5
6
7
8
cat >> /etc/profile << EOF
echo 'export PGHOME=/usr/local/pgsql' >> /etc/profile
echo 'export PGDATA=/data/pgsql' >> /etc/profile
echo 'export PATH=$PATH:$PGHOME/bin' >> /etc/profile
source /etc/profile
mkdir -p $PGDATA
chown postgres:postgres $PGDATA
chmod 700 $PGDATA

网络IP设置

服务器间使用机器名访问

shell
1
2
3
4
echo db1 > /etc/hostname
echo 192.168.1.10 db1 >> /etc/hosts
echo 192.168.1.11 db2 >> /etc/hosts
echo nameserver 114.114.114.114 >> /etc/resolv.conf

vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=”static”
IPADDR=”10.19.251.20”
NETMASK=”255.255.255.0”
GATEWAY=”10.19.251.1”
reboot

#ssh免登录配置
su postgres
cd ~
ssh-keygen
[enter]
[enter]
[enter]
ssh-copy-id postgres@db1
yes
password
ssh-copy-id postgres@db2
yes
password

安装

安装PostgresSQL

安装包官方下载地址:https://www.postgresql.org/download/

在页面上选择适合的版本,按照说明下载安装即可。

我的环境是 CentOS7 Postgresql10

1
2
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql10 postgresql10-server postgresql10-contrib

安装pgpool-II

1
yum install -y pgpool-II-10 pgpool-II-10-extensions

配置主库

创建数据库实例根目录,并修改权限

1
2
3
mkdir -p /data/pgsql
chown postgres:postgres /data/pgsql
chmod 700 /data/pgsql

切换到postgres用户

1
su postgres

初始化数据库

1
/usr/pgsql-10/bin/initdb -D /data/pgsql

配置访问权限文件,在文件最后追加

/data/pgsql/pg_hba.conf
1
2
host    all             all             192.168.0.0/24          md5
host replication replica 192.168.0.0/24 md5

配置数据库参数文件,在文件最后追加

/data/pgsql/postgresql.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
listen_addresses = '*'
max_connections = 1000
wal_level = replica
wal_log_hints = on
hot_standby = on
logging_collector = on

shared_preload_libraries = 'pg_stat_statements,auto_explain'
pg_stat_statements.max = 1000
pg_stat_statements.track = all
pg_stat_statements.track_utility = off
track_io_timing = off
auto_explain.log_min_duration = 10ms
auto_explain.log_analyze = false
auto_explain.log_verbose = false
auto_explain.log_nested_statements = false

配置完成后,启动数据库

1
2
mkdir -p /data/pgsql/log
/usr/pgsql-10/bin/pg_ctl -D /data/pgsql -l /data/pgsql/log/postgresql.log start

使用客户端登录数据库psql

创建一个复制角色

1
CREATE ROLE replica login replication encrypted password 'replica';

安装扩展函数

1
2
3
create extension pg_stat_statements;
create extension pgpool_regclass;
create extension pgpool_recovery;

配置备库

第一步同样创建数据库实例根目录,并修改权限

1
2
3
mkdir -p /data/pgsql
chown postgres:postgres /data/pgsql
chmod 700 /data/pgsql

切换到postgres用户

1
su postgres

从主库拷贝数据,初始化实例

1
/usr/pgsql-10/bin/pg_basebackup -D /data/pgsql -R -P -d "hostaddr=172.17.0.2 port=5432 user=replica password=replica"

配置自动恢复文件,在文件中添加

/data/pgsql/recovery.conf
1
2
recovery_target_timeline = 'latest'
trigger_file = '/data/pgsql/trigger_file'

最后启动备库即可

1
/usr/pgsql-10/bin/pg_ctl -D /data/pgsql -l /data/pgsql/log/postgresql.log start

创建触发文件,备库将升级为主库

1
touch /data/pgsql/trigger_file