CachingResultspgPool

来自 PostgreSQL 维基
跳转到导航跳转到搜索

想法

Pgpool-II 具有使用专用 PostgreSQL(“系统数据库”)提供的存储的查询缓存功能。但是,这有几个缺点。

1) 速度慢,因为它需要访问磁盘存储。

2) 它不会自动使缓存失效。


这个项目试图解决这些问题。

- 为了加快缓存访问速度,它将被放置在内存中,而不是数据库中。内存将被放置在共享内存或外部内存服务(如 memcached)上,以便多个会话可以共享缓存。旧的缓存条目将以 LRU 方式删除。

- 当相关表被更新时,缓存将被自动失效。请注意,这并不总是可能的,因为查询结果可能来自多个表、视图甚至函数。在这种情况下,缓存将通过超时失效(或者根本不缓存)。

- 需要发明一些微调旋钮来控制缓存行为,尽管目前还不清楚。

详情

外部规范(面向用户)

[概要]

内存查询缓存允许您通过重用 SELECT 结果来加快数据库访问速度。

  • 缓存可以存储在共享内存或 memcached 中(不能同时存储)。
  • 使用非 IMMUTABLE 函数的 SELECT 结果不会被缓存。
  • 如果 SELECT 结果的大小大于 pgpool.conf 中指定的值,则不会被缓存。
  • 如果满足以下条件之一,缓存将被删除

- 缓存过期时间超过
- 如果缓存已满,最不经常使用的缓存将被删除
- 如果表被删除或修改,相关的缓存数据将被删除。
- 如果表定义被修改(ALTER TABLE),相关的缓存数据将被删除。
- 如果模式或数据库被删除,相关的缓存数据将被删除。

[pgpool.conf 设置]

  • 要启用内存缓存功能,请将其设置为 on(默认值为 off)
memory_cache_enabled = on/off
  • 内存缓存行为可以通过 cache_param 指令指定。
memqcache_method = 'shmem'            *1
memqcache_memcached_host = 'foo.com'  *2
memqcache_memcached_port = 11211      *3
memqcache_total_size = 10240          *4
memqcache_expire = 60                 *5
memqcache_maxcache = 512              *6
memqcache_cache_block_size= 8192      *7

1) 缓存存储方法。可以是“shmem”(共享内存)或“memcached”。默认值为 shmem。

2) Memcached 主机名。如果 memqcache_method=memcached,则为必需。如果此参数以“/”开头,则假定为 UNIX 域套接字。

3) Memcached 端口号。如果 memqcache_method=memcached,则为必需。

4) 用于存储内存缓存的总内存大小(以字节为单位)。如果 memqcache_method=shmem,则为必需。

5) 内存缓存条目生存期(以秒为单位)。默认值为 60。

6) 最大的 SELECT 结果大小(以字节为单位)。如果超过此值,则结果不会被缓存。

7) 缓存块大小(以字节为单位)

只有当 memqcache_method=shmem 时才有意义。内存缓存被划分为固定大小的块。
如果块大小较小,内存使用效率较高,但处理速度可能较慢。另一方面,
如果块大小较大,内存使用效率不高,但处理速度可能更快。默认值为 8192。

项目时间表

该项目的计划如下所示。

  • 准备阶段(4 月 11 日 - 4 月 30 日)

- 我将在 4 月 11 日开始这个项目。
- 详细决定规范,以便在 pgpool-II 中创建缓存查询结果的模块。
- 我想与这个项目的导师联系,并与他们讨论我的项目进度和技术。

  • 实现阶段(5 月 1 日 - 6 月 19 日)

- 我将在 5 月 1 日开始实施程序,
并打算在 6 月 20 日之前完成实现阶段。

  • 实现阶段(5 月 1 日 - 6 月 26 日)

详情

6 月 14 日 - 19 日编码:共享内存缓存。在共享内存中设置、搜索或删除数据。

6 月 20 日 - 26 日编码:缓存失效部分。

  • 软件测试阶段(6 月 20 日 - 7 月 22 日)

- 我的实现可能不足。因此,我将尝试
进行软件测试,并减少错误。

  • 编写文档阶段(7 月 23 日 - 8 月 12 日)

- 我计划在 7 月 23 日之前完成软件测试阶段,
并为用户编写文档。