Use pgpool and pgbouncer limit global concurrent SQL Execution

这个需求来自于我们这边的数据仓库,可能是连接的用户太多了,大家都在上面执行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

时间: 2024-10-02 22:48:36

Use pgpool and pgbouncer limit global concurrent SQL Execution的相关文章

mysql-front复制数据错误sql execution error # 1577

错误原因:mysql当前版本不兼容 解决办法:  代码如下 复制代码 [root@localhost ~]# /usr/bin/mysql_upgrade -u root -p Enter password: Looking for 'mysql' as: /usr/bin/mysql Looking for 'mysqlcheck' as: /usr/bin/mysqlcheck Running 'mysqlcheck with default connection arguments Run

WordPress评论回复带气泡效果的实现代码

大部分Wordpress主题都会启用小工具这个功能,话说这是个很傻瓜的功能,但相当实用,只需通过后台拖拽就能实现前台各种显示问题. 现在给大家提供一段制作小工具的代码,并奉上明凯博客自用的侧栏最新评论列表模块,希望对你有用. 下面是后台最新评论小工具的添加方法: 把下面代码放到functions.php中:  代码如下 复制代码 // 最新评论带头像评论 add_action('widgets_init', create_function('', 'return register_widget(

MySQL之SQL分析三部曲实际案例(三)--limit的陷阱

附上MySQL之SQL分析三部曲地址http://blog.itpub.net/29510932/viewspace-1709732/ 姐妹篇http://blog.itpub.net/29510932/viewspace-1732876/ (其实是难兄难弟篇) -------------------------------------------------------------------------------------------------正文-------------------

pgpool 主从流复制模式下的安装使用

pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:  连接池 pgpool-II 保持已经连接到 PostgreSQL 服务器的连接,并在使用相同参数(例如:用户名,数据库,协议版本)连接进来时重用它们.它减少了连接开销,并增加了系统的总体吞吐量.  复制 pgpool-II 可以管理多个 PostgreSQL 服务器.激活复制功能并使在2台或者更多 PostgreSQL 节点中建立一个实时备份成为可能,这样,如果

Begin automatic SQL Tuning Advisor run for special tuning task "SYS_AUTO_SQL_TUNING_TASK"

hu May 29 22:00:00 2014 Setting Resource Manager plan SCHEDULER[0x310A]:DEFAULT_MAINTENANCE_PLAN via scheduler window Setting Resource Manager plan DEFAULT_MAINTENANCE_PLAN via parameter Thu May 29 22:00:00 2014 Starting background process VKRM Thu M

十步完全理解SQL(转)

本文由 伯乐在线 - 水果泡腾片 翻译.未经许可,禁止转载!英文出处: Lukas Eder .欢迎加入翻译组. 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语言.甚至是函数语言(尽管有些人认为 SQL 语言也是一种函数式语言). 我们每天都在写 SQL 并且应用在开源软件 jOOQ 中.于是我想把 SQL 之美介绍给那些仍然对它头疼不已的朋友,所以本文是为了以下读者而特地编写的: 1. 在工作中会用到 SQL

SQL常见的可优化点

作者:方波 # ########################################### # 索引相关 # ########################################### – 查询(或更新,删除,可以转换为查询)没有用到索引     这是最基础的步骤,需要对sql执行explain查看执行计划中是否用到了索引,需要重点关注type=ALL, key=NULL的字段. – 在索引字段上施加函数     to_char(gmt_created, 'mmdd')

[MySQL 5.6优化] -- limit x,x 优化

待优化SQL: 我们来分析下这条SQL存在的问题是什么?每条SQL都要进行limit 分页 1000 ,每次SQL扫描的时候都会多扫描出来1000依次类似 每个SQL1+1000+SQl n 1000扫描的行数越来越多,SQL执行越来越慢 那么我们这个时候应该如何进行优化呢? 1.查看表结构: 接下来看一下SQL: SQL2:SQL1:limit 13000,1000 SQL 2:limit 14000,1000 SQL3 15000,1000 .......每次进行limit分页后面就会越来越

mysql中导入/导出超大的sql文本文件方法总结

在实际工作中,有时经常地时行mysql数据库的导入和导入操作,但对于大型sql文件导入时,phpmyadmin是不行的,有太多限制,比如记录,内存等! 多种方案收集,如下: 方案一:客户端直接命令操作(此方法是我比较喜欢的) 刚恢复一个电商网站mysql备份数据,此备份文件有300多M,因为phpmyadmin支持上传有限,文件太大IE停止响应,所以在本地用  代码如下 复制代码 mysql -u root -p root jiahuibuydb< c:/yebihai.sql 但没导入进去,出