Use pgpool and pgbouncer limit global concurrent SQL Execution

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:
这个需求来自于我们这边的数据仓库,可能是连接的用户太多了,大家都在上面执行SQL,导致大家的查询都很慢。
所以通过连接池来限制并发的SQL请求是比较靠谱的方法。
允许用户连接上来,并且执行SQL,超出配置的请求放入队列,等有空闲的数据库端连接的时候再执行。而不是直接返回错误,这一点很重要。

pgbouncer和PostgreSQL之间连接的复用,pgpool和PostgreSQL之间连接的复用不在这里讨论。可以参考手册。
pgbouncer 可以限制每一对用户+数据库 到PostgreSQL Cluster的总连接数。
pgpool 可以限制pgpool到PostgreSQL cluster的总连接数。
结合起来可以干什么呢?
可以设置PostgreSQL Cluster全局的连接限制。如图
Use pgpool and pgbouncer limit global concurrent SQL Execution - 德哥@Digoal - The Heart,The World.
 

假设有客户端的需求最大有2万个连接,我们的需求是限制这2万个连接里面并发提交给数据库的请求是100个。超出100的SQL请求全部排队。
一个简单的配置如下:
pgbouncer.config
[databases]
db1 = host=pgpool_host_ip dbname=db1 port=9999 pool_size=1000
db2 = host=pgpool_host_ip dbname=db2 port=9999 pool_size=1000
[pgbouncer]
pool_mode = transaction  # 配置为事务级是比较适合我们前面提到的场景的。
listen_port = 1999
unix_socket_dir = /opt/pgbouncer/etc
listen_addr = *
auth_type = md5
auth_file = /opt/pgbouncer/etc/users.txt
logfile = /dev/null
pidfile = /opt/pgbouncer/etc/pgbouncer.pid
max_client_conn = 20000
reserve_pool_timeout = 0
server_reset_query = DISCARD ALL;
admin_users = pgbouncer_admin
stats_users = pgbouncer_guest
ignore_startup_parameters = extra_float_digits
server_idle_timeout = 1
server_round_robin = 1

pgbouncer.user
"username" "password"

启动pgbouncer
pgbouncer -d -u nonroot_user /opt/pgbouncer/etc/config.ini 


pgpool:
pcp.conf
# USERID:MD5PASSWD

pgpool.conf
listen_addresses = '*'
port = 9999
pcp_port = 9898
socket_dir = '/tmp'
pcp_socket_dir = '/tmp'
backend_socket_dir = '/tmp'
pcp_timeout = 10
num_init_children = 100    # num_init_children*max_pool = 限制的连接数
max_pool = 1
child_life_time = 300
connection_life_time = 0
child_max_connections = 0
client_idle_limit = 0
authentication_timeout = 60
logdir = '/tmp'
pid_file_name = '/var/run/pgpool/pgpool.pid'
replication_mode = false
load_balance_mode = false
replication_stop_on_mismatch = false
failover_if_affected_tuples_mismatch = false
replicate_select = false
reset_query_list = 'ABORT; DISCARD ALL'
white_function_list = ''
black_function_list = 'nextval,setval'
print_timestamp = true
master_slave_mode = false
master_slave_sub_mode = 'slony'
delay_threshold = 0
log_standby_delay = 'none'
connection_cache = true
health_check_timeout = 20
health_check_period = 0
health_check_user = 'nobody'
failover_command = ''
failback_command = ''
fail_over_on_backend_error = true
insert_lock = true
ignore_leading_white_space = true
log_statement = false
log_per_node_statement = false
log_connections = false
log_hostname = false
parallel_mode = false
enable_query_cache = false
pgpool2_hostname = ''
backend_hostname0 = 'real_database_ip'
backend_port0 = real_database_port
backend_weight0 = 1
enable_pool_hba = false
recovery_user = 'nobody'
recovery_password = ''
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90
client_idle_limit_in_recovery = 0
lobj_lock_table = ''
ssl = false
debug_level = 0

启动pgpool
pgpool -c -f /opt/pgpool/etc/pgpool.conf -F /opt/pgpool/etc/pcp.conf


客户端连接配置:
ip : pgbouncer_host_ip
port : pgbouncer_listener_port
dbname : pgbouncer_configed_dbname
user : pgbouncer_configed_name equal to real db's username
password : pgbouncer_configed_password equal to real db's password


【参考】
pgbouncer/doc
pgbouncer/share/man
pgpool/doc
pgpool/share/man
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6月前
|
SQL 自然语言处理 关系型数据库
每日一博 - 闲聊SQL Query Execution Order
每日一博 - 闲聊SQL Query Execution Order
29 0
|
6月前
|
SQL Java Spring
【MybatisPlus异常】The SQL execution time is too large, please optimize
【MybatisPlus异常】The SQL execution time is too large, please optimize
180 0
【MybatisPlus异常】The SQL execution time is too large, please optimize
|
24天前
|
数据库 SQL 索引
什么是数据库 SQL Execution Plan
什么是数据库 SQL Execution Plan
11 0
|
SQL 监控 关系型数据库
问题整理:ZABBIX4.0登录界面出现错误 SQL statement execution has failed “INSERT INTO sessions (sessionid,userid,..
问题整理:ZABBIX4.0登录界面出现错误 SQL statement execution has failed “INSERT INTO sessions (sessionid,userid,..
293 0
问题整理:ZABBIX4.0登录界面出现错误 SQL statement execution has failed “INSERT INTO sessions (sessionid,userid,..
|
SQL 存储
SAP ABAP SQL的execution plan和cache
SAP ABAP SQL的execution plan和cache
SAP ABAP SQL的execution plan和cache
|
数据库 索引
PolarDB-X 1.0-SQL 手册-SHOW-SHOW GLOBAL INDEX
PolarDB-X支持使用全局二级索引,本文将介绍如何使用SHOW GLOBAL INDEX命令查看已创建或创建中的全局二级索引。
108 0
|
SQL 索引
PolarDB-X 1.0-SQL 手册-DAL-CHECK GLOBAL INDEX
您可以使用CHECK GLOBAL INDEX语句检查主表和索引表的数据是否完全一致,并修订不一致的数据。
|
SQL 负载均衡 并行计算
Parallel SQL Execution in Oracle 10g 论文解读
这篇简短的paper从非常high level的角度描述了下Oracle 10g对于parallel query所做的重新设计和其中的一些优化,由于Oracle RAC特殊的share-disk架构,使其在并行计算上与普通的MPP数据库有一些不同,例如对于worker的调度和分配方式以及对于资源/数据的动态调整。
224 0
Parallel SQL Execution in Oracle 10g 论文解读
|
SQL 机器学习/深度学习 关系型数据库
RDS SQL Server– Best Practices of Execution Plan Cache for Missing Indexes
Execution plan cache is a significant part of SQL Server memory management. It can reveal to you how the execution of a query will occur, or how query execution took place.
2708 0