1.环境

OS:  CentOS release 6.4 (Final)
DB: postgresql 9.3.6
pgpool服务器: pgpool 172.16.0.240
数据库主服务器:master 172.16.0.241
数据库从服务器:slave 172.16.0.242 

其中主从数据库使用的流复制,并且已经配置完毕,新配置的pgpool使用postgres用户进行管理。新架构使用的主备模式外加流复制,此架构支持流复制、负载均衡、故障恢复,不支持复制和并行查询,主库可以支持读写,从库只读。

2.pgpool安装

[root@pgpool opt]# yum install -y http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm
[root@pgpool opt]# yum install postgresql93-devel
[root@pgpool opt]# wget http://www.pgpool.net/download.php?f=pgpool-II-3.4.2.tar.gz
[root@pgpool opt]# mv download.php\?f\=pgpool-II-3.4.2.tar.gz pgpool-II-3.4.2.tar.gz
[root@pgpool opt]# tar -zxvf pgpool-II-3.4.2.tar.gz
[root@pgpool opt]# cd pgpool-II-3.4.2
[root@pgpool pgpool-II-3.4.2]# ./configure --with-pgsql=/usr/pgsql-9.3

如果不加--with-pgsql=/usr/pgsql-9.3,可能会出现configure: error: libpq is not installed or libpq is old错误

[root@pgpool pgpool-II-3.4.2]# make
[root@pgpool pgpool-II-3.4.2]# make install

3.修改pgpool配置

启用并修改配置文件pgpool.conf

[root@pgpool etc]# cp /usr/local/etc/pgpool.conf.sample-stream /usr/local/etc/pgpool.conf

修改pgpool.conf文件中的内容

# - pgpool Communication Manager Connection Settings -
listen_addresses = '*' ---默认0是主库,其它是从库,backend_weight可以控制数据库读在两台机器上的分配比例 # - Backend Connection Settings -
backend_hostname0 = '172.16.0.241'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/9.3/data'
backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = '172.16.0.242'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data1'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_data_directory0 = '/var/lib/pgsql/9.3/data' # - Authentication - ---开启pgpool的hba认证 enable_pool_hba = on
#------------------------------------------------------------------------------
# MASTER/SLAVE MODE
#------------------------------------------------------------------------------
sr_check_user = 'postgres'
sr_check_password = '123456' #------------------------------------------------------------------------------
# HEALTH CHECK
#------------------------------------------------------------------------------ health_check_period = 1
health_check_user = 'postgres'
health_check_password = '123456' #------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------ ---用来在主库失败时,把只读的从库切为主库 failover_command = '/usr/local/bin/failover_stream.sh %d %H /tmp/trigger_file0'

启用并修改配置文件pcp.conf

[root@pgpool etc]# cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf

此文件是管理端口,可以暂时不用配置。

启用并修改配置文件pool_hba.conf

[root@pgpool etc]# cp /usr/local/etc/pool_hba.conf.sample /usr/local/etc/pool_hba.conf
---添加一行:
host all all 172.16.0.0/24 md5
---删除一行
host all all 127.0.0.1/32 trust

对pgpool的访问策略,要设置为md5的方式。

启用配置文件pool_passwd

[root@pgpool etc]# pg_md5 -m -p -u postgres pool_passwd
password:

密码填的是123456,该文件会在执行文件后自动生成。从远程连接pgpool的时候,需要使用该密码来访问,pgpool使用该用户密码来访问后面的真正的数据库。

添加主备脚本切换脚本failover_stream.sh

[root@pgpool bin]# vi /usr/local/bin/failover_stream.sh
# Failover command for streaming replication.
# This script assumes that DB node 0 is primary, and 1 is standby.
#
# If standby goes down, do nothing. If primary goes down, create a
# trigger file so that standby takes over primary node.
#
# Arguments: $1: failed node id. $2: new master hostname. $3: path to
# trigger file. failed_node=$1
new_master=$2
trigger_file=$3 # Do nothing if standby goes down.
if [ $failed_node = 1 ]; then
exit 0;
fi # Create the trigger file.
/usr/bin/ssh -T $new_master /bin/touch $trigger_file exit 0; [root@pgpool bin]# chmod 700 failover_stream.sh

对应的从库slave的recovery.conf配置:

[root@slave data]# cat recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=172.16.0.241 port=5432 user=rep_user'
trigger_file = '/tmp/trigger_file0'

该trigger_file的参数要和pgpool.conf文件中failover_command对应的文件保持一致。

4.设置主机互信

修改hosts文件

对每个主机的/etc/hosts文件添加以下内容,

172.16.0.240 pgpool
172.16.0.241 master
172.16.0.242 slave

pgpool主机生成公钥和私钥

[root@pgpool bin]# su - postgres
-bash-4.1$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/pgsql/.ssh/id_rsa):
Created directory '/var/lib/pgsql/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/pgsql/.ssh/id_rsa.
Your public key has been saved in /var/lib/pgsql/.ssh/id_rsa.pub.
The key fingerprint is:
a0:93:d4:b5:ed:26:d0:94:a5:e7:99:95:6b:d6:18:af postgres@pgpool
The key's randomart image is:
+--[ RSA 2048]----+
| oo. |
| . +.+ . |
| . + + o + |
| . o o + + * |
| + S * = o |
| . o o . |
| E |
| |
| |
+-----------------+

输入命令后一直回车即可。在master和slave节点同样执行上面的操作。

同步公钥

在pgpool节点上执行

-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.241
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.242

在master节点上执行

-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.241
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.242 

在slave节点上执行

-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.241
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.242

  

上面的操作执行后,在每个机器检查一下,是否可以用ssh username@nodename的方式,对其他节点进行免密码的ssh访问,第一次访问的时候会记录known_hosts,否则ssh时候会有是否信任节点的提示。

5.启动pgpool

使用postgres用户启动pgpool服务的话,需要修改对应目录的权限,否则pgpool会启动失败

[root@pgpool etc]# mkdir /var/run/pgpool
[root@pgpool run]# chown -R postgres:postgres /var/run/pgpool
[root@pgpool local]# chown -R postgres:postgres /usr/local/etc
[root@pgpool local]# chown -R postgres:postgres /usr/local/bin

  

检验主从数据库切换的脚本是否可以正常运行,在pgpool服务器执行命令,检测在slave服务器是否生成了trigger_file0文件

shell脚本在pgpool执行

-bash-4.1$ /usr/local/bin/failover_stream.sh 0 slave /tmp/trigger_file0

切换到slave主机检查

[root@slave ~]# ls /tmp
ssh-rangWC1783 trigger_file0 yum.log 

启动pgpool

-bash-4.1$ pgpool -n -d > /tmp/pgpool.log 2>&1 &
[1] 10474  

6.检测pgpool功能

任一节点(如slave节点)连接pgpool

[root@slave ~]# psql -h 172.16.0.240 -p 9999 -d test -U postgres
Password for user postgres:
psql (9.3.6)
Type "help" for help. test=# select * from t4;
id
----
1
(1 row) test=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+--------------+------+--------+-----------+---------
0 | 172.16.0.241 | 5432 | 2 | 0.500000 | primary
1 | 172.16.0.242 | 5432 | 2 | 0.500000 | standby
(2 rows)

可以看到此时241数据库是主节点,242是从节点。

关闭主要节点,可以关闭服务也可以直接杀进程模拟数据库崩溃

[root@master data]# service postgresql-9.3 stop
Stopping postgresql-9.3 service: [ OK ]
  
---master关闭后,从节点的连接中断后又成功连接上 server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
test=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+--------------+------+--------+-----------+---------
0 | 172.16.0.241 | 5432 | 3 | 0.500000 | standby
1 | 172.16.0.242 | 5432 | 2 | 0.500000 | primary test=# insert into t4 values (6);
INSERT 0 1
test=# select * from t4;
id
----
1
6
(2 rows) test=#  

pgpool发生主从切换后,242节点变为主节点,241节点关闭(status为3)。

上面查询show pool_nodes中得status字段含义

Status 由数字 [0 - 3]来表示。
0 - 该状态仅仅用于初始化,PCP从不显示它。
1 - 节点已启动,还没有连接。
2 - 节点已启动,连接被缓冲。
3 - 节点已关闭。

可以看到主备已经切换完成。

7.其它注意事项

    • 若pgpool上的主从切换脚本忘记写,或者没能正常执行,show pool_nodes命令会显示两个节点都是standby,而集群整体是只读的,此时可以关闭并启动节点的数据库服务,然后重启pgpool。
    • 测试trigger文件的时候,注意要及时删除生成的trigger 文件,否则会破坏主从架构,导致后面的实验失败。

pgpool-II主备流复制的架设的更多相关文章

  1. PostgreSQL主备流复制机制

    原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...

  2. PgSQL · 特性分析 · PG主备流复制机制

    原文地址:http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...

  3. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

  4. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

  5. KingbaseES R6 主备流复制集群创建级联复制案例

    案例环境: 数据库: test=# select version(); version -------------------------------------------------------- ...

  6. KingbaseES R6 手工创建主备流复制案例

    ​ 数据库版本: TEST=# select version(); version ---------------------------------------------------------- ...

  7. [原创] PostgreSQL Plus Advanced Server在Windows中配置双机热备流复制

    一.系统环境 操作系统:Windows Server 2003/2008 两个节点分别为master与slave. 主节点master:172.27.19.28 备机点slave:172.27.19. ...

  8. PostgreSQL流复制

    原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组 ...

  9. KingbaseES R3 集群删除test库导致主备无法切换问题

    案例说明: 在KingbaseES R3集群中,kingbasecluster进程会通过test库访问,连接后台数据库服务测试:如果删除test数据库,导致后台数据库服务访问失败,在集群主备切换时,无 ...

随机推荐

  1. Spring加载properties文件的属性的值

    要使用配置文件的值首先在spring.xml配置加载properties文件 <context:property-placeholder location="classpath:ife ...

  2. react 入门

    一:virtual DOM  虚拟DOM树 在React中,render执行的结果得到的并不是真正的DOM节点,结果仅仅是轻量级的JavaScript对象,我们称之为virtual DOM. 虚拟DO ...

  3. poj 2063完全背包

    题意:给出总资金和投资年份 ,n个股票 给出股票价格和其一年的利润.问如何选择能获得最大利润. 思路:股票可以重复选择,完全背包问题,完全背包也是从01背包衍生而行的,其主要区别在于中间那层循环的次序 ...

  4. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)

    说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...

  5. ES6块级作用域

    块级作用域的优点 避免变量冲突,比如程序中加载了多个第三方库的时候,如果没有妥善地将内部私有函数或变量隐藏起来,就很容易引发变量冲突: 可以方便的进行模块管理: 利于内存回收:(块级作用域里声明的变量 ...

  6. python re group()

    python group() 正则表达式中,group()用来提出分组截获的字符串,()用来分组 import re a = "123abc456" print re.search ...

  7. 201521123083《Java程序设计》第8周学习总结

    1. 本周学习总结 这周因为一些事情耽搁了,几乎没什么打java代码,这几天尽量补过来 2. 书面作业 1.List中指定元素的删除 1.1 实验总结 不贴大段代码了,简要总结一下.切割成数组,主要用 ...

  8. 201521123098 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 该方法调用了ind ...

  9. 201521123085 《Java程序设计》第一周学习总结

    一 本周学习总结 学习了Java,又和老师见面了,这学期要好好学习Java了.Java这个东西刚刚接触很难懂,其实现在还是不懂,但是我会慢慢地努力地好好学,上机课第一次在黑色的框框弄出Hello wo ...

  10. [转载]请教各位高手光盘版或者U盘版的BT保存配置的问题

    这样安装的bt4默认是不能保存配置的,每次你更改了设置,下次重启又没有了.在网上下载一个叫做"saveFile.rar"的压缩包,大小40K左右,这个是bt4能够保存配置关键,当然 ...