热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于PgpoolII的PostgreSQL集群安装与配置教程

本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。

安装Pgpool-II


Pgpool-II 是一个位于 PostgreSQL服务器和 PostgreSQL数据库客户端之间的中间件,Pgpool-II提供了连接池(Connection Pooling)、复制(Replication)、负载均衡(Load Balancing)、缓存(In Memory Query Cache)、看门狗(Watchdog)、超出限制链接(Limiting Exceeding Connections)等功能,可以基于这些特性来搭建PostgreSQL高可用集群。


yum安装

官方参考地址

Yum Repository

Installation from RPM

安装CentOS7的yum源。

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

安装支持PostgreSQL10版本的pgpool-II

$ yum install pgpool-II-pg10

$ yum install pgpool-II-pg10-debuginfo

$ yum install pgpool-II-pg10-devel

$ yum install pgpool-II-pg10-extensions

服务开机启动

$ systemctl enable pgpool.service

启动/停止服务

$ systemctl start pgpool.service

$ systemctl stop pgpool.service

配置Pgpool-II

参考文章

image.png

pgpool-II的安装及使用

PGPool-II+PG流复制实现HA主备切换

实例准备

role ip PostgreSQL Pgpool-II port

master 192.168.1.3 10.9 4.0.5 5432

slave 192.168.1.2 10.9 4.0.5 5432

vip 192.168.1.100 – – –

watchdog端口9000,pcp端口9898,psql服务连接端口9999

架构图

Pgpool-II集群

配置系统环境

配置程序运行的用户和组为 postgres


创建或修改目录权限

$ chown -R postgres.postgres /etc/pgpool-II

$ mkdir /var/run/pgpool/

$ chown postgres.postgres /var/run/pgpool/


修改pgpool运行用户和组为postgres

$ vi /usr/lib/systemd/system/pgpool.service

User=postgres

Group=postgres

配置认证方式

配置pool_hba.conf,要么都是trust,要么都是md5验证方式,这里采用了md5验证方式如下设置


“local” is for Unix domain socket connections only

local all all md5


IPv4 local connections:

host all all 127.0.0.1/32 md5

host all all ::1/128 md5

host all all 0.0.0.0/0 md5

配置pg_hba.conf,认证方式保持一致


“local” is for Unix domain socket connections only

local all all md5


IPv4 local connections:

host all all 127.0.0.1/32 md5

host all all 0.0.0.0/0 md5


IPv6 local connections:

host all all ::1/128 md5

非必要可选步骤,为了集群可扩展性,可以将复制的认证条件放宽


Allow replication connections from localhost, by a user with the
replication privilege.

local replication all md5

host replication all 127.0.0.1/32 md5

host replication all ::1/128 md5

host replication all 192.168.1.0/24 md5

配置pcp

pcp.conf 配置用于pgpool自己登陆管理使用的,一些操作pgpool的工具会要求提供密码等,配置如下

配置用户名密码

$ pg_md5 postgres

e8a48653851e28c69d0506508fb27fc5

$ vi pcp.conf


USERID:MD5PASSWD

postgres:e8a48653851e28c69d0506508fb27fc5

添加pg数据库用户密码

在pgpool中添加pg数据库的用户名和密码,数据库登录用户是postgres,这里输入登录密码

$ pg_md5 -p -m -u postgres pool_passwd

password:


输入密码后,会生成一个pool_passwd文件

$ cat pool_passwd

postgres:md53175bce1d3201d16594cebf9d7eb3f9d

配置系统命令权限

$ chmod +s /sbin/ifconfig

$ chmod +s /sbin/ip

$ chmod +s /sbin/ifup

$ chmod +s /bin/ping

$ chmod +s /sbin/arping

配置 pgpool.conf

primary

$ cp pgpool.conf.sample-stream pgpool.conf

编辑内容如下


- pgpool Connection Settings -

listen_addresses = ‘*’

port = 9999


- pgpool Communication Manager Connection Settings -

pcp_listen_addresses = ‘*’

pcp_port = 9898


- Backend Connection Settings -

backend_hostname0 = ‘192.168.1.3’

backend_port0 = 5432

backend_weight0 = 1

backend_data_directory0 = ‘/var/lib/pgsql/10/data’

backend_flag0 = ‘ALLOW_TO_FAILOVER’

backend_hostname1 = ‘192.168.1.2’

backend_port1 = 5432

backend_weight1 = 1

backend_data_directory1 = ‘/var/lib/pgsql/10/data’

backend_flag1 = ‘ALLOW_TO_FAILOVER’


- Authentication -

enable_pool_hba = on

pool_passwd = ‘pool_passwd’

authentication_timeout = 60


FILE LOCATIONS

pid_file_name = ‘/var/run/pgpool/pgpool.pid’


CONNECTION POOLING

connection_cache = on


REPLICATION MODE

replication_mode = off


LOAD BALANCING MODE

load_balance_mode = on


MASTER/SLAVE MODE

master_slave_mode = on

master_slave_sub_mode = ‘stream’


- Streaming -

sr_check_period = 5

sr_check_user = ‘repuser’

sr_check_password = ‘repuser’

sr_check_database = ‘postgres’


HEALTH CHECK

health_check_period = 10

health_check_timeout = 10

health_check_user = ‘postgres’

health_check_password = ‘postgres’

health_check_database = ‘postgres’


FAILOVER AND FAILBACK

failover_command = ‘/var/lib/pgsql/10/failover_stream.sh %H’


WATCHDOG

use_watchdog = on

wd_hostname = ‘192.168.1.3’

wd_port = 9000

delegate_IP = ‘192.168.1.100’

if_cmd_path = ‘/sbin’

if_up_cmd = ‘ifconfig eth0:0 inet _IP_ netmask 255.255.255.0’

if_down_cmd = ‘ifconfig eth0:0 down’


– heartbeat mode –

heartbeat_destination0 = ‘192.168.1.2’

heartbeat_device0 = ‘eth0’


- Other pgpool Connection Settings -

other_pgpool_hostname0 = ‘192.168.1.2’

other_pgpool_port0 = 9999

other_wd_port0 = 9000

standby

编辑内容如下


- pgpool Connection Settings -

listen_addresses = ‘*’

port = 9999


- pgpool Communication Manager Connection Settings -

pcp_listen_addresses = ‘*’

pcp_port = 9898


- Backend Connection Settings -

backend_hostname0 = ‘192.168.1.3’

backend_port0 = 5432

backend_weight0 = 1

backend_data_directory0 = ‘/var/lib/pgsql/10/data’

backend_flag0 = ‘ALLOW_TO_FAILOVER’

backend_hostname1 = ‘192.168.1.2’

backend_port1 = 5432

backend_weight1 = 1

backend_data_directory1 = ‘/var/lib/pgsql/10/data’

backend_flag1 = ‘ALLOW_TO_FAILOVER’


- Authentication -

enable_pool_hba = on

pool_passwd = ‘pool_passwd’

authentication_timeout = 60


FILE LOCATIONS

pid_file_name = ‘/var/run/pgpool/pgpool.pid’


CONNECTION POOLING

connection_cache = on


REPLICATION MODE

replication_mode = off


LOAD BALANCING MODE

load_balance_mode = on


MASTER/SLAVE MODE

master_slave_mode = on

master_slave_sub_mode = ‘stream’


- Streaming -

sr_check_period = 5

sr_check_user = ‘repuser’

sr_check_password = ‘repuser’

sr_check_database = ‘postgres’


HEALTH CHECK

health_check_period = 10

health_check_timeout = 10

health_check_user = ‘postgres’

health_check_password = ‘postgres’

health_check_database = ‘postgres’


FAILOVER AND FAILBACK

failover_command = ‘/var/lib/pgsql/10/failover_stream.sh %H’


WATCHDOG

use_watchdog = on

wd_hostname = ‘192.168.1.2’

wd_port = 9000

delegate_IP = ‘192.168.1.100’

if_cmd_path = ‘/sbin’

if_up_cmd = ‘ifconfig eth0:0 inet _IP_ netmask 255.255.255.0’

if_down_cmd = ‘ifconfig eth0:0 down’


– heartbeat mode –

heartbeat_destination0 = ‘192.168.1.3’

heartbeat_device0 = ‘eth0’


- Other pgpool Connection Settings -

other_pgpool_hostname0 = ‘192.168.1.3’

other_pgpool_port0 = 9999

other_wd_port0 = 9000

failover_stream.sh

配置failover_stream.sh脚本,内容如下:

$ pwd

/var/lib/pgsql/10

$ touch failover_stream.sh

$ chmod u+x failover_stream.sh

$ cat failover_stream.sh

#! /bin/sh


Failover command for streaming replication.
Arguments: $1: new master hostname.

new_master=$1

trigger_command="/usr/bin/pg_ctl promote -D /var/lib/pgsql/10/data"


Prompte standby database.

/usr/bin/ssh -T $new_master $trigger_command

exit 0;

设置主机互信

配置ssh秘钥,分别在master、slave上生成ssh密钥对,并设置主机互信。

$ ssh-keygen -t rsa -b 1024

$ cd ~/.ssh

$ pwd

/var/lib/pgsql/.ssh

$ touch authorized_keys

$ chmod 600 authorized_keys


将master公钥id_rsa.pub内容拷贝到salve认证文件authorized_keys,同理将slave公钥id_rsa.pub内容拷贝到master认证文件authorized_keys
测试主机互信
salve

$ ssh postgres@192.168.1.3


master

$ ssh postgres@192.168.1.2

如果这个脚本的执行目标是本地,并且ssh本地登陆没有设置免秘钥,那么这个脚本会一直卡在输入密码的阶段,这时候主备自动切换过程就阻塞了。如果 pgpool和 postgresql在同一台机器部署,需要添加本地登陆免秘钥。

$ pwd

/var/lib/pgsql

$ cd .ssh/

$ ls

authorized_keys id_rsa id_rsa.pub

$ cat id_rsa.pub >> authorized_keys

启动集群

分别启动master、slave的PostgreSQL服务

$ systemctl start postgresql-10.service

分别启动各节点Pgpool-II服务

$ systemctl start pgpool.service

集群状态

用vip登录集群,查看状态

$ psql -p 9999 -h 192.168.1.100 -U postgres

Password for user postgres:

psql (10.9)

Type “help” for help.

postgres=# show pool_nodes;

node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay | last_status_change

---------±--------------±-----±-------±----------±--------±-----------±------------------±------------------±--------------------

0 | 192.168.1.3 | 5432 | up | 0.500000 | primary | 5 | true | 0 | 2019-08-08 16:11:26

1 | 192.168.1.2 | 5432 | up | 0.500000 | standby | 3 | false | 0 | 2019-08-08 16:13:14

(2 rows)

至此,基于 Pgpool-II 中间件的 PostgreSQL 集群搭建完成。

PCP命令

获取节点数


获取192.168.1.3可见节点数

$ pcp_node_count -h 192.168.1.3 -p 9898 -U postgres

Password:

2


获取192.168.1.2可见节点数

$ pcp_node_count -h 192.168.1.2 -p 9898 -U postgres

Password:

2

获取节点信息


查看节点0信息

$ pcp_node_info -h 192.168.1.3 -p 9898 -U postgres 0

Password:

192.168.1.3 5432 2 0.500000 up primary 0 2019-08-08 16:11:26


查看节点1信息

$ pcp_node_info -h 192.168.1.3 -p 9898 -U postgres 1

Password:

192.168.1.2 5432 2 0.500000 up standby 0 2019-08-08 16:13:14

$

从pgpool-II中脱离一个节点

该命令将节点slave从pgpool-II中脱离。一般如果需要维护某个数据库节点、或不希望pgpool-II将连接分发到该节点时,需要将该节点从pgpool-II中用该命令脱离。

$ pcp_detach_node -h 192.168.1.100 -p 9898 -U postgres -n 1

为pgpool-II关联一个节点

该命令将节点slave关联到pgpool-II中。当维护结束,或新添加一个节点后,可以将节点添加到pgpool-II。

另外,如果该节点由于主机或数据库故障导致检测到数据库为启动时,即使后期服务器重新修复、数据库手工启动,也需要执行attach操作。同时需要注意从两个节点上观察是否节点都已经attach。

$ pcp_attach_node -h 192.168.1.100 -p 9898 -U postgres -n 1



推荐阅读
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
author-avatar
子幽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有