这个需求来自于我们这边的数据仓库,可能是连接的用户太多了,大家都在上面执行SQL,导致大家的查询都很慢。
所以通过连接池来限制并发的SQL请求是比较靠谱的方法。
允许用户连接上来,并且执行SQL,超出配置的请求放入队列,等有空闲的数据库端连接的时候再执行。而不是直接返回错误,这一点很重要。
pgbouncer和PostgreSQL之间连接的复用,pgpool和PostgreSQL之间连接的复用不在这里讨论。可以参考手册。

pgbouncer 可以限制每一对用户+数据库 到PostgreSQL Cluster的总连接数。

pgpool 可以限制pgpool到PostgreSQL cluster的总连接数。
结合起来可以干什么呢?
可以设置PostgreSQL Cluster全局的连接限制。如图
假设有客户端的需求最大有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

Use pgpool and pgbouncer limit global concurrent SQL Execution相关推荐

  1. hadoop之 exceeds the limit of concurrent xcievers处理

    dfs.datanode.max.transfer.threads: 默认 4096 < 2.0之前该参数为dfs.datanode.max.xcievers > 解释:Specifies ...

  2. Spark-submit 提交 报错 org.apache.spark.sql.execution.datasources.orc.OrcFileFormat could not be instant

    错误场景 如下代码: spark.sql("select e.empno,e.ename,e.job,e.mgr,e.comm from emp e join dept d on e.dep ...

  3. asp.net 全局sql注入处理 sql关键字过滤 global过滤sql

    asp.net 全局sql注入处理 sql关键字过滤 global //当前请求对象private HttpRequest request;//当前响应对象private HttpResponse r ...

  4. 专家视角 | 小荷的 Oracle Database 18c 新特性快速一瞥

    作者介绍:何剑敏  大疆创新 互联网事业部 运维部数据库技术团队负责人,曾供职于中国联通,卓望数码,IBM 和 ORACLE ACS 华南团队.多年从事一线的数据库运维工作,有丰富项目经验.维护经验和 ...

  5. sql limit 子句_SQL Server中的FOR XML PATH子句

    sql limit 子句 As SQL professionals, we often have to deal with XML data in our databases. This articl ...

  6. sql limit 子句_SQL Join子句介绍和概述

    sql limit 子句 The SQL Join clause is one of the major components of the Select statement, which is us ...

  7. SQL数据库查询LIMIT 数据分页

    SQL数据库查询LIMIT 数据分页 SQL的语句LIMIT 约束SELECT 查询数据包表时,使得SQL查询语句返回指定的记录数(行数).LIMIT 可以设置1个或2个int整型常量数字作为参数.L ...

  8. Spark SQL Catalyst源代码分析之TreeNode Library

    /** Spark SQL源代码分析系列文章*/ 前几篇文章介绍了Spark SQL的Catalyst的核心执行流程.SqlParser,和Analyzer,本来打算直接写Optimizer的,可是发 ...

  9. 人脸特征值能存放在sql server中吗_SQL运行内幕:从执行原理看调优的本质

    原文链接:https://www.cnblogs.com/arthinking/p/13205303.html 相信大家看过无数的MySQL调优经验贴了,会告诉你各种调优手段,如: 避免 select ...

最新文章

  1. 为了成长,我所做的一些努力!
  2. SpringMVC请求处理流程
  3. MySQL week()函数
  4. gnu linux中 使用,在Linux上使用GNU sed的方法
  5. Linux vsftpd(ftp)安装包安装方法
  6. 有效的MongoDB索引
  7. Nginx服务安全加固
  8. cacti+nagios整合(未成)
  9. 解决webstorm out of memory内存不足问题
  10. 程序员简单实用的桌面壁纸
  11. ajax传参的3种形式
  12. 清除90天苹果充值记录_王者荣耀开启安卓、苹果系统数据互转
  13. python程序扩展名 py、pyc、pyo、pyd文件区别
  14. iOS获取当前设备型号等信息总结 包含iPhone7和iPhone7P
  15. Android锁屏状态下信息的显示
  16. DownUnderCTF 2021 osint 赛后复现
  17. IC设计基础001:寄存器读写,读清是如何实现的
  18. 基于51单片机土壤湿度检测及自动浇花系统(带时间显示)
  19. BP神经网络隐藏层单元数的选择--(1)
  20. python---mysql批量插入数据

热门文章

  1. vue 外卖app(3) 引入阿里图标
  2. bzoj2527: [Poi2011]Meteors
  3. JS数组方法(forEach()、every()、reduce())
  4. jenkins构建一个maven项目[五]
  5. Modelsim初级使用教程
  6. 有漏洞无作为才可怕、可耻!
  7. MIPS(loongson)linux 中添加系统调用
  8. 手低眼高 初学者学习Hibernate的方法
  9. 人工智能导论笔记——江湖救急版
  10. delphi dbgrideh 遍历每一个单元格_用Python解数独[1]:求每个单元格的行值域