pgpool复制和负载均衡操作

简介

pgpool-II是一个位于postgresql数据库和客户端之间的中间件,可以提供一下几个功能:

1.连接池

pgpool-II保持已经连接到postgresql数据库的连接,并在使用相同参数连接进来时重用他们,减少了连接开销,并增加了系统的总体吞吐量。

2.复制

pgpool-II可以管理多个postgresql数据库,激活复制功能并使在2台或多台postgresql节点中建立一个实时备份称为可能,这样,如果其中一台节点失效,服务可以不被终端继续运行。

3.负载均衡

如果数据库进行了复制,则在任何一台服务器中执行一个select查询将返回相同的结果。pgpool-II利用了复制的功能以降低每台postgresql服务器的负载。它通过分发select查询到所有可用的服务器中,增强了系统的整体吞吐量。在理想的状况下,读性能应该和postgresql数量成正比。负载均衡功能在大量用户同时执行很多读查询的场景中工作效果最好。

4.限制超过限度的连接

postgresql会限制当前的最大连接数,当到达这个数量时,新的连接将被拒绝。增加这个连接数会增加资源消耗并且对系统的全局性能有一定的负面影响。pgpool-II也支持限制最大连接数,但她的做法是将连接放入队列,而不是立即返回一个错误。

另外,pgpool-II也支持并行查询,数据被分割到多台服务器上,所以一个查询可以在多台服务器上同时执行,以减少总体执行时间。并行查询在查询大规模数据的时候非常有效。

测试环境

IP 应用 版本
10.10.10.56 postgresql 9.2.15
10.10.10.57 postgresql 9.2.15
10.10.10.56 pgpool-II 3.5

环境说明:两台postgresql,pgpool和其中一台postgresql在一台服务器上。

测试需求:测试pgpool实现postgresql的复制和负载均衡

安装pgpool

1.源码安装

wget http://www.pgpool.net/download.php?f=pgpool-II-3.5.3.tar.gz
tar -zxvf pgpool-II-3.5.3.tar.gz
cd pgpool-II-3.5.3
./configure --prefix=/usr/local/pgpool --with-openssl
#报错configure: error: libpq is not installed or libpq is old
#安装 yum install postgresql-devel即可
make && make install

2.安装pgpool-regclass

使用 PostgreSQL 8.0 至 PostgreSQL 9.3,强烈推荐在需要访问的 PostgreSQL 中安装 pgpool_regclass 函数,因为它被 pgpool-II 内部使用。 如果不这样做,在不同的 schema 中处理相同的表名会出现问题(临时表不会出问题);而PostgreSQL 9.4或更高版本则不需要

cd pgpool-II-3.5.3/src/sql/pgpool-regclass
make && make install

-bash-4.2$ psql -f pgpool-regclass.sql template1
或
psql template1
=# CREATE EXTENSION pgpool_regclass;

应在每台通过 pgpool-II 访问的数据库中执行 pgpool-regclass.sql 或者 CREATE EXTENSION。 你不需要在你执行“psql -f pgpool-regclass.sql template1” 或者 CREATE EXTENSION 后建立的数据库中这么做, 因为这个模板数据库将被克隆成新建的数据库。

3.建立insert_lock表

如果你在复制模式中使用了 insert_lock ,强烈推荐建立 pgpool_catalog.insert_lock 表,用于互斥。 到现在为止,insert_lock 还能够工作。但是,在这种情况下,pgpool-II 需要锁定插入的目标表。 这种行为和 pgpool-II 2.2 和 2.3 系列类似。由于表锁与 VACUUM 冲突,所以 INSERT 操作可能因而等待很长时间。

cd pgpool-II-3.5.3/src/sql/
psql -f insert_lock.sql tempalte1

应在在每台通过 pgpool-II 访问的数据库中执行 insert_lock.sql。 你不需要在你执行“psql -f insert_lock.sql template1”后建立的数据库中这么做, 因为这个模板数据库将被克隆成新建的数据库。

4.安装pgpool_recovery

如果你使用在线回复,需要以下一些函数: pgpool_recovery, pgpool_remote_start, pgpool_switch_xlog。

另外,附带工具pgpoolAdmin 控制 pgpool-II 启停和重新连接后端的 PostgreSQL 节点, 它需要函数 pgpool_pgctl;而且 pgpoolAdmin 需要函数 pgpool_pgctl 来对 PostgreSQL 进行停止/重启/重新加载参数操作。

可以使用和安装 pgpool_regclass 一样的方法安装着四个函数。 不过和 pgpool_regclass 不同的是,你只需要在 template1 数据库中安装这些函数。

cd pgpool-II-3.5.3/src/sql/pgpool-recovery
make && make install
psql -f pgpool-recovery.sql template1
或
psql template1
=# CREATE EXTENSION pgpool_recovery

配置pgpool

1.配置pcp.conf

pgpool提供pcp接口,可以查看,管理pgpool的状态,并且可以远程操作pgpool,pcp.conf用来对pcp相关命令认证的文件

cd /usr/local/pgpool
cp etc/pcp.conf.sample etc/pcp.conf
bin/pg_md5 -m -u pgpool -p
会自动生成pool_passwd
postgres:md533c14731dfdfsdfsdf91e8d10c4bff5
cat etc/pcp.conf
pgpool:md533c14731dfdfsdfsdf91e8d10c4bff5

2.配置pool_hba.conf

通过pool_hba.conf可以进行相关权限设置,类似于postgresql的pg_hba.conf

cd /usr/local/pgpool
cp etc/pool_hba.conf.sample etc/pool_hba.conf
bin/pg_md5 -m -u postgres -p
会自动生成pool_passwd
postgres:md533c14731dfdfsdfsdf91e8d10c4bff5

**注意:

1.pool_hba.conf中的加密方式必须和pg_hba.conf中的加密方式一样,都为mds、trust或其他方式。若不一样会报错。

2.pool_hba.conf中的用户必须在postgresql数据库中存在

**

3.配置pgpool.conf

cd /usr/local/pgpool
cp etc/pgpool.conf.sample etc/pgpool.conf
#创建相关目录
mkdir -p /var/run/pgpool
mkdir -p /usr/local/pgpool/logs
vim etc/pgpool.conf
listen_addresses = '*'
port = 9999
socket_dir = '/tmp'
listen_backlog_multiplier = 2
serialize_accept = off
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/tmp'
backend_hostname0 = '10.10.10.56'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '10.10.10.57'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data/pgsql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
debug_level = 0
pid_file_name = '/var/run/pgpool/pgpool.pid'
logdir = '/usr/local/pgpool/logs'
replication_mode = on
load_balance_mode = on
master_slave_mode = off

其中:

replication_mode = on 复制模式打开,可以在两台postgresql数据库上进行实时备份

load_balance_mode = on 负载均衡模式打开,可以实现负载均衡

3.启动pgpool

/usr/local/pgpool/bin/pgpool

4.连接pgpool

psql -U postgres -p 9999 -h 10.10.10.56
Password for user postgres:
psql (9.2.15)
Type "help" for help.
postgres=#

测试

1.创建bench_replication数据库

psql -U postgres -p 9999 -h 10.10.10.56
Password for user postgres:
psql (9.2.15)
Type "help" for help.
postgres=#create database bench_replication;

我们可以分别登陆56、57上的postgresql进行查看

psql -U postgres -p 5432 -h 10.10.10.56
Password for user postgres:
psql (9.2.15)
Type "help" for help.

postgres=# \list
          List of databases
  Name  | Owner | Encoding | Collate | Ctype | Access privileges
-------------------+----------+----------+-------------+-------------+-----------------------
 bench_replication | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 |
 postgres   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 |
 template0   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   +
     |   |   |    |    | postgres=CTc/postgres
 template1   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   +
     |   |   |    |    | postgres=CTc/postgres
(4 rows)

可以看到两台postgresql都创建了bench_replication数据库,因此pgpool的复制是成功的。

2.pgbench测试

#安装pgbench
yum install postgresql-contrib
pgbench -i -h 10.10.10.56 -U postgres -p 9999 bench_replication

在所有pgsql节点中,下面列出的表和数据都被建立了,说明复制运行正常。

表名 行数
branches 1
tellers 10
accounts 100000
history 0

总结

以上只是简单介绍了pgpool-II的复制和负载均衡作为入门,还有很多功能没有介绍,需要我们继续探索。

补充:pgpool使用中遇到的坑总结

1,复制模式可靠性低

最早时候使用的是复制模式,数据到pgpool然后pgpool分别写入n个postgres.发现经常出现数据不一致问题,导致最终只有一个数据库可用

2,online recovery

基于PIRT的online recovery 配置复杂

3,基于流复制的主备模式

这个用到postgres9的新特性,前期配置测试都很easy,failover 也很好用,但是当服务连接上pgpool时,事务往往报错 postgres error : failed to read kind from backend,这个我在之前的文章中提到过,至今无法解决。

4,连接数的困扰

num_init_children 原来理解成了一个池的大小,如果超过了会自动扩增,但是实际上往往不够用,确切的说该值也是 pgpool-II 支持的从客户端发起的最大并发连接数。

所以这个值配的尽量大些,并且对这个值的更改必须重启pgpool.

5,client_idle_limit不要配置

当一个客户端在执行最后一条查询后如果空闲到了 client_idle_limit 秒数, 到这个客户端的连接将被断开.连接不应该让pgpool来断开,应该是应用主动去断开。如果让pgpool去断开,会导致客户端不可用。

当然pgpool也有一个好处,能够快速找到连接的应用。因为每个连接都是单独的进程,所以启动后会有num_init_children 个进程可以接受连接

使用# ps -ef |grep pgpool 可以看到

pgpool: wait for connection request 的进程是空进程,等待连接。

pgpool: postgres dbtest 10.115.53.167(51883) idle 这些进程是使用中的进程,并且可以看到是来自哪台机器,什么用户,连接的是什么数据库。

当然使用select * from pg_stat_activity 也能查到 连接情况

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

赞 (0)

相关推荐

  • Postgresql 如何清理WAL日志

    WAL是Write Ahead Log的简写,和oracle的redo日志类似,存放在$PGDATA/pg_xlog中,10版本以后在$PGDATA/pg_wal目录. 如果开启了归档,在目录archive_status下会有一些文件,以ready结尾的,表示可以归档但还没有归档,done结尾的表示已经归档. 和WAL日志数量相关的几个参数: wal_keep_segments = 300 # in logfile segments, 16MB each; 0 disables checkpoi

  • PostgreSQL pg_archivecleanup与清理archivelog的操作

    pg_archivecleanup 和 pg_rewind 是PG 中两个重要的功能,一个是为了清理过期的 archive log 使用的命令,另一个是你可以理解为物理级别的 wal log的搬运工. 我们先说第一个 pg_archivecleanup 命令,这个命令主要是用于使用了archive log 功能的 postgresql 但在 archive log 堆积如山的情况下,你怎么来根据某些规则,清理这些日志呢? 这里面就要使用 pg_archivecleanup 这个命令了,可以定时的

  • postgresql连续归档及时间点恢复的操作

    简介 前面我们介绍了通过pgsql的流复制在生产环境中搭建高可用环境来保证服务的可持续性:我们也要对数据库进行周期备份,来防止数据的丢失,这就需要连续归档,它不仅可以用于大型数据库的增量备份和恢复,也可以用于搭建standby镜像备份.    PostgreSQL默认处于非归档模式.开启归档模式,主要涉及到三个参数:wal_level,archive_mode和archive_commandwal_level参数默认为mininal,设置此参数为archive或者之上的级别都可以打开归档.当po

  • postgresql 实现启动、状态查看、关闭

    利用psql启动数据库 [postgres@highgo ~]$ pg_ctl start 查看系统中运行的postgres进程 #ps -ef | grep postgres 连接postgresql数据库 #psql -h 127.0.0.1 -d postgres -U postgres 停止postgresql数据库实例 #pg_ctl stop #ps -ef | grep postgres 启动服务器最简单的方法是像下面这样: $ postgres -D /usr/local/pgs

  • PostgreSQL+Pgpool实现HA主备切换的操作

    PostgreSQL流复制实现HA主备切换 环境说明和主机规划 操作系统 主机名 主机 角色 端口 CentOS 7 master 10.0.0.11 PG-Master 54321 CentOS 7 slave 10.0.0.12 PG-Slave 54321 CentOS 7 pool 10.0.0.13 pgpool 54321 基础环境配置(所有主机操作) 配置HOSTS echo -e "10.0.0.11 master\n10.0.0.12 slave\n10.0.0.13 pool

  • PostgreSQL归档配置及自动清理归档日志的操作

    在一般的生产环境中,数据库都需要开启归档模式,那么在pg中如何开启归档模式呢? pg中的归档配置涉及几个参数如下: # - Archiving - 是否开启归档 #archive_mode = off # enables archiving; off, on, or always # (change requires restart) 归档命令,注意 %p %f %% 格式化的含义. %p 是被归档的redo文件的路径, %f 是被归档的redo文档的文件名 %% 是百分号 #archive_c

  • 解决PostgreSQL日志信息占用磁盘过大的问题

    当PostgreSQL启用日志时,若postgresql.conf日志的相关参数还使用默认值的话磁盘很容易被撑爆.因此在启用了logging_collector参数时,需要对其它相关的参数进行调整. 系统默认参数如下 #log_destination = 'stderr' #日志格式,值为stderr, csvlog, syslog, and eventlog之一. logging_collector = on #启用日志 #log_directory = 'log' #日志文件存储目录 #lo

  • 如何查看postgres数据库端口

    如下所示: Linux: netstat -a | grep PGSQL 示例输出: [highgo@hgdbt data]$ netstat -a | grep PGSQL unix 2 [ ACC ] STREAM LISTENING 14710 /tmp/.s.PGSQL.5866 补充:postgresql 端口不对外开放问题 突然遇到了一个问题, 服务器的postgresql连接不上了,用nmap扫了以下5432端口没有打开 但是在服务器上netstats ps -e|grep 543

  • pgpool复制和负载均衡操作

    简介 pgpool-II是一个位于postgresql数据库和客户端之间的中间件,可以提供一下几个功能: 1.连接池 pgpool-II保持已经连接到postgresql数据库的连接,并在使用相同参数连接进来时重用他们,减少了连接开销,并增加了系统的总体吞吐量. 2.复制 pgpool-II可以管理多个postgresql数据库,激活复制功能并使在2台或多台postgresql节点中建立一个实时备份称为可能,这样,如果其中一台节点失效,服务可以不被终端继续运行. 3.负载均衡 如果数据库进行了复

  • Win2008 R2下配制负载均衡方法(图文简洁版)

    两台web 服务器,操作系统是Windows Server 2008 R2,申请三个IP地址及要做负载平衡的域名(www.test.cn),其中一个IP地址为虚拟IP地址,另外两个分别配置在两台服务器上,例: 虚拟IP: 11.1.6.13 两台的地址分别为11.1.6.11, 11.1.6.12两台服务须安装的内容如下: 服务器(11.1.6.11): 1. 安装负载均衡服务 2. 在此服务器上配制负载均衡操作(以下以此台服务器为例) 服务器(11.1.6.12):1. 安装负载均衡服务 负载

  • 负载均衡的基本知识以及使用nginx进行负载均衡的简单例子

    nginx一般可以用于七层的负载均衡,这篇文章将介绍一些负载均衡的基本知识以及使用nginx进行负载均衡的简单的例子. 四层负载均衡 vs 七层负载均衡 经常会说七层负载均衡还是四层负载均衡,其实根据ISO的OSI网络模型的所在层的叫法而决定的,nginx因为在使用http协议在应用层进行负载均衡的操作,所以被称为七层负载均衡.而诸如LVS在TCP层进行负载均衡操作的则被称为四层负载均衡.一般来说,有如下层的负载均衡分类: 常见软件的支持 常见的负载均衡算法 负载均衡常见有如下几种算法: 负载均

  • 基于mysql+mycat搭建稳定高可用集群负载均衡主备复制读写分离操作

    数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,推荐mycat,社区活跃,性能稳定. 测试环境 MYSQL版本:Server version: 5.5.53,到官网可以下载WINDWOS安装包. 注意:确保mysql版本为5.5以后,以前版本主备同步配置方式不同. linux实现思路类似,修改my.cnf即可. A主mysql.19

  • CentOS6.5环境安装nginx服务器及负载均衡配置操作详解

    本文实例讲述了CentOS6.5环境安装nginx服务器及负载均衡配置操作.分享给大家供大家参考,具体如下: 1.下载PCRE, 是一个用C语言编写的正则表达式函数库 [root@localhost pcre-8.36]# cd /tmp/download/ [root@localhost download]# wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz [root@localhost d

  • PHP实现负载均衡session共享redis缓存操作示例

    本文实例讲述了PHP实现负载均衡session共享redis缓存操作.分享给大家供大家参考,具体如下: 1.首先先创建html表单页面 <meta chatset='utf-8'> <center> <form action="se.php" method="post"> <table> <tr> <td>帐号:</td> <td><input type="

  • Nginx服务器负载均衡及ssl原理、生成ssl密钥对、Nginx配置ssl操作示例

    Nginx负载均衡 当用户访问nginx定制好的域名时,nginx通过转发到几台真实的站点,通过upstream实现 [root@centos7 vhost]# vim /usr/local/nginx/conf/vhost/load.conf upstream www.tt.com #自定义域名 { # ip_ash; #保证同一个用户始终保持在同一台机器上,即当域名指向多个IP时,保证每个用户始终解析到同一IP server 192.168.3.74:80; server 192.168.3

  • Docker Nginx容器和Tomcat容器实现负载均衡与动静分离操作

    下载Tomcat8镜像 [root@localhost ~]# docker search tomcat8 NAME DESCRIPTION STARS OFFICIAL AUTOMATED ashince/tomcat8 Tomcat GUI Manager pre-configured docker ima- 5 podbox/tomcat8 2 [OK] 这个tomcat包含了jdk而且启动了可以直接访问,自己启动了8080端口 [root@localhost ~]# docker pul

  • 详解 Nginx代理功能与负载均衡

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的配置说明 1.上一篇中我们在http模块中有下面的配置,当代理遇到状态码为404时,我们把404页面导向百度. error_page 404 https://www.baidu.com; #错误页 然而这个配置,细心的朋友可以发现他并没有起作用. 如果我们想让他起作用,我们必须配合着下面的配置一起使

  • windows安装nginx部署步骤图解(反向代理与负载均衡)

    一.下载安装Nginx(本文环境为windows xp 32bit环境) 解压nginx-1.0.11.zip,进入nginx-1.0.11,在命令行中执行命令让Nginx启动.具体操作如下图: 测试是否安装成功,输入地址:http://localhost:8090 浏览器显示结果如下图: OK,Nginx部署成功了. 二.关于Nginx的反向代理配置. 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器

随机推荐