基于PG的流复制能实现热备切换,但是是要手动建立触发文件实现,对于一些HA场景来说,需要当主机down了后,备机自动切换,经查询资料知道pgpool-II可以实现这种功能。本文基于PG流复制基础上 ,以pgpool-II实现主备切换。在配置pgpool之前需分别在两台规划机上安装好pg数据库,且配置好了流复制环境,关于流复制配置参考前文:http://www.jianshu.com/p/12bc931ebba3。
pgpool双机集群架构图.png
基于PGPool的双机集群如上图所示:pg主节点和备节点实现流复制热备,pgpool1,pgpool2作为中间件,将主备pg节点加入集群,实现读写分离,负载均衡和HA故障自动切换。两pgpool节点可以委托一个虚拟ip节点作为应用程序访问的地址,两节点之间通过watchdog进行监控,当pgpool1宕机时,pgpool2会自动接管虚拟ip继续对外提供不间断服务。
一 主机规划
主机名 | IP | 角色 | 端口
:----:|:----:|:----:|:----:|:----:|:----:
master| 192.168.0.108 |PGMaster|5432
| 192.168.0.108|pgpool1|9999
slave|192.168.0.109|PGSlave|5432
| 192.168.0.109|pgpool2|9999
vip|192.168.0.150|虚拟ip|9999
建立好主机规划之后,在master,slave上两台机器设置下host
[root@localhost ~]# vi .bashrc
#编辑内容如下:
192.168.0.108 master
192.168.0.109 slave
192.168.0.150 vip
二 配置ssh秘钥
在master,slave机器上都生成ssh如下:
[root@localhost ~]# su - postgres
[postgres@localhost ~]$ ssh-keygen -t rsa
[postgres@localhost ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[postgres@localhost ~]$ chmod 600 ~/.ssh/authorized_keys
分别将master的公钥复制到slave,slave的公钥复制到master。
#master端
[postgres@localhost ~]$ scp ~/.ssh/authorized_keys postgres@slave:~/.ssh/
#slave端
[postgres@localhost ~]$ scp ~/.ssh/authorized_keys postgres@master:~/.ssh/
验证下ssh配置是否成功
#master端
[postgres@slave ~]$ ssh postgres@slave
Last login: Tue Dec 20 21:22:50 2016 from master
#slave端
[postgres@slave ~]$ ssh postgres@master
Last login: Tue Dec 20 21:22:50 2016 from slave
证明ssh信任关系配置成功。
三 安装pgpool
# 下载pgpool
[root@master opt]# wget http://www.pgpool.net/mediawiki/images/pgpool-II-3.6.0.tar.gz
# 解压
[root@master opt]# tar -zxvf pgpool-II-3.6.0.tar.gz
# 文件权限设置为postgres(其实并非一定装在postgres账户,只不过之前ssh设置都在postgres下,为了方便)
[root@master opt]# chown -R postgres.postgres /opt/pgpool-II-3.6.0
[root@master ~]# su - postgres
[postgres@master opt]$ cd pgpool-II-3.6.0
[postgres@master pgpool-II-3.6.0]$ ./configure –prefix=/opt/pgpool -with-pgsql=path -with-pgsql=/home/postgres
[postgres@master pgpool-II-3.6.0]$ make
[postgres@master pgpool-II-3.6.0]$ make install
安装pgpool相关函数,并非强制,可选安装,为了系统稳定,建议安装
安装pg_reclass,pg_recovery
[postgres@master pgpool-II-3.6.0]$ cd src/sql
[postgres@master sql]$ make
[postgres@master sql]$ make install
[postgres@master sql]$ psql -f insert_lock.sql
安装全部结束。
四 配置pgpool
4.1 配置pgpool环境变量
pgpool装在了postgres账户下,在该账户中添加环境变量,master,slave节点都执行。
[postgres@master ~]$ cd /home/postgres
[postgres@master ~]$ vim .bashrc
#编辑内容如下
PGPOOLHOME=/opt/pgpool
export PGPOOLHOME
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin:$PGPOOLHOME/bin
export PATH
4.2 配置pool_hba.conf
pool_hba.conf是对登录用户进行验证的,要和pg的pg_hba.conf保持一致,要么都是trust,要么都是md5验证方式,这里采用了md5验证方式如下设置:
[postgres@master ~]$ cd /opt/pgpool/etc
[postgres@etc~]$ cp pool_hba.conf.sample pool_hba.conf
[postgres@etc~]$ vim pool_hba.conf
#编辑内容如下
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 0.0.0.0/0 md5
host all all 0/0 md5
4.3 配置pcp.conf
pcp.conf配置用于pgpool自己登陆管理使用的,一些操作pgpool的工具会要求提供密码等,配置如下:
[postgres@master ~]$ cd /opt/pgpool/etc
[postgres@etc~]$ cp pcp.conf.sample pcp.conf
# 使用pg_md5生成配置的用户名密码
[postgres@etc~]$ pg_md5 nariadmin
6b07583ba8af8e03043a1163147faf6a
#pcp.conf是pgpool管理器自己的用户名和密码,用于管理集群。
[postgres@etc~]$ vim pcp.conf
#编辑内容如下
postgres:6b07583ba8af8e03043a1163147faf6a
#保存退出!
#在pgpool中添加pg数据库的用户名和密码
[postgres@etc~]$ pg_md5 -p -m -u postgres pool_passwd
#数据库登录用户是postgres,这里输入登录密码,不能出错
#输入密码后,在pgpool/etc目录下会生成一个pool_passwd文件
4.4 配置系统命令权限
配置 ifconfig, arping 执行权限 ,执行failover_stream.sh需要用到,可以让其他普通用户执行。
[root@master ~]# chmod u+s /sbin/ifconfig
[root@master ~]# chmod u+s /usr/sbin
4.5 配置pgpool.conf
查看本机网卡,配置后面的delegate_IP需要
[postgres@etc~]$ ifconfig
网卡名称.png
配置master上的pgpool.conf:
[postgres@master ~]$ cd /opt/pgpool/etc
[postgres@etc~]$ cp pgpool.conf.sample pgpool.conf
[postgres@etc~]$ vim pgpool.conf
编辑内容如下:
# CONNECTIONS
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898
# - Backend Connection Settings -
backend_hostname0