prestogres 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (393) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +20 -0
  4. data/LICENSE +202 -0
  5. data/NOTICE +22 -0
  6. data/README.md +217 -0
  7. data/Rakefile +13 -0
  8. data/VERSION +1 -0
  9. data/bin/prestogres +254 -0
  10. data/config/pcp.conf.sample +28 -0
  11. data/config/pgpool.conf +678 -0
  12. data/config/pool_hba.conf +84 -0
  13. data/config/pool_passwd +0 -0
  14. data/config/postgresql.conf +2 -0
  15. data/ext/.gitignore +6 -0
  16. data/ext/depend +26 -0
  17. data/ext/extconf.rb +4 -0
  18. data/ext/prestogres_config.c +12 -0
  19. data/pgpool2/.gitignore +36 -0
  20. data/pgpool2/AUTHORS +4 -0
  21. data/pgpool2/COPYING +12 -0
  22. data/pgpool2/ChangeLog +1 -0
  23. data/pgpool2/INSTALL +1 -0
  24. data/pgpool2/Makefile.am +159 -0
  25. data/pgpool2/Makefile.in +1187 -0
  26. data/pgpool2/NEWS +4960 -0
  27. data/pgpool2/README +1 -0
  28. data/pgpool2/README.euc_jp +1 -0
  29. data/pgpool2/README.online-recovery +62 -0
  30. data/pgpool2/TODO +103 -0
  31. data/pgpool2/ac_func_accept_argtypes.m4 +85 -0
  32. data/pgpool2/aclocal.m4 +1088 -0
  33. data/pgpool2/c-compiler.m4 +134 -0
  34. data/pgpool2/c-library.m4 +325 -0
  35. data/pgpool2/child.c +2097 -0
  36. data/pgpool2/config.guess +1532 -0
  37. data/pgpool2/config.h.in +332 -0
  38. data/pgpool2/config.sub +1640 -0
  39. data/pgpool2/configure +15752 -0
  40. data/pgpool2/configure.in +392 -0
  41. data/pgpool2/depcomp +522 -0
  42. data/pgpool2/doc/basebackup.sh +17 -0
  43. data/pgpool2/doc/pgpool-de.html +4220 -0
  44. data/pgpool2/doc/pgpool-en.html +5738 -0
  45. data/pgpool2/doc/pgpool-fr.html +4118 -0
  46. data/pgpool2/doc/pgpool-ja.css +198 -0
  47. data/pgpool2/doc/pgpool-ja.html +11279 -0
  48. data/pgpool2/doc/pgpool-zh_cn.html +4445 -0
  49. data/pgpool2/doc/pgpool.css +280 -0
  50. data/pgpool2/doc/pgpool_remote_start +13 -0
  51. data/pgpool2/doc/recovery.conf.sample +117 -0
  52. data/pgpool2/doc/tutorial-en.html +707 -0
  53. data/pgpool2/doc/tutorial-ja.html +422 -0
  54. data/pgpool2/doc/tutorial-memqcache-en.html +325 -0
  55. data/pgpool2/doc/tutorial-memqcache-ja.html +370 -0
  56. data/pgpool2/doc/tutorial-memqcache-zh_cn.html +322 -0
  57. data/pgpool2/doc/tutorial-watchdog-en.html +306 -0
  58. data/pgpool2/doc/tutorial-watchdog-ja.html +343 -0
  59. data/pgpool2/doc/tutorial-watchdog-zh_cn.html +301 -0
  60. data/pgpool2/doc/tutorial-zh_cn.html +537 -0
  61. data/pgpool2/doc/watchdog.png +0 -0
  62. data/pgpool2/doc/wd-en.html +236 -0
  63. data/pgpool2/doc/wd-en.jpg +0 -0
  64. data/pgpool2/doc/wd-ja.html +219 -0
  65. data/pgpool2/doc/wd-ja.jpg +0 -0
  66. data/pgpool2/doc/wd-zh_cn.html +201 -0
  67. data/pgpool2/doc/where_to_send_queries.odg +0 -0
  68. data/pgpool2/doc/where_to_send_queries.pdf +0 -0
  69. data/pgpool2/general.m4 +166 -0
  70. data/pgpool2/getopt_long.c +200 -0
  71. data/pgpool2/getopt_long.h +44 -0
  72. data/pgpool2/install-sh +251 -0
  73. data/pgpool2/ltmain.sh +8406 -0
  74. data/pgpool2/m4/libtool.m4 +7360 -0
  75. data/pgpool2/m4/ltoptions.m4 +368 -0
  76. data/pgpool2/m4/ltsugar.m4 +123 -0
  77. data/pgpool2/m4/ltversion.m4 +23 -0
  78. data/pgpool2/m4/lt~obsolete.m4 +92 -0
  79. data/pgpool2/main.c +2971 -0
  80. data/pgpool2/md5.c +444 -0
  81. data/pgpool2/md5.h +28 -0
  82. data/pgpool2/missing +360 -0
  83. data/pgpool2/mkinstalldirs +40 -0
  84. data/pgpool2/parser/Makefile.am +50 -0
  85. data/pgpool2/parser/Makefile.in +559 -0
  86. data/pgpool2/parser/copyfuncs.c +3310 -0
  87. data/pgpool2/parser/gram.c +39100 -0
  88. data/pgpool2/parser/gram.h +940 -0
  89. data/pgpool2/parser/gram.y +13408 -0
  90. data/pgpool2/parser/gramparse.h +74 -0
  91. data/pgpool2/parser/keywords.c +32 -0
  92. data/pgpool2/parser/keywords.h +39 -0
  93. data/pgpool2/parser/kwlist.h +425 -0
  94. data/pgpool2/parser/kwlookup.c +88 -0
  95. data/pgpool2/parser/list.c +1156 -0
  96. data/pgpool2/parser/makefuncs.c +518 -0
  97. data/pgpool2/parser/makefuncs.h +83 -0
  98. data/pgpool2/parser/memnodes.h +79 -0
  99. data/pgpool2/parser/nodes.c +29 -0
  100. data/pgpool2/parser/nodes.h +609 -0
  101. data/pgpool2/parser/outfuncs.c +5790 -0
  102. data/pgpool2/parser/parsenodes.h +2615 -0
  103. data/pgpool2/parser/parser.c +262 -0
  104. data/pgpool2/parser/parser.h +46 -0
  105. data/pgpool2/parser/pg_class.h +158 -0
  106. data/pgpool2/parser/pg_config_manual.h +273 -0
  107. data/pgpool2/parser/pg_list.h +352 -0
  108. data/pgpool2/parser/pg_trigger.h +147 -0
  109. data/pgpool2/parser/pg_wchar.h +492 -0
  110. data/pgpool2/parser/pool_memory.c +342 -0
  111. data/pgpool2/parser/pool_memory.h +77 -0
  112. data/pgpool2/parser/pool_parser.h +222 -0
  113. data/pgpool2/parser/pool_string.c +121 -0
  114. data/pgpool2/parser/pool_string.h +37 -0
  115. data/pgpool2/parser/primnodes.h +1280 -0
  116. data/pgpool2/parser/scan.c +4094 -0
  117. data/pgpool2/parser/scan.l +1451 -0
  118. data/pgpool2/parser/scanner.h +120 -0
  119. data/pgpool2/parser/scansup.c +221 -0
  120. data/pgpool2/parser/scansup.h +28 -0
  121. data/pgpool2/parser/snprintf.c +1102 -0
  122. data/pgpool2/parser/stringinfo.c +294 -0
  123. data/pgpool2/parser/stringinfo.h +178 -0
  124. data/pgpool2/parser/value.c +78 -0
  125. data/pgpool2/parser/value.h +62 -0
  126. data/pgpool2/parser/wchar.c +2048 -0
  127. data/pgpool2/pcp.conf.sample +28 -0
  128. data/pgpool2/pcp/Makefile.am +40 -0
  129. data/pgpool2/pcp/Makefile.in +771 -0
  130. data/pgpool2/pcp/libpcp_ext.h +250 -0
  131. data/pgpool2/pcp/md5.c +444 -0
  132. data/pgpool2/pcp/md5.h +28 -0
  133. data/pgpool2/pcp/pcp.c +1652 -0
  134. data/pgpool2/pcp/pcp.h +61 -0
  135. data/pgpool2/pcp/pcp_attach_node.c +172 -0
  136. data/pgpool2/pcp/pcp_detach_node.c +185 -0
  137. data/pgpool2/pcp/pcp_error.c +87 -0
  138. data/pgpool2/pcp/pcp_node_count.c +160 -0
  139. data/pgpool2/pcp/pcp_node_info.c +198 -0
  140. data/pgpool2/pcp/pcp_pool_status.c +166 -0
  141. data/pgpool2/pcp/pcp_proc_count.c +166 -0
  142. data/pgpool2/pcp/pcp_proc_info.c +261 -0
  143. data/pgpool2/pcp/pcp_promote_node.c +185 -0
  144. data/pgpool2/pcp/pcp_recovery_node.c +172 -0
  145. data/pgpool2/pcp/pcp_stop_pgpool.c +179 -0
  146. data/pgpool2/pcp/pcp_stream.c +385 -0
  147. data/pgpool2/pcp/pcp_stream.h +52 -0
  148. data/pgpool2/pcp/pcp_systemdb_info.c +194 -0
  149. data/pgpool2/pcp/pcp_watchdog_info.c +211 -0
  150. data/pgpool2/pcp_child.c +1493 -0
  151. data/pgpool2/pg_md5.c +305 -0
  152. data/pgpool2/pgpool.8.in +121 -0
  153. data/pgpool2/pgpool.conf +553 -0
  154. data/pgpool2/pgpool.conf.sample +666 -0
  155. data/pgpool2/pgpool.conf.sample-master-slave +665 -0
  156. data/pgpool2/pgpool.conf.sample-replication +664 -0
  157. data/pgpool2/pgpool.conf.sample-stream +664 -0
  158. data/pgpool2/pgpool.spec +264 -0
  159. data/pgpool2/pgpool_adm/TODO +7 -0
  160. data/pgpool2/pgpool_adm/pgpool_adm--1.0.sql +85 -0
  161. data/pgpool2/pgpool_adm/pgpool_adm.c +558 -0
  162. data/pgpool2/pgpool_adm/pgpool_adm.control +5 -0
  163. data/pgpool2/pgpool_adm/pgpool_adm.h +46 -0
  164. data/pgpool2/pgpool_adm/pgpool_adm.sql.in +85 -0
  165. data/pgpool2/pool.h +655 -0
  166. data/pgpool2/pool_auth.c +1390 -0
  167. data/pgpool2/pool_config.c +5007 -0
  168. data/pgpool2/pool_config.h +284 -0
  169. data/pgpool2/pool_config.l +3281 -0
  170. data/pgpool2/pool_config_md5.c +29 -0
  171. data/pgpool2/pool_connection_pool.c +812 -0
  172. data/pgpool2/pool_error.c +242 -0
  173. data/pgpool2/pool_globals.c +27 -0
  174. data/pgpool2/pool_hba.c +1723 -0
  175. data/pgpool2/pool_hba.conf.sample +67 -0
  176. data/pgpool2/pool_ip.c +567 -0
  177. data/pgpool2/pool_ip.h +65 -0
  178. data/pgpool2/pool_ipc.h +38 -0
  179. data/pgpool2/pool_lobj.c +242 -0
  180. data/pgpool2/pool_lobj.h +32 -0
  181. data/pgpool2/pool_memqcache.c +3818 -0
  182. data/pgpool2/pool_memqcache.h +268 -0
  183. data/pgpool2/pool_params.c +163 -0
  184. data/pgpool2/pool_passwd.c +249 -0
  185. data/pgpool2/pool_passwd.h +41 -0
  186. data/pgpool2/pool_path.c +193 -0
  187. data/pgpool2/pool_path.h +81 -0
  188. data/pgpool2/pool_process_context.c +247 -0
  189. data/pgpool2/pool_process_context.h +62 -0
  190. data/pgpool2/pool_process_query.c +5001 -0
  191. data/pgpool2/pool_process_reporting.c +1671 -0
  192. data/pgpool2/pool_process_reporting.h +44 -0
  193. data/pgpool2/pool_proto2.c +671 -0
  194. data/pgpool2/pool_proto_modules.c +3524 -0
  195. data/pgpool2/pool_proto_modules.h +185 -0
  196. data/pgpool2/pool_query_cache.c +1020 -0
  197. data/pgpool2/pool_query_context.c +1871 -0
  198. data/pgpool2/pool_query_context.h +105 -0
  199. data/pgpool2/pool_relcache.c +284 -0
  200. data/pgpool2/pool_relcache.h +78 -0
  201. data/pgpool2/pool_rewrite_outfuncs.c +9060 -0
  202. data/pgpool2/pool_rewrite_query.c +715 -0
  203. data/pgpool2/pool_rewrite_query.h +192 -0
  204. data/pgpool2/pool_select_walker.c +1150 -0
  205. data/pgpool2/pool_select_walker.h +68 -0
  206. data/pgpool2/pool_sema.c +161 -0
  207. data/pgpool2/pool_session_context.c +952 -0
  208. data/pgpool2/pool_session_context.h +203 -0
  209. data/pgpool2/pool_shmem.c +185 -0
  210. data/pgpool2/pool_signal.c +158 -0
  211. data/pgpool2/pool_signal.h +61 -0
  212. data/pgpool2/pool_ssl.c +339 -0
  213. data/pgpool2/pool_stream.c +962 -0
  214. data/pgpool2/pool_stream.h +61 -0
  215. data/pgpool2/pool_system.c +659 -0
  216. data/pgpool2/pool_timestamp.c +1215 -0
  217. data/pgpool2/pool_timestamp.h +38 -0
  218. data/pgpool2/pool_type.h +171 -0
  219. data/pgpool2/pool_worker_child.c +384 -0
  220. data/pgpool2/ps_status.c +404 -0
  221. data/pgpool2/recovery.c +435 -0
  222. data/pgpool2/redhat/pgpool.conf.sample.patch +52 -0
  223. data/pgpool2/redhat/pgpool.init +201 -0
  224. data/pgpool2/redhat/pgpool.sysconfig +7 -0
  225. data/pgpool2/redhat/rpm_installer/basebackup-replication.sh +53 -0
  226. data/pgpool2/redhat/rpm_installer/basebackup-stream.sh +55 -0
  227. data/pgpool2/redhat/rpm_installer/config_for_script +17 -0
  228. data/pgpool2/redhat/rpm_installer/failover.sh +64 -0
  229. data/pgpool2/redhat/rpm_installer/getsources.sh +141 -0
  230. data/pgpool2/redhat/rpm_installer/install.sh +1363 -0
  231. data/pgpool2/redhat/rpm_installer/pgpool_recovery_pitr +47 -0
  232. data/pgpool2/redhat/rpm_installer/pgpool_remote_start +15 -0
  233. data/pgpool2/redhat/rpm_installer/recovery.conf +4 -0
  234. data/pgpool2/redhat/rpm_installer/uninstall.sh +57 -0
  235. data/pgpool2/sample/dist_def_pgbench.sql +73 -0
  236. data/pgpool2/sample/pgpool.pam +3 -0
  237. data/pgpool2/sample/pgpool_recovery +20 -0
  238. data/pgpool2/sample/pgpool_recovery_pitr +19 -0
  239. data/pgpool2/sample/pgpool_remote_start +13 -0
  240. data/pgpool2/sample/replicate_def_pgbench.sql +18 -0
  241. data/pgpool2/sql/insert_lock.sql +15 -0
  242. data/pgpool2/sql/pgpool-recovery/pgpool-recovery.c +280 -0
  243. data/pgpool2/sql/pgpool-recovery/pgpool-recovery.sql.in +19 -0
  244. data/pgpool2/sql/pgpool-recovery/pgpool_recovery--1.0.sql +24 -0
  245. data/pgpool2/sql/pgpool-recovery/pgpool_recovery.control +5 -0
  246. data/pgpool2/sql/pgpool-recovery/uninstall_pgpool-recovery.sql +3 -0
  247. data/pgpool2/sql/pgpool-regclass/pgpool-regclass.c +206 -0
  248. data/pgpool2/sql/pgpool-regclass/pgpool-regclass.sql.in +4 -0
  249. data/pgpool2/sql/pgpool-regclass/pgpool_regclass--1.0.sql +7 -0
  250. data/pgpool2/sql/pgpool-regclass/pgpool_regclass.control +5 -0
  251. data/pgpool2/sql/pgpool-regclass/uninstall_pgpool-regclass.sql +1 -0
  252. data/pgpool2/sql/system_db.sql +38 -0
  253. data/pgpool2/strlcpy.c +85 -0
  254. data/pgpool2/test/C/test_extended.c +98 -0
  255. data/pgpool2/test/jdbc/.cvsignore +2 -0
  256. data/pgpool2/test/jdbc/AutoCommitTest.java +45 -0
  257. data/pgpool2/test/jdbc/BatchTest.java +55 -0
  258. data/pgpool2/test/jdbc/ColumnTest.java +60 -0
  259. data/pgpool2/test/jdbc/CreateTempTableTest.java +48 -0
  260. data/pgpool2/test/jdbc/InsertTest.java +34 -0
  261. data/pgpool2/test/jdbc/LockTest.java +36 -0
  262. data/pgpool2/test/jdbc/PgpoolTest.java +75 -0
  263. data/pgpool2/test/jdbc/README.euc_jp +73 -0
  264. data/pgpool2/test/jdbc/RunTest.java +83 -0
  265. data/pgpool2/test/jdbc/SelectTest.java +37 -0
  266. data/pgpool2/test/jdbc/UpdateTest.java +32 -0
  267. data/pgpool2/test/jdbc/expected/CreateTempTable +1 -0
  268. data/pgpool2/test/jdbc/expected/autocommit +10 -0
  269. data/pgpool2/test/jdbc/expected/batch +1 -0
  270. data/pgpool2/test/jdbc/expected/column +100 -0
  271. data/pgpool2/test/jdbc/expected/insert +1 -0
  272. data/pgpool2/test/jdbc/expected/lock +100 -0
  273. data/pgpool2/test/jdbc/expected/select +2 -0
  274. data/pgpool2/test/jdbc/expected/update +1 -0
  275. data/pgpool2/test/jdbc/pgpool.properties +7 -0
  276. data/pgpool2/test/jdbc/prepare.sql +54 -0
  277. data/pgpool2/test/jdbc/run.sh +6 -0
  278. data/pgpool2/test/parser/.cvsignore +6 -0
  279. data/pgpool2/test/parser/README +32 -0
  280. data/pgpool2/test/parser/expected/copy.out +17 -0
  281. data/pgpool2/test/parser/expected/create.out +64 -0
  282. data/pgpool2/test/parser/expected/cursor.out +37 -0
  283. data/pgpool2/test/parser/expected/delete.out +10 -0
  284. data/pgpool2/test/parser/expected/drop.out +12 -0
  285. data/pgpool2/test/parser/expected/insert.out +13 -0
  286. data/pgpool2/test/parser/expected/misc.out +28 -0
  287. data/pgpool2/test/parser/expected/prepare.out +4 -0
  288. data/pgpool2/test/parser/expected/privileges.out +31 -0
  289. data/pgpool2/test/parser/expected/scanner.out +30 -0
  290. data/pgpool2/test/parser/expected/select.out +89 -0
  291. data/pgpool2/test/parser/expected/transaction.out +38 -0
  292. data/pgpool2/test/parser/expected/update.out +11 -0
  293. data/pgpool2/test/parser/expected/v84.out +37 -0
  294. data/pgpool2/test/parser/expected/v90.out +25 -0
  295. data/pgpool2/test/parser/expected/var.out +22 -0
  296. data/pgpool2/test/parser/input/alter.sql +2 -0
  297. data/pgpool2/test/parser/input/copy.sql +17 -0
  298. data/pgpool2/test/parser/input/create.sql +64 -0
  299. data/pgpool2/test/parser/input/cursor.sql +37 -0
  300. data/pgpool2/test/parser/input/delete.sql +10 -0
  301. data/pgpool2/test/parser/input/drop.sql +12 -0
  302. data/pgpool2/test/parser/input/insert.sql +13 -0
  303. data/pgpool2/test/parser/input/misc.sql +28 -0
  304. data/pgpool2/test/parser/input/prepare.sql +4 -0
  305. data/pgpool2/test/parser/input/privileges.sql +31 -0
  306. data/pgpool2/test/parser/input/scanner.sql +34 -0
  307. data/pgpool2/test/parser/input/select.sql +89 -0
  308. data/pgpool2/test/parser/input/transaction.sql +38 -0
  309. data/pgpool2/test/parser/input/update.sql +11 -0
  310. data/pgpool2/test/parser/input/v84.sql +37 -0
  311. data/pgpool2/test/parser/input/v90.sql +38 -0
  312. data/pgpool2/test/parser/input/var.sql +22 -0
  313. data/pgpool2/test/parser/main.c +96 -0
  314. data/pgpool2/test/parser/parse_schedule +16 -0
  315. data/pgpool2/test/parser/pool.h +13 -0
  316. data/pgpool2/test/parser/run-test +62 -0
  317. data/pgpool2/test/pdo-test/README.euc_jp +58 -0
  318. data/pgpool2/test/pdo-test/SQLlist/test1.sql +3 -0
  319. data/pgpool2/test/pdo-test/SQLlist/test2.sql +3 -0
  320. data/pgpool2/test/pdo-test/collections.inc +11 -0
  321. data/pgpool2/test/pdo-test/def.inc +7 -0
  322. data/pgpool2/test/pdo-test/log.txt +0 -0
  323. data/pgpool2/test/pdo-test/mod/database.inc +36 -0
  324. data/pgpool2/test/pdo-test/mod/def.inc +0 -0
  325. data/pgpool2/test/pdo-test/mod/errorhandler.inc +27 -0
  326. data/pgpool2/test/pdo-test/pdotest.php +11 -0
  327. data/pgpool2/test/pdo-test/regsql.inc +56 -0
  328. data/pgpool2/test/pgpool_setup +898 -0
  329. data/pgpool2/test/regression/README +39 -0
  330. data/pgpool2/test/regression/clean.sh +21 -0
  331. data/pgpool2/test/regression/libs.sh +16 -0
  332. data/pgpool2/test/regression/regress.sh +166 -0
  333. data/pgpool2/test/regression/tests/001.load_balance/test.sh +128 -0
  334. data/pgpool2/test/regression/tests/002.native_replication/PgTester.java +47 -0
  335. data/pgpool2/test/regression/tests/002.native_replication/create.sql +6 -0
  336. data/pgpool2/test/regression/tests/002.native_replication/test.sh +71 -0
  337. data/pgpool2/test/regression/tests/003.failover/expected.r +6 -0
  338. data/pgpool2/test/regression/tests/003.failover/expected.s +6 -0
  339. data/pgpool2/test/regression/tests/003.failover/test.sh +45 -0
  340. data/pgpool2/test/regression/tests/004.watchdog/master.conf +12 -0
  341. data/pgpool2/test/regression/tests/004.watchdog/standby.conf +19 -0
  342. data/pgpool2/test/regression/tests/004.watchdog/test.sh +52 -0
  343. data/pgpool2/test/regression/tests/050.bug58/test.sh +50 -0
  344. data/pgpool2/test/regression/tests/051.bug60/bug.sql +12 -0
  345. data/pgpool2/test/regression/tests/051.bug60/database-clean.sql +6 -0
  346. data/pgpool2/test/regression/tests/051.bug60/database-setup.sql +28 -0
  347. data/pgpool2/test/regression/tests/051.bug60/test.sh +79 -0
  348. data/pgpool2/test/regression/tests/052.do_query/test.sh +44 -0
  349. data/pgpool2/test/regression/tests/053.insert_lock_hangs/test.sh +81 -0
  350. data/pgpool2/test/regression/tests/054.postgres_fdw/test.sh +67 -0
  351. data/pgpool2/test/regression/tests/055.backend_all_down/test.sh +52 -0
  352. data/pgpool2/test/regression/tests/056.bug63/jdbctest2.java +66 -0
  353. data/pgpool2/test/regression/tests/056.bug63/test.sh +47 -0
  354. data/pgpool2/test/regression/tests/057.bug61/test.sh +40 -0
  355. data/pgpool2/test/regression/tests/058.bug68/jdbctest3.java +45 -0
  356. data/pgpool2/test/regression/tests/058.bug68/test.sh +47 -0
  357. data/pgpool2/test/timestamp/expected/insert.out +16 -0
  358. data/pgpool2/test/timestamp/expected/misc.out +3 -0
  359. data/pgpool2/test/timestamp/expected/update.out +6 -0
  360. data/pgpool2/test/timestamp/input/insert.sql +16 -0
  361. data/pgpool2/test/timestamp/input/misc.sql +3 -0
  362. data/pgpool2/test/timestamp/input/update.sql +6 -0
  363. data/pgpool2/test/timestamp/main.c +129 -0
  364. data/pgpool2/test/timestamp/parse_schedule +3 -0
  365. data/pgpool2/test/timestamp/run-test +69 -0
  366. data/pgpool2/version.h +1 -0
  367. data/pgpool2/watchdog/Makefile.am +17 -0
  368. data/pgpool2/watchdog/Makefile.in +505 -0
  369. data/pgpool2/watchdog/test/stab.c +266 -0
  370. data/pgpool2/watchdog/test/test.c +85 -0
  371. data/pgpool2/watchdog/test/wd_child_t.c +87 -0
  372. data/pgpool2/watchdog/test/wd_lifecheck_t.c +87 -0
  373. data/pgpool2/watchdog/test/wd_packet_t.c +87 -0
  374. data/pgpool2/watchdog/test/wd_ping_t.c +20 -0
  375. data/pgpool2/watchdog/watchdog.c +408 -0
  376. data/pgpool2/watchdog/watchdog.h +209 -0
  377. data/pgpool2/watchdog/wd_child.c +444 -0
  378. data/pgpool2/watchdog/wd_ext.h +123 -0
  379. data/pgpool2/watchdog/wd_heartbeat.c +577 -0
  380. data/pgpool2/watchdog/wd_if.c +216 -0
  381. data/pgpool2/watchdog/wd_init.c +126 -0
  382. data/pgpool2/watchdog/wd_interlock.c +347 -0
  383. data/pgpool2/watchdog/wd_lifecheck.c +512 -0
  384. data/pgpool2/watchdog/wd_list.c +429 -0
  385. data/pgpool2/watchdog/wd_packet.c +1159 -0
  386. data/pgpool2/watchdog/wd_ping.c +330 -0
  387. data/pgpool2/ylwrap +223 -0
  388. data/pgsql/presto_client.py +346 -0
  389. data/pgsql/prestogres.py +156 -0
  390. data/pgsql/setup_functions.sql +21 -0
  391. data/pgsql/setup_language.sql +3 -0
  392. data/prestogres.gemspec +23 -0
  393. metadata +496 -0
@@ -0,0 +1,280 @@
1
+ ul#navlist
2
+ {
3
+ width: 158px>;
4
+ \width: 160px;
5
+ w\idth: 158px;
6
+ padding: 0px;
7
+ border: 1px solid #808080;
8
+ border-top: 0px;
9
+ margin: 0px;
10
+ font: bold 12px verdana,helvetica,arial,sans-serif;
11
+ background: #808080;
12
+ }
13
+
14
+ ul#navlist li
15
+ {
16
+ list-style: none;
17
+ margin: 0px;
18
+ border: 0px;
19
+ border-top: 1px solid #808080;
20
+ font-size:7pt;
21
+ }
22
+
23
+ ul#navlist li a
24
+ {
25
+ display: block;
26
+ width: 122px;
27
+ \width: 158px;
28
+ w\idth: 122px;
29
+ padding: 4px 8px 4px 8px;
30
+ border: 0px;
31
+ border-left: 20px solid #aaaabb;
32
+ background: #ccccdd;
33
+ text-decoration: none;
34
+ text-align: right;
35
+
36
+ }
37
+
38
+ ul#navlist li a:link { color: #666677; }
39
+ div#navcontainer li a:visited { color: #666677; }
40
+
41
+ ul#navlist li a:hover
42
+ {
43
+ border-color: #ff9000;
44
+ color: #ffffff;
45
+ background: #000d33;
46
+ }
47
+
48
+ ul#navlist li > ul
49
+ {
50
+ margin-left: 0px;
51
+ padding-left: 0px;
52
+ }
53
+ ul#navlist li > ul li a {
54
+ border-left: 20px solid #B9B9CE;
55
+ background: #DEDEEF;
56
+ }
57
+
58
+ /* --------------------------- */
59
+ #menu {
60
+ border-right:1px dotted #cccccc;
61
+ float: left;
62
+ padding-top: 20px;
63
+ }
64
+ #navcontainer {
65
+ margin-bottom: 20px;
66
+ }
67
+ #manual {
68
+ border-left:1px dotted #cccccc;
69
+ width: 800px;
70
+ float: left;
71
+ }
72
+ body {
73
+ font-family:Verdana, Arial, Helvetica, sans-serif;
74
+ font-size:9pt;
75
+ margin: 0px;
76
+ color: black;
77
+ border-left: 20px solid #ccc;
78
+ }
79
+ pre {
80
+ background-color:#f0f0f0;
81
+ color: brown;
82
+ padding: 5px;
83
+ margin-left:40px;
84
+ margin-right:30px;
85
+ word-wrap: break-word;
86
+ word-break: break-all;
87
+ overflow: auto;
88
+ }
89
+ h1 {
90
+ margin-top: 50px;
91
+ border-bottom: 2px solid #6699CC;
92
+ padding: 5px;
93
+ margin-left:10px;
94
+ background:#6699CC;
95
+ color: #ffffff;
96
+ }
97
+ h2 {
98
+ margin-top: 30px;
99
+ padding: 5px;
100
+ margin-left:30px;
101
+ background: #8CD8E2;
102
+ }
103
+
104
+ h3 {
105
+ margin-top: 30px;
106
+ border: 2px solid #8CD8E2;
107
+ border-left: 10px solid #8CD8E2;
108
+ padding: 5px;
109
+ margin-left:40px;
110
+ background: #F4F8F1;
111
+ }
112
+
113
+ h4 {
114
+ border-bottom: 2px solid #8CD8E2;
115
+ padding: 5px;
116
+ margin-left:40px;
117
+ background: #F4F8F1;
118
+ }
119
+
120
+ p {
121
+ margin: 3px 25px 3px 40px;
122
+ text-indent: 1em;
123
+ }
124
+
125
+ li p, dd p {
126
+ text-indent: 0em;
127
+ color: black;
128
+ }
129
+
130
+ ul, ol,dl {
131
+ margin-left:40px;
132
+ padding-right: 30px;
133
+ }
134
+ dt {
135
+ font-weight:bold;
136
+ }
137
+
138
+ ul li {
139
+ padding-right: 30px;
140
+ list-style:square;
141
+ color: #663333;
142
+ }
143
+
144
+ ul li ul li {
145
+ list-style: circle;
146
+ }
147
+
148
+ ul li ol li {
149
+ list-style: decimal;
150
+ }
151
+
152
+
153
+ ol li {
154
+ padding-right: 30px;
155
+ color: #663333;
156
+ }
157
+
158
+
159
+ table {
160
+ margin-left:40px;
161
+ border-collapse: collapse;
162
+ border: #666666 1px solid;
163
+ margin-bottom: 10px;
164
+ }
165
+ th, td {
166
+ padding: 5px;
167
+ font-size:10pt;
168
+ }
169
+ th {
170
+ font-weight: normal;
171
+ background-color: #eeeeee;
172
+ }
173
+ th.nodec {
174
+ text-align: left;
175
+ white-space: nowrap;
176
+ }
177
+ tr.header th {
178
+ font-weight: bold;
179
+ background-color: #cccccc;
180
+ border-bottom: double;
181
+ }
182
+ tr.center td {
183
+ text-align: center;
184
+ }
185
+
186
+ dd {
187
+ margin-left: 0px;
188
+ }
189
+ a:link { color: blue; }
190
+ a:hover { color: red; }
191
+
192
+ p.top_link {
193
+ text-align: right;
194
+ }
195
+ p.top_link a {
196
+ text-decoration: none;
197
+ border: #aaaaaa 1px solid;
198
+ border-radius: 3px;
199
+ background-color: #eeeeee;
200
+ padding: 1px 5px;
201
+ color: #666666;
202
+ }
203
+ .header_small {
204
+ font-size: 0.9em;
205
+ background-color: #f0f0f0;
206
+
207
+ }
208
+ .header_text {
209
+ border-bottom: 2px solid #663366;
210
+ padding: 5px;
211
+ background-color: #E9F8F8;
212
+ font-size: 2em;
213
+ font-weight:bold;
214
+ padding:25px;
215
+ }
216
+
217
+ .copyright {
218
+ padding: 5px;
219
+ padding:25px;
220
+ text-align:center;
221
+ }
222
+ .version {
223
+ font-size: smaller;
224
+ font-weight: bold;
225
+ border: 1px solid #B27F00;
226
+ background-color: orange;
227
+ padding: 1px 3px;
228
+ border-radius: 3px;
229
+ color: white;
230
+ }
231
+ h1 .version {
232
+ border-radius: 5px;
233
+ border-color: white;
234
+ }
235
+ .version_notice {
236
+ border-left: 7px solid orange;
237
+ border-right: 5px solid orange;
238
+ padding: 5px;
239
+ }
240
+ .caution {
241
+ font-weight: bold;
242
+ color: red;
243
+ }
244
+ dl.flat dt {
245
+ clear: both;
246
+ float: left;
247
+ width: 40px;
248
+ line-height: 150%;
249
+ }
250
+ dl.flat dd {
251
+ padding-left: 50px;
252
+ line-height: 150%;
253
+ }
254
+ dl.flat dd * {
255
+ margin-left: 0px;
256
+ }
257
+ li dl dt {
258
+ font-weight: normal;
259
+ display: list-item;
260
+ list-style: square outside;
261
+ }
262
+ li dl dd {
263
+ margin-bottom: 10px;
264
+ }
265
+ ul.flat_ul {
266
+ margin: 0px;
267
+ list-style-type: none;
268
+ }
269
+ ul.flat_ul li {
270
+ display: inline-block;
271
+ border: 1px solid #666;
272
+ border-radius: 3px;
273
+ width: 100px;
274
+ margin: 3px;
275
+ padding: 0px;
276
+ text-align: center;
277
+ }
278
+ ul.flat_ul li a {
279
+ text-decoration: none;
280
+ }
@@ -0,0 +1,13 @@
1
+ #! /bin/sh
2
+
3
+ if [ $# -ne 2 ]
4
+ then
5
+ echo "pgpool_remote_start remote_host remote_datadir"
6
+ exit 1
7
+ fi
8
+
9
+ DEST=$1
10
+ DESTDIR=$2
11
+ PGCTL=/usr/local/pgsql/bin/pg_ctl
12
+
13
+ ssh -T $DEST $PGCTL -w -D $DESTDIR start 2>/dev/null 1>/dev/null < /dev/null &
@@ -0,0 +1,117 @@
1
+ # -------------------------------
2
+ # PostgreSQL recovery config file
3
+ # -------------------------------
4
+ #
5
+ # Edit this file to provide the parameters that PostgreSQL needs to
6
+ # perform an archive recovery of a database, or to act as a log-streaming
7
+ # replication standby.
8
+ #
9
+ # If "recovery.conf" is present in the PostgreSQL data directory, it is
10
+ # read on postmaster startup. After successful recovery, it is renamed
11
+ # to "recovery.done" to ensure that we do not accidentally re-enter
12
+ # archive recovery or standby mode.
13
+ #
14
+ # This file consists of lines of the form:
15
+ #
16
+ # name = 'value'
17
+ #
18
+ # (The quotes around the value are NOT optional, but the "=" is.)
19
+ #
20
+ # Comments are introduced with '#'.
21
+ #
22
+ # The complete list of option names and allowed values can be found
23
+ # in the PostgreSQL documentation.
24
+ #
25
+ #---------------------------------------------------------------------------
26
+ # ARCHIVE RECOVERY PARAMETERS
27
+ #---------------------------------------------------------------------------
28
+ #
29
+ # restore_command
30
+ #
31
+ # specifies the shell command that is executed to copy log files
32
+ # back from archival storage. The command string may contain %f,
33
+ # which is replaced by the name of the desired log file, and %p,
34
+ # which is replaced by the absolute path to copy the log file to.
35
+ #
36
+ # This parameter is *required* for an archive recovery, but optional
37
+ # for streaming replication.
38
+ #
39
+ # It is important that the command return nonzero exit status on failure.
40
+ # The command *will* be asked for log files that are not present in the
41
+ # archive; it must return nonzero when so asked.
42
+ #
43
+ # NOTE that the basename of %p will be different from %f; do not
44
+ # expect them to be interchangeable.
45
+ #
46
+ #restore_command = '' # e.g. 'cp /mnt/server/archivedir/%f %p'
47
+ #
48
+ #
49
+ # archive_cleanup_command
50
+ #
51
+ # specifies an optional shell command to execute at every restartpoint.
52
+ # This can be useful for cleaning up the archive of a standby server.
53
+ #
54
+ #archive_cleanup_command = ''
55
+ #
56
+ # recovery_end_command
57
+ #
58
+ # specifies an optional shell command to execute at completion of recovery.
59
+ # This can be useful for cleaning up after the restore_command.
60
+ #
61
+ #recovery_end_command = ''
62
+ #
63
+ #---------------------------------------------------------------------------
64
+ # RECOVERY TARGET PARAMETERS
65
+ #---------------------------------------------------------------------------
66
+ #
67
+ # By default, recovery will rollforward to the end of the WAL log.
68
+ # If you want to stop rollforward at a specific point, you
69
+ # must set a recovery target.
70
+ #
71
+ # You may set a recovery target either by transactionId, or
72
+ # by timestamp. Recovery may either include or exclude the
73
+ # transaction(s) with the recovery target value (ie, stop either
74
+ # just after or just before the given target, respectively).
75
+ #
76
+ #recovery_target_time = '' # e.g. '2004-07-14 22:39:00 EST'
77
+ #
78
+ #recovery_target_xid = ''
79
+ #
80
+ #recovery_target_inclusive = 'true'
81
+ #
82
+ #
83
+ # If you want to recover into a timeline other than the "main line" shown in
84
+ # pg_control, specify the timeline number here, or write 'latest' to get
85
+ # the latest branch for which there's a history file.
86
+ #
87
+ #recovery_target_timeline = 'latest'
88
+ #
89
+ #---------------------------------------------------------------------------
90
+ # STANDBY SERVER PARAMETERS
91
+ #---------------------------------------------------------------------------
92
+ #
93
+ # When standby_mode is enabled, the PostgreSQL server will work as
94
+ # a standby. It tries to connect to the primary according to the
95
+ # connection settings primary_conninfo, and receives XLOG records
96
+ # continuously.
97
+ #
98
+ #standby_mode = 'off'
99
+ #
100
+ #primary_conninfo = '' # e.g. 'host=localhost port=5432'
101
+ #
102
+ #
103
+ # By default, a standby server keeps streaming XLOG records from the
104
+ # primary indefinitely. If you want to stop streaming and finish recovery,
105
+ # opening up the system in read/write mode, specify path to a trigger file.
106
+ # Server will poll the trigger file path periodically and stop streaming
107
+ # when it's found.
108
+ #
109
+ #trigger_file = ''
110
+ #
111
+ #---------------------------------------------------------------------------
112
+ # HOT STANDBY PARAMETERS
113
+ #---------------------------------------------------------------------------
114
+ #
115
+ # Hot Standby related parameters are listed in postgresql.conf
116
+ #
117
+ #---------------------------------------------------------------------------
@@ -0,0 +1,707 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2
+
3
+ <html>
4
+
5
+ <head>
6
+ <title>pgpool-II Tutorial</title>
7
+ <meta http-equiv="Content-Type" content="text/html" />
8
+ <link href="pgpool.css" rel="stylesheet" type="text/css" />
9
+ </head>
10
+
11
+ <body>
12
+ <h1>pgpool-II Tutorial</h1>
13
+ <p>Welcome to the Tutorial for pgpool-II. From here, you can learn how
14
+ to install, setup, and run parallel queries or do replication using
15
+ pgpool-II. We assume that you already know basic PostreSQL operations,
16
+ so please refer to the PostgreSQL document if neccesary.</p>
17
+
18
+ <dl>
19
+ <dt><em>Table of Contents</em></dt>
20
+ <dt>1. <a href="#start">Let's Begin!</a></dt>
21
+ <dd>1.1. <a href="#install">Installing pgpool-II</a></dd>
22
+ <dd>1.2. <a href="#config">Configuration Files</a></dd>
23
+ <dd>1.3. <a href="#pcp-config">Configuring PCP commands</a></dd>
24
+ <dd>1.4. <a href="#db-node">Preparing Database Nodes</a></dd>
25
+ <dd>1.5. <a href="#start-shutdown">Starting/Stopping pgpool-II</a></dd>
26
+ <dt>2. <a href="#replication">Your First Replication</a></dt>
27
+ <dd>2.1. <a href="#replication-config">Configuring Replication</a></dd>
28
+ <dd>2.2. <a href="#replication-check">Checking Replication</a></dd>
29
+ <dt>3. <a href="#parallel">Your First Parallel Query</a></dt>
30
+ <dd>3.1. <a href="#parallel-config">Configuring Parallel Query</a></dd>
31
+ <dd>3.2. <a href="#system-db">Configuring the System Database</a></dd>
32
+ <dd>3.3. <a href="#dist-def">Partitioning Rule Definition</a></dd>
33
+ <dd>3.4. <a href="#replicate-def">Replication Rule Definition</a></dd>
34
+ <dd>3.5. <a href="#parallel-check">Checking Parallel Query</a></dd>
35
+ </dl>
36
+
37
+
38
+ <h2>1. <a name="start">Let's Begin!</a></h2>
39
+
40
+ <p>First, we must learn how to install and configure pgpool-II and
41
+ database nodes before using replication or parallel query.</p>
42
+
43
+ <h3>1.1. <a name="install">Installing pgpool-II</a></h3>
44
+
45
+ <p>Installing pgpool-II is very easy. In the directory which you have
46
+ extracted the source tar ball, execute the following commands.</p>
47
+
48
+ <pre>
49
+ $ ./configure
50
+ $ make
51
+ $ make install
52
+ </pre>
53
+
54
+ <p><code>configure</code> script collects your system information
55
+ and use it for the compilation procedure. You can pass command line
56
+ arguments to <code>configure</code> script to change the default
57
+ behavior, such as the installation directory. pgpool-II will be
58
+ installed to <code>/usr/local</code> directory by default.</p>
59
+
60
+ <p><code>make</code> command compiles the source code, and <code>make
61
+ install</code> will install the executables. You must have write
62
+ permission on the installation directory.</p>
63
+
64
+ <p>In this tutorial, we will install pgpool-II in the default
65
+ <code>/usr/local</code> directory.</p>
66
+
67
+ <p><em>Note</em>: pgpool-II requires libpq library in PostgreSQL 7.4
68
+ or later (version 3 protocol). If the <code>configure</code> script
69
+ displays the following error message, the libpq library may not be
70
+ installed, or it is not of version 3.</p>
71
+
72
+ <pre>configure: error: libpq is not installed or libpq is old</pre>
73
+
74
+ <p>If the library is version 3, but the above message is still displayed,
75
+ your libpq library is probably not recognized by
76
+ the <code>configure</code> script.</p>
77
+
78
+ <p>The <code>configure</code> script searches for libpq library under
79
+ <code>/usr/local/pgsql</code>. If you have installed
80
+ PostgreSQL in a directory other than <code>/usr/local/pgsql</code>,
81
+ use <code>--with-pgsql</code>, or <code>--with-pgsql-includedir</code>
82
+ and <code>--with-pgsql-libdir</code> command line options when you
83
+ execute <code>configure</code>.</p>
84
+
85
+ <h3>1.2. <a name="config">Configuration Files</a></h3>
86
+
87
+ <p>pgpool-II configuration parameters are saved in
88
+ the <code>pgpool.conf</code> file. The file is in "<code>parameter =
89
+ value</code>" per line format. When you install pgpool-II,
90
+ <code>pgpool.conf.sample</code> is automatically created. We recommend
91
+ copying and renaming it to <code>pgpool.conf</code>, and edit it as
92
+ you like.</p>
93
+
94
+ <pre>$ cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.conf</pre>
95
+
96
+ <p>pgpool-II only accepts connections from the local host using port
97
+ 9999. If you wish to receive conenctions from other hosts, set
98
+ <code>listen_addresses</code> to '*'.</code></p>
99
+
100
+ <pre>
101
+ listen_addresses = 'localhost'
102
+ port = 9999
103
+ </pre>
104
+
105
+ <p>We will use the default parameters in thie tutorial.</p>
106
+
107
+ <h3>1.3. <a name="pcp-config">Configuring PCP Commands</a></h3>
108
+
109
+ <p>pgpool-II has an interface for administrative purpose to retrieve
110
+ information on database nodes, shutdown pgpool-II, etc. via
111
+ network. To use PCP commands, user authentication is required. This
112
+ authentication is different from PostgreSQL's user authentication. A
113
+ user name and password need to be defined in the <code>pcp.conf</code>
114
+ file. In the file, a user name and password are listed as a pair on
115
+ each line, and they are separated by a colon (:). Passwords are
116
+ encrypted in md5 hash format.</p>
117
+
118
+ <pre>postgres:e8a48653851e28c69d0506508fb27fc5</pre>
119
+ <p>
120
+ When you install pgpool-II, <code>pcp.conf.sample</code> is
121
+ automatically created. We recommend copying and renaming it to
122
+ <code>pcp.conf</code>, and edit it.
123
+ </p>
124
+ <pre>$ cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf</pre>
125
+
126
+ <p>To encrypt your password into md5 hash format, use the pg_md5 command,
127
+ which is installed as one of pgpool-II's
128
+ executables. <code>pg_md5</code> takes text as a command line
129
+ argument, and displays its md5-hashed text.</p>
130
+
131
+ <p>For example, give "postgres" as the command line argument, and
132
+ <code>pg_md5</code> displays md5-hashed text on its standard
133
+ output.</p>
134
+
135
+ <pre>
136
+ $ /usr/bin/pg_md5 postgres
137
+ e8a48653851e28c69d0506508fb27fc5
138
+ </pre>
139
+
140
+ <p>PCP commands are executed via network, so the port number must be
141
+ configured with <code>pcp_port</code> parameter in
142
+ <code>pgpool.conf</code> file.</p>
143
+
144
+ <p>We will use the default 9898 for <code>pcp_port</code> in this tutorial.</p>
145
+
146
+ <pre>pcp_port = 9898</pre>
147
+
148
+ <h3>1.4. <a name="db-node">Preparing Database Nodes</a></h3>
149
+
150
+ <p>Now, we need to set up backend PostgreSQL servers for
151
+ pgpool-II. These servers can be placed within the same host as
152
+ pgpool-II, or on separate machines. If you decide to place the servers
153
+ on the same host, different port numbers must be assigned for each
154
+ server. If the servers are placed on separate machines, they must be
155
+ configured properly so that they can accept network connections from
156
+ pgpool-II.</p>
157
+
158
+ <p>In this tutorial, we will place three servers within the same host
159
+ as pgpool-II, and assign 5432, 5433, 5434 port numbers
160
+ respectively. To configure pgpool-II, edit <code>pgpool.conf</code> as
161
+ follows.
162
+
163
+ <pre>
164
+ backend_hostname0 = 'localhost'
165
+ backend_port0 = 5432
166
+ backend_weight0 = 1
167
+ backend_hostname1 = 'localhost'
168
+ backend_port1 = 5433
169
+ backend_weight1 = 1
170
+ backend_hostname2 = 'localhost'
171
+ backend_port2 = 5434
172
+ backend_weight2 = 1
173
+ </pre>
174
+
175
+ <p>For <code>backend_hostname</code>, <code>backend_port</code>,
176
+ <code>backend_weight</code>, set the node's hostname, port number, and
177
+ ratio for load balancing. At the end of each parameter string, node ID
178
+ must be specified by adding positive integers starting with 0 (i.e. 0,
179
+ 1, 2, &hellip;).</p>
180
+
181
+ <p><code>backend_weight</code> parameters are all 1, meaning that
182
+ SELECT queries are equally distributed among three servers.</p>
183
+
184
+ <h3>1.5. <a name="start-shutdown">Starting/Stopping pgpool-II</a></h3>
185
+
186
+ <p>To fire up pgpool-II, execute the following command on a terminal.</p>
187
+
188
+ <pre>$ pgpool</pre>
189
+
190
+ <p>The above command, however, prints no log messages because pgpool
191
+ detaches the terminal. If you want to show pgpool log messages, you
192
+ pass <code>-n</code> option to pgpool command so pgpool-II is executed
193
+ as non-daemon process, and the terminal will not be detached.
194
+ </p>
195
+
196
+ <pre>
197
+ $ pgpool -n &
198
+ </pre>
199
+
200
+ <p>
201
+ The log messages are printed on the terminal, so the recommended
202
+ options to use the following.
203
+ </p>
204
+
205
+ <pre>$ pgpool -n -d &gt; /tmp/pgpool.log 2&gt;&1 &</pre>
206
+
207
+ <p>The <code>-d</code> option enables debug messages to be generated.</p>
208
+
209
+ <p>
210
+ The above command keeps appending log messages to /tmp/pgpool.log. If
211
+ you need to rotate log files, pass the logs to a external command
212
+ which has log rotation function.
213
+
214
+ For example, you can use rotatelogs from Apache2:
215
+ <pre>
216
+ $ pgpool -n 2>&1 | /usr/local/apache2/bin/rotatelogs \
217
+ -l -f /var/log/pgpool/pgpool.log.%A 86400 &
218
+ </pre>
219
+ This will generate a log file named "pgpool.log.Thursday" then
220
+ rotate it 00:00 at midnight. Rotatelogs adds logs to a file if it already
221
+ exists. To delete old log files before rotation, you could use cron:
222
+ <pre>
223
+ 55 23 * * * /usr/bin/find /var/log/pgpool -type f -mtime +5 -exec /bin/rm -f '{}' \;
224
+ </pre>
225
+ Please note that rotatelogs may exist as /usr/sbin/rotatelogs2 in some
226
+ distributions.
227
+ -f option generates a log file as soon as rotatelogs starts and is
228
+ available in apache2 2.2.9 or greater.
229
+ </p>
230
+ <p>
231
+ Also <a
232
+ href="http://www.cronolog.org"><code>cronolog</code></a> can be used.
233
+ </p>
234
+
235
+ <pre>
236
+ $ pgpool -n 2>&1 | /usr/sbin/cronolog \
237
+ --hardlink=/var/log/pgsql/pgpool.log \
238
+ '/var/log/pgsql/%Y-%m-%d-pgpool.log' &
239
+ </pre>
240
+
241
+ <p>To stop pgpool-II, execute the following command.</p>
242
+
243
+ <pre>$ pgpool stop</pre>
244
+
245
+ <p>If any client is still connected, pgpool-II waits for it to
246
+ disconnect, and then terminates itself. Run the following command
247
+ instead if you want to shutdown pgpool-II forcibly.
248
+
249
+ <pre>$ pgpool -m fast stop</pre>
250
+
251
+ <h2>2. <a name="replication">Your First Replication</a></h2>
252
+
253
+ <p>Replication enables the same data to be copied to multiple database
254
+ nodes.</p>
255
+
256
+ <p>In this section, we'll use three database nodes, which we have
257
+ already set up in section "1. <a href="#start">Let's Begin!</a>", and
258
+ takes you step by step to create a database replication system. Sample
259
+ data to be replicated will be generated by the pgbench benchmark
260
+ program.</p>
261
+
262
+ <h3>2.1. <a name="replication-config">Configuring Replication</a></h3>
263
+
264
+ <p>To enable the database replication function, set
265
+ <code>replication_mode</code> to true in <code>pgpool.conf</code>
266
+ file.</p>
267
+
268
+ <pre>replication_mode = true</pre>
269
+
270
+ <p>When <code>replication_mode</code> is set to true, pgpool-II will send a
271
+ copy of a received query to all the database nodes.</p>
272
+
273
+ <p>When <code>load_balance_mode</code> is set to true, pgpool-II will
274
+ distribute SELECT queries among the database nodes.</p>
275
+
276
+ <pre>load_balance_mode = true</pre>
277
+
278
+ <p>In this section, we enable both <code>replication_mode</code> and
279
+ <code>load_balance_mode</code>.</p>
280
+
281
+ <h3>2.2. <a name="replication-check">Checking Replication</a></h3>
282
+
283
+ <p>To reflect the changes in <code>pgpool.conf</code>, pgpool-II must
284
+ be restarted. Please refer to section "1.5 <a
285
+ href="#start-shutdown">Starting/Stopping pgpool-II</a>".</p>
286
+
287
+ <p>After configuring <code>pgpool.conf</code> and restarting
288
+ pgpool-II, let's try the actual replication and see if everything is
289
+ working.</p>
290
+
291
+ <p>First, we need to create a database to be replicated. We will name
292
+ it "bench_replication". This database needs to be created on all the
293
+ nodes. Use the <code>createdb</code> commands through pgpool-II, and the
294
+ database will be created on all the nodes.</p>
295
+
296
+ <pre>$ createdb -p 9999 bench_replication</pre>
297
+
298
+ <p>Then, we'll execute pgbench with <code>-i</code>
299
+ option. <code>-i</code> option initializes the database with
300
+ pre-defined tables and data.</p>
301
+
302
+ <pre>$ pgbench -i -p 9999 bench_replication</pre>
303
+
304
+ <p>The following table is the summary of tables and data, which will
305
+ be created by <code>pgbench -i</code>. If, on all the nodes, the
306
+ listed tables and data are created, replication is working correctly.
307
+
308
+ <table border="1" align="center">
309
+ <tr>
310
+ <th>Table Name</th>
311
+ <th>Number of Rows</th>
312
+ </tr>
313
+ <tr>
314
+ <td>branches</td>
315
+ <td>1</td>
316
+ </tr>
317
+ <tr>
318
+ <td>tellers</td>
319
+ <td>10</td>
320
+ </tr>
321
+ <tr>
322
+ <td>accounts</td>
323
+ <td>100000</td>
324
+ </tr>
325
+ <tr>
326
+ <td>history</td>
327
+ <td>0</td>
328
+ </tr>
329
+ </table>
330
+
331
+ <p>Let's use a simple shell script to check the above on all the
332
+ nodes. The following script will display the number of rows in
333
+ branches, tellers, accounts, and history tables on all the nodes (5432,
334
+ 5433, 5434).</p>
335
+
336
+ <pre>$ for port in 5432 5433 5434; do
337
+ &gt; echo $port
338
+ &gt; for table_name in branches tellers accounts history; do
339
+ &gt; echo $table_name
340
+ &gt; psql -c &quot;SELECT count(*) FROM $table_name&quot; -p $port bench_replication
341
+ &gt; done
342
+ &gt; done
343
+ </pre>
344
+
345
+ <h2>3. <a name="parallel">Your First Parallel Query</a></h2>
346
+ <p>
347
+ Data within the range is stored in two or more data base nodes in a parallel Query. This is called a partitioning.
348
+ Moreover you could replicate some of tables among database nodes even
349
+ in parallel query mode.
350
+ </p>
351
+
352
+ <p>To enable parallel query in pgpool-II, you must set up another
353
+ database called "System Database" (we will denote it as SystemDB from
354
+ this point).</p>
355
+
356
+ <p>SystemDB holds the user-defined rules to decide what data will be
357
+ saved in which database node. Another use of SystemDB is to merge
358
+ results sent back from the database nodes using dblink.</p>
359
+
360
+ <p>In this section, we will use three database nodes which we have set
361
+ up in section "1. <a href="#start">Let's Begin!</a>", and takes you
362
+ step by step to create a parallel query database system. We will use
363
+ pgbench again to create sample data.</p>
364
+
365
+ <h3>3.1. <a name="parallel-config">Configuring Parallel Query</a></h3>
366
+
367
+ <p>To enable the parallel query function, set <code>parallel_mode</code> to true in <code>pgpool.conf</code> file.</p>
368
+
369
+ <pre>parallel_mode = true</pre>
370
+
371
+ <p>Setting <code>paralle_mode</code> to true does not start parallel
372
+ query automatically. pgpool-II needs SystemDB and the rules
373
+ to know how to distribute data to the database nodes.</p>
374
+
375
+ <p>Also, dblink used by SystemDB makes connections to
376
+ pgpool-II. Therefore, <code>listen_addresses</code> needs to be
377
+ configured so that pgpool-II accepts those connections.</p>
378
+
379
+ <pre>listen_addresses = '*'</pre>
380
+
381
+ <p>
382
+ Attention: The replication is not done for the table that does the partitioning
383
+ though a parallel Query and the replication can be made effective at the same time.
384
+
385
+ <p>
386
+ Attention: You can have both partitioned tables and replicated
387
+ tables. However a table cannot be a partioned and replicated at
388
+ the same time. Because the data structure of partioned tables and
389
+ replicated tables is different, "bench_replication" database created
390
+ in section "2. <a href="#replication">Your First Replication</a>"
391
+ cannot be reused in parallel query mode.</p>
392
+
393
+ <pre>
394
+ replication_mode = true
395
+ load_balance_mode = false
396
+ </pre>
397
+ <p>
398
+ OR
399
+ </p>
400
+ <pre>
401
+ replication_mode = false
402
+ load_balance_mode = true
403
+ </pre>
404
+
405
+ <p>In this section, we will set <code>parallel_mode and load_balance_mode</code> to true,
406
+ <code>listen_addresses</code> to '*', <code>replication_mode</code>to false.</p>
407
+
408
+ <h3>3.2. <a name="system-db">Configuring SystemDB</a></h3>
409
+
410
+ <p> "System database" is just an ordinaly database. The only
411
+ requirement is that dblink functions and the dist_def table, which
412
+ describes partioning rule, must be installed in the system
413
+ database. You could have a system database on a database node, or you
414
+ could have multiple nodes having system database by using cascade
415
+ configuration in pgpool-II. </p>
416
+
417
+ <p>In this section, we will create SystemDB on the 5432 port
418
+ node. The following list is the configuration parameters for
419
+ SystemDB</p>
420
+
421
+ <pre>
422
+ system_db_hostname = 'localhost'
423
+ system_db_port = 5432
424
+ system_db_dbname = 'pgpool'
425
+ system_db_schema = 'pgpool_catalog'
426
+ system_db_user = 'pgpool'
427
+ system_db_password = ''
428
+ </pre>
429
+
430
+ <p>Actually, the above are the default settings of
431
+ <code>pgpool.conf</code>. Now, we must create a user called "pgpool",
432
+ and a database called "pgpool" owned by user "pgpool".</p>
433
+
434
+ <pre>
435
+ $ createuser -p 5432 pgpool
436
+ $ createdb -p 5432 -O pgpool pgpool
437
+ </pre>
438
+
439
+ <h4><p>3.2.1. Installing dblink</p></h4>
440
+
441
+ <p>Next, we must install dblink into "pgpool" database. dblink is one
442
+ of the tools included in the <code>contrib</code> directory in the
443
+ PostgreSQL source code.</p>
444
+
445
+ <p>To install dblink to your system, execute the following commands.</p>
446
+
447
+ <pre>
448
+ $ USE_PGXS=1 make -C contrib/dblink
449
+ $ USE_PGXS=1 make -C contrib/dblink install
450
+ </pre>
451
+
452
+ <p>After dblink has been installed into your system, we will define
453
+ dblink functions in the "pgpool" database. If PostgreSQL is installed in
454
+ <code>/usr/local/pgsql</code>, <code>dblink.sql</code> (a file with
455
+ function definitions) should have been installed in
456
+ <code>/usr/local/pgsql/share/contrib</code>. Now, execute the
457
+ following command to define dblink functions.</p>
458
+
459
+ <pre>$ psql -f /usr/local/pgsql/share/contrib/dblink.sql -p 5432 pgpool</pre>
460
+
461
+ <h4><p>3.2.2. Defining dist_def table</p></h4>
462
+ <p>
463
+ Define a table called "dist_def", which has the partitioning rule, in
464
+ database called "pgpool".
465
+ After installing pgpool-II, you will have <code>system_db.sql</code>,
466
+ which is the <code>psql</code> script to generate the system database.
467
+ </p>
468
+ <pre>
469
+ $ psql -f /usr/local/share/system_db.sql -p 5432 -U pgpool pgpool
470
+ </pre>
471
+ <p>
472
+ dist_def table is created in pgpool_catalog schema.
473
+ If you have configured
474
+ <code>system_db_schema</code> to use other schema, you need to edit
475
+ <code>system_db.sql</code> accordingly.</p>
476
+
477
+ <p>The definition for "dist_def" is as shown here, and the table name
478
+ cannot be changed.</p>
479
+
480
+ <pre>
481
+ CREATE TABLE pgpool_catalog.dist_def (
482
+ dbname text, -- database name
483
+ schema_name text, -- schema name
484
+ table_name text, -- table name
485
+ col_name text NOT NULL CHECK (col_name = ANY (col_list)), -- distribution key-column
486
+ col_list text[] NOT NULL, -- list of column names
487
+ type_list text[] NOT NULL, -- list of column types
488
+ dist_def_func text NOT NULL, -- distribution function name
489
+ PRIMARY KEY (dbname, schema_name, table_name)
490
+ );
491
+ </pre>
492
+
493
+ <p>A tuple stored in "dist_def" can be classified into two types.</p>
494
+
495
+ <ul>
496
+ <li>Distribution Rule (col_name, dist_def_func)</li>
497
+ <li>Table's meta-information (dbname, schema_name, table_name, col_list, type_list)</li>
498
+ </ul>
499
+
500
+ <p>A distribution rule decides how to distribute data to a
501
+ particular node. Data will be distributed depending on the value of
502
+ the "col_name" column. "dist_def_func" is a function that takes the value
503
+ of "col_name" as its argument, and returns an integer which
504
+ points to the appropriate database node ID where the data should be
505
+ stored.</p>
506
+
507
+ <p>A meta-information is used to rewrite queries. Parallel query
508
+ must rewrite queries so that the results sent back from the backend
509
+ nodes can be merged into one result.</p>
510
+
511
+ <h4><p>3.2.3. Defining replicate_def table</p></h4>
512
+ <p>
513
+ If you want to use replicated tables in SELECT in parallel mode, you
514
+ need to register information about such tables(replication rule) to a table
515
+ called replicate_def.
516
+ The replicate_def table has already been made when making it from the
517
+ system_db.sql file when dist_def is defined.
518
+ The replicate_def table is defined as follows.
519
+ </p>
520
+ <pre>
521
+ CREATE TABLE pgpool_catalog.replicate_def (
522
+ dbname text, -- database name
523
+ schema_name text, -- schema name
524
+ table_name text, -- table name
525
+ col_list text[] NOT NULL, -- list of column names
526
+ type_list text[] NOT NULL, -- list of column types
527
+ PRIMARY KEY (dbname, schema_name, table_name)
528
+ );
529
+ </pre>
530
+ <p>
531
+ replicate_def includes table's meta data information(dbname, schema_name, table_name, col_list, type_list).
532
+ </p>
533
+ <p>
534
+ All the query analysis and query rewriting process are dependent on the
535
+ information (table, column and type) stored in dist_def and/or
536
+ replicate_def table. If the information is not correct, analysis and
537
+ query rewriting process will produce wrong results.
538
+ </p>
539
+
540
+ <h3>3.3. <a name="dist-def">Defining Distribution Rules</a></h3>
541
+
542
+ <p>In this tutorial, we will define rules to distribute pgbench's
543
+ sample data into three database nodes. The sample data will be created
544
+ by "pgbench -i -s 3" (i.e. scale factor of 3). We will create a new
545
+ database called "bench_parallel" for this section.</p>
546
+
547
+ <p>In pgpool-II's source code, you can find the
548
+ <code>dist_def_pgbench.sql</code> file in <code>sample</code>
549
+ directoy. We will use this sample file here to create distribution
550
+ rules for pgbench. Execute the following command in extracted
551
+ pgpool-II source code directory.</p>
552
+
553
+ <pre>$ psql -f sample/dist_def_pgbench.sql -p 5432 pgpool</pre>
554
+
555
+ <p>Here is the explanation of <code>dist_def_pgbench.sql</code>.</p>
556
+
557
+ <p>Inside <code>dist_def_pgbench.sql</code>, we are inserting one
558
+ row into "dist_def" table. There is a distribution
559
+ function for accounts table.
560
+ For the key-column, aid is defined for accounts respectively (which is the primary keys)</p>
561
+
562
+ <pre>
563
+ INSERT INTO pgpool_catalog.dist_def VALUES (
564
+ 'bench_parallel',
565
+ 'public',
566
+ 'accounts',
567
+ 'aid',
568
+ ARRAY['aid', 'bid', 'abalance', 'filler'],
569
+ ARRAY['integer', 'integer', 'integer', 'character(84)'],
570
+ 'pgpool_catalog.dist_def_accounts'
571
+ );
572
+ </pre>
573
+
574
+ <p>Now, we must define the distribution function for the accounts table. Note
575
+ that you can use the same function from different tables. Also, you
576
+ can define functions using languages other than SQL (e.g. PL/pgSQL,
577
+ PL/Tcl, etc.).</p>
578
+
579
+ <p>
580
+ The accounts table when data is initialized specifying 3 scale factor,
581
+ The value of the aid is 1 to 300000.
582
+ The function is defined so that data is evenly distributed to three data base nodes.
583
+ </p>
584
+ <p>
585
+ An SQL function will be defined as the return of the number of the data base node.
586
+ </p>
587
+
588
+ </p>
589
+ <pre>CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_branches(anyelement)
590
+ RETURNS integer AS $$
591
+ SELECT CASE WHEN $1 &gt; 0 AND $1 &lt;= 1 THEN 0
592
+ WHEN $1 &gt; 1 AND $1 &lt;= 2 THEN 1
593
+ ELSE 2
594
+ END;
595
+ $$ LANGUAGE sql;
596
+ </pre>
597
+
598
+ <h3>3.4. <a name="replicate-def">Defining Replication Rules</a></h3>
599
+ <p>
600
+ The replication rule is the one that which table decides the replication whether to be done.
601
+ </p>
602
+
603
+ <p>
604
+ Here, it is made with pgbench With the branches table and tellers table are registered.
605
+
606
+ As a result, the accounts table and the inquiry that uses the branches table
607
+ and the tellers table become possible.
608
+ </p>
609
+ <pre>
610
+ INSERT INTO pgpool_catalog.replicate_def VALUES (
611
+ 'bench_parallel',
612
+ 'public',
613
+ 'branches',
614
+ ARRAY['bid', 'bbalance', 'filler'],
615
+ ARRAY['integer', 'integer', 'character(88)']
616
+ );
617
+
618
+ INSERT INTO pgpool_catalog.replicate_def VALUES (
619
+ 'bench_parallel',
620
+ 'public',
621
+ 'tellers',
622
+ ARRAY['tid', 'bid', 'tbalance', 'filler'],
623
+ ARRAY['integer', 'integer', 'integer', 'character(84)']
624
+ );
625
+ </pre>
626
+ <p>
627
+ Replicate_def_pgbench.sql is prepared in sample directory.
628
+
629
+ In the directory that progresses the source code to define a replicate rule by using this as follows The psql command is executed.
630
+ </p>
631
+ <pre>
632
+ $ psql -f sample/replicate_def_pgbench.sql -p 5432 pgpool
633
+ </pre>
634
+
635
+ <h3>3.5. <a name="parallel-check">Checking Parallel Query</a></h3>
636
+
637
+ <p>To reflect the changes in <code>pgpool.conf</code>, pgpool-II must
638
+ be restarted. Please refer to section "1.5 <a
639
+ href="#start-shutdown">Starting/Stopping pgpool-II</a>".</p>
640
+
641
+ <p>After configuring <code>pgpool.conf</code> and restarting
642
+ pgpool-II, let's try and see if parallel query is working.</p>
643
+
644
+ <p>First, we need to create a database to be distributed. We will name
645
+ it "bench_parallel". This database needs to be created on all the
646
+ nodes. Use the <code>createdb</code> commands through pgpool-II, and the
647
+ databases will be created on all the nodes.</p>
648
+
649
+ <pre>$ createdb -p 9999 bench_parallel</pre>
650
+
651
+ <p>Then, we'll execute pgbench with <code>-i -s 3</code>
652
+ options. <code>-i</code> option initializes the database with
653
+ pre-defined tables and data. <code>-s</code> option specifies the
654
+ scale factor for initialization.</p>
655
+
656
+ <pre>$ pgbench -i -s 3 -p 9999 bench_parallel</pre>
657
+
658
+ <p>The tables and data created are shown in "3.3. <a
659
+ href="#dist-def">Defining Distribution Rules</a>".</p>
660
+
661
+ <p>One way to check if the data have been distributed correctly is to
662
+ execute a SELECT query via pgpool-II and directly on the backend, and
663
+ compare two results. If everything is configured right,
664
+ "bench_parallel" should be distributed as follows.</p>
665
+
666
+ <table border="1" align ="center">
667
+ <tr>
668
+ <th >Table Name</th>
669
+ <th >the number of lines</th>
670
+ </tr>
671
+ <tr>
672
+ <td>branches</td>
673
+ <td>3</td>
674
+ </tr>
675
+ <tr>
676
+ <td>tellers</td>
677
+ <td>30</td>
678
+ </tr>
679
+ <tr>
680
+ <td>accounts</td>
681
+ <td>300000</td>
682
+ </tr>
683
+ <tr>
684
+ <td>history</td>
685
+ <td>0</td>
686
+ </tr>
687
+ </table>
688
+
689
+ <p>Let's use a simple shell script to check the above on all the nodes
690
+ and via pgpool-II. The following script will display the minimum and
691
+ maximum values in accounts table using port 5432, 5433, 5434, and
692
+ 9999.</p>
693
+
694
+ <pre>$ for port in 5432 5433 5434 9999; do
695
+ &gt; echo $port
696
+ &gt; psql -c &quot;SELECT min(aid), max(aid) FROM accounts&quot; -p $port bench_parallel
697
+ &gt; done
698
+ </pre>
699
+
700
+ <div class="copyright">
701
+ <hr>
702
+ <copyright>
703
+ Copyright &copy; 2003 &ndash; 2011 pgpool Global Development Group
704
+ </copyright>
705
+ </div>
706
+ </body>
707
+ </html>