自学内容网 自学内容网

基于Linux的pgpool-II制搭建

第一部分 说明

Pgpool-II管理一个 PostgreSQL服务器池, 以实现一些单个PostgreSQL安装不可用的功能。特点包括:
高可用性
Pgpool-II通过使用多个PostgreSQL服务器提供高可用性 (HA) 功能, 以便它自动从服务器池中删除损坏的服务器以继续执行数据库任务。这称为自动故障转移。Pgpool-II还为Pgpool-II本身 提供了一个 HA 功能 ,称为Watchdog。此外 ,Pgpool-II 采用复杂的 仲裁算法来避免误报错误和脑裂问题,使整个 HA 系统高度可靠。
负载均衡
Pgpool-II将读取查询分布在多个PostgreSQL服务器上以获得更高的性能。此功能称为负载平衡。写查询被发送到主服务器(流复制模式)或所有服务器(本机复制模式和快照隔离模式)。在任何情况下,Pgpool-II 都会自动区分读查询和写查询。
除了这些基本功能之外,Pgpool-II还提供了一些有用的功能,例如:
连接池
Pgpool-II维护与PostgreSQL服务器的已建立连接 ,并在具有相同属性(即用户名、数据库、协议版本和其他连接参数,如果有的话)的新连接进入时重用它们。它减少了连接开销,并提高了系统的整体吞吐量。
在线恢复
pgpool-II可以通过执行一条命令进行数据库节点的在线恢复。当在线恢复与自动故障转移一起使用时,通过故障转移分离的节点可以自动附加为备用节点。也可以同步和附加新的 PostgreSQL服务器。
限制超出的连接
PostgreSQL 的最大并发连接数是有限制的,当达到这个数量时,新的连接会被拒绝。但是,提高此最大连接数会增加资源消耗并对整体系统性能产生负面影响。Pgpool-II对最大连接数也有限制,但是额外的连接会排队而不是立即返回错误。但是,您可以配置为在超出连接限制时返回错误(4.1 或更高版本)。
看门狗
Watchdog 可以协调多个Pgpool-II,创建一个健壮的集群系统,避免单点故障或裂脑。为避免脑裂,您至少需要 3 个Pgpool-II节点。Watchdog 可以对其他pgpool-II节点执行生命检查,以检测 Pgpool-II 的故障。如果活动Pgpool-II宕机,备用 Pgpool-II可以升级为活动,并接管虚拟 IP。
在内存查询缓存中
在内存中查询缓存允许保存一对 SELECT 语句及其结果。如果有相同的 SELECT 进入,Pgpool-II从缓存中返回值。由于不涉及 SQL 解析和对PostgreSQL的访问 ,因此使用内存缓存非常快。另一方面,在某些情况下它可能比正常路径慢,因为它增加了一些存储缓存数据的开销。

第二部分 pgpool-II安装

2.1 下载安装

源码下载网址:https://www.pgpool.net/
解压安装源码包

$ tar -xzvf pgpool-II-4.2.7.tar.gz

2.2 创建安装目录

创建对应的安装目录,并修改属组

# mkdir /SoftWare/pgpool
# chown postgres:postgres /SoftWare/pgpool

2.3 编译安装

查找对应PostgreSQL版本pg_config的路径,对应bin所在的目录

$ which pg_config
/software/pgsql13/bin/pg_config

编译安装pgpool-II

$ cd pgpool-II-4.2.7/
$ ./configure --prefix=/SoftWare/pgpool --pgsql=/software/pgsql13/
$ make && make install

2.4 安装pgpool_recovery

在线恢复时,Pgpool-II需要pgpool_recovery、pgpool_remote_start和pgpool_switch_xlog函数。另外pgpoolAdmin的管理工具,停止,重启或重新加载一个PostgreSQL在屏幕上使用pgpool_pgctl。这些函数先安装在template1中,不需要安装在生产数据库中。

# 编译安装
$ cd /software/medias/pgpool-II-4.2.7/src/sql/pgpool-recovery
$ make
$ make install
# 进入template1数据库
$ psql -c "create extension pgpool_recovery" template1

2.5 安装pgpool_regclass

PostgreSQL版本是9.4以上,跳过此操作;否则需要生产数据库安装

# 编译安装
$ cd /software/medias/pgpool-II-4.2.7/src/sql/pgpool-regclass
$ make
$ make install
# 进入template1数据库; 其生产数据库也需要执行
$ psql -c "create extension pgpool_regclass" template1

第三部分 复制模式

3.1配置pcp.conf文件

pcp 工具的用户名、密码配置文件,假设配置的用户/密码为pcpadm/pgpool123
进入配置目录

[pgpool@node3 pgpool]$ cd /SoftWare/pgpool/etc
[pgpool@node3 etc]$ cp pcp.conf.sample pcp.conf

在该文件中;用户/密码出现在每一行; # USERID:MD5PASSWD
pg_md5 生成配置的用户名密码是 pgpool123

[pgpool@node3 etc]$ pg_md5 pgpool123
fa039bd52c3b2090d86b0904021a5e33

编辑pcp.conf;这里配置用户是 pcpadm,

[pgpool@node3 etc]$ vi pcp.conf
# USERID:MD5PASSWD
pcpadm:fa039bd52c3b2090d86b0904021a5e33

3.2配置pool_hba.conf文件
现客户端连接数据库;要经过连接池 pgpool 中转。对客户端来说,pgpool 就是数据库服务端,所以 pool_hba.conf 接管 pg_hba.conf 的作用。与PostgreSQL实例上的pg_hba.conf文件保持一致的配置。

[pgpool@node3 etc]$ cp pool_hba.conf.sample  pool_hba.conf
[pgpool@node3 etc]$ vi pool_hba.conf
# 增加
hostall  all0.0.0.0/0md5

3.3配置pgpool.conf文件

拷贝一份配置文件的模板,并修改以下参数

$ cp /SoftWare/pgpool/etc/pgpool.conf.sample-replication /SoftWare/pgpool/etc/pgpool.conf
$ vi /SoftWare/pgpool/etc/pgpool.conf

backend_clustering_mode = 'native_replication'             #复制模式
listen_addresses = '*'
backend_hostname0 = '10.0.4.13'                          #填写需要复制的实例信息
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/SoftWare/pgpooltestpgdata/db1'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'server0'
backend_hostname1 = '10.0.4.13'
backend_port1 = 5433
backend_weight1 = 1
backend_data_directory1 = '/SoftWare/pgpooltestpgdata/db2'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'server1'
enable_pool_hba = on                       #启用pool_hba.conf中的用户认证
pool_passwd = 'pool_passwd'              #配置账户密码文件路径
logging_collector = on
log_directory = '/tmp/pgpool_logs'       #pgpool运行错误日志路径
pid_file_name = '/SoftWare/pgpool/etc/pgpool.pid'    #pgpool进程pid文件位置
replicate_select = off                     #是否复制select语句
insert_lock = on                            
load_balance_mode = on  #设置为 on,pgpool-II 将在数据库节点之间分发 SELECT 查询
failover_when_quorum_exists = off    #内置复制模式不支持该参数,置为off

3.4配置pool_passwd文件

pgpool 密钥文件;通过 pgpool 访问需要用户验证;这里暂用数据库用户 pgpool,密码为pgpool,与下一步创建数据库用户对应。

[pgpool@node3 etc]$ pg_md5 --md5auth -u pgpool -p
password: 

3.5为PostgreSQL实例安装insert_lock表

我们在各节点创建一个测试用户和业务库

postgres=# create user pgpool password 'pgpool';
postgres=# create database pgpool01 owner pgpool;
$ psql -p 5432 -f /software/medias/pgpool-II-4.2.7/src/sql/insert_lock.sql -d pgpool01 -U pgpool

3.6启动pgpool

使用pgpool命令启动,并查看是否成功启动

$ pgpool
$ ps -ef | grep pgpool
postgres  7706     1  0 15:18 ?        00:00:00 pgpool

另外地也可以用如下几种方式启动pgpool

$ pgpool
然而,以上的命令不打印日志信息,因为 pgpool 脱离终端了。如果你想显示 pgpool 日志信息,你需要传递 -n 到 pgpool 命令。此时 pgpool-II 作为非守护进程模式运行,也就不会脱离终端了。
$ pgpool -n &
日志消息会打印到终端,所以推荐使用如下的选项。-d 选项启用调试信息生成。
$ pgpool -n -d > /tmp/pgpool.log 2>&1 &

3.7测试复制模式

使用pgpool端口连接服务(pgpool作为连接池),创建测试表并插入数据

$ psql -p9999 -U pgpool -d pgpool01
pgpool01=> create table lottu01(id int, info text, regtime timestamp);
pgpool01=> insert into lottu01 values (1, 'pgpool native replication', now());

连接到后台PostgreSQL实例查看是否成功插入

db1:
$ psql -p5432 -U pgpool -d pgpool01
pgpool01=> \dt
         List of relations
 Schema |  Name   | Type  | Owner  
--------+---------+-------+--------
 public | lottu01 | table | pgpool
(1 row)

pgpool01=> select * from lottu01 ;
 id |           info            |          regtime           
----+---------------------------+----------------------------
  1 | pgpool native replication | 2022-03-16 15:22:11.405787
(1 row)

db2:
$ psql -p5433 -U pgpool -d pgpool01
pgpool01=> \dt
         List of relations
 Schema |  Name   | Type  | Owner  
--------+---------+-------+--------
 public | lottu01 | table | pgpool
(1 row)

pgpool01=> select * from lottu01 ;
 id |           info            |          regtime           
----+---------------------------+----------------------------
  1 | pgpool native replication | 2022-03-16 15:22:11.405787
(1 row)

hhh6.jpg


原文地址:https://blog.csdn.net/weixin_42329915/article/details/144110901

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!