文档章节

内置PostgreSQL多线程连接池Odyssey

有理想的猪
 有理想的猪
发布于 2018/11/05 14:37
字数 484
阅读 141
收藏 0

1、Worker

PG支持内置Worker,可以自定义伴随主进程一起启停的守护进程。
详细文档:Background Worker Processes
已经有很多例子,比如:pg_cron

2、Odyssey多线程连接池

单进程的PgBouncer有很明显的瓶颈,很多人的解决办法是多启实例,这样一来管理是个痛苦的事情。
俄罗斯Yandex出品的 Odyssey 是一个不错的替代品。
架构介绍:Odyssey architecture and internals

3、启动主函数

int main(int argc, char *argv[])
{
	od_instance_t odyssey;
	od_instance_init(&odyssey);
	int rc = od_instance_main(&odyssey, argc, argv);
	if (rc == -1) {
		rc = EXIT_FAILURE;
	} else {
		rc = EXIT_SUCCESS;
	}
	od_instance_free(&odyssey);
	return rc;
}

只需要告诉Odyssey配置文件在何处即可

4、GUC自定义配置

在 postgresql.conf 文件的最后,我们能看到

#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------

# Add settings for extensions here

GUC参数是允许用户程序自定义的

可以把 PL/pgSQL的定义 作为例子,这里涵盖枚举、布尔、字符串,此外还支持整形、浮点。

例如我们可以定义 odyssey.config_file 用来指定配置文件位置

5、简单示范


PG_MODULE_MAGIC;

char *od_config_file;

void
_PG_init(void)
{
	BackgroundWorker worker;

	DefineCustomStringVariable("odyssey.config_file",
		略 ...
	);

	worker.bgw_flags = 0;
	worker.bgw_start_time = BgWorkerStart_RecoveryFinished;
	worker.bgw_restart_time = 1;
	worker.bgw_main_arg = Int32GetDatum(0);
	worker.bgw_notify_pid = 0;
	sprintf(worker.bgw_library_name, "odyssey");
	sprintf(worker.bgw_function_name, "OdysseyDaemon");
	snprintf(worker.bgw_name, BGW_MAXLEN, "Odyssey multi-threaded connection pooler");

	RegisterBackgroundWorker(&worker);
}

void
OdysseyDaemon(Datum arg)
{
	int rc;
	int argc = 2;
	char *argv[2];

	od_instance_t odyssey;
	od_instance_init(&odyssey);

	argv[0] = "odyssey";
	argv[1] = od_config_file;
	rc = od_instance_main(&odyssey, argc, argv);
	if (rc == -1) {
		rc = EXIT_FAILURE;
	} else {
		rc = EXIT_SUCCESS;
	}
	od_instance_free(&odyssey);

	return;
}

这是玩具式代码,示例而已,生产环境要做的工作还有很多。

6、突然不想写了

权叔亲手炮制,版权所有,如有错误实属正常,欢迎阅读,欢迎斧正。
未经允许不得链接,未经允许不得转载。

© 著作权归作者所有

共有 人打赏支持
有理想的猪
粉丝 136
博文 91
码字总数 32273
作品 0
红挢
高级程序员
私信 提问
PostgresPro buildin pool(内置连接池)版本 原理与测试

标签 PostgreSQL , 内置连接池 , pgbouncer , postgrespro 背景 PostgreSQL 与Oracle dedicate server 一样采用了线程模式,在连接数非常多时,性能下降会比较严重。 通常社区用户的做法是使...

德哥
2018/07/28
0
0
阿里云 RDS PostgreSQL 高并发特性 vs 社区版本 (1.6万并发: 3倍吞吐,240倍响应速度)

标签 PostgreSQL , 阿里云 , 高并发 , 内置pool , Oracle shared server 背景 进程模型数据库,需要为每个会话指派独立的进程与之服务,在连接数非常多,且大都是活跃连接时,进程调度浪费或...

德哥
2018/05/06
0
0
Druid 1.0.28 发布,阿里数据库连接池

连接池相关更新 连接池DruidDataSource支持KeepAlive 在此之前,druid在从池中取出连接时实现testWhileIdle,不能满足某些场景需要保活连接的需求,在此版本中加入keepAlive的支持。 https:...

wenshao
2017/02/05
1K
5
PgSQL · 应用案例 · 阿里云 RDS PostgreSQL 高并发特性 vs 社区版本

摘要: 背景 进程模型数据库,需要为每个会话指派独立的进程与之服务,在连接数非常多,且大都是活跃连接时,进程调度浪费或引入的开销甚至远远大于实际任务需要的开销(例如上下文切换,MEM...

阿里云云栖社区
2018/06/04
0
0
PostgreSQL DBA快速入门(四) - 体系架构

PostgreSQL在开源关系型数据库市场是最先进的数据库。他的第一个版本在1989年发布,从那时开始,他得到了很多扩展。根据db-enginers上的排名情况,PostgreSQL目前在数据库领域排名第四。 本篇...

闻术苑
2018/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

我所遇到的GitLab 502问题的解决

我所遇到的GitLab 502问题的解决 2015年02月11日 20:17:07 wangxicoding 阅读数:51095 标签: gitlab 502 解决 端口冲突 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://bl...

rootliu
35分钟前
3
0
OSChina 周五乱弹 —— 对不起,把你看成绿灯了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 梁博《男孩 (Live)》居然只有现场版,也是好听cry。 《男孩 (Live)》- 梁博 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
45分钟前
298
7
移植Modbus到STM32F103(2):移植FreeModbus到usart3并运行示例代码

FreeModbus是Modbus的一个被广泛移植的实现。其源码在github,最新版是1.6。 FreeModbus支持Modbus功能码里的0x01~0x06,0x0F~0x11和0x17,对一些功能比如异常诊断和读事件计数等功能码并没有...

Konstantine
今天
3
0
浅谈神经网络(神经网络篇)

背景 之前写过浅谈神经网络基础篇,简单介绍下机器学习这块内容,用于扫盲。本文正式将神经网络,这部分是深度学习的基础。了解完可以掌握强大的机器学习的方法,也可以更好的了解深度学习。...

Uknowzheng
今天
5
0
移动硬盘变为RAW格式后的修复

在Mac上使用自己的移动硬盘结果文件系统格式变为RAW; 在自己windows笔记本上使用chkdsk H: /F进行修复,修复日志如下: C:\Users\mengzhang6>chkdsk H: /F文件系统的类型是 NTFS。卷标是 do...

晨猫
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部