原 【DB宝61】PostgreSQL使用Pgpool-II实现读写分离+负载均衡
[toc]
一、Pgpool-II 简介
官网:https://www.pgpool.net/mediawiki/index.php/Main_Page
Pgpool-II是一个在PostgreSQL服务器和PostgreSQL数据库客户端之间工作的中间件。它是根据BSD许可证授权的。它提供以下功能。
连接池
Pgpool-II保存与PostgreSQL服务器的连接,并在具有相同属性(即用户名,数据库,协议版本)的新连接进入时重用它们。它减少了连接开销,并提高了系统的整体吞吐量。
复制
Pgpool-II可以管理多个PostgreSQL服务器。使用复制功能可以在2个或更多物理磁盘上创建实时备份,以便在磁盘发生故障时服务可以继续运行而不会停止服务器。
负载均衡
如果复制了数据库,则在任何服务器上执行SELECT查询都将返回相同的结果。Pgpool-II利用复制功能,通过在多个服务器之间分配SELECT查询来减少每个PostgreSQL服务器的负载,从而提高系统的整体吞吐量。充其量,性能与PostgreSQL服务器的数量成比例地提高。在许多用户同时执行许多查询的情况下,负载平衡最有效。
限制超出连接
PostgreSQL的最大并发连接数有限制,连接在这么多连接后被拒绝。但是,设置最大连接数会增加资源消耗并影响系统性能。pgpool-II对最大连接数也有限制,但额外连接将排队,而不是立即返回错误。
看家狗
Watchdog可以协调多个Pgpool-II,创建一个强大的集群系统,避免单点故障或脑裂。看门狗可以对其他pgpool-II节点执行生命检查,以检测Pgpoll-II的故障。如果活动Pgpool-II发生故障,则可以将备用Pgpool-II提升为活动状态,并接管虚拟IP。
在内存查询缓存中
在内存中查询缓存允许保存一对SELECT语句及其结果。如果有相同的SELECT,Pgpool-II将从缓存中返回值。由于不涉及SQL解析或访问PostgreSQL,因此在内存缓存中使用速度非常快。另一方面,在某些情况下,它可能比正常路径慢,因为它增加了存储缓存数据的一些开销。
Pgpool-II讲PostgreSQL的后端和前端协议,并在后端和前端之间传递消息。因此,数据库应用程序(前端)认为Pgpool-II是实际的PostgreSQL服务器,服务器(后端)将Pgpool-II视为其客户端之一。因为Pgpool-II对服务器和客户端都是透明的,所以现有的数据库应用程序可以与Pgpool-II一起使用。Pgpool-II讲述PostgreSQL的后端和前端协议,并在它们之间传递连接。因此,数据库应用程序(前端)认为Pgpool-II是实际的PostgreSQL服务器,服务器(后端)将Pgpool-II视为其客户端之一。因为Pgpool-II对服务器和客户端都是透明的,所以现有的数据库应用程序可以与Pgpool-II一起使用,几乎不需要更改其源码。
二、高可用架构图
PG搭建1主2从流复制的过程可以参考“【DB宝60】PG12高可用之1主2从流复制环境搭建及切换测试”,本文基于该篇的基础上,使用Pgpool-II来实现读写分离和负载均衡功能。
整体架构如下所示:
三、使用Docker快速部署Pgpool-II中间件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | -- 下载镜像 docker pull registry.cn-hangzhou.aliyuncs.com/lhrbest/lhrpgpool:4.2.2 -- 创建专用网络 docker network create --subnet=172.72.6.0/24 pg-network -- 创建Pgpool-II的容器 docker rm -f lhrpgpool docker run -d --name lhrpgpool -h lhrpgpool \ --net=pg-network --ip 172.72.6.6 \ -p 9999:9999 -p 9898:9898 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrpgpool:4.2.2 \ /usr/sbin/init docker network connect bridge lhrpgpool docker restart lhrpgpool docker exec -it lhrpgpool bash |
四、配置Pgpool-II
以下所有操作均在pgsql用户执行。
4.1、拷贝参数文件
1 2 3 4 5 | [root@lhrpgpool etc]# su - pgsql Last login: Mon Apr 26 14:28:35 CST 2021 on pts/0 [pgsql@lhrpgpool /]# cp /postgresql/pgpool/etc/pgpool.conf.sample /postgresql/pgpool/etc/pgpool.conf [pgsql@lhrpgpool /]# cp /postgresql/pgpool/etc/pool_hba.conf.sample /postgresql/pgpool/etc/pool_hba.conf [pgsql@lhrpgpool /]# cp /postgresql/pgpool/etc/pcp.conf.sample /postgresql/pgpool/etc/pcp.conf |
4.2、配置pgpool.conf
? vi进入列操作:Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的I进入行首插入模式,输入注释符号如 // 或 #,输入完毕之后,按两下ESC,Vim会自动将你选中的所有行首都加上注释,保存退出完成注释。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | vi /postgresql/pgpool/etc/pgpool.conf # - pgpool Connection Settings - listen_addresses = '*' # - Backend Connection Settings - backend_hostname0 = '172.72.6.2' backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/var/lib/postgresql/data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_application_name0 = 'lhrpg64302' backend_hostname1 = '172.72.6.3' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/var/lib/postgresql/data' backend_flag1 = 'ALLOW_TO_FAILOVER' backend_application_name1 = 'lhrpg64303' backend_hostname2 = '172.72.6.4' backend_port2 = 5432 backend_weight2 = 1 backend_data_directory2 = '/var/lib/postgresql/data' backend_flag2 = 'ALLOW_TO_FAILOVER' backend_application_name2 = 'lhrpg64304' # - Authentication - enable_pool_hba = on # - Where to log - log_destination = 'syslog' log_connections = on #------------------------------------------------------------------------------ # FILE LOCATIONS #------------------------------------------------------------------------------ pid_file_name = '/postgresql/pgpool/pgpool.pid' logdir = '/tmp' #------------------------------------------------------------------------------ # LOAD BALANCING MODE #------------------------------------------------------------------------------ load_balance_mode = on |
4.3、开启系统日志(root操作)
pgpool的日志默认写到stderr,可以如上文中设置为syslog中。但由于默认情况下写入LOCAL0级别的日志会被丢弃,故要在/etc/rsyslog.conf中修改该syslog指定的输出路径:
1 2 3 | echo "local0.* /postgresql/pgpool/pgpool.log" >> /etc/rsyslog.conf systemctl restart rsyslog.service |
4.4、配置pool_hba.conf
1 2 | su - pgsql echo "host all all 0.0.0.0/0 md5" >> /postgresql/pgpool/etc/pool_hba.conf |
4.5、生成pool_passwd文件
1 2 3 4 | pg_md5 --md5auth --username=nobody "lhr" pg_md5 --md5auth --username=lhr "lhr" pg_md5 --md5auth --username=pgpool "lhr" pg_md5 --md5auth --username=postgres "lhr" |
我打算通过第六步骤:psql -U nobody -h localhost -p 9999 -d postgres 查询节点状态,但是登录不上去,显示密码不正确,但是我在主库创建中按照您4.7的步骤,常见过相应的账户,且账户的md5也生成过,步骤基本和您一致,密码未:lhr 。 并且通过pcp_node_info -U pgpool -h localhost -p 9898 -n 0 -v 命令查询,是没问题的,可以查出我的连个节点状态都是up,请帮我解答的一下。谢谢
请问,在4.7步骤的192.168.66.35这个IP是那里的呀?之前部署过程中都是没有的
支持Markdown
写的真详细,测试负载均衡可以使用: