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已经配置好主从,java中怎么进行读写分离
数据库基础选型之——PostgreSQL vs MySQL分析对比