热门标签 | 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



推荐阅读
  • 本文详细介绍了如何在CentOS 7操作系统上安装和配置Grafana,包括必要的依赖项安装、插件管理以及服务启动等步骤。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
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社区 版权所有