CachingResultspgPool
想法
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 日之前完成软件测试阶段,
并为用户编写文档。