postgresql热备并使用pgpool实现高可用

前言:本文主要是介绍postgresql的流复制,并使用pgpool实现高可用,主机IP(192.168.163.129)、备机(192.168.163.130)

1.安装依赖(主机,备机) root用户

在一台有网的电脑上先下载好所需的依赖
yum install --downloadonly --downloaddir=/tmp/ zlib-devel readline-devel gcc-c++ -y

然后将下载的rpm全部拷贝到装postgresql电脑上,我这里打包好了所有的依赖和9.6.10的安装包,一起上传到服务器,有需要的自己下(链接:https://pan.baidu.com/s/1nDUcIdiMSXLrByH3S9YTNg 提取码:gxrj)

解压文件并安装依赖

tar -zxvf postgresql.tar.gz

进入到dependencies目录下执行

rpm -Uvh --force --nodeps *.rpm

 

 2.关闭firewalld(主机,备机) root用户

关闭firewalld
systemctl stop firewalld
systemctl disable firewalld

 

 3.编译安装(主机,备机) root用户

解压postgresqlan安装文件
tar -zxvf postgresql-9.6.10.tar.gz

 

创建安装目录

mkdir -p /usr/local/pgsql

检查安装环境

cd /opt/postgresql/postgresql-9.6.10

./configure --prefix=/usr/local/pgsql

 

编译

make world

 

安装

make world install

 

 4.创建postgres用户来安装postgresql(主机,备机) root用户

创建用户组和用户
groupadd postgres useradd
-g postgres postgres passwd postgres

 

在/usr/local/pgsql下创建数据目录data,log,archive

mkdir -p /usr/local/pgsql/data
mkdir -p /usr/local/pgsql/log
mkdir -p /usr/local/pgsql/archive
chmod 700 /usr/local/pgsql/archive
chown -R postgres:postgres /usr/local/pgsql

 

5.配置环境变量(主机,备机) root用户

配置环境变量
vim
/etc/profile
#postgresql 
export PGDATA=/usr/local/pgsql/data
export PGHOME=/usr/local/pgsql
export PATH=$PGHOME/bin:$PATH

使环境变量生效 source /etc/profile

 

6.初始化主机数据库(主机) postgres用户

切换到postgres用户
su - postgres

 

到安装包目录下执行

cd /opt/postgresql/postgresql-9.6.10

initdb

 

 7.启动pgsql服务并配置主从关系(主机) postgres用户

启动服务
pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/log/postgresql.log start 
查看服务进程
ps
-ef|grep postgres

 

用自带的工具连接数据库并修改postgres用户密码

psql

\password

 

创建热备用户

create role replica login replication encrypted password 'replica';

 使用\q退出数据库

 

修改配置文件

vim /usr/local/pgsql/data/postgresql.conf

按照下面进行配置修改

listen_addresses = '*'
port=5432

wal_level = hot_standby #wal归档复制级别为hot_standby异步流复制

max_wal_senders = 2 #多少server就填多少

wal_keep_segments = 10 #指定pg_xlog目录保存的wal log的最小数量。每个文件一般是16M

hot_standby = on

archive_mode = on
archive_command = 'cp %p /usr/local/pgsql/archive/%f'

wal_log_hints = on

 

vim /usr/local/pgsql/data/pg_hba.conf

按照如下进行配置修改

 

创建recovery.done文件

这个文件在安装postgresql时,会生成到/usr/local/pgsql/share/postgresql目录下,名字是recovery.conf.sample。
我们复制并修改名称为recovery.conf并放置在/usr/local/pgsql/data目录下

cp /usr/local/pgsql/share/recovery.conf.sample /usr/local/pgsql/data/recovery.conf

vim /usr/local/pgsql/data/recovery.conf

按照如下进修配置修改(host是主库的ip,后面高可用的时候需要改动)

#开启备库
standby_mode = 'on'
#连接主库
primary_conninfo = 'host=192.168.163.129 port=5432 user=replica password=replica'

restore_command = 'cp /usr/local/pgsql/archive/%f %p'

 

 重启数据库

pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/log/postgresql.log restart

可以使用数据库连接工具远程连接了

 

8. 启动备机数据库(备机) postgres用户

切换到postgres用户
su - postgres

 

从主机备份数据-h是主机的IP

pg_basebackup -h 192.168.163.129 -p 5432 -U replica -F p -P -D /usr/local/pgsql/data

这里要求输入数据库备份用户的密码,我这里是replica

 

将备份过来的recovery.done文件改名为recovery.conf

mv recovery.done recovery.conf

 

切换到root用户执行(用postgres备份过来的data下的文件权限不是700)

chmod 700 -R /usr/local/pgsql/data

然后切回到postgres用户启动从数据库

su - postgres

pg_ctl -D /usr/local/pgsql/data/ -l /usr/local/pgsql/log/postgresql.log start

 

查看主机postgres进程

 

查看备机postgres进程

 

9.配置SSH互信 (主机,备机)

使用Pgpool-II的自动故障转移和在线恢复;需要 pgpool 服务免密码在各个机器上执行;以及后续在在线恢复功能。

生成密钥对root用户,postgres用户都操作下)
ssh-keygen -t rsa 
(连续三次回车,即在本地生成了公钥和私钥,不设置密码,默认存储在 ~/.ssh目录下)


将所有公钥id_rsa.pub 追加到服务端 ~/.ssh/authorized_keys 文件中
为了保证名称一致冲突,将所有备机的
id_rsa.pub重新命名(建议是:id_rsa_主机名_用户名.pub)
cp id_rsa.pub id_rsa_node2_postgres.pub

我这里使用scp传输(这里是需要输入主机root用户的密码
scp
id_rsa_node2_postgres.pub root@192.168.163.129:~/.ssh

 

主机操作

cat id_rsa.pub >> ~/.ssh/authorized_keys

cat id_rsa_node2_postgres.pub >> ~/.ssh/authorized_keys

chmod 700 ~/.ssh

chmod 600 ~/.ssh/authorized_keys

 

把主机的authorized_keys传回到各个备机

scp authorized_keys root@192.168.163.130:~/.ssh

 

在各个备机整理权限

chmod 700 ~/.ssh

chmod 600 ~/.ssh/authorized_keys

 

测试:ssh 用户名@ip (这里不需要输入密码就能连接过去)

 

10,pgpool配置主从切换 root用户

先自行下载pgpool安装文件,上传到服务器(我这里上传到主机服务器,也可以是其他服务器),插件下载地址(链接:https://pan.baidu.com/s/1_iJgNEN9O7Zmnu9UIH20yw 提取码:gxrj
解压pgpool-II-4.3.3.tar.gz
tar -zxvf pgpool-II-4.3.3.tar.gz

 

创建安装目录

mkdir -p /usr/local/pgpool

cd pgpool-II-4.3.3

./configure --prefix=/usr/local/pgpool

 

编译安装文件

make

make install

 

配置环境变量

vim /etc/profile

#pgpool

export PGPOOLHOME=/usr/local/pgpool
export PATH=$PGPOOLHOME/bin:$PATH

 

根据pgpool自带的配置文件模板设置对应的配置文件 

设置 pcp 的管理用户/密码文件 pcp.conf(我这里就直接用配置文件中的postgres用户和密码(服务器的用户),因为我postgres用户的密码就是postgres,这里的密码是通过/usr/local/pgpool/bin/pg_md5生成的,这个工具是pgpool自带的

 

设置pool_hba.conf

 

生成 pool_passwd(需要自行新建该文件)

 vim pool_passwd

添加以下内容(这个是主数据库中postgres用户的用户名和密码(root),可以在数据库查询到:select rolname,rolpassword from pg_authid; 也可以通过pg_md5生成)

postgres:md52a29a4f7eb0a98abca0992ca3fb555b6

 

设置pgpool.conf(这个配置文件也有模板,我这里就直接新建一个文件)

vim pgpool.conf

添加以下内容:

listen_addresses = '*'
port = 9999
socket_dir = '/usr/local/pgpool'
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/usr/local/pgpool'

backend_hostname0 = '192.168.163.129' #主库
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/usr/local/pgsql/data' #数据库data位置
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = '192.168.163.130' #从库
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/usr/local/pgsql/data' #数据库data位置
backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = on
pool_passwd = 'pool_passwd'

pid_file_name = '/usr/local/pgpool/pgpool.pid' ##pid文件位置
logdir = '/usr/local/pgpool/logs' ##日志位置

replication_mode = off
# 开启读写分离
load_balance_mode = on

master_slave_mode = on
master_slave_sub_mode = 'stream'

# Streaming
sr_check_period = 0
sr_check_user = 'replica'
sr_check_password = 'replica'

# HEALTH CHECK 健康检查
health_check_period = 10
health_check_timeout = 20
health_check_user = 'replica' ##主库创建的用户
health_check_password = 'replica' ##密码

failover_command = '/usr/local/pgpool/failover.sh %d %H %R'

 

设置failover.sh(这个文件的路径与上面pgpool.conf中failover_command的一致)

vim /usr/local/pgpool/failover.sh

添加以下内容

#!/bin/sh

FAILED_NODE_ID=$1
NEW_MASTER_HOST=$2
PGDATA=$3

if [ $FAILED_NODE_ID -eq 0 ]; then
echo "promote standby node"
ssh postgres@$NEW_MASTER_HOST "/usr/local/pgsql/bin/pg_ctl -D $PGDATA promote"
fi

修改failover.sh权限为可执行

chmod +x /usr/local/pgpool/failover.sh

 

启动pgpool

pgpool -n -D >> /usr/local/pgpool/pgpool.log 2>&1 &

 

 11,连接pgpool测试

使用navicate连接pgpool

 后面自行在这个连接中做测试,新增一个是数据库,看主库和从库中是否能查询到新增的数据库;

 

 12,模拟主库宕机操作

先查看主库备库的状态


在主库中直接关闭数据库 su
- postgres pg_ctl stop
再查看主库从库的状态

 

 13,宕机的主库以从库的角色回到集群中

先把主库中的data目录备份
mv data data_bak

通过
pg_basebackup全量从新主库备份数据(也可以不备份掉原来的data,用pg_rewind -D /usr/local/pgsql/data --source-server='host=192.168.163.129 port=5432 user=postgres dbname=postgres password=root' -P来统一两个库的时间线)
pg_basebackup -h 192.168.163.130 -p 5432 -U replica -F p -P -D /usr/local/pgsql/data

把recovery.done改名为recovery.conf 然后修改里面的主库ip
mv /usr/local/pgsqp/data/recovery.done
/usr/local/pgsqp/data/recovery.conf
vim /usr/local/pgsqp/data/recovery.conf

 

重启宕机数据库

pg_ctl -D /usr/local/pgsql/data/ -l /usr/local/pgsql/log/postgresql.log start

 

修改pgpool.conf(主库从库ip互换,其他配置不动)

vim /usr/local/pgpool/etc/pgpool.conf

 

重启pgpool

pgpool -m fast stop

pgpool -n -D >> /usr/local/pgpool/pgpool.log 2>&1 &

 

 作者:zengwb    转载请注明原文链接:https://www.cnblogs.com/zengwb/p/17517934.html

posted @ 2023-07-01 17:35  四毛二  阅读(1302)  评论(0编辑  收藏  举报