Postgres高可用环境搭建

Postgres高可用环境搭建

1. postgreSQL HA配置

基础PG的流模式加上pgpool软件实现双机热备,类似于Orical DG的FSF功能。pgpool-1与pgpool-2作为中间件,将主备pg节点加入集群,实现读写分离,负载均衡和HA,故障自动切换。两个pgpool节点使用一个虚拟IP节点,作为应用程序访问的地址,两节点之间通过watchdog进行监控,当pgpool-1宕机时,pgpool-2会自动接管虚拟IP继续对外提供不间断的服务。

2.pgpool主备模式


3.pgpool常用命令

# 查询 pgpool节点状态
psql -h 192.168.230.55 -p 9999 -c "show pool_nodes"

# 查看备库状态
psql -p 5433 -c "show transaction_read_only"

# 查看节点状态
psql -p 9999 -c "show pool_nodes" test

# 启动pgpool
pgpool -n -d > /tmp/pgpool.log 2>&1 &

show pool_version
show pool_nodes
show pool_status
show pool_pools
show pool_processes


主机规划

1.)配置域名

vim /etc/hosts
192.168.18.211 pg1
192.168.18.212 pg2
192.168.18.215 vip

2.)下载pgpool-3.7.13

下载地址:http://pgpool.net/mediawiki/index.php/Downloads
3.)配置节点互信

# pg1和pg2都执行以下命令,生成公钥
ssh-kengen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 公钥互相拷贝
scp ~/.ssh/authorized_keys postgres@pg2:~/.ssh/  # pg1主机
scp ~/.ssh/authorized_keys postgres@pg1:~/.ssh/  # pg2主机

# 验证,两个主机均执行如下命令
ssh postgres@pg2 uptime
ssh postgres@pg1 uptime

4.)安装pgpool

mkdir /usr/local/pgpool   # root用户
chown postgres:postgres /usr/local/pgpool  # root

cd /osft/pgpool-II-3.7.13
./configure --prefix=/usr/local/pgpool --with-pgsql=/usr/local/pg12.2/
make
make install

5.)安装pgpool相关的函数,可选,建议安装

cd /soft/pgool-II-3.7.13/src/sql
make
make install
cd sql
psql -f insert_lock.sql

6.)配置postgres用户环境变量(pg1,pg2)

vim .bash_profile
export PGPOOL_HOME=/usr/local/pgpool
export PATH=$PATH:$PGPOOL_HOME/bin

7.)配置pgpool
首先配置pg1上的pool_hba.conf,该文件是对登录用户进行验证的,要和pg的pg_hba.conf保持一致。

cd /usr/local/pgpool/etc/
cp pool_hba.conf.sample pool_hba.conf

vim pool_hba.conf
host replication repl  pg2 trust
host replication repl  192.168.18.0/24 trust
host all          all  192.168.18.0/24 trust

其次,配置pcp.conf(pg1,pg2),该文件用于pgpool自己登录管理使用的,一些操作pgpool的工具会要求提供密码等,比如节点的添加和删除等,配置如下:

cd /usr/local/pgpool/etc
cp pcp.conf.sample pcp.conf

# 使用pg_md5生成配置的用户名和密码
pg_md5 postgres
xxx

vim pcp.conf
postgres:xxx   # xxx标识上面pg_md5生成的内容

配置pgpool.conf,在pgpool中添加pg数据库的用户名和密码(pg1,pg2)

# 创建pgpool.conf文件
cp pgpool.conf.sample-master-slave pgpool.conf

pg_md5 -p -m -u postgres pool_passwd
# 输入数据库登录用户postgres密码,生成pool_passwd文件

more pool_passwd # 查看生成的文件

最后,配置pgpool.conf,该文件是最核心的文件,HA是否能够正常云霄路,与该文件息息相关,该配置文件分为不同的模块,需要根据不同的模块来配置。





pg2主机上的pgpool.conf其他配置同上,不同之处如下:

8)切换脚本的编辑(pg1,pg2)
vim /usr/local/pgpool/failover_stream.sh

赋予执行权限:
chmod +x /usr/local/pgpool/failover_stream.sh

9.)设置ip arping等setuid权限,执行failover_stream.sh时会用到,否则无法启动IP(pg1,pg2)

chmod u+x /sbin/ip
chmod u+x /sbin/arping

10)启动集群守护进程
pg1、pg2启动数据库与pgpool进程

pg_ctl start -l pg.log
pgpool -n -d -D > /usr/local/pgpool/pgpool.log 2>&1 &   #-d 标识debug状态
  1. 查看pgpool后台进程
ps -ef |grep pgpool

12)启动顺序:
先启动主库的pg数据库,然后再启动主库的pgpool守护进程,这样vip会在主库上生成,否则会在备库上产生,但是不影响业务的访问。可以看出vip是可以在不同的集群上漂移,跟以往的双机热备有区别的。接着再启动备库的pg数据库,最后启动pgpool进程。

13)故障切换
场景一:模拟主库pgpool进程中断,此时备库主机的pgpool会把vip接管过来,但是主备库的角色没有发生变化。

pgpool -m start stop

show pool_nodes; # 先连数据库,再查看

pg_controldata |grep cluster

场景二:模拟主库数据库关闭,pg_ctl -m fast stop 此处备库的pgpool切换脚本会把备库切换成主库,提供主库服务。检查postgresql.auto.conf文件,需要将primary_conninfo注释掉,否则不会承担主库的责任,向备库发送日志,重启数据库。

场景三:将原来的主库编程备库,创建standby.signal文件:


执行pg_ctl promote命令会进行主从切换,执行后发现standby.signal备删除了,查看最新状态pg_controlddata |grep cluster 原来备库的postgresql.auto.conf中自动添加了一行primary_conninfo的信息,需要把这行注释,否则虽然现在是主库,但是配置还是当做备库,日志会报错background worker logical replication launcher exited with exit code

启动备库,注意rewind会自动把standby.signal文件删除,以及修改postgres.auto.conf文件,需要手动修改,主库数据库如果管理或者发生异常中断,pgpool会将备库切换成主库,提供服务,不会影响业务,但是恢复主备库之间的关系,需要人为干预,不够智能。所以如果需要维护数据库,需要先停止pgpool进程再关闭主库,否则发生切换,害的修复备库。

14)压力测试
方法一:通过第三台机器网络连接测试:

方法二:pgbench工具测试

pgbench -c 30 -T 60 -h vip -p 9999 -U postgres -r postgres
pgbench -c 30 -T 60 -S -h vip -p 9999 -U postgres -r postgres # select压力测试,两个节点负载均衡

方法三:把备库脱离出集群,进行单机测试:

pcp_detach_node -h vip -p 9898 -U postgres -n 0
pgbench -c 30 -T 60 -S -h vip -p 9999 -U postgres -r postgres
【励志篇】: 古之成大事掌大学问者,不惟有超世之才,亦必有坚韧不拔之志。
原文地址:https://www.cnblogs.com/tomtellyou/p/14928683.html