pgpool-ii实现postgresql读写分离

Posted 小学生运维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pgpool-ii实现postgresql读写分离相关的知识,希望对你有一定的参考价值。

pgpool-ii实现postgresql读写分离

实验环境:

10.10.1.60         Pgpool-II

10.10.1.61         PgSql-001(master)

10.10.1.62         PgSql-002(slave)

yum源安装(centos7 pgpool3.4)

yum install http://www.pgpool.net/yum/rpms/3.4/redhat/rhel-7-x86_64/pgpool-II-release-3.4-1.noarch.rpm

安装对应版本pgpool软件包

查看版本 #yum list|grep pgpool

[root@Pgpool-II pgpool-II]# yum list|grep pgpool

pgpool-II-pg92.x86_64                       3.4.8-1pgdg.rhel7          @pgpool34 pgpool-II-pg92-devel.x86_64                 3.4.8-1pgdg.rhel7          @pgpool34 pgpool-II-release.noarch                    3.4-1                      installed

pgpool-II-pg11.x86_64                       3.4.21-1pgdg.rhel7         pgpool34 pgpool-II-pg11-debuginfo.x86_64             3.4.21-1pgdg.rhel7         pgpool34 pgpool-II-pg11-devel.x86_64                 3.4.21-1pgdg.rhel7         pgpool34 pgpool-II-pg11-extensions.x86_64            3.4.21-1pgdg.rhel7         pgpool34 pgpool-II-pg92-debuginfo.x86_64             3.4.8-1pgdg.rhel7          pgpool34 pgpool-II-pg92-extensions.x86_64            3.4.8-1pgdg.rhel7          pgpool34 pgpool-II-pg93.x86_64                       3.4.21-1pgdg.rhel7         pgpool34

pgpoolAdmin.noarch                          3.5.3-1pgdg.rhel7          pgpool34


安装pgpool(postgresql-9.2.4)

yum install  pgpool-II-pg92

配置文件在/etc/pgpool-II/下

启用默认配置文件

cp pgpool.conf.sample-stream pgpool.conf

修改配置文件(主要配置如下)

listen_addresses = '*'

---默认0是主库,其它是从库,backend_weight可以控制数据库读在两台机器上的分配比例

# - Backend Connection Settings -

backend_hostname0 = '10.10.1.61'

backend_port0 = 5432

backend_weight0 = 1

backend_data_directory0 = '/var/lib/pgsql/data'

backend_flag0 = 'ALLOW_TO_FAILOVER'  

backend_hostname1 = '10.10.1.62'

backend_port1 = 5432

backend_weight1 = 1

backend_data_directory1 = '/var/lib/pgsql/data'

backend_flag1 = 'ALLOW_TO_FAILOVER'

# - 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(此文件为pcp认证文件存储用户名和密码(密码为MD5格式存储))密码:123456

postgres:e10adc3949ba59abbe56e057f20f883e


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

---添加一行:

host    all         all         172.16.0.0/24   md5

---删除一行

host    all         all         127.0.0.1/32          trust

启用配置文件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/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 755 failover_stream.sh


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

[root@slave data]# cat recovery.conf

standby_mode = 'on'

primary_conninfo = 'host=10.10.1.61 port=5432 user=repl password=123456' trigger_file = '/tmp/trigger_file0'


设置主机互信(设置所有主机的postgres双机互信)

ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@IP


启动pgpool服务

service pgpool start

连接pgpool

psql -h 10.10.1.60 -p 9999 -U postgres password:123456

查看节点状态:

postgres=# show pool_nodes; node_id |  hostname  | port | status | lb_weight |  role   ---------+------------+------+--------+-----------+--------- 0       | 10.10.1.61 | 5432 | 2      | 0.500000  | primary 1       | 10.10.1.62 | 5432 | 2      | 0.500000  | standby (2 行记录)

Status 由数字 [0 - 3]来表示。

0 - 该状态仅仅用于初始化,PCP从不显示它。

1 - 节点已启动,还没有连接。

2 - 节点已启动,连接被缓冲。

3 - 节点已关闭。

添加失效主机(例如status为3时)

pcp_attach_node -d 5 localhost 9898 postgres 123456 1


pcp_attach_node - attach a node from pgpool-II

Usage: pcp_attach_node [-d] timeout hostname port# username password nodeID

Usage: pcp_attach_node -h 

-d, --debug : enable debug message (optional) 

timeout     : connection timeout value in seconds. command exits on timeout hostname    : pgpool-II hostname 

port#       : PCP port number 

username    : username for PCP authentication

 password    : password for PCP authentication 

nodeID      : ID of a node to be attached 

-h, --help  : print this help


其它注意事项

    • 若pgpool上的主从切换脚本忘记写,或者没能正常执行,show pool_nodes命令会显示两个节点都是standby,而集群整体是只读的,此时可以关闭并启动节点的数据库服务,然后重启pgpool。

    • 测试trigger文件的时候,注意要及时删除生成的trigger 文件,否则会破坏主从架构,导致后面的实验失败。

    • pgpool的运行身份:必须和postresql的运行身份一致,否则postgresql无法自动删除pgpool创建的trigger_file


以上是关于pgpool-ii实现postgresql读写分离的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL+pgpool-II复制方案

postgresql已经配置好主从,java中怎么进行读写分离

数据库基础选型之——PostgreSQL vs MySQL分析对比

debian8下给postgresql9.5配置pgpool-II-3.5

Pgpool-II 模式初步浅析

数据库读写分离小结