ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] > [home](https://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-zh_cn.html#memqcache) ## 概述 * **连接池** pgpool-II 保持已经连接到 PostgreSQL 服务器的连接, 并在使用相同参数(例如:用户名,数据库,协议版本) 连接进来时重用它们。 它减少了连接开销,并增加了系统的总体吞吐量。 * **复制** pgpool-II 可以管理多个 PostgreSQL 服务器。 激活复制功能并使在2台或者更多 PostgreSQL 节点中建立一个实时备份成为可能, 这样,如果其中一台节点失效,服务可以不被中断继续运行。 * **负载均衡** 如果数据库进行了复制(可能运行在复制模式或者主备模式下), 则在任何一台服务器中执行一个 SELECT 查询将返回相同的结果。 pgpool-II 利用了复制的功能以降低每台 PostgreSQL 服务器的负载。 它通过分发 SELECT 查询到所有可用的服务器中,增强了系统的整体吞吐量。 在理想的情况下,读性能应该和 PostgreSQL 服务器的数量成正比。 负载均很功能在有大量用户同时执行很多只读查询的场景中工作的效果最好。 * **限制超过限度的连接** PostgreSQL 会限制当前的最大连接数,当到达这个数量时,新的连接将被拒绝。 增加这个最大连接数会增加资源消耗并且对系统的全局性能有一定的负面影响。 pgpool-II 也支持限制最大连接数,但它的做法是将连接放入队列,而不是立即返回一个错误。 * **缓存查询结果** pgpool 可用于缓存查询结果,并且支持内存行和mamache 注意事项 - 不支持windows ## 安装 ``` ./configure --prefix=path --with-pgsql=path PostgreSQL 的客户端库安装的顶层目录。默认值由 pg_config 提供 --with-openssl pgpool-II 程序将提供 OpenSSL 支持。默认是禁用 OpenSSL 支持的。V2.3 - --with-memcached=path pgpool-II 的二进制程序将使用 memcached 作为 基于内存的查询缓存。你必须先安装 libmemcached。 V3.2 - ``` 编译 ``` make make install ``` ## 安装依赖插件 ### pgpool_regclass 如果你在使用 PostgreSQL 8.0 或之后的版本,强烈推荐在需要访问的 PostgreSQL 中安装 pgpool_regclass 函数,因为它被 pgpool-II 内部使用。 如果不这样做,在不同的 schema 中处理相同的表名会出现问题(临时表不会出问题 ``` $ cd pgpool-II-x.x.x/sql/pgpool-regclass $ make $ make install $ psql -f pgpool-regclass.sql template1 ``` > 应在每台通过 pgpool-II 访问的数据库中执行 pgpool-regclass.sql 或者 CREATE EXTENSION。 你不需要在你执行“psql -f pgpool-regclass.sql template1” 或者 CREATE EXTENSION 后建立的数据库中这么做, 因为这个模板数据库将被克隆成新建的数据库 ### pgpool_recovery 用于在线恢复 ``` $ cd pgpool-II-x.x.x/sql/pgpool-recovery $ make $ make install $ psql -f pgpool-recovery.sql template1 ``` **配置 pgpool.pg_ctl** ``` $ cat >> /usr/local/pgsql/postgresql.conf pgpool.pg_ctl = '/usr/local/pgsql/bin/pg_ctl' $ pg_ctl reload -D /usr/local/pgsql/data ``` ## 功能 ### 流复制 * 这些查询只允许被发送到主节点 * INSERT, UPDATE, DELETE, COPY FROM, TRUNCATE, CREATE, DROP, ALTER, COMMENT * SELECT ... FOR SHARE | UPDATE * 在事务隔离级别为 SERIALIZABLE 的 SELECT * 比 ROW EXCLUSIVE MODE 更严厉的 LOCK 命令 * DECLARE, FETCH, CLOSE * SHOW * 一些事务相关命令: * BEGIN READ WRITE, START TRANSACTION READ WRITE * SET TRANSACTION READ WRITE, SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE * SET transaction\_read\_only = off * 两步提交命令:PREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK PREPARED * LISTEN, UNLISTEN, NOTIFY * VACUUM * 一些序列生成器操作函数(nextval 和 setval) * 大对象建立命令 ### 缓存 基于内存的查询缓存 **限制** * 基于内存的查询缓存通过监视 UPDATE,INSERT,ALTER TABLE一类的查询语句来自动删除缓存的数据。 但 pgpool-II 无法发现通过触发器、外键和 DROP TABLE CASCADE 产生的非显式的更新。 你可以通过配置[memqcache\_expire](https://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-zh_cn.html#MEMQCACHE_EXPIRE)让 pgpool 在固定时间周期内自动删除缓存来避免这个问题, 你也可以通过配置[black\_memqcache\_table\_list](https://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-zh_cn.html#BLACK_MEMQCACHE_TABLE_LIST)来让 pgpool 的基于内存的缓存忽略指定的表。 * 如果你使用 pgpool-II 的**多个实例**来使用共享内存进行缓存,可能出现一个 pgpool 发现表被更新了因而删除了缓存,但另一个依旧使用旧的缓存。 对于这种情况,使用 **memcached** 是一个更好的策略。 **启用基于内存的查询缓存** 可以是 “shmem”(共享内存) 或者 “memcached” ``` memqcache_method = 'shmem' ``` **基于内存缓存被禁用的情况** * SELECT 语句以 `/\*NO QUERY CACHE\*/` 注释开始 * SELECT 包含以下表的[black\_memqcache\_table\_list](https://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-zh_cn.html#BLACK_MEMQCACHE_TABLE_LIST) * SELECT FOR SHARE / UPDATE * SELECT 包含 un-immutable 函数 * SELECT 包含 TEMP TABLE * SELECT 包含 系统对象 * SELECT 包含 VIEW 和 不记录日志的表。但如果表在[white\_memqcache\_table\_list](https://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-zh_cn.html#WHITE_MEMQCACHE_TABLE_LIST)中,结果还是会被缓存的。 * SELECT 包含 VIEW * SELECT 在一个被终止的显示事务中 * SELECT 结果超出[memqcache\_maxcache](https://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-zh_cn.html#MEMQCACHE_MAXCACHE) **监控缓存 ** ``` 2012-05-01 15:42:09 LOG: pid 20181: query result fetched from cache. statement: select * from t1; pool_status 命令显示缓存的命中率。 memqcache_stats_start_time | Tue May 1 15:41:59 2012 | Start time of query cache stats memqcache_no_cache_hits | 80471 | Number of SELECTs not hitting query cache memqcache_cache_hits | 36717 | Number of SELECTs hitting query cache 在本例中,你可以通过以下方法计算: (memqcache_cache_hits) / (memqcache_no_cache_hits+memqcache_cache_hits) = 36717 / (36717 + 80471) = 31.3% show pool_cache 也显示相同的结果。 ```