prestogres 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +20 -0
- data/LICENSE +202 -0
- data/NOTICE +22 -0
- data/README.md +217 -0
- data/Rakefile +13 -0
- data/VERSION +1 -0
- data/bin/prestogres +254 -0
- data/config/pcp.conf.sample +28 -0
- data/config/pgpool.conf +678 -0
- data/config/pool_hba.conf +84 -0
- data/config/pool_passwd +0 -0
- data/config/postgresql.conf +2 -0
- data/ext/.gitignore +6 -0
- data/ext/depend +26 -0
- data/ext/extconf.rb +4 -0
- data/ext/prestogres_config.c +12 -0
- data/pgpool2/.gitignore +36 -0
- data/pgpool2/AUTHORS +4 -0
- data/pgpool2/COPYING +12 -0
- data/pgpool2/ChangeLog +1 -0
- data/pgpool2/INSTALL +1 -0
- data/pgpool2/Makefile.am +159 -0
- data/pgpool2/Makefile.in +1187 -0
- data/pgpool2/NEWS +4960 -0
- data/pgpool2/README +1 -0
- data/pgpool2/README.euc_jp +1 -0
- data/pgpool2/README.online-recovery +62 -0
- data/pgpool2/TODO +103 -0
- data/pgpool2/ac_func_accept_argtypes.m4 +85 -0
- data/pgpool2/aclocal.m4 +1088 -0
- data/pgpool2/c-compiler.m4 +134 -0
- data/pgpool2/c-library.m4 +325 -0
- data/pgpool2/child.c +2097 -0
- data/pgpool2/config.guess +1532 -0
- data/pgpool2/config.h.in +332 -0
- data/pgpool2/config.sub +1640 -0
- data/pgpool2/configure +15752 -0
- data/pgpool2/configure.in +392 -0
- data/pgpool2/depcomp +522 -0
- data/pgpool2/doc/basebackup.sh +17 -0
- data/pgpool2/doc/pgpool-de.html +4220 -0
- data/pgpool2/doc/pgpool-en.html +5738 -0
- data/pgpool2/doc/pgpool-fr.html +4118 -0
- data/pgpool2/doc/pgpool-ja.css +198 -0
- data/pgpool2/doc/pgpool-ja.html +11279 -0
- data/pgpool2/doc/pgpool-zh_cn.html +4445 -0
- data/pgpool2/doc/pgpool.css +280 -0
- data/pgpool2/doc/pgpool_remote_start +13 -0
- data/pgpool2/doc/recovery.conf.sample +117 -0
- data/pgpool2/doc/tutorial-en.html +707 -0
- data/pgpool2/doc/tutorial-ja.html +422 -0
- data/pgpool2/doc/tutorial-memqcache-en.html +325 -0
- data/pgpool2/doc/tutorial-memqcache-ja.html +370 -0
- data/pgpool2/doc/tutorial-memqcache-zh_cn.html +322 -0
- data/pgpool2/doc/tutorial-watchdog-en.html +306 -0
- data/pgpool2/doc/tutorial-watchdog-ja.html +343 -0
- data/pgpool2/doc/tutorial-watchdog-zh_cn.html +301 -0
- data/pgpool2/doc/tutorial-zh_cn.html +537 -0
- data/pgpool2/doc/watchdog.png +0 -0
- data/pgpool2/doc/wd-en.html +236 -0
- data/pgpool2/doc/wd-en.jpg +0 -0
- data/pgpool2/doc/wd-ja.html +219 -0
- data/pgpool2/doc/wd-ja.jpg +0 -0
- data/pgpool2/doc/wd-zh_cn.html +201 -0
- data/pgpool2/doc/where_to_send_queries.odg +0 -0
- data/pgpool2/doc/where_to_send_queries.pdf +0 -0
- data/pgpool2/general.m4 +166 -0
- data/pgpool2/getopt_long.c +200 -0
- data/pgpool2/getopt_long.h +44 -0
- data/pgpool2/install-sh +251 -0
- data/pgpool2/ltmain.sh +8406 -0
- data/pgpool2/m4/libtool.m4 +7360 -0
- data/pgpool2/m4/ltoptions.m4 +368 -0
- data/pgpool2/m4/ltsugar.m4 +123 -0
- data/pgpool2/m4/ltversion.m4 +23 -0
- data/pgpool2/m4/lt~obsolete.m4 +92 -0
- data/pgpool2/main.c +2971 -0
- data/pgpool2/md5.c +444 -0
- data/pgpool2/md5.h +28 -0
- data/pgpool2/missing +360 -0
- data/pgpool2/mkinstalldirs +40 -0
- data/pgpool2/parser/Makefile.am +50 -0
- data/pgpool2/parser/Makefile.in +559 -0
- data/pgpool2/parser/copyfuncs.c +3310 -0
- data/pgpool2/parser/gram.c +39100 -0
- data/pgpool2/parser/gram.h +940 -0
- data/pgpool2/parser/gram.y +13408 -0
- data/pgpool2/parser/gramparse.h +74 -0
- data/pgpool2/parser/keywords.c +32 -0
- data/pgpool2/parser/keywords.h +39 -0
- data/pgpool2/parser/kwlist.h +425 -0
- data/pgpool2/parser/kwlookup.c +88 -0
- data/pgpool2/parser/list.c +1156 -0
- data/pgpool2/parser/makefuncs.c +518 -0
- data/pgpool2/parser/makefuncs.h +83 -0
- data/pgpool2/parser/memnodes.h +79 -0
- data/pgpool2/parser/nodes.c +29 -0
- data/pgpool2/parser/nodes.h +609 -0
- data/pgpool2/parser/outfuncs.c +5790 -0
- data/pgpool2/parser/parsenodes.h +2615 -0
- data/pgpool2/parser/parser.c +262 -0
- data/pgpool2/parser/parser.h +46 -0
- data/pgpool2/parser/pg_class.h +158 -0
- data/pgpool2/parser/pg_config_manual.h +273 -0
- data/pgpool2/parser/pg_list.h +352 -0
- data/pgpool2/parser/pg_trigger.h +147 -0
- data/pgpool2/parser/pg_wchar.h +492 -0
- data/pgpool2/parser/pool_memory.c +342 -0
- data/pgpool2/parser/pool_memory.h +77 -0
- data/pgpool2/parser/pool_parser.h +222 -0
- data/pgpool2/parser/pool_string.c +121 -0
- data/pgpool2/parser/pool_string.h +37 -0
- data/pgpool2/parser/primnodes.h +1280 -0
- data/pgpool2/parser/scan.c +4094 -0
- data/pgpool2/parser/scan.l +1451 -0
- data/pgpool2/parser/scanner.h +120 -0
- data/pgpool2/parser/scansup.c +221 -0
- data/pgpool2/parser/scansup.h +28 -0
- data/pgpool2/parser/snprintf.c +1102 -0
- data/pgpool2/parser/stringinfo.c +294 -0
- data/pgpool2/parser/stringinfo.h +178 -0
- data/pgpool2/parser/value.c +78 -0
- data/pgpool2/parser/value.h +62 -0
- data/pgpool2/parser/wchar.c +2048 -0
- data/pgpool2/pcp.conf.sample +28 -0
- data/pgpool2/pcp/Makefile.am +40 -0
- data/pgpool2/pcp/Makefile.in +771 -0
- data/pgpool2/pcp/libpcp_ext.h +250 -0
- data/pgpool2/pcp/md5.c +444 -0
- data/pgpool2/pcp/md5.h +28 -0
- data/pgpool2/pcp/pcp.c +1652 -0
- data/pgpool2/pcp/pcp.h +61 -0
- data/pgpool2/pcp/pcp_attach_node.c +172 -0
- data/pgpool2/pcp/pcp_detach_node.c +185 -0
- data/pgpool2/pcp/pcp_error.c +87 -0
- data/pgpool2/pcp/pcp_node_count.c +160 -0
- data/pgpool2/pcp/pcp_node_info.c +198 -0
- data/pgpool2/pcp/pcp_pool_status.c +166 -0
- data/pgpool2/pcp/pcp_proc_count.c +166 -0
- data/pgpool2/pcp/pcp_proc_info.c +261 -0
- data/pgpool2/pcp/pcp_promote_node.c +185 -0
- data/pgpool2/pcp/pcp_recovery_node.c +172 -0
- data/pgpool2/pcp/pcp_stop_pgpool.c +179 -0
- data/pgpool2/pcp/pcp_stream.c +385 -0
- data/pgpool2/pcp/pcp_stream.h +52 -0
- data/pgpool2/pcp/pcp_systemdb_info.c +194 -0
- data/pgpool2/pcp/pcp_watchdog_info.c +211 -0
- data/pgpool2/pcp_child.c +1493 -0
- data/pgpool2/pg_md5.c +305 -0
- data/pgpool2/pgpool.8.in +121 -0
- data/pgpool2/pgpool.conf +553 -0
- data/pgpool2/pgpool.conf.sample +666 -0
- data/pgpool2/pgpool.conf.sample-master-slave +665 -0
- data/pgpool2/pgpool.conf.sample-replication +664 -0
- data/pgpool2/pgpool.conf.sample-stream +664 -0
- data/pgpool2/pgpool.spec +264 -0
- data/pgpool2/pgpool_adm/TODO +7 -0
- data/pgpool2/pgpool_adm/pgpool_adm--1.0.sql +85 -0
- data/pgpool2/pgpool_adm/pgpool_adm.c +558 -0
- data/pgpool2/pgpool_adm/pgpool_adm.control +5 -0
- data/pgpool2/pgpool_adm/pgpool_adm.h +46 -0
- data/pgpool2/pgpool_adm/pgpool_adm.sql.in +85 -0
- data/pgpool2/pool.h +655 -0
- data/pgpool2/pool_auth.c +1390 -0
- data/pgpool2/pool_config.c +5007 -0
- data/pgpool2/pool_config.h +284 -0
- data/pgpool2/pool_config.l +3281 -0
- data/pgpool2/pool_config_md5.c +29 -0
- data/pgpool2/pool_connection_pool.c +812 -0
- data/pgpool2/pool_error.c +242 -0
- data/pgpool2/pool_globals.c +27 -0
- data/pgpool2/pool_hba.c +1723 -0
- data/pgpool2/pool_hba.conf.sample +67 -0
- data/pgpool2/pool_ip.c +567 -0
- data/pgpool2/pool_ip.h +65 -0
- data/pgpool2/pool_ipc.h +38 -0
- data/pgpool2/pool_lobj.c +242 -0
- data/pgpool2/pool_lobj.h +32 -0
- data/pgpool2/pool_memqcache.c +3818 -0
- data/pgpool2/pool_memqcache.h +268 -0
- data/pgpool2/pool_params.c +163 -0
- data/pgpool2/pool_passwd.c +249 -0
- data/pgpool2/pool_passwd.h +41 -0
- data/pgpool2/pool_path.c +193 -0
- data/pgpool2/pool_path.h +81 -0
- data/pgpool2/pool_process_context.c +247 -0
- data/pgpool2/pool_process_context.h +62 -0
- data/pgpool2/pool_process_query.c +5001 -0
- data/pgpool2/pool_process_reporting.c +1671 -0
- data/pgpool2/pool_process_reporting.h +44 -0
- data/pgpool2/pool_proto2.c +671 -0
- data/pgpool2/pool_proto_modules.c +3524 -0
- data/pgpool2/pool_proto_modules.h +185 -0
- data/pgpool2/pool_query_cache.c +1020 -0
- data/pgpool2/pool_query_context.c +1871 -0
- data/pgpool2/pool_query_context.h +105 -0
- data/pgpool2/pool_relcache.c +284 -0
- data/pgpool2/pool_relcache.h +78 -0
- data/pgpool2/pool_rewrite_outfuncs.c +9060 -0
- data/pgpool2/pool_rewrite_query.c +715 -0
- data/pgpool2/pool_rewrite_query.h +192 -0
- data/pgpool2/pool_select_walker.c +1150 -0
- data/pgpool2/pool_select_walker.h +68 -0
- data/pgpool2/pool_sema.c +161 -0
- data/pgpool2/pool_session_context.c +952 -0
- data/pgpool2/pool_session_context.h +203 -0
- data/pgpool2/pool_shmem.c +185 -0
- data/pgpool2/pool_signal.c +158 -0
- data/pgpool2/pool_signal.h +61 -0
- data/pgpool2/pool_ssl.c +339 -0
- data/pgpool2/pool_stream.c +962 -0
- data/pgpool2/pool_stream.h +61 -0
- data/pgpool2/pool_system.c +659 -0
- data/pgpool2/pool_timestamp.c +1215 -0
- data/pgpool2/pool_timestamp.h +38 -0
- data/pgpool2/pool_type.h +171 -0
- data/pgpool2/pool_worker_child.c +384 -0
- data/pgpool2/ps_status.c +404 -0
- data/pgpool2/recovery.c +435 -0
- data/pgpool2/redhat/pgpool.conf.sample.patch +52 -0
- data/pgpool2/redhat/pgpool.init +201 -0
- data/pgpool2/redhat/pgpool.sysconfig +7 -0
- data/pgpool2/redhat/rpm_installer/basebackup-replication.sh +53 -0
- data/pgpool2/redhat/rpm_installer/basebackup-stream.sh +55 -0
- data/pgpool2/redhat/rpm_installer/config_for_script +17 -0
- data/pgpool2/redhat/rpm_installer/failover.sh +64 -0
- data/pgpool2/redhat/rpm_installer/getsources.sh +141 -0
- data/pgpool2/redhat/rpm_installer/install.sh +1363 -0
- data/pgpool2/redhat/rpm_installer/pgpool_recovery_pitr +47 -0
- data/pgpool2/redhat/rpm_installer/pgpool_remote_start +15 -0
- data/pgpool2/redhat/rpm_installer/recovery.conf +4 -0
- data/pgpool2/redhat/rpm_installer/uninstall.sh +57 -0
- data/pgpool2/sample/dist_def_pgbench.sql +73 -0
- data/pgpool2/sample/pgpool.pam +3 -0
- data/pgpool2/sample/pgpool_recovery +20 -0
- data/pgpool2/sample/pgpool_recovery_pitr +19 -0
- data/pgpool2/sample/pgpool_remote_start +13 -0
- data/pgpool2/sample/replicate_def_pgbench.sql +18 -0
- data/pgpool2/sql/insert_lock.sql +15 -0
- data/pgpool2/sql/pgpool-recovery/pgpool-recovery.c +280 -0
- data/pgpool2/sql/pgpool-recovery/pgpool-recovery.sql.in +19 -0
- data/pgpool2/sql/pgpool-recovery/pgpool_recovery--1.0.sql +24 -0
- data/pgpool2/sql/pgpool-recovery/pgpool_recovery.control +5 -0
- data/pgpool2/sql/pgpool-recovery/uninstall_pgpool-recovery.sql +3 -0
- data/pgpool2/sql/pgpool-regclass/pgpool-regclass.c +206 -0
- data/pgpool2/sql/pgpool-regclass/pgpool-regclass.sql.in +4 -0
- data/pgpool2/sql/pgpool-regclass/pgpool_regclass--1.0.sql +7 -0
- data/pgpool2/sql/pgpool-regclass/pgpool_regclass.control +5 -0
- data/pgpool2/sql/pgpool-regclass/uninstall_pgpool-regclass.sql +1 -0
- data/pgpool2/sql/system_db.sql +38 -0
- data/pgpool2/strlcpy.c +85 -0
- data/pgpool2/test/C/test_extended.c +98 -0
- data/pgpool2/test/jdbc/.cvsignore +2 -0
- data/pgpool2/test/jdbc/AutoCommitTest.java +45 -0
- data/pgpool2/test/jdbc/BatchTest.java +55 -0
- data/pgpool2/test/jdbc/ColumnTest.java +60 -0
- data/pgpool2/test/jdbc/CreateTempTableTest.java +48 -0
- data/pgpool2/test/jdbc/InsertTest.java +34 -0
- data/pgpool2/test/jdbc/LockTest.java +36 -0
- data/pgpool2/test/jdbc/PgpoolTest.java +75 -0
- data/pgpool2/test/jdbc/README.euc_jp +73 -0
- data/pgpool2/test/jdbc/RunTest.java +83 -0
- data/pgpool2/test/jdbc/SelectTest.java +37 -0
- data/pgpool2/test/jdbc/UpdateTest.java +32 -0
- data/pgpool2/test/jdbc/expected/CreateTempTable +1 -0
- data/pgpool2/test/jdbc/expected/autocommit +10 -0
- data/pgpool2/test/jdbc/expected/batch +1 -0
- data/pgpool2/test/jdbc/expected/column +100 -0
- data/pgpool2/test/jdbc/expected/insert +1 -0
- data/pgpool2/test/jdbc/expected/lock +100 -0
- data/pgpool2/test/jdbc/expected/select +2 -0
- data/pgpool2/test/jdbc/expected/update +1 -0
- data/pgpool2/test/jdbc/pgpool.properties +7 -0
- data/pgpool2/test/jdbc/prepare.sql +54 -0
- data/pgpool2/test/jdbc/run.sh +6 -0
- data/pgpool2/test/parser/.cvsignore +6 -0
- data/pgpool2/test/parser/README +32 -0
- data/pgpool2/test/parser/expected/copy.out +17 -0
- data/pgpool2/test/parser/expected/create.out +64 -0
- data/pgpool2/test/parser/expected/cursor.out +37 -0
- data/pgpool2/test/parser/expected/delete.out +10 -0
- data/pgpool2/test/parser/expected/drop.out +12 -0
- data/pgpool2/test/parser/expected/insert.out +13 -0
- data/pgpool2/test/parser/expected/misc.out +28 -0
- data/pgpool2/test/parser/expected/prepare.out +4 -0
- data/pgpool2/test/parser/expected/privileges.out +31 -0
- data/pgpool2/test/parser/expected/scanner.out +30 -0
- data/pgpool2/test/parser/expected/select.out +89 -0
- data/pgpool2/test/parser/expected/transaction.out +38 -0
- data/pgpool2/test/parser/expected/update.out +11 -0
- data/pgpool2/test/parser/expected/v84.out +37 -0
- data/pgpool2/test/parser/expected/v90.out +25 -0
- data/pgpool2/test/parser/expected/var.out +22 -0
- data/pgpool2/test/parser/input/alter.sql +2 -0
- data/pgpool2/test/parser/input/copy.sql +17 -0
- data/pgpool2/test/parser/input/create.sql +64 -0
- data/pgpool2/test/parser/input/cursor.sql +37 -0
- data/pgpool2/test/parser/input/delete.sql +10 -0
- data/pgpool2/test/parser/input/drop.sql +12 -0
- data/pgpool2/test/parser/input/insert.sql +13 -0
- data/pgpool2/test/parser/input/misc.sql +28 -0
- data/pgpool2/test/parser/input/prepare.sql +4 -0
- data/pgpool2/test/parser/input/privileges.sql +31 -0
- data/pgpool2/test/parser/input/scanner.sql +34 -0
- data/pgpool2/test/parser/input/select.sql +89 -0
- data/pgpool2/test/parser/input/transaction.sql +38 -0
- data/pgpool2/test/parser/input/update.sql +11 -0
- data/pgpool2/test/parser/input/v84.sql +37 -0
- data/pgpool2/test/parser/input/v90.sql +38 -0
- data/pgpool2/test/parser/input/var.sql +22 -0
- data/pgpool2/test/parser/main.c +96 -0
- data/pgpool2/test/parser/parse_schedule +16 -0
- data/pgpool2/test/parser/pool.h +13 -0
- data/pgpool2/test/parser/run-test +62 -0
- data/pgpool2/test/pdo-test/README.euc_jp +58 -0
- data/pgpool2/test/pdo-test/SQLlist/test1.sql +3 -0
- data/pgpool2/test/pdo-test/SQLlist/test2.sql +3 -0
- data/pgpool2/test/pdo-test/collections.inc +11 -0
- data/pgpool2/test/pdo-test/def.inc +7 -0
- data/pgpool2/test/pdo-test/log.txt +0 -0
- data/pgpool2/test/pdo-test/mod/database.inc +36 -0
- data/pgpool2/test/pdo-test/mod/def.inc +0 -0
- data/pgpool2/test/pdo-test/mod/errorhandler.inc +27 -0
- data/pgpool2/test/pdo-test/pdotest.php +11 -0
- data/pgpool2/test/pdo-test/regsql.inc +56 -0
- data/pgpool2/test/pgpool_setup +898 -0
- data/pgpool2/test/regression/README +39 -0
- data/pgpool2/test/regression/clean.sh +21 -0
- data/pgpool2/test/regression/libs.sh +16 -0
- data/pgpool2/test/regression/regress.sh +166 -0
- data/pgpool2/test/regression/tests/001.load_balance/test.sh +128 -0
- data/pgpool2/test/regression/tests/002.native_replication/PgTester.java +47 -0
- data/pgpool2/test/regression/tests/002.native_replication/create.sql +6 -0
- data/pgpool2/test/regression/tests/002.native_replication/test.sh +71 -0
- data/pgpool2/test/regression/tests/003.failover/expected.r +6 -0
- data/pgpool2/test/regression/tests/003.failover/expected.s +6 -0
- data/pgpool2/test/regression/tests/003.failover/test.sh +45 -0
- data/pgpool2/test/regression/tests/004.watchdog/master.conf +12 -0
- data/pgpool2/test/regression/tests/004.watchdog/standby.conf +19 -0
- data/pgpool2/test/regression/tests/004.watchdog/test.sh +52 -0
- data/pgpool2/test/regression/tests/050.bug58/test.sh +50 -0
- data/pgpool2/test/regression/tests/051.bug60/bug.sql +12 -0
- data/pgpool2/test/regression/tests/051.bug60/database-clean.sql +6 -0
- data/pgpool2/test/regression/tests/051.bug60/database-setup.sql +28 -0
- data/pgpool2/test/regression/tests/051.bug60/test.sh +79 -0
- data/pgpool2/test/regression/tests/052.do_query/test.sh +44 -0
- data/pgpool2/test/regression/tests/053.insert_lock_hangs/test.sh +81 -0
- data/pgpool2/test/regression/tests/054.postgres_fdw/test.sh +67 -0
- data/pgpool2/test/regression/tests/055.backend_all_down/test.sh +52 -0
- data/pgpool2/test/regression/tests/056.bug63/jdbctest2.java +66 -0
- data/pgpool2/test/regression/tests/056.bug63/test.sh +47 -0
- data/pgpool2/test/regression/tests/057.bug61/test.sh +40 -0
- data/pgpool2/test/regression/tests/058.bug68/jdbctest3.java +45 -0
- data/pgpool2/test/regression/tests/058.bug68/test.sh +47 -0
- data/pgpool2/test/timestamp/expected/insert.out +16 -0
- data/pgpool2/test/timestamp/expected/misc.out +3 -0
- data/pgpool2/test/timestamp/expected/update.out +6 -0
- data/pgpool2/test/timestamp/input/insert.sql +16 -0
- data/pgpool2/test/timestamp/input/misc.sql +3 -0
- data/pgpool2/test/timestamp/input/update.sql +6 -0
- data/pgpool2/test/timestamp/main.c +129 -0
- data/pgpool2/test/timestamp/parse_schedule +3 -0
- data/pgpool2/test/timestamp/run-test +69 -0
- data/pgpool2/version.h +1 -0
- data/pgpool2/watchdog/Makefile.am +17 -0
- data/pgpool2/watchdog/Makefile.in +505 -0
- data/pgpool2/watchdog/test/stab.c +266 -0
- data/pgpool2/watchdog/test/test.c +85 -0
- data/pgpool2/watchdog/test/wd_child_t.c +87 -0
- data/pgpool2/watchdog/test/wd_lifecheck_t.c +87 -0
- data/pgpool2/watchdog/test/wd_packet_t.c +87 -0
- data/pgpool2/watchdog/test/wd_ping_t.c +20 -0
- data/pgpool2/watchdog/watchdog.c +408 -0
- data/pgpool2/watchdog/watchdog.h +209 -0
- data/pgpool2/watchdog/wd_child.c +444 -0
- data/pgpool2/watchdog/wd_ext.h +123 -0
- data/pgpool2/watchdog/wd_heartbeat.c +577 -0
- data/pgpool2/watchdog/wd_if.c +216 -0
- data/pgpool2/watchdog/wd_init.c +126 -0
- data/pgpool2/watchdog/wd_interlock.c +347 -0
- data/pgpool2/watchdog/wd_lifecheck.c +512 -0
- data/pgpool2/watchdog/wd_list.c +429 -0
- data/pgpool2/watchdog/wd_packet.c +1159 -0
- data/pgpool2/watchdog/wd_ping.c +330 -0
- data/pgpool2/ylwrap +223 -0
- data/pgsql/presto_client.py +346 -0
- data/pgsql/prestogres.py +156 -0
- data/pgsql/setup_functions.sql +21 -0
- data/pgsql/setup_language.sql +3 -0
- data/prestogres.gemspec +23 -0
- metadata +496 -0
@@ -0,0 +1,370 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>pgpool-II オンメモリクエリキャッシュ チュートリアル</title>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
|
6
|
+
<link href="pgpool.css" rel="stylesheet" type="text/css" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
|
10
|
+
<body bgcolor="#ffffff">
|
11
|
+
<div id="top" class="header_text">pgpool-II オンメモリクエリキャッシュ チュートリアル</div>
|
12
|
+
|
13
|
+
<div id="menu">
|
14
|
+
<div id="navcontainer">
|
15
|
+
<ul id="navlist">
|
16
|
+
<li><a href="#thisis">チュートリアルの概要</a>
|
17
|
+
<ul>
|
18
|
+
<li><a href="#memqcache_config">共有メモリに関する設定</a></li>
|
19
|
+
</ul>
|
20
|
+
</li>
|
21
|
+
<li><a href="#basic">簡単なクエリキャッシュ</a>
|
22
|
+
<ul>
|
23
|
+
<li><a href="#memqcache_config">pgpool.conf の設定</a></li>
|
24
|
+
<li><a href="#basic_start">pgpool-II の起動</a></li>
|
25
|
+
<li><a href="#basic_try">クエリキャッシュ</a></li>
|
26
|
+
</ul>
|
27
|
+
</li>
|
28
|
+
<li><a href="start#more">応用</a>
|
29
|
+
<ul>
|
30
|
+
<li><a href="#invalidation">キャッシュの無効化</a></li>
|
31
|
+
<li><a href="#white_and_black_list">ホワイトリスト / ブラックリスト</a></li>
|
32
|
+
<li><a href="#cache_or_not">キャッシュ可否の制御</a></li>
|
33
|
+
</ul>
|
34
|
+
</li>
|
35
|
+
</ul>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
<div class="header_small" align="center">
|
39
|
+
[<a href="tutrial-memqcache-en.html">English page</a>]
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div id="manual">
|
44
|
+
|
45
|
+
<!-- ================================================================================ -->
|
46
|
+
|
47
|
+
<h1 id="thisis">チュートリアルの概要</h1>
|
48
|
+
|
49
|
+
<p>このチュートリアルでは、共有メモリを使ったオンメモリクエリキャッシュを試す方法を説明します。</p>
|
50
|
+
<p>必要なのは、Linux マシン 1 台で、PostgreSQL と pgpool-II がインストールされているものとします。
|
51
|
+
なお、pgpool-II はどのモードで稼働していても、オンメモリクエリキャッシュを利用することができます。</p>
|
52
|
+
|
53
|
+
<p class="top_link"><a href="#Top">△ back to top</a></p>
|
54
|
+
|
55
|
+
<!-- ================================================================================ -->
|
56
|
+
|
57
|
+
<h1 id="basic">簡単なクエリキャッシュ</h1>
|
58
|
+
|
59
|
+
<h2 id="memqcache_config">pgpool.conf の設定</h2>
|
60
|
+
|
61
|
+
<h3>クエリキャッシュの基本設定</h3>
|
62
|
+
|
63
|
+
<p>オンメモリクエリキャッシュ機能を有効にする「memory_cache_enabled」を on にします。</p>
|
64
|
+
<pre>
|
65
|
+
# If on, use the memory cache functionality, off by default
|
66
|
+
memory_cache_enabled = <b>on</b>
|
67
|
+
</pre>
|
68
|
+
|
69
|
+
<p>メモリキャッシュでは、どの DB のどのテーブルのどのキャッシュ、という情報をファイルに保存していて、
|
70
|
+
これを「OID マップ」と呼んでいます。
|
71
|
+
このファイル群を配置するディレクトリを「memqcache_oiddir」で指定します。</p>
|
72
|
+
<pre>
|
73
|
+
# Temporary work directory to record table oids
|
74
|
+
memqcache_oiddir = '/var/log/pgpool/oiddir'
|
75
|
+
</pre>
|
76
|
+
|
77
|
+
<h3 id="config_shmem">共有メモリに関する設定</h3>
|
78
|
+
|
79
|
+
<p>
|
80
|
+
キャッシュを記録する先を指定する「memqcache_method」は、デフォルトのまま
|
81
|
+
shmem(共有メモリ)を指定します。</p>
|
82
|
+
<pre>
|
83
|
+
# Cache storage method. either 'shmem'(shared memory) or 'memcached'. 'shmem' by default
|
84
|
+
memqcache_method = '<b>shmem</b>'
|
85
|
+
</pre>
|
86
|
+
|
87
|
+
<h3>ログ出力</h3>
|
88
|
+
<p>オンメモリクエリキャッシュの動作確認に便利なため、どのバックエンドノードでどんなクエリが実行されたかを
|
89
|
+
出力するフラグ「log_per_node_statement」を on にします。</p>
|
90
|
+
<pre>
|
91
|
+
log_per_node_statement = on
|
92
|
+
# Log all statements
|
93
|
+
# with node and backend informations
|
94
|
+
</pre>
|
95
|
+
|
96
|
+
<h2 id="basic_start">pgpool-II の起動</h2>
|
97
|
+
|
98
|
+
<p>pgpool-II を起動します。
|
99
|
+
なお、ログで動作確認するため、-n オプションをつけて非デーモンモードで起動し、
|
100
|
+
出力されるログメッセージを pgpool.log ファイルにリダイレクトします。</p>
|
101
|
+
<pre>
|
102
|
+
$ {installed_dir}/bin/pgpool -n -f {installed_dir}/etc/pgpool.conf > pgpool.log 2>&1
|
103
|
+
</pre>
|
104
|
+
|
105
|
+
<p>データベース、テーブルを作成します。</p>
|
106
|
+
<pre>
|
107
|
+
$ createdb -p 9999 test
|
108
|
+
|
109
|
+
$ psql -p 9999 test
|
110
|
+
test=> CREATE TABLE table_cache_ok (a INT);
|
111
|
+
CREATE TABLE
|
112
|
+
|
113
|
+
test=> INSERT INTO table_cache_ok VALUES (1), (2), (3);
|
114
|
+
INSERT 0 3
|
115
|
+
|
116
|
+
test=> SELECT * FROM table_cache_ok ORDER BY a;
|
117
|
+
a
|
118
|
+
---
|
119
|
+
1
|
120
|
+
2
|
121
|
+
3
|
122
|
+
(3 rows)
|
123
|
+
</pre>
|
124
|
+
|
125
|
+
<!-- -------------------------------------------------------------------------------- -->
|
126
|
+
|
127
|
+
<h2 id="basic_try">クエリキャッシュ</h2>
|
128
|
+
|
129
|
+
<p>SELECT を実行してみます。</p>
|
130
|
+
<pre>
|
131
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
132
|
+
a
|
133
|
+
---
|
134
|
+
1
|
135
|
+
(1 row)
|
136
|
+
</pre>
|
137
|
+
|
138
|
+
<p>ログの log_per_node_statement の出力から、SELECT が実行されていることがわかります。</p>
|
139
|
+
<pre>
|
140
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
141
|
+
</pre>
|
142
|
+
|
143
|
+
<p>では、もう一度同じ SELECT を実行します。</p>
|
144
|
+
<pre>
|
145
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
146
|
+
a
|
147
|
+
---
|
148
|
+
1
|
149
|
+
(1 row)
|
150
|
+
</pre>
|
151
|
+
|
152
|
+
<p>ログを見ると今度は以下のメッセージがあり、キャッシュから結果を取得してきたことがわかります。</p>
|
153
|
+
<pre>
|
154
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
155
|
+
</pre>
|
156
|
+
|
157
|
+
<p class="top_link"><a href="#Top">△ back to top</a></p>
|
158
|
+
|
159
|
+
<!-- ================================================================================ -->
|
160
|
+
|
161
|
+
<h1 id="more">応用</h1>
|
162
|
+
|
163
|
+
<h2 id="invalidation">キャッシュの無効化</h2>
|
164
|
+
|
165
|
+
<h3 id="invalidation_when_update">テーブルが更新されたとき</h3>
|
166
|
+
<p>キャッシュした SELECT 結果は、そのテーブルが INSERT/UPDATE/DELETE されたとき、
|
167
|
+
その SELECT 結果が古くなる可能性があります。
|
168
|
+
デフォルトでは、INSERT/UPDATE/DELETE が行なわれたら、そのテーブルのキャッシュを削除します。
|
169
|
+
<p>ここではその動作を確認します。</p>
|
170
|
+
|
171
|
+
<h4 id="invalidation_config">設定</h4>
|
172
|
+
<p>「memqcache_auto_cache_invalidation」で指定します。デフォルトでは on になっています。</p>
|
173
|
+
<pre>
|
174
|
+
# If on, invalidation of query cache is triggered by corresponding
|
175
|
+
# DDL/DML/DCL(and memqcache_expire). If off, it is only triggered
|
176
|
+
# by memqcache_expire. on by default.
|
177
|
+
memqcache_auto_cache_invalidation = on
|
178
|
+
</pre>
|
179
|
+
|
180
|
+
<p>設定を変更した場合は、pgpool-II を再起動します。</p>
|
181
|
+
|
182
|
+
<h4 id="invalidation_try">動作確認</h4>
|
183
|
+
<p>SELECT がキャッシュされていることを確認します。</p>
|
184
|
+
<pre>
|
185
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
186
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
187
|
+
</pre>
|
188
|
+
|
189
|
+
<p>テーブルに INSERT を実行します。</p>
|
190
|
+
<pre>
|
191
|
+
test=> INSERT INTO table_cache_ok VALUES (5);
|
192
|
+
INSERT 0 1
|
193
|
+
</pre>
|
194
|
+
|
195
|
+
<p>再度 SELECT を実行し、キャッシュから取得されず、実際に SELECT が実行されることを確認します。</p>
|
196
|
+
<pre>
|
197
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
198
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
199
|
+
</pre>
|
200
|
+
|
201
|
+
<h3 id="expire">一定秒数経過したとき</h3>
|
202
|
+
<p>そのほか、一定秒数が経過したキャッシュも、自動的に削除します。</p>
|
203
|
+
|
204
|
+
<h4 id="expire_config">設定</h4>
|
205
|
+
<p>「memqcache_expire」パラメータでその秒数を指定します。
|
206
|
+
デフォルトは 0 秒ですが、ここでは動作確認のため 5 秒にしてみます。</p>
|
207
|
+
<pre>
|
208
|
+
# Memory cache entry life time specified in seconds.
|
209
|
+
# 0 means infinite life time. 0 by default.
|
210
|
+
memqcache_expire = 5
|
211
|
+
</pre>
|
212
|
+
|
213
|
+
<p>設定を変更したら、pgpool-II を再起動します。</p>
|
214
|
+
|
215
|
+
<h4 id="expire_try">動作確認</h4>
|
216
|
+
|
217
|
+
<p>SELECT がキャッシュされていることを確認します。</p>
|
218
|
+
<pre>
|
219
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
220
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
221
|
+
</pre>
|
222
|
+
|
223
|
+
<p>そのまま 5 秒以上待ちます。</p>
|
224
|
+
|
225
|
+
<p>再度 SELECT を実行し、キャッシュから取得されず、実際に SELECT が実行されることを確認します。</p>
|
226
|
+
<pre>
|
227
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
228
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
229
|
+
</pre>
|
230
|
+
|
231
|
+
<!-- -------------------------------------------------------------------------------- -->
|
232
|
+
|
233
|
+
<h2 id="white_and_black_list">ホワイトリスト / ブラックリスト</h2>
|
234
|
+
<h3 id="whitelist">一部テーブルだけキャッシュする</h3>
|
235
|
+
|
236
|
+
<h4 id="whitelist_config">設定</h4>
|
237
|
+
<p>一部テーブルだけキャッシュしたい場合、「white_memqcache_table_list」にそのテーブルを指定します。
|
238
|
+
TEMP テーブルや UNLOGGED テーブルも、ここに指定すればキャッシュされるようになります。</p>
|
239
|
+
<p>テーブルの名前を直接指定することも、正規表現を使う(^ と $ が補完されて使われる)こともできます。</p>
|
240
|
+
<pre>
|
241
|
+
white_memqcache_table_list = '.*_cache_ok'
|
242
|
+
# Comma separated list of table names to memcache
|
243
|
+
# that don't write to database
|
244
|
+
# Regexp are accepted
|
245
|
+
</pre>
|
246
|
+
<p>設定を変更したら、pgpool-II をリロードします。</p>
|
247
|
+
<pre>
|
248
|
+
$ {installed_dir}/bin/pgpool reload
|
249
|
+
</pre>
|
250
|
+
|
251
|
+
<h4 id="whitelist_try">動作確認</h4>
|
252
|
+
<p>キャッシュ不可とするテーブルを作成します。</p>
|
253
|
+
<pre>
|
254
|
+
$ psql -p 9999 test
|
255
|
+
test=> CREATE TABLE table_cache_ng (a INT);
|
256
|
+
CREATE TABLE
|
257
|
+
|
258
|
+
test=> INSERT INTO table_cache_ng VALUES (1), (2), (3);
|
259
|
+
INSERT 0 3
|
260
|
+
</pre>
|
261
|
+
|
262
|
+
<p>ホワイトリストに指定したテーブルの SELECT が、キャッシュされることを確認します。</p>
|
263
|
+
<pre>
|
264
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
265
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT oid FROM pg_database WHERE datname = 'test'
|
266
|
+
|
267
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
268
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
269
|
+
</pre>
|
270
|
+
|
271
|
+
<p>ホワイトリストに指定していないテーブル の SELECT が、キャッシュされないことを確認します。</p>
|
272
|
+
<pre>
|
273
|
+
test=> SELECT * FROM table_cache_ng WHERE a = 1;
|
274
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
275
|
+
|
276
|
+
test=> SELECT * FROM table_cache_ng WHERE a = 1;
|
277
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
278
|
+
</pre>
|
279
|
+
|
280
|
+
<h3 id="blacklist">一部テーブルをキャッシュしない</h3>
|
281
|
+
<h4 id="blacklist_config">設定</h4>
|
282
|
+
<p>一部テーブルだけキャッシュしたくない場合、「black_memqcache_table_list」にそのテーブルを指定します。
|
283
|
+
TEMP テーブルや UNLOGGED テーブルも、ここに指定したもの以外がキャッシュされるようになります。</p>
|
284
|
+
<p>テーブルの名前を直接指定することも、正規表現を使う(^ と $ が補完されて使われる)こともできます。</p>
|
285
|
+
<pre>
|
286
|
+
black_memqcache_table_list = '.*_cache_ng'
|
287
|
+
# Comma separated list of table names not to memcache
|
288
|
+
# that don't write to database
|
289
|
+
# Regexp are accepted
|
290
|
+
</pre>
|
291
|
+
<p>設定を変更したら、pgpool-II をリロードします。</p>
|
292
|
+
<pre>
|
293
|
+
$ {installed_dir}/bin/pgpool reload
|
294
|
+
</pre>
|
295
|
+
|
296
|
+
<h4 id="blacklist_try">動作確認</h4>
|
297
|
+
<p>ブラックリストに指定したテーブルの SELECT が、キャッシュされないことを確認します。</p>
|
298
|
+
<pre>
|
299
|
+
test=> SELECT * FROM table_cache_ng WHERE a = 1;
|
300
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
301
|
+
|
302
|
+
test=> SELECT * FROM table_cache_ng WHERE a = 1;
|
303
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
304
|
+
</pre>
|
305
|
+
|
306
|
+
<p>ブラックリストに指定していないテーブル の SELECT が、キャッシュされることを確認します。</p>
|
307
|
+
<pre>
|
308
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
309
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT oid FROM pg_database WHERE datname = 'test'
|
310
|
+
|
311
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
312
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
313
|
+
</pre>
|
314
|
+
|
315
|
+
<!-- -------------------------------------------------------------------------------- -->
|
316
|
+
|
317
|
+
<h2 id="cache_or_not">キャッシュ可否の制御</h2>
|
318
|
+
|
319
|
+
<h3 id="maxcacge">結果が大きい SELECT がキャッシュされない</h3>
|
320
|
+
<p>キャッシュできる SELECT 結果のサイズには限界があります。
|
321
|
+
これを指定しているのが「memqcache_maxcache」パラメータです。</p>
|
322
|
+
<pre>
|
323
|
+
# Maximum SELECT result size in bytes.
|
324
|
+
# Must be smaller than memqcache_cache_block_size. Defaults to 400KB.
|
325
|
+
memqcache_maxcache = 409600
|
326
|
+
</pre>
|
327
|
+
|
328
|
+
<p>このサイズを超過しているときは、以下のログメッセージが出力されます。
|
329
|
+
これは、「memqcache_maxcache」を 1024 バイトと非常に小さくして、10 MB 以上のテーブルを全件 SELECT した例です。</p>
|
330
|
+
<pre>
|
331
|
+
LOG: DB node id: 0 backend pid: 17749 statement: SELECT * FROM pgbench_accounts ;
|
332
|
+
LOG: pool_add_temp_query_cache: <b>data size exceeds memqcache_maxcache</b>.
|
333
|
+
current:983 requested:110 memq_maxcache:1024
|
334
|
+
</pre>
|
335
|
+
|
336
|
+
<h3 id="no_query_cache">特定の SELECT をキャッシュしたくない</h3>
|
337
|
+
<p>SELECT の可否をテーブルごとの指定ではなく、より細かく指定したい場合には、
|
338
|
+
クエリの頭に「/* NO QUERY CACHE */」という接頭辞をつけることで対処することができます。</p>
|
339
|
+
|
340
|
+
<p>例えば、以下のようにキャッシュされている SELECT でも、</p>
|
341
|
+
<pre>
|
342
|
+
LOG: statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
343
|
+
LOG: query result fetched from cache. statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
344
|
+
</pre>
|
345
|
+
|
346
|
+
<p>「/* NO QUERY CACHE */」をつけて実行すると、キャッシュされないようになります。</p>
|
347
|
+
<pre>
|
348
|
+
LOG: statement: /* NO QUERY CACHE */ SELECT * FROM table_cache_ok WHERE a = 1;
|
349
|
+
LOG: DB node id: 0 backend pid: 18070 statement: /* NO QUERY CACHE */ SELECT * FROM table_cache_ok WHERE a = 1;
|
350
|
+
LOG: statement: /* NO QUERY CACHE */ SELECT * FROM table_cache_ok WHERE a = 1;
|
351
|
+
LOG: DB node id: 0 backend pid: 18070 statement: /* NO QUERY CACHE */ SELECT * FROM table_cache_ok WHERE a = 1;
|
352
|
+
</pre>
|
353
|
+
|
354
|
+
<p>なおこれは、現実的にはアプリケーションに手を入れることになるでしょう。</p>
|
355
|
+
|
356
|
+
<p class="top_link"><a href="#Top">△ back to top</a></p>
|
357
|
+
|
358
|
+
<!-- ================================================================================ -->
|
359
|
+
|
360
|
+
</div>
|
361
|
+
|
362
|
+
<div class="copyright" style="clear: both">
|
363
|
+
<hr>
|
364
|
+
<copyright>
|
365
|
+
Copyright © 2003 – 2013 pgpool Global Development Group
|
366
|
+
</copyright>
|
367
|
+
</div>
|
368
|
+
|
369
|
+
</body>
|
370
|
+
</html>
|
@@ -0,0 +1,322 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
2
|
+
<html><head>
|
3
|
+
<title>pgpool-II 入门教程 [ 基于内存的查询缓存 ]</title>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
5
|
+
<link href="pgpool.css" rel="stylesheet" type="text/css">
|
6
|
+
</head>
|
7
|
+
<body bgcolor="#ffffff">
|
8
|
+
|
9
|
+
|
10
|
+
<div id="top" class="header_text">pgpool-II 入门教程 [ 基于内存的查询缓存 ]</div>
|
11
|
+
|
12
|
+
<div id="menu">
|
13
|
+
<div id="navcontainer">
|
14
|
+
<ul id="navlist">
|
15
|
+
<li><a href="#thisis">关于本文档</a></li>
|
16
|
+
<li><a href="#basic">基于内存的查询缓存</a>
|
17
|
+
<ul>
|
18
|
+
<li><a href="#memqcache_config">配置 pgpool.conf</a></li>
|
19
|
+
<li><a href="#basic_start">启动 pgpool</a></li>
|
20
|
+
<li><a href="#basic_try">试用查询缓存</a></li>
|
21
|
+
</ul>
|
22
|
+
</li>
|
23
|
+
<li><a href="#more">更多内容</a>
|
24
|
+
<ul>
|
25
|
+
<li><a href="#invalidation">自动失效</a></li>
|
26
|
+
<li><a href="#white_and_black_list">白名单和黑名单</a></li>
|
27
|
+
<li><a href="#cache_or_not">其他内容</a></li>
|
28
|
+
</ul>
|
29
|
+
</li>
|
30
|
+
</ul>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<div class="header_small" align="center">
|
34
|
+
[<a href="tutrial-memqcache-en.html">英文页面</a>]
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
<div id="manual">
|
39
|
+
|
40
|
+
<!-- ================================================================================ -->
|
41
|
+
|
42
|
+
<h1 id="thisis">关于本文档</h1>
|
43
|
+
|
44
|
+
<p>在本教程中,将讲解一个简单的方法来在共享内存中试用“基于内存的查询缓存”。</p>
|
45
|
+
<p>你需要的是一个安装有 PostgreSQL 和 pgpool-II 的 Linux 测试环境。你可以在任何模式中使用
|
46
|
+
基于内存的查询缓存:复制模式,主/备模式和原始模式。</p>
|
47
|
+
|
48
|
+
<p class="top_link"><a href="#Top">返回顶部</a></p>
|
49
|
+
|
50
|
+
<!-- ================================================================================ -->
|
51
|
+
|
52
|
+
<h1 id="basic">基于内存的查询缓存</h1>
|
53
|
+
|
54
|
+
<h2 id="memqcache_config">配置 pgpool.conf</h2>
|
55
|
+
|
56
|
+
<h3>基本参数</h3>
|
57
|
+
|
58
|
+
<p>设置 "memory_cache_enabled" 为 on 以启用基于内存的查询缓存功能。</p>
|
59
|
+
<pre># If on, use the memory cache functionality, off by default
|
60
|
+
memory_cache_enabled = <b>on</b>
|
61
|
+
</pre>
|
62
|
+
|
63
|
+
<p>pgpool 会建立“OID 映射”文件,它用于指明哪个缓存用于哪个数据库和表。指定你希望用于这个用途的目录。</p>
|
64
|
+
<pre># Temporary work directory to record table oids
|
65
|
+
memqcache_oiddir = '/var/log/pgpool/oiddir'
|
66
|
+
</pre>
|
67
|
+
|
68
|
+
<h3 id="config_shmem">关于共享内存</h3>
|
69
|
+
|
70
|
+
<p>参数 "memqcache_method" 用于选择缓存的存储类型,默认为 "shmem"。</p>
|
71
|
+
<pre># Cache storage method. either 'shmem'(shared memory) or 'memcached'. 'shmem' by default
|
72
|
+
memqcache_method = '<b>shmem</b>'
|
73
|
+
</pre>
|
74
|
+
|
75
|
+
<h3>关于日志</h3>
|
76
|
+
<p>参数 "log_per_node_statement" 可以帮助你了解某个查询是在哪个后端上执行。设置本参数为 on。</p>
|
77
|
+
<pre>log_per_node_statement = on
|
78
|
+
# Log all statements
|
79
|
+
# with node and backend informations
|
80
|
+
</pre>
|
81
|
+
|
82
|
+
<h2 id="basic_start">启动 pgpool</h2>
|
83
|
+
|
84
|
+
<p>使用 "-n" 参数(表示以非守护进程模式)启动 pgpool-II 并重定向日志消息到 pgpool.log 中。</p>
|
85
|
+
<pre>$ {installed_dir}/bin/pgpool -n -f {installed_dir}/etc/pgpool.conf > pgpool.log 2>&1
|
86
|
+
</pre>
|
87
|
+
|
88
|
+
<p>建立数据库和表。</p>
|
89
|
+
<pre>$ createdb -p 9999 test
|
90
|
+
|
91
|
+
$ psql -p 9999 test
|
92
|
+
test=> CREATE TABLE table_cache_ok (a INT);
|
93
|
+
CREATE TABLE
|
94
|
+
|
95
|
+
test=> INSERT INTO table_cache_ok VALUES (1), (2), (3);
|
96
|
+
INSERT 0 3
|
97
|
+
|
98
|
+
test=> SELECT * FROM table_cache_ok ORDER BY a;
|
99
|
+
a
|
100
|
+
---
|
101
|
+
1
|
102
|
+
2
|
103
|
+
3
|
104
|
+
(3 rows)
|
105
|
+
</pre>
|
106
|
+
|
107
|
+
<!-- -------------------------------------------------------------------------------- -->
|
108
|
+
|
109
|
+
<h2 id="basic_try">试用查询缓存</h2>
|
110
|
+
|
111
|
+
<p>执行一个 SELECT 语句。</p>
|
112
|
+
<pre>test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
113
|
+
a
|
114
|
+
---
|
115
|
+
1
|
116
|
+
(1 row)
|
117
|
+
</pre>
|
118
|
+
|
119
|
+
<p>log_per_node_statement 的输出显示 SELECT 语句被实际执行了。</p>
|
120
|
+
<pre>LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
121
|
+
</pre>
|
122
|
+
|
123
|
+
<p>再次执行相同的 SELECT 语句。</p>
|
124
|
+
<pre>test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
125
|
+
a
|
126
|
+
---
|
127
|
+
1
|
128
|
+
(1 row)
|
129
|
+
</pre>
|
130
|
+
|
131
|
+
<p>这次日志消息显示 SELECT 语句的结果来源于缓存。</p>
|
132
|
+
<pre>LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
133
|
+
</pre>
|
134
|
+
|
135
|
+
<p class="top_link"><a href="#Top">返回顶部</a></p>
|
136
|
+
|
137
|
+
<!-- ================================================================================ -->
|
138
|
+
|
139
|
+
<h1 id="more">查询缓存的更多内容</h1>
|
140
|
+
|
141
|
+
<h2 id="invalidation">自动失效</h2>
|
142
|
+
|
143
|
+
<h3 id="invalidation_when_update">当一个表被更新</h3>
|
144
|
+
<p>当一个表被更新,这个表中缓存的 SELECT 的结果会过期。
|
145
|
+
pgpool 默认情况下会自动忽略那个表上的所有缓存。</p>
|
146
|
+
|
147
|
+
<h4 id="invalidation_config">配置</h4>
|
148
|
+
<p>通过 "memqcache_auto_cache_invalidation" 指定动作。它的默认值是 "on"。</p>
|
149
|
+
<pre># If on, invalidation of query cache is triggered by corresponding
|
150
|
+
# DDL/DML/DCL(and memqcache_expire). If off, it is only triggered
|
151
|
+
# by memqcache_expire. on by default.
|
152
|
+
memqcache_auto_cache_invalidation = on
|
153
|
+
</pre>
|
154
|
+
|
155
|
+
<p>修改这个参数的值后,重启 pgpool。</p>
|
156
|
+
|
157
|
+
<h4 id="invalidation_try">尝试自动失效的效果</h4>
|
158
|
+
<p>确认你可以从缓存中获得 SELECT 语句的结果。</p>
|
159
|
+
<pre>test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
160
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
161
|
+
</pre>
|
162
|
+
|
163
|
+
<p>在这个表中执行 INSERT INTO 。</p>
|
164
|
+
<pre>test=> INSERT INTO table_cache_ok VALUES (5);
|
165
|
+
INSERT 0 1
|
166
|
+
</pre>
|
167
|
+
|
168
|
+
<p>再次执行相同的 SELECT 语句,这条 SELECT 语句被实际执行。</p>
|
169
|
+
<pre>test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
170
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
171
|
+
</pre>
|
172
|
+
|
173
|
+
<h3 id="expire">缓存过期</h3>
|
174
|
+
<p>pgpool 会忽略比指定过期周期更旧的缓存。</p>
|
175
|
+
|
176
|
+
<h4 id="expire_config">配置</h4>
|
177
|
+
<p>通过 "memqcache_expire" 指定过期周期。默认为 0 秒,不过为了测试我们在这里设置为 5 秒。</p>
|
178
|
+
<pre># Memory cache entry life time specified in seconds.
|
179
|
+
# 0 means infinite life time. 0 by default.
|
180
|
+
memqcache_expire = 5
|
181
|
+
</pre>
|
182
|
+
|
183
|
+
<p>修改这个参数的值后,重启 pgpool。</p>
|
184
|
+
|
185
|
+
<h4 id="expire_try">Try</h4>
|
186
|
+
|
187
|
+
<p>确认你可以从缓存中获得 SELECT 语句的结果。</p>
|
188
|
+
<pre>test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
189
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
190
|
+
</pre>
|
191
|
+
|
192
|
+
<p>等 5 秒钟...</p>
|
193
|
+
|
194
|
+
<p>再次执行相同的 SELECT 语句,这条 SELECT 语句被实际执行。</p>
|
195
|
+
<pre>test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
196
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
197
|
+
</pre>
|
198
|
+
|
199
|
+
<!-- -------------------------------------------------------------------------------- -->
|
200
|
+
|
201
|
+
<h2 id="white_and_black_list">白名单和黑名单</h2>
|
202
|
+
<h3 id="whitelist">只缓存某些表的结果</h3>
|
203
|
+
|
204
|
+
<h4 id="whitelist_config">配置</h4>
|
205
|
+
<p>如果你只想缓存某些表的结果,可以通过 "white_memqcache_table_list" 指定。</p>
|
206
|
+
<p>可以使用正则表达式(会自动添加 ^ 和 $)。</p>
|
207
|
+
<pre>white_memqcache_table_list = '.*_cache_ok'
|
208
|
+
# Comma separated list of table names to memcache
|
209
|
+
# that don't write to database
|
210
|
+
# Regexp are accepted
|
211
|
+
</pre>
|
212
|
+
|
213
|
+
<p>修改这个参数的值后,重新加载配置文件。</p>
|
214
|
+
<pre>$ {installed_dir}/bin/pgpool reload
|
215
|
+
</pre>
|
216
|
+
|
217
|
+
<h4 id="whitelist_try">尝试</h4>
|
218
|
+
<p>建立一个不需要缓存的表</p>
|
219
|
+
<pre>$ psql -p 9999 test
|
220
|
+
test=> CREATE TABLE table_cache_ng (a INT);
|
221
|
+
CREATE TABLE
|
222
|
+
|
223
|
+
test=> INSERT INTO table_cache_ng VALUES (1), (2), (3);
|
224
|
+
INSERT 0 3
|
225
|
+
</pre>
|
226
|
+
|
227
|
+
<p>确认是否 SELECT FROM 在 white_memqcache_table_list 中的表被缓存。</p>
|
228
|
+
<pre>test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
229
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT oid FROM pg_database WHERE datname = 'test'
|
230
|
+
|
231
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
232
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
233
|
+
</pre>
|
234
|
+
|
235
|
+
<p>确认是否 SELECT FROM 不在 white_memqcache_table_list 中的表不被缓存。</p>
|
236
|
+
<pre>test=> SELECT * FROM table_cache_ng WHERE a = 1;
|
237
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
238
|
+
|
239
|
+
test=> SELECT * FROM table_cache_ng WHERE a = 1;
|
240
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
241
|
+
</pre>
|
242
|
+
|
243
|
+
<h3 id="blacklist">不缓存某些表的结果</h3>
|
244
|
+
<h4 id="blacklist_config">Config</h4>
|
245
|
+
<p>如果你不想缓存某些表的结果,可以通过 "black_memqcache_table_list" 指定。</p>
|
246
|
+
<p>可以使用正则表达式(会自动添加 ^ 和 $)。</p>
|
247
|
+
<pre>black_memqcache_table_list = '.*_cache_ng'
|
248
|
+
# Comma separated list of table names not to memcache
|
249
|
+
# that don't write to database
|
250
|
+
# Regexp are accepted
|
251
|
+
</pre>
|
252
|
+
|
253
|
+
<p>修改这个参数的值后,重新加载配置文件。</p>
|
254
|
+
<pre>$ {installed_dir}/bin/pgpool reload
|
255
|
+
</pre>
|
256
|
+
|
257
|
+
<h4 id="blacklist_try">Try</h4>
|
258
|
+
<p>确认是否 SELECT FROM 在 black_memqcache_table_list 中的表不被缓存。</p>
|
259
|
+
<pre>test=> SELECT * FROM table_cache_ng WHERE a = 1;
|
260
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
261
|
+
|
262
|
+
test=> SELECT * FROM table_cache_ng WHERE a = 1;
|
263
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
264
|
+
</pre>
|
265
|
+
|
266
|
+
<p>确认是否 SELECT FROM 不在 black_memqcache_table_list 中的表被缓存。</p>
|
267
|
+
<pre>test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
268
|
+
LOG: DB node id: 0 backend pid: 11203 statement: SELECT oid FROM pg_database WHERE datname = 'test'
|
269
|
+
|
270
|
+
test=> SELECT * FROM table_cache_ok WHERE a = 1;
|
271
|
+
LOG: <b>query result fetched from cache.</b> statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
272
|
+
</pre>
|
273
|
+
|
274
|
+
<!-- -------------------------------------------------------------------------------- -->
|
275
|
+
|
276
|
+
<h2 id="cache_or_not">还有什么内容?</h2>
|
277
|
+
|
278
|
+
<h3 id="maxcacge">太大的结果集</h3>
|
279
|
+
<p>SELECT 的结果集的大小会受限于 "memqcache_maxcache"。</p>
|
280
|
+
<pre># Maximum SELECT result size in bytes.
|
281
|
+
# Must be smaller than memqcache_cache_block_size. Defaults to 400KB.
|
282
|
+
memqcache_maxcache = 409600
|
283
|
+
</pre>
|
284
|
+
|
285
|
+
<p>如果结果集大于 memqcache_maxcache,日志信息会告诉我们。
|
286
|
+
以下是一个示例,memqcache_maxcache 被设置为 1024 字节而 SELECT 出来的表的大小超过 10 MB。</p>
|
287
|
+
<pre>LOG: DB node id: 0 backend pid: 17749 statement: SELECT * FROM pgbench_accounts ;
|
288
|
+
LOG: pool_add_temp_query_cache: <b>data size exceeds memqcache_maxcache</b>.
|
289
|
+
current:983 requested:110 memq_maxcache:1024
|
290
|
+
</pre>
|
291
|
+
|
292
|
+
<h3 id="no_query_cache">指定某个查询不需要缓存</h3>
|
293
|
+
<p>如果白名单和黑名单还不够用,可以在查询最开始的地方
|
294
|
+
put the text "/* NO QUERY CACHE */" at the head of the queries.</p>
|
295
|
+
|
296
|
+
<pre>LOG: statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
297
|
+
LOG: query result fetched from cache. statement: SELECT * FROM table_cache_ok WHERE a = 1;
|
298
|
+
|
299
|
+
LOG: statement: /* NO QUERY CACHE */ SELECT * FROM table_cache_ok WHERE a = 1;
|
300
|
+
LOG: DB node id: 0 backend pid: 18070 statement: /* NO QUERY CACHE */ SELECT * FROM table_cache_ok WHERE a = 1;
|
301
|
+
LOG: statement: /* NO QUERY CACHE */ SELECT * FROM table_cache_ok WHERE a = 1;
|
302
|
+
LOG: DB node id: 0 backend pid: 18070 statement: /* NO QUERY CACHE */ SELECT * FROM table_cache_ok WHERE a = 1;
|
303
|
+
</pre>
|
304
|
+
|
305
|
+
<p>当然,这种方法需要修改你的程序。</p>
|
306
|
+
|
307
|
+
<p class="top_link"><a href="#Top">返回顶部</a></p>
|
308
|
+
|
309
|
+
<!-- ================================================================================ -->
|
310
|
+
|
311
|
+
</div>
|
312
|
+
|
313
|
+
<div class="copyright" style="clear: both">
|
314
|
+
<hr>
|
315
|
+
<copyright>
|
316
|
+
Copyright © 2003 – 2013 pgpool Global Development Group
|
317
|
+
</copyright>
|
318
|
+
</div>
|
319
|
+
|
320
|
+
|
321
|
+
|
322
|
+
</body></html>
|